[Web-bot-auth] Vectors reproduced, a note on unnamed failures, and two field observations
ParallaxGrain <parallaxgrain@gmail.com> Mon, 24 August 2026 20:13 UTC
Return-Path: <parallaxgrain@gmail.com>
X-Original-To: web-bot-auth@mail2.ietf.org
Delivered-To: web-bot-auth@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 57CBB12EAF40E for <web-bot-auth@mail2.ietf.org>; Mon, 24 Aug 2026 13:13:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1787602381; bh=yTpVistU4U9EF7Ix1r5Uv3/YfmI/4p4OPGUQRI3KE3Y=; h=From:Date:Subject:To; b=Vw6ybNOhtBD4/BMjFVNVJuG9N92sCKMLugVatC5QtbQJpqUxMo6WXbAJh/3eCi8Ne b81EudOvbQCqDV11XBxIvqZZhlss9LEOHoBidUq4k2SvloL7a0jBFOnsXhwyKhVxXq PvnHMxi2SopUbuWTRZNJ9IXbJ7Au2+dzo+n9dMG4=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id eL-Bv79Vai7R for <web-bot-auth@mail2.ietf.org>; Mon, 24 Aug 2026 13:13:00 -0700 (PDT)
Received: from mail-yw1-x112a.google.com (mail-yw1-x112a.google.com [IPv6:2607:f8b0:4864:20::112a]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 9DD6012EAF407 for <web-bot-auth@ietf.org>; Mon, 24 Aug 2026 13:13:00 -0700 (PDT)
Received: by mail-yw1-x112a.google.com with SMTP id 00721157ae682-836c43641baso72604327b3.0 for <web-bot-auth@ietf.org>; Mon, 24 Aug 2026 13:13:00 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1787602380; cv=none; d=google.com; s=arc-20260327; b=lwiB+LOaECtyXcrpKLYx6Kqn14Nf3ig4VQCq1R/lKIIrJ8X8l259SpcYWoHc3vrLas 704wkk8pojipIdfqwO25kWTUDVflgYIUMKmMvCfNNTwaQ2E7VwoTYeii2BmypDR+94ZE EF+jK3Z9NFL0O8RCZAK6XGu1MU4d6hKrqP1THX54JSpIPtdlHKX4spsMlKw7frAsGZhi iGJofx7658efOG5n2rdD7du+KrTOVxXK5LFVuNvZOw8CgLdHL2S0Mty3tKov00vLEqM7 ZrLMJsLBeXnzrhxhg4NX49KHPafPanzahy/Q5cRCrKGF89dTcgIrFjG/WiO+vaS5Co2i 41CA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=yTpVistU4U9EF7Ix1r5Uv3/YfmI/4p4OPGUQRI3KE3Y=; fh=xAfnAr/+ShY+4ms6rzvPN+QKPYv7dVWR519swS2eF80=; b=shb+UZjn1zAtnEUjzJBGWLKQ3J40VVKQh7wZF9DNq/cO9eqQI39/dKKW/6cusMykjw fPOX2atsdGgZYdk50+GhJ88uf29MxE9ftIEcsc6gAu0HL8/AXMjGkaXT2UiO9otGIEG4 A4jZSK7pprNfmDCiwKmXfUwsCgV5H0nVoql4/RQmM1iWyAqQ0RD8xWytUjaeJUbtXAI0 MDDSOiFAsy7u1/wekx+ZjCUmCHNVJAt4cYkunkTruplbmwPIhqmg8J8mXmZsGtPq1gfD racX1XtgbEQQnpj1IPc974X0qOmWyQFRvvpFcSt+Gl6GLDz+2g3dFeg+X3qkVY7nc65/ VZsA==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787602380; x=1788207180; darn=ietf.org; h=content-type:to:subject:message-id:date:from:mime-version:from:to :cc:subject:date:message-id:reply-to:content-type; bh=yTpVistU4U9EF7Ix1r5Uv3/YfmI/4p4OPGUQRI3KE3Y=; b=bGspA39wYHQ1mS0t6h27+R+DagxLx/QTSLJP4Uw/9QrFVYdShjJxIHOPfYMjK6gMI+ 6HVUT7+noukCPDIm/78t54HA6c+XqEqLLv5ENKerh9dnLPTPWY+ST3BPk3BJWc79MDO3 oGj/ommFS6YH2etv/soxavMBNGSTnt24kroPJbn/Sgkww7IQ3qfQCnpvWaJtTBnpvaCo DlMCo2Zrx0TeCtPqCE3HrRiPuJ8Q1HTksIoEl+vWS+r4wKJvEdQUeROhn2Oy6Vdy4cI4 mTvgu9xk4tNIXXB5NwxtmQ5BADau1iQ88PtnLLj7U+fUsxBeKYTDQBxaGqBf7Uj7+BaC pY3Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787602380; x=1788207180; h=content-type:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yTpVistU4U9EF7Ix1r5Uv3/YfmI/4p4OPGUQRI3KE3Y=; b=ItDiUFBQ/eehdenDqFOQvuWMu08kfmOmMqxory48TSSlQopjnshQiM8kk1k/I7XQUv psof2V4PR2qJmZiiOhCqcNet0CgPPdlJOeUeR9VmdTNJMGyX0xQ0Wh+O4r0sSTre7zk7 3uYTxODYq+N5Q+ztUK3H8amV7nlcW1d4QrAbu34dGRi1WvbVlDw+9QWNcnQAVSrJvji1 pGTE6bSfWoQFCQqCkTZG7pGFqMx0ysqLIBgv8wdA0rMqp05ufTWGa+y2/B2NOUuhU5Im bV5Ok0+UVhZSRsx50F2RZ8R9T0z9JOFMKX73MISRx+fwN+QQsmaHuvFN54LQ1zBLmupa n06Q==
X-Gm-Message-State: AFuF++m+pTeiGLCGWdwqXHJJ1an7xEgTt+5BfeCATmL9KxvyA1UErZul bvU+AA8PmYyw/KPQHpXwtz/vXQL5QrfDYGgfYxRBtNH5J4tq290ed5nCP3bnWixQ5n5yyUqJCtI juW6mtkAaX784xdlwz9ajom8u6TjKpS+oinOlV+avCQ==
X-Gm-Gg: AR+sD10GDYlGSL6iKfypAp5KfkNiLV+I9Ou2LPoI1RbZnlK7fwBWLiO/DAWSMDaZ4nX P4ad8Xf7sQFUCG1yRtvbUX4udlh0oX6Q19QEcZLw8kEJvqnZNH35qUiDVmy0hiks1kEXH4ftd18 sHUgJFULIjDnVdiDu6CrxRkIWnnt2jxm6RZ93lRpLvSejngpN+AfhcA0PrDe/S87XLwnHLkDZZ7 nGzffREqqGbHmCLB41fB4hgZp974fACE7qG1bMEaiDC0dG5hXxQwZQbDqHCGF2QxgLYc1xAq78T Qq0Hrsdt3LpcUDfJtvBd8bGJRv4T6z8EYADgwcgNs+t0i9+zZtPL0xdvJ90rz+d0kS3ygd20K3a 7cMZ3W2kPhbaO5xaYN+cbkuVx
X-Received: by 2002:a05:690c:e29a:20b0:81e:eaaa:535b with SMTP id 00721157ae682-849f6c946f8mr81340377b3.35.1787602379834; Mon, 24 Aug 2026 13:12:59 -0700 (PDT)
MIME-Version: 1.0
From: ParallaxGrain <parallaxgrain@gmail.com>
Date: Mon, 24 Aug 2026 15:12:47 -0500
X-Gm-Features: AcwNN1VrkVDI43YodzDhXNGQWaXofJvNAvlTDSc-UA-SaxO77qtqGPwbhSm-Z1M
Message-ID: <CAKw8RMcQ1aO7jYyBzocc6FPsQL56u42-uPxw1=iW2QMvp-BrNA@mail.gmail.com>
To: web-bot-auth@ietf.org
Content-Type: multipart/alternative; boundary="000000000000d986e00659d09cbd"
Message-ID-Hash: QLE24GQVQUCWF5VYISSKGKNMCIG2MVT5
X-Message-ID-Hash: QLE24GQVQUCWF5VYISSKGKNMCIG2MVT5
X-MailFrom: parallaxgrain@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-web-bot-auth.ietf.org-0; header-match-web-bot-auth.ietf.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Web-bot-auth] Vectors reproduced, a note on unnamed failures, and two field observations
List-Id: Authentication of non-human users to human-oriented Web sites <web-bot-auth.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/web-bot-auth/4RAziyyxRY5bjUDF4SNC5OLiEmc>
List-Archive: <https://mailarchive.ietf.org/arch/browse/web-bot-auth>
List-Help: <mailto:web-bot-auth-request@ietf.org?subject=help>
List-Owner: <mailto:web-bot-auth-owner@ietf.org>
List-Post: <mailto:web-bot-auth@ietf.org>
List-Subscribe: <mailto:web-bot-auth-join@ietf.org>
List-Unsubscribe: <mailto:web-bot-auth-leave@ietf.org>
Hi all, I am an independent researcher and this is my first post here. I have been following this work since the spring and I run a public verifier for the protocol, which is where the three results below come from. On the call for adoption: I support it. I was able to implement from the published text alone, and the vectors added in -02 made that implementation checkable rather than merely plausible. 1. The test vectors in draft-meunier-webbotauth-httpsig-protocol-02. All three EdDSA vectors are wired into my test suite. My verifier rebuilds each published signature base byte for byte and verifies each published signature with the RFC 9421 Appendix B.1.4 key. I also regenerated E.2.1's signature from scratch with the B.1.4 private key and got the published bytes exactly, so the vectors reproduce end to end and not only under my own parser. I independently confirm the defect Joshua reported: E.2.1 keys its Signature-Agent member agent2 while the signature label is sig2, and the text requires the member keyed to the signature label to be covered. A verifier built from the prose alone selects by the signature's own label, finds nothing, and fails the document's own vector. E.1.1 has the same shape, I did not run it, as I implement Ed25519 only. E.2.2 is unaffected, since the legacy form carries no member key. That is #128 in the authors' repository, and the re-keying Joshua suggested closes it. The vectors were the most useful addition in -02. Nick's directory vector in particular gave me something to check the possession proof against, which the prose alone had not. 2. A rejection has no name (negative test vectors), and that can be important for the client. This was the recurring problem while building the verifier. When verification fails, nothing tells the client which of several unrelated things went wrong. "My signature base is malformed", "my clock is ahead", "the verifier never fetched my directory" and "my key is not in it" all arrive as the same event. None of them can be acted on, and the only way forward is to guess and retry against a live endpoint. The document does not fill that in. An origin gets 400, 403 and 429. Verifier Outcomes gives verified, invalid and unverified, and nothing below that. The flagship deployment shows the effect: Cloudflare's test endpoint answers 401 when the key is unknown, and the same page notes you may also see 401 when the key is known but the message failed to verify. Two unrelated faults with different fixes, under one code. My verifier names 36 faults and returns the one that applies, with a sentence saying what to change. They divide into 19 that mean the request broke a rule and 17 that mean the verifier could not decide, which is invalid and unverified one level further down, grouped by what the operator would have to touch: the signature, the Signature-Agent header, the directory, the key. The list is at https://packet.guru/agents/reference#faults One datapoint on whether the names carry their weight. I pointed an autonomous agent at that endpoint with nothing but the published guide and no help from me. It produced a verifying signature and a readable agent card within a few minutes, correcting itself from the named faults between attempts. Against a bare 401 it would have had nothing to work from. #11 asks for negative test vectors and has no comments on it. Writing one forces this question directly, because a negative vector needs an expected reason, and today there are only three to choose from. If it is useful I will prepare a set against the B.1.4 key, one fault per vector, with the request, the expected outcome and the reason, and the group can keep, rename or drop any of the names. 3. Two field observations, measured today across the eight distinct operators publishing a directory. On alg and #109: two emit EdDSA, six omit the member, and none emit ed25519, the registered name that applies to an Ed25519 key. Joshua reported from the signer side that the conformant value is the one stock WebCrypto refuses to import, and I can confirm that independently: importing the same JWK with alg absent, or as EdDSA, or as Ed25519, succeeds, and with ed25519 it is refused. Both resolutions have already been named on the list, either say "omit it" or align the member with the JOSE names. I have no third to offer, only the count: whichever way it goes, one of those two already matches every deployment I can see, and the value in the text matches none of them. On purpose: the registry draft defines it as a card parameter and leaves the vocabulary open, with AIPREF named as a candidate and search as the example. On the list the current answer for distinguishable per-purpose crawlers is a distinct URL per purpose, which Shivdeep and Joshua have both described from their own deployments. Meanwhile two production key directories already carry a purpose member in the directory itself: chatgpt.com sends "ai" and browserbase.com sends "rag". RFC 7517 says additional members in a JWK Set must be ignored if not understood, so neither is malformed. But they are two different words for the same slot, chosen with nothing to choose from. If the vocabulary question is still open, those are two live values to test a candidate against. Thanks for the work on this. I hope some of it is useful, and I am happy to help where I can.
- [Web-bot-auth] Vectors reproduced, a note on unna… ParallaxGrain
- [Web-bot-auth] Re: Vectors reproduced, a note on … Joshua Ashcroft
- [Web-bot-auth] Re: Vectors reproduced, a note on … ParallaxGrain