Skip to content

Commit 02a299c

Browse files
committed
Add AnonCreds v2 relationship section to the spec and README
1 parent ffe2047 commit 02a299c

2 files changed

Lines changed: 51 additions & 2 deletions

File tree

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,14 @@ The standards boundary is intentional:
8080
- The JSON-LD layer borrows the document-processing shape of `bbs-2023`, but uses distinct
8181
cryptosuite identifiers and proof envelopes. A credkit proof is deliberately not a
8282
`bbs-2023` proof.
83+
- The architecture — BBS credentials over a blind-signed link secret, hidden-message equality,
84+
predicates, accumulator revocation, one merged challenge — is shared with
85+
[AnonCreds v2](https://github.com/anoncreds/anoncreds-v2-rs), which served as credkit's
86+
architecture reference. The two share no bytes at any layer: credkit sits on the IETF BBS
87+
wire format, fills the predicate and accumulator-proof slots differently, and packages
88+
results as JSON-LD credentials. The
89+
[draft specification](https://tmarkovski.github.io/credkit/#relationship-to-anoncreds-v2)
90+
records the full comparison.
8391

8492
The draft is a reviewable description of the construction, not a standards-track proposal. It
8593
covers the composite presentation and predicate layers and summarizes the JSON-LD integration.

docs/draft-credkit-composite-proofs.md

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,39 @@ This document is not, however, an instantiation of either draft, for three reaso
159159
Should those drafts mature to cover BLS12-381 and statement composition, re-aligning this layer's
160160
transcript with them would be a natural future revision.
161161

162+
## Relationship to AnonCreds v2 {#relationship-to-anoncreds-v2}
163+
164+
The construction this document describes is architecturally the same as AnonCreds v2, whose Rust
165+
implementation [@?ANONCREDS-V2] served as the architecture reference for the composite layer. The
166+
feature sets coincide almost exactly: multi-message BBS credentials, blind issuance over a
167+
holder-chosen link secret, selective disclosure, equality of hidden messages across credentials,
168+
predicates over hidden signed values, accumulator-based revocation, and the composition of all of
169+
these statements into one presentation. Two of its design decisions are adopted here directly: the
170+
Pedersen indirection that decouples a predicate backend from the signature proof (see
171+
(#binding-a-predicate-to-a-signature)), and the integer message encoding that makes predicates
172+
over signed values possible at all (see (#numeric-messages)).
173+
174+
The two systems nonetheless share no bytes at any layer (all observations are as of crate
175+
`credx` 0.2.1):
176+
177+
| Layer | AnonCreds v2 | credkit |
178+
|---|---|---|
179+
| BBS core | A vendored pre-IETF BBS from the academic short-group-signature lineage: its own generator derivation, Merlin transcript labels, no ciphersuite identifiers | [@!I-D.irtf-cfrg-bbs-signatures] unchanged, verified byte-for-byte against its test vectors |
180+
| Blind issuance | Classic BBS+ blind signing — a G1 commitment with a Schnorr proof, predating the IETF draft | The `Commit`/`BlindSign` flow of [@!I-D.irtf-cfrg-bbs-blind-signatures] |
181+
| Predicates | Bulletproofs range proofs over 64-bit ranges | CCS signed-set membership and digit decomposition [@CCS08] (see (#predicates-over-hidden-messages)) |
182+
| Non-revocation | The same positive VB accumulator [@VB20], proven with the paper's own membership protocol (additional generators, prover GT arithmetic) | The same accumulator, proven with the CDH weak-BB protocol (see (#cdh-membership-proof-and-bbs-binding)) |
183+
| Transcript | Merlin | The labeled transcript of (#the-merged-fiat-shamir-transcript), kept in the BBS `hash_to_scalar` family |
184+
| Envelope | A bespoke presentation format | W3C Verifiable Credentials and Presentations secured by Data Integrity proofs (see (#the-cryptosuite-layer)) |
185+
186+
Every intermediate value consequently diverges — generators, domain separation, challenges, wire
187+
encodings — so neither implementation can serve as a test oracle for the other, and no
188+
interoperability between them is possible or intended. Cross-checking is structural only: the same
189+
statement composition, the same equality mechanic, the same protocol shapes. The comparison also
190+
runs the other way: AnonCreds v2 provides verifiable encryption of hidden messages toward a
191+
designated third party, which credkit does not implement. The relationship is fairly summarized
192+
as: the AnonCreds v2 architecture, re-derived over the IETF BBS wire format and packaged as
193+
JSON-LD credentials, with the predicate and accumulator-proof slots filled differently.
194+
162195
## Terminology
163196

164197
Holder, Issuer, Verifier, Prover, and the BBS operation names (`Sign`, `Commit`, `BlindSign`,
@@ -310,8 +343,8 @@ messageToScalar(suite, message):
310343
return hash_to_scalar(message, api_id || "MAP_MSG_TO_SCALAR_AS_HASH_")
311344
```
312345

313-
This is the same technique AnonCreds uses for its attribute encoding, and it is the only change
314-
to the signing path. Bytes messages are unaffected and continue to reproduce the BBS vectors.
346+
This is the same technique AnonCreds uses for its attribute encoding (see
347+
(#relationship-to-anoncreds-v2)), and it is the only change to the signing path. Bytes messages are unaffected and continue to reproduce the BBS vectors.
315348
The consequences for predicate semantics — that predicates are modular, and that honest values
316349
must be encoded well below `r` for the natural comparison to hold — are discussed in
317350
(#modular-predicate-semantics). A predicate MUST reference a message that was signed as an
@@ -1377,6 +1410,14 @@ This document has no IANA actions. It defines no new registries and requests no
13771410
</front>
13781411
</reference>
13791412

1413+
<reference anchor="ANONCREDS-V2" target="https://github.com/anoncreds/anoncreds-v2-rs">
1414+
<front>
1415+
<title>AnonCreds v2 Rust implementation (crate credx)</title>
1416+
<author><organization>AnonCreds Project</organization></author>
1417+
<date year="2026"/>
1418+
</front>
1419+
</reference>
1420+
13801421
<reference anchor="FrozenHeart" target="https://blog.trailofbits.com/2022/04/13/part-1-coordinated-disclosure-of-vulnerabilities-affecting-girault-bulletproofs-and-plonk/">
13811422
<front>
13821423
<title>The Frozen Heart vulnerability in Fiat-Shamir implementations</title>

0 commit comments

Comments
 (0)