Skip to content

1/OPENAC: tracking — verifier-side profile boundary clarifications #89

@cc03668

Description

@cc03668

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.

cc @oskarth @vplasencia

Checklist

  • 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions