[CFRG] Re: Implementation review of "Blind BBS Signatures" (draft-irtf-cfrg-bbs-blind-signatures-02)
Greg Bernstein <gregb@grotto-networking.com> Wed, 27 May 2026 17:59 UTC
Return-Path: <gregb@grotto-networking.com>
X-Original-To: cfrg@mail2.ietf.org
Delivered-To: cfrg@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 3A992F61DA90 for <cfrg@mail2.ietf.org>; Wed, 27 May 2026 10:59:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1779904797; bh=Wej+8Cif8YAJPCxD7Hr9dwlDQ/2Tblcb+rosxMhvBvA=; h=Date:Subject:To:References:From:In-Reply-To; b=clrBIUVw9jTpXOhRCuf7a1CO388h7unU+s2mZucOdk7KQORivDJOjvGqbXC40vOku 7XKzL9S5XZCf98FFXtsHEllP8goJRYMLdVN+gYDWMvjRMZw6IObVGKgnAXk79ZHRjw Q3U4DESllsg+cP5Q3Cnrx9oXI2IF5LNKmr9me0EE=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.084
X-Spam-Level:
X-Spam-Status: No, score=-2.084 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, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, T_SPF_PERMERROR=0.01] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (1024-bit key) header.d=grotto-networking.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 X8dvKO8ZwC4o for <cfrg@mail2.ietf.org>; Wed, 27 May 2026 10:59:54 -0700 (PDT)
Received: from sender4-op-o12.zoho.com (sender4-op-o12.zoho.com [136.143.188.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 35B21F61BC8B for <cfrg@irtf.org>; Wed, 27 May 2026 10:53:09 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1779904379; cv=none; d=zohomail.com; s=zohoarc; b=LBiNPbtmEs/2/FMeM1v2vyTh4LMh+pzMPe13vjgHqqrshsuzuYJVu8C+0+FXhKi9xLiC4O6SFcleg4Du5amsPtzwgW3wssXrgK+h9xxHOejzq25demkFJLAyTmoPSiBBVAYvt/K3rFlZ9L/ER3RhOfEjHxjW3DBNALYheyPVytk=
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779904379; h=Content-Type:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=QOCHCstIZqh0mMAS8ekHnnv15ijbaqbBJg+n44ftiWo=; b=EK8DITsJHf6H8SbyoRtt6hXRcvUsY6eLYSw+kpQQDd6jYxJro7VZadL+SzBOFrnWCJU8qopGZNVhE+eQbGBs6mpeNzHfDpWkKFLN4qqE/hqm8OIFRwxbVFsNf5yPI7Y8kKGHRJEDbQKB2nkl7VX8svJZfjFFnRf8i5AdtfC2PiU=
ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=grotto-networking.com; spf=pass smtp.mailfrom=gregb@grotto-networking.com; dmarc=pass header.from=<gregb@grotto-networking.com>
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1779904379; s=mail; d=grotto-networking.com; i=gregb@grotto-networking.com; h=Message-ID:Date:Date:MIME-Version:Subject:Subject:To:To:References:From:From:In-Reply-To:Content-Type:Message-Id:Reply-To:Cc; bh=QOCHCstIZqh0mMAS8ekHnnv15ijbaqbBJg+n44ftiWo=; b=V8Hj7XkvFuCKnqGlOp3hcx8zN3xOXqgGvTzvW7KCY2hDqgEEZJKrWQmmUUQm8Zyx 9pDowaqoPLvBWTQKKu06QTIWu4y+o3l09cVX2PLpkahZHn2CQdnKtrlRvMO3QrqIhkQ 1/eBDHVeP4AJN3mBbzN9G6m13LM23xPgCMagbo6s=
Received: by mx.zohomail.com with SMTPS id 1779904376893457.38910888602265; Wed, 27 May 2026 10:52:56 -0700 (PDT)
Message-ID: <0b17d7d2-eda9-4a8b-b8a8-c2d1439c0df9@grotto-networking.com>
Date: Wed, 27 May 2026 10:52:56 -0700
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
To: cfrg@irtf.org
References: <CANMnvkyGFwJKU4t5eJUn5YTrX6kaQjcqnApEqwyCjde-E9xxrA@mail.gmail.com> <CANMnvkwx82vFUE9vbNHQm8U-ST=j6G_UXPfM7j8TtTsjnwTgRw@mail.gmail.com>
From: Greg Bernstein <gregb@grotto-networking.com>
Content-Language: en-US
Autocrypt: addr=gregb@grotto-networking.com; keydata= xjMEZwLKYRYJKwYBBAHaRw8BAQdA8IOoK17s6mGoiBSzwOyaOoGOgWU8OumDTSofGGhGQUjN LEdyZWcgQmVybnN0ZWluIDxncmVnYkBncm90dG8tbmV0d29ya2luZy5jb20+wo8EExYIADcW IQRLzhHbMKsLgNK7vMOLI64ixFJm8wUCZwLKYQUJBaOagAIbAwQLCQgHBRUICQoLBRYCAwEA AAoJEIsjriLEUmbz0NIA/iMpT0PHcvdfHGorTCR8wYfmafZ5dRgOyIknaepT9SEnAQDvNzl1 YT1LvhYiB+RqlMCXxCC96vkuoxlC5fuUm6pzB844BGcCymISCisGAQQBl1UBBQEBB0BbfXd2 chNynacbUQ/8JmIBWUcYSnBcAecizPRRLJOIQwMBCAfCfgQYFggAJhYhBEvOEdswqwuA0ru8 w4sjriLEUmbzBQJnAspiBQkFo5qAAhsMAAoJEIsjriLEUmbzlYgA/05UvcaXFGdkD+dFChBP 9+u0MbsGOkLdZTZQvEQamZWvAQDhiTGdsF40gJFVMg1H56/9r4cpjnymbociUXD2Bgg0Aw==
In-Reply-To: <CANMnvkwx82vFUE9vbNHQm8U-ST=j6G_UXPfM7j8TtTsjnwTgRw@mail.gmail.com>
Content-Type: multipart/signed; micalg="pgp-sha256"; protocol="application/pgp-signature"; boundary="------------UtNTJXmkTgp1DdmNnSaqsN3x"
X-Zoho-Virus-Status: 1
X-Zoho-AV-Stamp: zmail-av-0.2.2.1.5.2/279.897.12
X-ZohoMailClient: External
Message-ID-Hash: KESAVSRMWTFP7M73LBEVIYOTFD5RCA7X
X-Message-ID-Hash: KESAVSRMWTFP7M73LBEVIYOTFD5RCA7X
X-MailFrom: gregb@grotto-networking.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-cfrg.irtf.org-0; header-match-cfrg.irtf.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: [CFRG] Re: Implementation review of "Blind BBS Signatures" (draft-irtf-cfrg-bbs-blind-signatures-02)
List-Id: Crypto Forum Research Group <cfrg.irtf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/cfrg/A6LemSxNVNNz2M_ciBjK_zMtkDY>
List-Archive: <https://mailarchive.ietf.org/arch/browse/cfrg>
List-Help: <mailto:cfrg-request@irtf.org?subject=help>
List-Owner: <mailto:cfrg-owner@irtf.org>
List-Post: <mailto:cfrg@irtf.org>
List-Subscribe: <mailto:cfrg-join@irtf.org>
List-Unsubscribe: <mailto:cfrg-leave@irtf.org>
Thanks Emil. And thanks for the PRs on the drafts. We will try to get an update out in a week or two. Best Regards Greg B. On 5/27/26 05:21, Emil Lundberg wrote: > One more thing I noticed now: > > Substantive but editorial issues: > - In "Test Vectors", the "Generators" and "Blind Generators" sections > spell the attribute generators `H_0 ... H_9` and `J_0 ... J_9` while > both draft-irtf-cfrg-bbs-signatures-10 > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-signatures-10.html#name-message-generators-2> > and the rest of draft-irtf-cfrg-bbs-blind-signatures-02 spells them > `H_1 ... H_10` and `J_1 ... J_10`. > > Emil Lundberg > > Staff Engineer | Yubico <http://www.yubico.com/> > > > > > Den tis 26 maj 2026 kl 22:28 skrev Emil Lundberg <emil@yubico.com>: > > Hi, > > I've recently been implementing "Blind BBS Signatures" > (draft-irtf-cfrg-bbs-blind-signatures-02) > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html> > [1] and would like to share some issues I found. > > Interoperability issues: > > - In `FinalizeBlindSign`, the statement `3. if L <= 0 or M <=0, > return INVALID` fails for the BLS12-381-SHA-256 signature test > vector "valid no prover committed messages, no signer messages > signature" > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-no-prover-committed-m> > [3]. This should presumably be `if L < 0 or M < 0`? > > - In `FinalizeBlindSign`, the description of `blind_generators` > states it defaults to empty array, but the procedure requires that > `M > 0` which fails if `blind_generators` is empty. (This is > obviously related to the previous issue) > > - In `BlindProofGen`, something seems to be wrong when > `secret_prover_blind` is null. I have not been able to reproduce > nor verify the proof test vector "9.1.5.8. valid all prover > committed messages and signer messages revealed proof" > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-all-prover-committed-m> [2]. > > It seems to me like either the `prepare_parameters` call needs > to return one fewer generator (because it skips returning > `secret_prover_blind` as a message scalar), or the > `secret_prover_blind` generator needs to be omitted from > `generators` before passing it to `BBS.CoreProofGen`, but it may > also be something else. I haven't found a way to match the test > vectors, so I'm not sure what correction is needed. > > - In `prepare_parameters`, the description of > `secret_prover_blind` states it defaults to zero, but the > procedure checks `3. if secret_prover_blind != NONE;`. It can't be > "NONE" at this point if it defaults to zero. Perhaps this should > be `if secret_prover_blind != 0;`, but I'm not sure that's correct > either. (This is related to the previous issue) > > - I have been able to verify the `signature` of all of the > "Signature Test Vectors", but not reproduce any of the `signature` > values. My `BlindSign` outputs verify correctly with my > `VerifyBlindSign` implementation, and my `BlindSign` > implementation produces the same `B` and `domain` values shown as > "Trace:" in the test vectors, so the only reason I can imagine for > failing to reproduce the signatures is that there is some > difference between how my `FinalizeBlindSign` implementation > hashes to `e` and how the test vectors hash to `e`. > > - In general I think there are too many optional parameters, > especially in the internal procedures. I don't think the defaults > seem particularly useful, which weighs poorly against the very > real opportunity for misalignments (see the `secret_prover_blind` > issue above) and misinterpretations that defaults introduce. (I > gave a similar critique of optional parameters in > draft-irtf-cfrg-bbs-signatures-08 > <https://mailarchive.ietf.org/arch/msg/cfrg/2XuK5BoAy-WjKWjzWM3O19Vry6g/> > earlier). > > > Substantive but editorial issues: > > - In the return statement of the `Commit` procedure, the > `committed_message_scalars` and `blind_generators` arguments are > in reverse order compared to the `CoreCommit` procedure definition. > - In `BlindProofVerify`, descriptions of > `disclosed_committed_messages` and `disclosed_committed_indexes` > are missing. > - In `CoreCommit`, the "Outputs:" definition is missing. > - In `CoreCommit`, `1. M = length(committed_messages)` references > a variable `committed_messages` which does not exist. Should > probably be `committed_scalars`? > - In `prepare_parameters`, descriptions of `generators_number` and > `blind_generators_number` are missing. > - In `calculate_blind_challenge`, the "Outputs:" definition is > missing. > - In the "Blind Generators" subsection of "Test Vectors", `Q1` > should probably be `Q2` (`Q_2`)? Q_1 is consistently used in the > procedures to denote non-blind generators. > - In "Signature Test Vectors" for BLS12-381-SHA-256, "valid no > prover committed messages, multiple signer messages signature", > the "Trace:" appears to have mislabeled the `B` value as `domain > =`. I don't know what the value labeled `B =` is, either. > - Section "9.1.5.8. valid all prover committed messages and signer > messages revealed proof" has the same title as "9.1.5.1. valid all > prover committed messages and signer messages revealed proof" > which does not seem to accurately describe the test vector values > in 9.1.5.8 (not all signer messages are revealed). > - In test vectors with arrays of multiple values (for example > `committedMessages`), the formatting is very poor and it's easy to > miss trailing empty octet strings. Ideally, values that fit on one > line should not be line-wrapped and each value should be delimited > clearly so that empty octet strings are clearly visible. For > example, consider using CDDL syntax > <https://www.rfc-editor.org/info/rfc8610/> [5] > (`h'5982967821da3c5983496214df36aa5e58de6fa25314af4cf4c00400779f08c3'`) > for test vector values (this allows internal whitespace, and would > also enable disambiguating octet strings and hex-encoded large > integers, among other things). > - A few more obvious or unambiguous errors, I have opened pull > requests on GitHub to fix these: #14 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/14>, > #15 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/15>, > #16 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/16>, > #17 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/17>, > #18 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/18>, > #19 > <https://github.com/cfrg/draft-irtf-cfrg-bbs-blind-signatures/pull/19>. > > Subjective style comments: > > - The `Commit` procedure seems like it's part of the "public" > interface, so it seems like it shouldn't expose `api_id` as a free > parameter (instead letting it be fixed by the ciphersuite, like > `BlindSign` etc.)? > - The `deserialize_and_validate_commit` procedure seems more like > an "internal" procedure, so it should perhaps be under "Core > Operations" or "Utilities"? Its current position alongside > `Commit` makes it seem equally "public". > - In the "Test Vectors" section, this document has the subsections > in the order [SHA-256, SHAKE-256] while > draft-irtf-cfrg-bbs-signatures-10 has them in opposite order. This > may be an opportunity for confusion. > - In the "Generators" subsection of "Test Vectors", perhaps it's > worth pointing out that `P1` is the same `P1` as in > draft-irtf-cfrg-bbs-signatures-10 but `Q1` is NOT the same (since > it's generated by a different `api_id`)? > - In the "Blind Generators" subsection of "Test Vectors", does P1 > need to be repeated from the preceding "Generators" section? Also > it doesn't quite seem at home in either section since it's > generated by its own separate DSTs in `create_generators`. > - In the "Test Vectors" section, it's not always obvious which > values are inputs and which are outputs: > - In "Commitment", the position of `proverBlind` alongside > `committedMessages` makes it look like `proverBlind` is an input. > - In the "Proof Test Vectors" section, the listings of > `revealedMessages` and `revealedCommittedMessages` are a bit > misleading, since the test needs to repeat _all_ the `messages` > and `committedMessages` from "Signature Test Vectors". Consider > instead repeating (or explicitly refering back to) `messages` and > `committedMessages` and explicitly listing `disclosed_indexes` and > `disclosed_commitment_indexes` as separate values. > - In the "Proof Test Vectors" section, `commitmentWithProof` and > `proverBlind` seem like unnecessary inputs (they are already > covered by the signature)? > - In the "Test Vectors" section, variables are spelled differently > than they are elsewhere. This is not a big problem, but it makes > it harder to search for the values throughout and between > documents if they are not consistently spelled: > - `Q1` is consistently spelled `Q_1` elsewhere in both this > document and in draft-irtf-cfrg-bbs-signatures-10 > - `committedMessages` is spelled `committed_messages` elsewhere > - `proverBlind` is spelled `secret_prover_blind` elsewhere > - `commitmentWithProof` is spelled `commitment_with_proof` > elsewhere > - `s_tilde` and `m_tildes` are spelled `s~` and `m~` (`m~_i`) > elsewhere > - `secretKey` and `publicKey` are spelled `SK` and `PK` elsewhere > - `signerPublicKey` is spelled `PK` elsewhere > - `presentationHeader` is spelled `presentation_header` elsewhere > - `revealedMessages` is spelled `disclosed_messages` elsewhere > - `revealedCommittedMessages` is spelled > `disclosed_committed_messages` elsewhere > - `r_1`, `r_2`, `e_tilde`, `r1_tilde` and `r3_tilde` are > spelled `r1`, `r2`, `e~`, `r1~` and `r3~` in > draft-irtf-cfrg-bbs-signatures-10 (though not in its test vectors > section, hmm...) > - `m_tilde_scalars` is spelled `m~` (`m~_i`) elsewhere > - In the "Commitment" subsections, `seed` and `dst` are > spelled differently from `SEED` and `DST` in > draft-irtf-cfrg-bbs-signatures-10 > - In the "Commitment" subsections of "Test Vectors", perhaps it > would be appropriate to reference section "8.1. Mocked Random > Scalars" of draft-irtf-cfrg-bbs-signatures > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-signatures-10.html#name-mocked-random-scalars> [4] > for what `seed` and `dst` should be used for? > > Thank you for your consideration and for your work on the draft! > Please let me know if I can help in some way. > > [1]: > https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html > [2]: > https://www.ietf.org/archive/id/dhttps://www.rfc-editor.org/info/rfc8610/https://www.rfc-editor.org/info/rfc8610/raft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-all-prover-committed-m > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-all-prover-committed-m> > [3]: https://www.ietf.o"valid no prover committed messages, no > signer messages > signature"rg/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-no-prover-committed-m > <https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-blind-signatures-02.html#name-valid-no-prover-committed-m> > [4]: > https://www.ietf.org/archive/id/draft-irtf-cfrg-bbs-signatures-10.html#name-mocked-random-scalars > [5]: https://www.rfc-editor.org/info/rfc8610/ > > Emil Lundberg > > Staff Engineer | Yubico <http://www.yubico.com/> > > > > _______________________________________________ > CFRG mailing list --cfrg@irtf.org > To unsubscribe send an email tocfrg-leave@irtf.org -- ------------------------------------------------------------------------ Dr. Greg M. Bernstein, https://www.grotto-networking.com ​
- [CFRG] Implementation review of "Blind BBS Signat… Emil Lundberg
- [CFRG] Re: Implementation review of "Blind BBS Si… Emil Lundberg
- [CFRG] Re: Implementation review of "Blind BBS Si… Greg Bernstein