You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This issue was originally opened as privacy-ethereum/zkspecs#22. It is preserved here verbatim because cross-org issue transfer required permissions the original author doesn't hold. The original issue has been closed with a pointer back to this one.
Context
This issue tracks open verifier-profile questions for 1/OPENAC
(added in privacy-ethereum/zkID#88; supersedes the earlier draft at zkspecs#21).
The OpenAC spec defines proof-bundle handling and a current SD-JWT-P256 profile. While reviewing the implementation surface, several
verifier-facing semantics appear to be implicit in the PoC, delegated to
the caller, or not yet specified as normative rejection rules. If these
are not made explicit, different verifier integrations could accept
different presentations, interpret the same public inputs differently,
or accidentally accept presentations that are cryptographically valid
but semantically unsafe.
This issue collects each item so we can decide, per question, whether it
belongs in 1/OPENAC, the SD-JWT-P256 profile, or deployment policy.
1. Core vs profile vs deployment policy. What exactly belongs
in OPENAC, SD-JWT-P256, and application/deployment code? Risk: App developers may think the SDK performs full verifier
validation when it only verifies proofs.
2. Issuer trust and JOSE validation. Does the profile require alg=ES256, reject alg=none, resolve kid, and bind issuer keys
to iss / credential type / trust policy? Risk: A verifier may prove the credential was signed by some key,
not a trusted issuer key.
3. Audience / verifier binding. Is the challenge bound to a
verifier identity, audience, origin, session, or policy hash? Risk: Verifier A could forward a holder's valid presentation to
Verifier B.
4. Challenge freshness / replay. What are the minimum nonce
entropy, TTL, single-use, and replay-cache requirements? Risk: Verifiers may accept stale, reused, or predictable challenges.
5. ECDSA encoding and malleability. Are signatures required
to be raw r || s? Is DER rejected? Are high-S signatures accepted
or rejected? Risk: Different libraries/verifiers may disagree on whether the
same presentation is valid.
6. Disclosure digest and ordering. Are disclosure digests
computed over exact raw disclosure bytes? Does disclosure ordering
affect claim slots? Risk: Implementations may hash different bytes or assign claims to
different slots.
7. Claim slot mapping. How does the verifier know that claimRef = 0 means a specific claim name/path? Risk: A proof may show that some scalar satisfies a predicate, but
not that the intended credential claim does.
8. Claim normalization. Are bool, uint, iso_date, roc_date,
and string parsing rules normative for SD-JWT-P256? Risk: Different SDKs may normalize the same credential differently.
9. compareValue and valueBits. Are comparisons unsigned 64-bit
integer comparisons? Are overflow, negative values, and unsupported
type/operator pairs rejected? Risk: Circuit comparisons may not match application-level semantics.
10. Challenge hash vs circuit scalar. Is SHA-256(UTF8(challenge)) mod q_P256 only the circuit scalar
encoding, distinct from the ECDSA signing input? Risk: Implementers may sign/verify different bytes than the circuit
expects.
11. Proof validity vs policy acceptance. Does the SDK return
proof validity separately from expression_result / authorization
result? Risk: Apps may treat "proof verified" as "policy satisfied."
12. Device public key exposure. Is exposing deviceKeyX/Y
intended long-term behavior or only a current implementation artifact? Risk: A stable device public key may become a verifier-observable
tracking identifier.
13. Version semantics. Does version identify
profile/proof-bundle semantics, not SDK release metadata? Risk: Verifiers may use the wrong verifying key, circuit params,
or profile semantics.
14. Conformance / negative tests. Can we add negative verifier
fixtures for malformed JOSE headers, wrong issuer binding,
stale/reused challenge, wrong audience, DER/high-S signatures, wrong
claim slots, invalid normalization, and overflowed compareValue? Risk: Downstream integrations will each invent their own verifier
behavior.
Acceptance
For each item, the resolution should classify it as one of:
CORE: normative in 1/OPENAC
PROFILE: normative in SD-JWT-P256 profile
POLICY: explicitly delegated to deployment, with required
fail-closed behavior in the SDK when the policy input is missing
Items resolved as CORE or PROFILE land as PRs against specs/1-openac/.
Items resolved as POLICY land as documentation/SDK changes elsewhere.
Context
This issue tracks open verifier-profile questions for
1/OPENAC(added in privacy-ethereum/zkID#88; supersedes the earlier draft at
zkspecs#21).The OpenAC spec defines proof-bundle handling and a current
SD-JWT-P256profile. While reviewing the implementation surface, severalverifier-facing semantics appear to be implicit in the PoC, delegated to
the caller, or not yet specified as normative rejection rules. If these
are not made explicit, different verifier integrations could accept
different presentations, interpret the same public inputs differently,
or accidentally accept presentations that are cryptographically valid
but semantically unsafe.
This issue collects each item so we can decide, per question, whether it
belongs in
1/OPENAC, theSD-JWT-P256profile, or deployment policy.cc @oskarth @vplasencia
Checklist
in OPENAC, SD-JWT-P256, and application/deployment code?
Risk: App developers may think the SDK performs full verifier
validation when it only verifies proofs.
alg=ES256, rejectalg=none, resolvekid, and bind issuer keysto
iss/ credential type / trust policy?Risk: A verifier may prove the credential was signed by some key,
not a trusted issuer key.
verifier identity, audience, origin, session, or policy hash?
Risk: Verifier A could forward a holder's valid presentation to
Verifier B.
entropy, TTL, single-use, and replay-cache requirements?
Risk: Verifiers may accept stale, reused, or predictable challenges.
to be raw
r || s? Is DER rejected? Are high-S signatures acceptedor rejected?
Risk: Different libraries/verifiers may disagree on whether the
same presentation is valid.
computed over exact raw disclosure bytes? Does disclosure ordering
affect claim slots?
Risk: Implementations may hash different bytes or assign claims to
different slots.
claimRef = 0means a specific claim name/path?Risk: A proof may show that some scalar satisfies a predicate, but
not that the intended credential claim does.
and string parsing rules normative for SD-JWT-P256?
Risk: Different SDKs may normalize the same credential differently.
integer comparisons? Are overflow, negative values, and unsupported
type/operator pairs rejected?
Risk: Circuit comparisons may not match application-level semantics.
SHA-256(UTF8(challenge)) mod q_P256only the circuit scalarencoding, distinct from the ECDSA signing input?
Risk: Implementers may sign/verify different bytes than the circuit
expects.
proof validity separately from
expression_result/ authorizationresult?
Risk: Apps may treat "proof verified" as "policy satisfied."
deviceKeyX/Yintended long-term behavior or only a current implementation artifact?
Risk: A stable device public key may become a verifier-observable
tracking identifier.
versionidentifyprofile/proof-bundle semantics, not SDK release metadata?
Risk: Verifiers may use the wrong verifying key, circuit params,
or profile semantics.
fixtures for malformed JOSE headers, wrong issuer binding,
stale/reused challenge, wrong audience, DER/high-S signatures, wrong
claim slots, invalid normalization, and overflowed
compareValue?Risk: Downstream integrations will each invent their own verifier
behavior.
Acceptance
For each item, the resolution should classify it as one of:
1/OPENACSD-JWT-P256profilefail-closed behavior in the SDK when the policy input is missing
Items resolved as CORE or PROFILE land as PRs against
specs/1-openac/.Items resolved as POLICY land as documentation/SDK changes elsewhere.