identity: the SD-JWT form of an AERE hybrid identity is judged on its ML-DSA-65 half by default, the Ed25519 half only on explicit request, and every verdict says postQuantum (rule sdjwt.hybrid-half); pq-pki: the signature algorithm a certificate or a revocation list declares must be its issuer key's (ALG_KEY, CRL_ALG_KEY); agents: an equivocation proof requires the agent's ML-DSA-65 key; pq-gateway: the status names the path to the backend and hybrid-only refuses a plain-HTTP backend; conformance 241 rules, 631 vectors

This commit is contained in:
Aere Network 2026-10-19 05:19:21 +03:00
parent 3ff21f7758
commit 0c8f1de3fd
122 changed files with 1205 additions and 262 deletions

View File

@ -1,7 +1,7 @@
# Citations in this repository that you cannot open
This file is generated by the publication stager of this repository (scripts/legaturi-declaratie.cjs in the Aere working
tree) and enforced by legaturi.cjs. It is the complete list, measured on 2026-10-18, of every path cited in this
tree) and enforced by legaturi.cjs. It is the complete list, measured on 2026-10-19, of every path cited in this
repository that does not resolve to a published file.
A citation is a promise that a claim is checkable. Where the target is not published, or names a file the reader creates

View File

@ -22,7 +22,7 @@ notarization command of the verification layer and for the agents' x402 wallet (
| [`market-settlement/`](market-settlement/) | the dispute and settlement rail of a verifiable infrastructure market, measured end to end on testnet 28001: an order with its reward in escrow and a provider bond, the result committed on chain with its execution envelope notarized under a post-quantum certified anchor, a challenge window in which anyone disputes with a recomputed result and a bond, an arbiter that can only route the escrow (with a permissionless 14-day timeout), deadline reclaims, and an AIP-23 settlement receipt; a pure judge over the job's timeline that checks deadlines, the window, who resolved, the payout, the replay and the proof |
| [`verifiable-data/`](verifiable-data/) | a dataset whose every answer is checkable against a short commitment without the data: RFC 9162 commitments per version (append-only, consistency proofs), equality and range queries proven correct AND complete (contiguous run of a sorted index plus its two neighbours), hash-based selective disclosure of fields, availability sampling against the serving endpoint, and the version's AIP-23 envelope notarized and read back under a post-quantum certified anchor; not zero knowledge, and says so |
| [`ai-trust/`](ai-trust/) | the trust chain of an AI result: the agent's identity (agents/), the model artifact's attestation, the host's runtime record (verify-layer/), the policy and signed ledger, the Proof of AI envelope and the chain as witness, joined in one bundle whose verifier checks only the links between them |
| [`conformance/`](conformance/) | a conformance suite for the AIP-23 proof kinds: one verdict form over the verifiers published here (four levels: integrity, authenticity, anchoring, finality; each passed, failed or not measured, with the named rule), 240 rules of fifteen verifiers read from their code (the presentation verifier of identity/ and the device verifier of device-identity/ among them since 2026-10-05; the SD-JWT, SD-JWT VC, Travel Rule and compliance-policy verifiers since 2026-10-18, so nothing of identity/ is left out), 626 vectors derived from the producers and from evidence recorded on testnet 28001 (each invalid one is one operation away from one that is not, or one change at its producer, and must be refused for exactly its named rules), and a runner that scores any implementation given as a command, in any language; a second implementation in Python covers 6 of the 240 rules. Not a certification and not an audit |
| [`conformance/`](conformance/) | a conformance suite for the AIP-23 proof kinds: one verdict form over the verifiers published here (four levels: integrity, authenticity, anchoring, finality; each passed, failed or not measured, with the named rule), 241 rules of fifteen verifiers read from their code (the presentation verifier of identity/ and the device verifier of device-identity/ among them since 2026-10-05; the SD-JWT, SD-JWT VC, Travel Rule and compliance-policy verifiers since 2026-10-18, so nothing of identity/ is left out), 631 vectors derived from the producers and from evidence recorded on testnet 28001 (each invalid one is one operation away from one that is not, or one change at its producer, and must be refused for exactly its named rules), and a runner that scores any implementation given as a command, in any language; a second implementation in Python covers 6 of the 241 rules. Not a certification and not an audit |
| [`identity/`](identity/) | post-quantum credentials: an issuer signs claims (hybrid Ed25519 + ML-DSA-65, both required), the holder shows only the claims it picks (selective disclosure in the manner of SD-JWT, RFC 9901, in a format of its own), bound to the verifier's audience and nonce; delegation to a phone, an agent or a ten-minute session key that can only narrow; revocation and an issuer status list in the manner of W3C Bitstring Status List; all checked offline from the files; and compliance without surveillance: a verifier's policy (issuers, required claims) judged on a presentation, recorded as an AIP-23 envelope that carries no personal data; and the Travel Rule between VASPs, the IVMS101 data sealed for the receiving VASP with a hybrid X25519 + ML-KEM-768 key encapsulation, signed, bound to the transfer and acknowledged; and the same credentials as standard SD-JWT (IETF RFC 9901): issued with the issuer's Ed25519 key (EdDSA) or its ML-DSA-65 key, presented with a key binding JWT, and verified against the RFC's own example vectors and, since 2026-10-18, interoperable in both directions with a foreign library (@sd-jwt/core 0.23.0 with jose 6.2.12, ML-DSA-65 included; `interop/`), plus the SD-JWT VC profile (draft-ietf-oauth-sd-jwt-vc-19, `dc+sd-jwt`, `vct`, a Token Status List judged offline) (`identity-cli.mjs verify-sdjwt`, behind Aere Cloud's POST /v1/identity/sd-jwt/verify, and `verify-sdjwt-vc`) |
| [`device-identity/`](device-identity/) | what a machine is, as a chain of signed statements checked offline: the manufacturer's credential for the device key (the manufacturer and the owners sign hybrid, Ed25519 + ML-DSA-65, both required; the device key is ML-DSA-65), a firmware release with a floor and retractions (a rolled-back or retracted firmware is refused), ownership by transfers each signed by the owner before, the current owner's authorization, a status registry in which the manufacturer's retirement is final and an owner's lasts as long as its ownership (after a sale the records of the previous owner are named and not applied: a seller could date one before the sale after it; a retirement by an owner that survives a sale needs a witness of time that is not built), and the device's fresh attestation to the verifier's nonce, with an AIP-23 envelope that can be notarized and read back under a post-quantum certified anchor; one verifier makes every check it can reach, names every rule that refused and says VALID, PARTIAL (what it was not handed, or could not read) or INVALID. The device key is a software key: no TPM, secure element or TEE is used or checked, and the README says what that leaves open |
| [`exposure-report/`](exposure-report/) | classifies Bitcoin and Ethereum addresses by whether their public key is already readable from chain data, in three declared modes (offline, by address or script type only; through your own Electrum server, Esplora index, Bitcoin Core or Ethereum JSON-RPC, one declared target; through a third-party provider only with written consent, recorded in the report), with exactly two labels ("exposed (on-chain evidence)", "no on-chain evidence of exposure") and "unmeasured" when the reading did not happen, the evidence named for each address, and a dated report (JSON, Markdown, an AIP-23 `compliance` envelope that binds the JSON). It records what was readable on the date of the report: it does not protect, move or recover any coins, it does not change what a spend reveals, and it says nothing about the future. The one component with npm dependencies (`@noble/hashes`, `@noble/curves` 1.x: `npm install --ignore-scripts` in its directory) |
@ -37,23 +37,23 @@ test, counts as a failure of the control. Results measured on 2026-09-29 (Node.j
| component | tests | negative control |
|---|---|---|
| pq-gateway | 33/33 (`node proba-pq-gateway.mjs`) | 33/33 (`bash proba-pq-gateway-control-negativ.sh`) |
| pq-gateway | 35/35 on 2026-10-19 (`node proba-pq-gateway.mjs`; the status names the path to the service behind the gateway: its mode, minimum TLS version and groups, and `AERE_PQGW_UPSTREAM_MODE=hybrid-only` refuses a plain-HTTP backend) | 37/37 (`bash proba-pq-gateway-control-negativ.sh`) |
| pq-kms | 62/62 (`node test/proba.mjs`); HSM root on SoftHSM2 + OpenSC 20/20 (`pq-kms/test/proba-hsm.mjs`, Linux); sealed-file trust rules 7/7 (`pq-kms/test/proba-hsm-incredere.mjs`) | 16/16 (`node test/control-negativ.mjs`); sealed-file rules 2/2 in this repository (`pq-kms/test/control-negativ-hsm-incredere.mjs`) |
| pq-secrets | 43/43 on 2026-10-18 (`node test/proba-secrete.mjs`: the whole flow with keys born at run time, each refusal by name, a presentation signed for one request refused on any other, grant attenuation, the same refusal for every unauthorized caller, concurrent writes, rotation, revoked versions, the value searched for as a string in the log and on disk, the log intact after 100 operations, every envelope VALID for the AIP-23 reference verifier when `AERE_VERIFY_PROOF` names it, otherwise skipped by name); an adversarial review ran more than sixty attacks before publication, and the three that still succeed are limits written in the README | 43/43 on 2026-10-18 (`node test/control-negativ-secrete.mjs`: each guard planted out in a copy, the named checks must fail; `--autoproba` 5/5) |
| pq-pki | 27/27 (`node test/proba.mjs`), each verdict compared with OpenSSL 3.5 | 22/22 (`node test/control-negativ.mjs`) |
| pq-pki | 28/28 on 2026-10-19 (`node test/proba.mjs`), each verdict compared with OpenSSL 3.5; since 2026-10-19 the signature algorithm a certificate or a revocation list declares must be its issuer key's | 26/26 (`node test/control-negativ.mjs`) |
| crypto-inventory | 68/68 (`node test/proba.mjs`, measured 2026-10-18 with the Rust, Swift and Kotlin detectors, glob imports, libcrux, BoringSSL, the libsignal Java/Node/Swift/Android APIs, CryptoKit, CommonCrypto, Security.framework, Android Keystore, Tink and OkHttp included); cost on hostile input 13/13 linear (`node test/proba-timp.mjs`) | 35/35 (`node test/control-negativ.mjs`); cost 5/5 in this repository (`node test/control-negativ-timp.mjs`; its fourth case compares with version 0.1.0 from the development history and is skipped here) |
| verify-layer | 45/45 with the AIP-23 reference verifier, measured from a fresh clone on 2026-10-18 (`AERE_VERIFY_PROOF=<verify-proof.mjs> node proba-sidecar.mjs`, where verify-proof.mjs is the one served at aere.network/tools with verify-anchor.mjs, mpt.mjs, falcon512.mjs, registry-v3.mjs and package.json beside it and `npm install` done there; verify-proof.mjs alone gives 41/45, because the four finality checks need the anchor verifier); without it 40 run, 5 are reported as skipped and the exit code is 2; the cloud adapters 60/60 with the same verifier on 2026-10-18 (`node proba-adaptoare-cloud.mjs`: nine fixtures derived from the vendors' documented CLI and REST examples by `fixturi-cloud/deriva.mjs`; without the verifier 59 run and one is skipped; a real account is unmeasured and the README says so); the Merkle tree 20/20 (`node proba-arbore.mjs`: the reference roots of Certificate Transparency, every proof up to 64 leaves, each attack), measured 2026-09-30 | 37/37 from a fresh clone of this repository on 2026-10-18 (`node control-negativ-sidecar.mjs`: the ten original plantings plus the cloud adapter rules; the case that compares with the development history is skipped here, and is the 38th in the development tree); the tree 14/14 (`node control-negativ-arbore.mjs`) |
| proof-kinds | 28/28 on 2026-10-18 with the same verifier (`AERE_VERIFY_PROOF=... node proba-proof-kinds.mjs`: fifteen kinds, the allowed values of the `secret-access` fields included) | seven negative controls inside the test |
| readiness | 6/6 (`node proba-adrese-private.mjs`: the private-address rules, and a local listener no scan may touch) | the rate limit and the queue bound are tested where the service runs, not here (its README says so) |
| control-plane | planner 44/44 (2026-10-18: a key agreement or a client-side TLS configured by the application itself is not routed to the TLS gateway; a self-signed trust anchor is blocked, not "automatic through PKI"; test code is LOW with its own scope), command line 10/10, execution 30/30 on real products started locally, remediation 33/33 on real TLS servers (all five server profiles measured end to end on 2026-10-18: nginx, Apache, HAProxy, Node, Go), compliance report 30/30 (with the AIP-23 verifier; test-code findings are counted apart and are not "exposed today"), console 8/8; the console viewer in a real Chromium, phone and desktop, 26/26 (`node proba-consola-web.mjs`, measured 2026-09-30; needs `playwright-core` and a Chromium, otherwise it exits 2) | remediation 7/7, compliance report 3/3 in this repository; viewer 8/8 (`node control-negativ-consola-web.mjs`) |
| identity | 52/52 (`node proba-identity.mjs`, a presentation optionally signed for one exact request (`request`) included, with the AIP-23 verifier for its envelope test; without it that test is reported as skipped and the exit code is 2), compliance 18/18 (`node proba-conformitate.mjs`) and Travel Rule 20/20 (`node proba-travel-rule.mjs`) with the same verifier (without it each reports one test unmeasured and exits 2; 2026-10-18: a missing originator id or nonce is a refusal, found when the verifier was enrolled in the conformance suite), SD-JWT 25/25 (`node proba-sdjwt.mjs`, the RFC 9901 vectors and fixtures derived from @sd-jwt/core 0.23.0 included), SD-JWT VC 10/10 (`node proba-sdjwt-vc.mjs`); interoperability with @sd-jwt/core and jose in both directions 26/26 and 28/28 (`interop/`, with those libraries installed in a folder you name; otherwise reported unmeasured), measured 2026-10-18 | 57/57 (`node control-negativ-identity.mjs`); compliance 17/17 (`node control-negativ-conformitate.mjs`); Travel Rule 20/20 (`node control-negativ-travel-rule.mjs`); SD-JWT 31/31 (`node control-negativ-sdjwt.mjs`); SD-JWT VC 16/16 (`node control-negativ-sdjwt-vc.mjs`) |
| agents | policy 27/27 with the AIP-23 verifier (without it 25 run, 2 are reported as skipped and the exit code is 2), ledger 54/54 on 2026-10-05, approval and revocation 39/39, the chain as witness 26/26 without a network and 7/7 on testnet 28001 on 2026-09-30 (`proba-agent-ancora-testnet.mjs`, needs a funded testnet key and the AIP-23 verifier), command line 23/23 through files and processes only (on Linux and macOS one more test checks the key file mode; not measured here); x402 wallet 25/25, 2-of-2 co-signing 16/16 and payment verifier 14/14 without a network; on the public testnet 28001, 9/9 with the wallet key and 13/13 with the 2-of-2 contract wallet (`agents/x402/proba-x402-testnet.mjs`, `agents/x402/proba-cosign-testnet.mjs`, each needs a funded testnet key); the contract's artifact recompiles byte for byte with solc 0.8.23 (`node x402/recompileaza-contract.mjs --solc <solc>`) | 26/26 (`node control-negativ-aprobare.mjs`); the chain as witness 11/11 (`node control-negativ-ancora.mjs`); x402 30/30 (`node x402/control-negativ-wallet.mjs`); the contract's own tests (7) and their negative control (4/4) run in the Aere Network contracts project, not in this repository |
| identity | 52/52 (`node proba-identity.mjs`, a presentation optionally signed for one exact request (`request`) included, with the AIP-23 verifier for its envelope test; without it that test is reported as skipped and the exit code is 2), compliance 18/18 (`node proba-conformitate.mjs`) and Travel Rule 20/20 (`node proba-travel-rule.mjs`) with the same verifier (without it each reports one test unmeasured and exits 2; 2026-10-18: a missing originator id or nonce is a refusal, found when the verifier was enrolled in the conformance suite), SD-JWT 31/31 (`node proba-sdjwt.mjs`, the RFC 9901 vectors and fixtures derived from @sd-jwt/core 0.23.0 included; since 2026-10-19 the keys of an AERE identity are judged on their ML-DSA-65 half by default, the Ed25519 half only on request, and every verdict says `postQuantum`), SD-JWT VC 11/11 (`node proba-sdjwt-vc.mjs`); interoperability with @sd-jwt/core and jose in both directions 26/26 and 28/28 (`interop/`, with those libraries installed in a folder you name; otherwise reported unmeasured), measured 2026-10-18, before the 2026-10-19 change; the scripts now ask for the Ed25519 half explicitly and have not been re-run since | 57/57 (`node control-negativ-identity.mjs`); compliance 17/17 (`node control-negativ-conformitate.mjs`); Travel Rule 20/20 (`node control-negativ-travel-rule.mjs`); SD-JWT 39/39 (`node control-negativ-sdjwt.mjs`); SD-JWT VC 20/20 (`node control-negativ-sdjwt-vc.mjs`) |
| agents | policy 27/27 with the AIP-23 verifier (without it 25 run, 2 are reported as skipped and the exit code is 2), ledger 59/59 on 2026-10-19 (since then an equivocation proof must be made with the agent's ML-DSA-65 key), approval and revocation 39/39, the chain as witness 26/26 without a network and 7/7 on testnet 28001 on 2026-09-30 (`proba-agent-ancora-testnet.mjs`, needs a funded testnet key and the AIP-23 verifier), command line 23/23 through files and processes only (on Linux and macOS one more test checks the key file mode; not measured here); x402 wallet 25/25, 2-of-2 co-signing 16/16 and payment verifier 14/14 without a network; on the public testnet 28001, 9/9 with the wallet key and 13/13 with the 2-of-2 contract wallet (`agents/x402/proba-x402-testnet.mjs`, `agents/x402/proba-cosign-testnet.mjs`, each needs a funded testnet key); the contract's artifact recompiles byte for byte with solc 0.8.23 (`node x402/recompileaza-contract.mjs --solc <solc>`) | 28/28 (`node control-negativ-aprobare.mjs`); the chain as witness 11/11 (`node control-negativ-ancora.mjs`); x402 30/30 (`node x402/control-negativ-wallet.mjs`); the contract's own tests (7) and their negative control (4/4) run in the Aere Network contracts project, not in this repository |
| proof-of-ai | 6/6 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-proof-of-ai.mjs`); without it the probe reports NEMASURAT and exits 2 | one negative control inside the test (an envelope touched after its hash: INVALID) |
| payments | 23/23 without a chain (`node proba-risc.mjs`: the verdicts under a policy, the reproducible verdict hash, a receipt verified, nine forged ones refused by name, a malformed payment refused by name); 9/9 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-plata-28001.mjs`: a payment allowed, paid, its receipt notarized and read back with finality PASSED, the public reader VALID; a payment above the limit refused with nothing sent; the fourth in the window refused; a forged receipt and a loosened policy INVALID) | 10/10 (`node proba-risc.mjs --control-negativ`: form, asset, counterparty, rate, per-payment limit, window, linkage, USD arithmetic, verdict reproduction, chain facts, each planted out on a copy and each forged fixture then accepted) |
| market-settlement | 20/20 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-piata-28001.mjs`: five scenarios on AereComputeMarketV3 deployed from the committed artifact, every refusal by its named custom error, the provider's notarized envelope read back under a post-quantum certified anchor); the judge on the recorded timelines 26/26 without a chain (`node proba-judecata.mjs`: seven honest readings VALID, eighteen forged or malformed ones INVALID for their named reason, the settlement receipt) | 10/10 (`node proba-judecata.mjs --control-negativ`: form, completeness of the timeline, posting, deadline, window, arbiter, payout, result bytes, replay, proof, each planted out on a copy and each forged fixture then accepted) |
| verifiable-data | 23/23 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-verifiable-data.mjs`: honest answers VALID, ten forged or malformed ones INVALID for their named reason, availability sampling on a local server; the envelope row is NEMASURAT without the verifier, exit 2); the two chain rows of `--viu` measured on testnet 28001 on 2026-10-02 (a version notarized with a test key and read back under a post-quantum certified anchor; evidence in `dovezi/`) | 5/5 (`node proba-verifiable-data.mjs --control-negativ`: field commitment, index order, completeness, consistency, sampling, each planted out on a copy and each forged fixture then accepted) |
| ai-trust | 16/16 with the AIP-23 verifier, measured 2026-10-05 (`AERE_VERIFY_PROOF=... node proba-lant-de-incredere.mjs`: the whole chain on a committed fixture, then thirteen bundles broken on purpose, each refused for its named reason, among them an agent with a classical key and an audit head signed with one); without the verifier it exits 2 | 11/11 (`node proba-lant-de-incredere.mjs --control-negativ`) |
| conformance | 11/11 from a fresh clone of this repository on 2026-10-18 (`AERE_VERIFY_PROOF=<verify-proof.mjs> node proba-conformance.mjs --online`; the twelfth row, the comparison with the published AIP-23 kind vectors, needs their generator, which is not part of this copy, and is reported as information); 12/12 in the development repository, with the AIP-23 verifier as served (fetched and installed in an empty folder), Python 3 and testnet 28001 read (`AERE_VERIFY_PROOF=... node proba-conformance.mjs --online`: the rules and the vectors are what the code derives, every rule has a vector, every invalid vector is one operation from its base or one declared change at its producer, the published verifiers pass 626/626, an independent Python implementation passes the 65 it claims and the other 561 are reported not covered, 101,833 malformed inputs and 183 malformed envelope files each get a verdict; remeasured 2026-10-18 21:25Z after the request-signed presentation); without `--online` the nine chain vectors are reported unmeasured and the exit code is 2 | 322/322 on 2026-10-18: 240/240 rules (`node proba-conformance.mjs --control-negativ --online`: each rule planted out of its verifier in a copy; the vectors that expect it, and only they, must fail), then 76/76 conditions of the device verifier's compound checks, each planted out alone (exactly the vectors written for it must fail), then six controls of the instruments |
| conformance | 11/11 from a fresh clone of this repository on 2026-10-18 (`AERE_VERIFY_PROOF=<verify-proof.mjs> node proba-conformance.mjs --online`; the twelfth row, the comparison with the published AIP-23 kind vectors, needs their generator, which is not part of this copy, and is reported as information); 12/12 in the development repository, with the AIP-23 verifier as served (fetched and installed in an empty folder), Python 3 and testnet 28001 read (`AERE_VERIFY_PROOF=... node proba-conformance.mjs --online`: the rules and the vectors are what the code derives, every rule has a vector, every invalid vector is one operation from its base or one declared change at its producer, the published verifiers pass 631/631, an independent Python implementation passes the 65 it claims and the other 566 are reported not covered, 101,947 malformed inputs and 183 malformed envelope files each get a verdict; remeasured 2026-10-19 02:13Z after the rule that judges the post-quantum half of an AERE identity by default); without `--online` the nine chain vectors are reported unmeasured and the exit code is 2 | 323/323 on 2026-10-19: 241/241 rules (`node proba-conformance.mjs --control-negativ --online`: each rule planted out of its verifier in a copy; the vectors that expect it, and only they, must fail), then 76/76 conditions of the device verifier's compound checks, each planted out alone (exactly the vectors written for it must fail), then six controls of the instruments |
| device-identity | 372/372 with the AIP-23 verifier, measured 2026-10-14 (`AERE_VERIFY_PROOF=... node proba-device.mjs`: fifty-four bundles that must be VALID; seventy-seven with something not brought, not read or not readable, each PARTIAL for its named causes; two hundred and four attack rows, each refused for exactly its named rules, among them a clone with another key, a rolled-back or retracted firmware (also when the release is left out of the bundle), a previous owner that still signs, an owner's retirement written under no ownership head, a replayed attestation, an attestation dated ahead of the verifier's clock, a manufacturer the verifier does not trust, a retirement, a classical key under the ML-DSA-65 name, a signature in another base64 text, a day that does not exist; 804 damaged bundles each given a verdict; the command line through files only; the evidence recorded on testnet 28001 judged again offline); the chain as witness 10/10 on testnet 28001 on 2026-10-05, before the repairs of that day (`proba-device-ancora-testnet.mjs`, needs a funded testnet key and the AIP-23 verifier; not run again since: the bundles and readings it recorded give the same verdicts under the verifier of now) | 220/220 (`node control-negativ-device.mjs`: the untouched copy green; each of the 47 rules taken out of a copy, the rows that expect it, and only they, go red; 172 more plantings, most of them one condition of a compound check taken out alone, each with its rows) |
| exposure-report | 164 passed and 1 `NEMASURAT` of 165 rows in the AERE development tree on 2026-10-14 (`node proba-expunere.mjs`: codec checks with real public vectors, mode 1 and mode 2 through four mock targets that serve recorded responses, the network guard's proof that in modes 1 and 2 nothing leaves the machine, the language gate, the AIP-23 `compliance` envelopes judged by the reference verifier; the `NEMASURAT` row is mode 3 against a real provider, which would send addresses to a third party); in this copy, after `npm install --ignore-scripts` in its directory: 153 passed, 0 red, 0 broken, 12 `NEMASURAT` with the reason (the rows compared with the AIP-23 verifier, the anchor verifier's RLP encoder and MPT walker and the shield's header pins, none of which is in this repository: with `AERE_PROOF_PROTOCOL_VERIFY`, `AERE_VERIFY_PROOF` and `AERE_EXPUNERE_PINI` naming them the rows run, 162 passed and 3 `NEMASURAT`; the scan of the directory for names from the AERE host inventory; the git-ignore row outside a git tree); the exit code is 0 unless a row is red or broken | inside the test, 2026-10-14: each rule has its reverse planting in a copy of the tool (a foreign provider planted on each network path is caught, a label planted in the language gate is refused, each classification rule taken out turns its row red, a `@noble/curves` 2.x planted first is passed over and alone is named as missing), and the recorded fixtures are judged against their declared date |
@ -64,4 +64,4 @@ interface, command line and data (`definePolicy`, `verifyLedger`, `approve`, ...
## Licence
MIT, see [LICENSE](LICENSE). Files: 962 (pq-gateway 9, pq-kms 10, pq-secrets 6, pq-pki 6, crypto-inventory 73, verify-layer 56, proof-kinds 3, control-plane 27, agents 39, identity 24, proof-of-ai 3, ai-trust 6, verifiable-data 7, market-settlement 9, payments 8, conformance 638, device-identity 11, exposure-report 18, readiness 4).
MIT, see [LICENSE](LICENSE). Files: 967 (pq-gateway 9, pq-kms 10, pq-secrets 6, pq-pki 6, crypto-inventory 73, verify-layer 56, proof-kinds 3, control-plane 27, agents 39, identity 24, proof-of-ai 3, ai-trust 6, verifiable-data 7, market-settlement 9, payments 8, conformance 643, device-identity 11, exposure-report 18, readiness 4).

View File

@ -112,13 +112,13 @@ Measured on 2026-09-29 (Node.js 24.14.1, Windows):
| test | result |
|---|---|
| `node proba-agent-policy.mjs` | 27/27 with the AIP-23 reference verifier (`AERE_VERIFY_PROOF=<verify-proof.mjs from aere.network/tools>`); without it 25 run, 2 are reported as skipped and the exit code is 2 |
| `node proba-agent-ledger.mjs` | 54/54 (measured 2026-10-05): a ledger written and signed with a classical key refused by name, by the verifier and by the writer; limits over the ledger, identity, tampering, a re-signed false decision, a looser policy under the real hash, backdating (refused when written; caught with anchors or `notBefore`), a branch, equivocation proofs, resuming |
| `node proba-agent-ledger.mjs` | 59/59 (measured 2026-10-19; since then an equivocation proof must be made with the agent's ML-DSA-65 key, AIP-25 finding C2): a ledger written and signed with a classical key refused by name, by the verifier and by the writer; limits over the ledger, identity, tampering, a re-signed false decision, a looser policy under the real hash, backdating (refused when written; caught with anchors or `notBefore`), a branch, equivocation proofs, resuming |
| `node proba-agent-aprobare.mjs` | 39/39: threshold, unnamed or repeated approvers, classical keys, another action or other tool arguments, reused nonces (also after a restart), expiry, approvals across branches, revocation, an omitted revocation |
| `node proba-agent-cli.mjs` | 23/23 on Windows, through files and processes only; on Linux and macOS one more test checks the 0600 mode of the key (not measured here) |
| `node proba-agent-ancora.mjs` | 26/26 without a network (the AIP-23 verifier's answer in its own form): the head, the time read from the finality level (pending, failed, a mismatched or unknown form: no anchor), an envelope that claims another time, backdating caught with the anchor and not without it, another branch, the refusals before any transaction (a modified head, chain 2800 without confirmation, no contract at the notary) |
| `AERE_TESTNET_KEY_FILE=<funded testnet key> node proba-agent-ancora-testnet.mjs` | 7/7 on the public testnet 28001, measured 2026-09-30: a real ledger's head notarized, read back under a post-quantum certified anchor by the published AIP-23 verifier within 20 s, the certified time equal to the contract's first-seen time, the honest continuation valid with the anchor, a backdated continuation valid without it and caught with it, another branch refused; evidence in `dovezi-ancora-28001/` |
| `node control-negativ-ancora.mjs` | 11/11: each anchoring guard removed in a copy turns its named test red |
| `node control-negativ-aprobare.mjs` | 26/26: each guard is removed in a copy, one at a time, and the named test must fail for that reason; a test that stops before its summary counts as a failure of the control |
| `node control-negativ-aprobare.mjs` | 28/28 (2026-10-19): each guard is removed in a copy, one at a time, and the named test must fail for that reason; a test that stops before its summary counts as a failure of the control |
The data format is version 2 (2026-09-29). Code comments, test names and most internal names are in Romanian; messages, data and
the exported interface are in English. No third party has reviewed this component.

View File

@ -307,6 +307,10 @@ export function verifyLedger(ledger, { policy: politicaData, policyHash: hashFix
// DOVADA DE ECHIVOCARE: doua intrari semnate de aceeasi cheie de agent, cu aceeasi sesiune si acelasi seq, si continut diferit. Cum
// sesiunea e una pe agent si politica, asta inseamna ca agentul a scris doua istorii diferite ale aceluiasi registru (o aprobare
// folosita de doua ori, o cheltuiala dubla). Dovada se verifica fara incredere in cine o aduce: numai cheia publica si doua semnaturi.
// 2026-10-19 (AIP-25 constatarea C2, D-536): si aici cheia trebuie sa fie ML-DSA-65, ca la verifyLedger (regula `cheie`). Pana atunci
// findEquivocation si verifyEquivocation verificau cu orice cheie arata dovada, deci o "echivocare" semnata cu o cheie Ed25519 (agentId
// derivat din ea) iesea ok, desi registrul aceleiasi chei e refuzat: o dovada impotriva a ceva ce nu e o identitate de agent.
const cheieDeAgent = (pub) => !!pub && pub.asymmetricKeyType === ALG;
function intrareSemnata(e, pub) {
if (!e || !e.body || !Number.isInteger(e.seq) || e.body.seq !== e.seq) return false;
let ok = false;
@ -320,6 +324,7 @@ function intrareSemnata(e, pub) {
export function findEquivocation(a, b) {
if (!a || !b || a.agentId !== b.agentId || a.session !== b.session) return null;
let pub; try { pub = crypto.createPublicKey(a.publicKeyPem); } catch { return null; }
if (!cheieDeAgent(pub)) return null; // AIP-25 C2: numai cheia unei identitati de agent (ML-DSA-65) face o dovada
if (agentIdFromKey(pub) !== a.agentId) return null;
const n = Math.min((a.entries || []).length, (b.entries || []).length);
for (let i = 0; i < n; i++) {
@ -330,10 +335,11 @@ export function findEquivocation(a, b) {
}
return null;
}
/** @returns {{ok:boolean, error?:string}} */
/** @returns {{ok:boolean, error?:string, rule?:string}} (`rule: 'cheie'` cand cheia aratata nu e o cheie de agent ML-DSA-65, AIP-25 C2) */
export function verifyEquivocation(p) {
if (!p || p.kind !== 'aere-agent-equivocation' || p.v !== 1) return { ok: false, error: 'not an aere-agent-equivocation v1' };
let pub; try { pub = crypto.createPublicKey(p.publicKeyPem); } catch { return { ok: false, error: 'the public key cannot be read' }; }
if (!cheieDeAgent(pub)) return { ok: false, rule: 'cheie', error: `the agent key is ${pub.asymmetricKeyType}, not ML-DSA-65: an agent identity is an ML-DSA-65 key, so this proves nothing against an agent` };
if (agentIdFromKey(pub) !== p.agentId) return { ok: false, error: 'agentId is not derived from the public key' };
for (const e of [p.a, p.b]) {
if (!e || !e.body || e.seq !== p.seq || e.body.agentId !== p.agentId || e.body.session !== p.session) return { ok: false, error: 'the two entries are not at the same position of the same ledger' };

View File

@ -34,6 +34,9 @@ const PLANTARI = [
['verificatorul nu mai cere sesiunea registrului in intrare', 'agent-ledger.mjs', ' && b.session === ledger.session /*PAZA:corp*/)) return', ' /*PAZA:corp*/)) return', P.reg],
['sesiunea registrului nu mai trebuie sa fie cea derivata', 'agent-ledger.mjs', 'if (!(ledger.session === sessionId(ledger.agentId, policyHash) /*PAZA:sesiune*/)) return', 'if (false) return', P.reg],
['dovada de echivocare fara semnaturile agentului', 'agent-ledger.mjs', "if (!intrareSemnata(e, pub)) return { ok: false, error: 'an entry is not signed by the agent' };", '', P.reg],
// 2026-10-19 (AIP-25 C2, D-536): dovada de echivocare cere cheia unei identitati de agent, ML-DSA-65, ca verifyLedger
['AIP-25 C2: verifyEquivocation primeste o cheie care nu e ML-DSA-65', 'agent-ledger.mjs', "if (!cheieDeAgent(pub)) return { ok: false, rule: 'cheie',", "if (false) return { ok: false, rule: 'cheie',", P.reg],
['AIP-25 C2: findEquivocation face o dovada din cheia oricui', 'agent-ledger.mjs', 'if (!cheieDeAgent(pub)) return null;', 'if (false) return null;', P.reg],
['un registru atins se poate relua', 'agent-ledger.mjs', 'if (!v.ok) throw new Error(`agent-ledger: the ledger to resume does not verify', 'if (false) throw new Error(`agent-ledger: the ledger to resume does not verify', P.reg],
['reluarea uita nonce-urile folosite', 'agent-ledger.mjs', 'for (const e of entries) for (const n of nonceuri(e.body.approvals)) folosite.add(n);', '', P.apr],
['reluarea uita revocarea', 'agent-ledger.mjs', 'JSON.parse(JSON.stringify(ledger.entries)), v.revocations.revokedAt);', 'JSON.parse(JSON.stringify(ledger.entries)), null);', P.apr],

View File

@ -228,6 +228,33 @@ cer(!vt4.ok && /false identity/.test(vt4.error), `11. CONTROL: cheia publica inl
cer(bun.ok === true && bun.rule === undefined, '20. martor: acelasi fel de registru, cu o cheie ML-DSA-65, verifica');
}
// 21. AIP-25 C2 (D-536, 2026-10-19): dovada de echivocare cere aceeasi cheie ca registrul, ML-DSA-65. Pana atunci findEquivocation si
// verifyEquivocation verificau cu orice cheie arata dovada, deci o "echivocare" a unei chei Ed25519 (agentId derivat din ea) iesea ok,
// desi verifyLedger (proba 20) refuza registrul aceleiasi chei: o dovada impotriva unei identitati care nu e o identitate de agent.
{
const sha = (s) => crypto.createHash('sha256').update(Buffer.from(s, 'utf8')).digest('hex');
// doua intrari la seq 0, cu continut diferit, semnate cu cheia `priv`, pentru agentul derivat din `pub`
const echivocare = (pub, priv, semnaB = priv) => {
const agentId = agentIdFromKey(pub); const pc = definePolicy({ agentId, tools: ['retrieval', 'search'] }); const session = sessionId(agentId, pc.policyHash);
const intrare = (tool, cheie) => { const body = { v: 2, agentId, policyHash: pc.policyHash, session, at: 6000, action: { kind: 'tool', tool, at: 6000 }, decision: { allowed: true, reason: 'tool allowed' }, provenance: null, seq: 0 };
const prev = '0'.repeat(64); const signature = crypto.sign(null, Buffer.from(`0|${prev}|${canonical(body)}`, 'utf8'), cheie).toString('base64'); return { seq: 0, prev, body, signature, hash: sha(`0|${prev}|${canonical(body)}|${signature}`) }; };
const a = intrare('retrieval', priv), b = intrare('search', semnaB);
const exp = (e) => ({ version: 2, agentId, publicKeyPem: pub.export({ type: 'spki', format: 'pem' }), policyHash: pc.policyHash, session, entries: [e] });
return { dovada: { v: 1, kind: 'aere-agent-equivocation', agentId, session, publicKeyPem: pub.export({ type: 'spki', format: 'pem' }), seq: 0, a, b }, A: exp(a), B: exp(b) };
};
const ed = crypto.generateKeyPairSync('ed25519'); const E = echivocare(ed.publicKey, ed.privateKey);
const v = verifyEquivocation(E.dovada);
cer(!v.ok && v.rule === 'cheie' && /not ML-DSA-65/.test(String(v.error)), `21. AIP-25 C2: o echivocare semnata cu o cheie Ed25519 e refuzata pe nume (${v.ok ? 'ok' : v.rule + ': ' + String(v.error).slice(0, 60)})`);
cer(findEquivocation(E.A, E.B) === null, '21. AIP-25 C2: findEquivocation nu face o dovada din doua exporturi ale unei chei Ed25519');
const m44 = crypto.generateKeyPairSync('ml-dsa-44'); const v44 = verifyEquivocation(echivocare(m44.publicKey, m44.privateKey).dovada);
cer(!v44.ok && v44.rule === 'cheie', `21. AIP-25 C2 ATAC: si o cheie post-cuantica de alt fel (ML-DSA-44) e refuzata: identitatea agentului e ML-DSA-65 (${v44.ok ? 'ok' : v44.error})`);
// chei de feluri diferite in cele doua intrari: cheia aratata e ML-DSA-65, a doua intrare e semnata cu o cheie Ed25519 -> nu e semnata de agent
const m65 = crypto.generateKeyPairSync('ml-dsa-65'); const Mx = echivocare(m65.publicKey, m65.privateKey, ed.privateKey);
const vx = verifyEquivocation(Mx.dovada); cer(!vx.ok && /not signed by the agent/.test(String(vx.error)), `21. AIP-25 C2 ATAC: o intrare semnata cu alt fel de cheie decat cea aratata -> refuzata (${vx.ok ? 'ok' : vx.error})`);
const M = echivocare(m65.publicKey, m65.privateKey);
cer(verifyEquivocation(M.dovada).ok === true && !!findEquivocation(M.A, M.B), '21. martor: aceeasi echivocare, cu o cheie ML-DSA-65, e o dovada (verifyEquivocation ok, findEquivocation o gaseste)');
}
for (const l of linii) console.log(l);
console.log(`agent-ledger: ${ok}/${ok + rau} cum trebuia`);
process.exitCode = rau ? 1 : 0;

View File

@ -42,9 +42,9 @@ verdict (`vectori/payment-receipt/company-p1-28001.valid.json`).
## What is enrolled
`REGULI.json` is derived from the code (`node deriva-reguli.mjs --verifica`): 240 rules of 15 verifiers, 21 artifact kinds (since
2026-10-18: 239 when the Travel Rule and the compliance verifiers were enrolled, 240 with `identity.request` later that day; 213 rules of 13 verifiers and 17 kinds after the SD-JWT
verifiers earlier that day; 181 rules of 11 verifiers, 15 kinds before). By level: 188 rules are reported at `integrity`, 49 at
`REGULI.json` is derived from the code (`node deriva-reguli.mjs --verifica`): 241 rules of 15 verifiers, 21 artifact kinds (since
2026-10-19: 241 with `sdjwt.hybrid-half`, AIP-25 finding C1; 2026-10-18: 239 when the Travel Rule and the compliance verifiers were enrolled, 240 with `identity.request` later that day; 213 rules of 13 verifiers and 17 kinds after the SD-JWT
verifiers earlier that day; 181 rules of 11 verifiers, 15 kinds before). By level: 188 rules are reported at `integrity`, 50 at
`authenticity`, 3 at `anchoring` (one of them, `envelope.finality`, is reported at `anchoring` or at `finality` by the place that refused).
| artifact kind | judged by | rules |
@ -60,8 +60,8 @@ verifiers earlier that day; 181 rules of 11 verifiers, 15 kinds before). By leve
| `agent-ledger` (an agent's signed ledger under its policy) | `agents/agent-ledger.mjs` | 16: `agents.ledger-form`, `.policy`, `.other-policy`, `.session`, `.key`, `.identity`, `.anchor`, `.seq`, `.chain`, `.body`, `.signature`, `.hash`, `.time`, `.revocation`, `.approvals`, `.decision` |
| `identity-presentation` (a credential shown by its holder or by the last delegate of a chain, judged with what the verifier brings: its audience, its nonce, its clock, the issuers it trusts, the status lists and the revocations it was handed) | `identity/identity.mjs` | 38: `identity.form`, `.issuer-id`, `.holder-id`, `.credential-signature`, `.issuer-trusted`, `.credential-window`, `.status-list`, `.credential-revoked`, `.sd-distinct`, `.disclosure-readable`, `.disclosure-signed`, `.disclosure-once`, `.disclosure-plain`, `.claim-name`, `.binding-credential`, `.binding-disclosures`, `.binding-delegations`, `.presenter`, `.presentation-signature`, `.audience`, `.nonce`, `.freshness`, `.chain-length`, `.delegation-form`, `.delegation-ids`, `.delegation-from`, `.delegation-parent`, `.delegation-signature`, `.delegation-scope`, `.delegation-window`, `.delegation-depth`, `.delegation-narrows`, `.delegation-credential`, `.delegation-claims`, `.delegation-audience`, `.delegation-revoked`, `.unreadable`, `.request` (since 2026-10-18: the presentation commits to the request the verifier received, OpenID4VP `transaction_data`) |
| `device-bundle` (the chain of a device: the manufacturer's credential for the device key, a firmware release, the ownership transfers, the owner's authorization, the device's attestation and its AIP-23 envelope, judged with what the verifier brings: its clock, nonce and audience, the manufacturers it trusts, the recall lists, firmware policies and status records it read, its own reading of the notarized envelope) | `device-identity/device.mjs` | 47: `device.form`, `.manufacture-form`, `.manufacturer-id`, `.manufacture-holder`, `.manufacture-signature`, `.manufacturer-trusted`, `.manufacture-window`, `.manufacture-status-list`, `.manufacture-revoked`, `.device-key`, `.device-id`, `.firmware-form`, `.firmware-signer`, `.firmware-signature`, `.firmware-model`, `.firmware-retracted`, `.firmware-rollback`, `.firmware-software`, `.chain-length`, `.transfer-form`, `.transfer-device`, `.transfer-ids`, `.transfer-from`, `.transfer-prev`, `.transfer-signature`, `.transfer-time`, `.authorization-form`, `.authorization-device`, `.authorization-owner`, `.authorization-ownership`, `.authorization-signature`, `.authorization-window`, `.authorization-action`, `.status-retired`, `.status-suspended`, `.attestation-form`, `.attestation-key`, `.attestation-device`, `.attestation-signature`, `.audience`, `.nonce`, `.freshness`, `.attestation-firmware`, `.attestation-ownership`, `.witness-envelope`, `.witness-time`, `.unreadable` |
| `sdjwt-presentation` (an SD-JWT of IETF RFC 9901, as issued or with its Key Binding JWT, judged with what the verifier brings: the issuer key it chose, a public JWK, never one taken from the token; its clock; its audience and nonce; the issuer and the explicit type it expects; whether it requires key binding and `exp`) | `identity/sdjwt.mjs` (enrolled 2026-10-18) | 23: `sdjwt.form`, `.alg`, `.typ`, `.crit`, `.key`, `.signature`, `.issuer`, `.sd-alg`, `.disclosure-form`, `.disclosure-twice`, `.digest-twice`, `.disclosure-name`, `.claim-conflict`, `.unreferenced`, `.time`, `.kb-context`, `.kb-required`, `.kb-cnf`, `.kb-claims`, `.kb-audience`, `.kb-nonce`, `.kb-freshness`, `.kb-sd-hash` |
| `sdjwt-vc-presentation` (an SD-JWT VC of `draft-ietf-oauth-sd-jwt-vc`, judged as the SD-JWT above plus the profile: the credential type the verifier expects, and the Token Status List it fetched for the `status` the credential names) | `identity/sdjwt-vc.mjs` (enrolled 2026-10-18) | 9 of its own, on top of the 23 of `sdjwt`: `sdjwtvc.vct-expected`, `.vct`, `.vct-mismatch`, `.disclosed-protected`, `.form`, `.status-list`, `.status-index`, `.status-revoked`, `.status-unjudged` |
| `sdjwt-presentation` (an SD-JWT of IETF RFC 9901, as issued or with its Key Binding JWT, judged with what the verifier brings: the issuer key it chose, a public JWK, never one taken from the token; its clock; its audience and nonce; the issuer and the explicit type it expects; whether it requires key binding and `exp`) | `identity/sdjwt.mjs` (enrolled 2026-10-18) | 24: `sdjwt.form`, `.alg`, `.typ`, `.crit`, `.key`, `.hybrid-half` (since 2026-10-19), `.signature`, `.issuer`, `.sd-alg`, `.disclosure-form`, `.disclosure-twice`, `.digest-twice`, `.disclosure-name`, `.claim-conflict`, `.unreferenced`, `.time`, `.kb-context`, `.kb-required`, `.kb-cnf`, `.kb-claims`, `.kb-audience`, `.kb-nonce`, `.kb-freshness`, `.kb-sd-hash` |
| `sdjwt-vc-presentation` (an SD-JWT VC of `draft-ietf-oauth-sd-jwt-vc`, judged as the SD-JWT above plus the profile: the credential type the verifier expects, and the Token Status List it fetched for the `status` the credential names) | `identity/sdjwt-vc.mjs` (enrolled 2026-10-18) | 9 of its own, on top of the 24 of `sdjwt`: `sdjwtvc.vct-expected`, `.vct`, `.vct-mismatch`, `.disclosed-protected`, `.form`, `.status-list`, `.status-index`, `.status-revoked`, `.status-unjudged` |
| `travel-rule-binding`, `travel-rule-message`, `travel-rule-receipt` (the Travel Rule between VASPs: the beneficiary's KEM key binding with its VASP presentation, judged by the originator with its id, its nonce, its clock, the registries it trusts and their status lists; the sealed IVMS101 message, judged by the beneficiary with its id, its own KEM key pair, which decrypts, its clock, its registries and lists and its replay store; the signed receipt, judged by the originator with the message it sent and the beneficiary it accepted) | `identity/travel-rule.mjs` (enrolled 2026-10-18) | 23: `travelrule.binding-form`, `.binding-id`, `.binding-signature`, `.binding-window`, `.vasp-presentation`, `.vasp-status`, `.vasp-identity`, `.vasp-claim`, `.message-form`, `.message-id`, `.message-signature`, `.message-recipient`, `.message-kem-keys`, `.message-freshness`, `.replay-store`, `.replay`, `.kem-alg`, `.kem-open`, `.ciphertext`, `.receipt-form`, `.receipt-from`, `.receipt-signature`, `.receipt-message` |
| `compliance-presentation` (a presentation of a credential judged against the verifier's compliance policy: the issuers it believes and the claims it requires, with the verifier's audience, nonce and clock, all required, and the status lists and revocations it holds) | `identity/conformitate.mjs` (enrolled 2026-10-18) | 3: `compliance.presentation`, `.status`, `.rule` |
@ -116,9 +116,9 @@ issuer and for its status at once.
## The vectors
`vectori/` holds 626 vectors (617 offline, 9 that read testnet 28001; 22 MB, since every device, identity and Travel Rule vector carries its ML-DSA-65 keys and signatures), listed with their digests in `vectori/INDEX.json`:
`vectori/` holds 631 vectors (622 offline, 9 that read testnet 28001; 22 MB, since every device, identity and Travel Rule vector carries its ML-DSA-65 keys and signatures), listed with their digests in `vectori/INDEX.json`:
envelope 67, payment-risk 11, payment-receipt 10, market-timeline 26, dataset 22, ai-trust-bundle 24, audit-log 19, audit-inclusion
10, audit-consistency 4, agent-ledger 18, identity-presentation 69, device-bundle 194, sdjwt-presentation 54, sdjwt-vc-presentation 32, travel-rule-binding 19, travel-rule-message 26, travel-rule-receipt 9, compliance-presentation 12. By expected verdict: 87 `VALID`, 70 `PARTIAL`, 469 `INVALID`. None is typed by hand
10, audit-consistency 4, agent-ledger 18, identity-presentation 69, device-bundle 194, sdjwt-presentation 59, sdjwt-vc-presentation 32, travel-rule-binding 19, travel-rule-message 26, travel-rule-receipt 9, compliance-presentation 12. By expected verdict: 89 `VALID`, 70 `PARTIAL`, 472 `INVALID`. None is typed by hand
(`node genereaza-vectori.mjs --verifica` regenerates them and compares byte for byte):
- the 17 AIP-23 kinds come from their producers on fixed inputs (the same envelopes as the published AIP-23 kind vectors; `secret-access`, the audit entry of the secrets service, since 2026-10-18); the audit
@ -194,7 +194,7 @@ not JSON at all: a file that is not an envelope is refused at the form level, by
the vectors show (`{ log, head?, signer? }` for an audit log, `{ ledger, policy }` for an agent's ledger, `{ bundle }` for a trust
chain, `{ presentation, now, audience?, nonce?, trustedIssuers?, statusLists?, revocations?, maxAgeS? }` for a presentation of a
credential, `{ bundle, now, nonce?, audience?, trustedManufacturers?, statusLists?, firmwarePolicies?, statusRecords?,
softwareAttestation?, anchors?, maxAgeS? }` for a device bundle, `{ sdJwt, issuerKey, issuerAlg?, now, audience?, nonce?,
softwareAttestation?, anchors?, maxAgeS? }` for a device bundle, `{ sdJwt, issuerKey, issuerAlg?, classicalHalf?, now, audience?, nonce?,
expectedIssuer?, expectedTyp?, requireKeyBinding?, requireExp?, maxAgeS? }` for an SD-JWT presentation and the same plus
`{ expectedVct, statusListJwt?, statusListKey?, statusListAlg?, requireStatus? }` for an SD-JWT VC, `{ binding, presentation,
registries, originatorId, nonce, now, statusLists?, maxAgeS? }` for a Travel Rule binding (`originatorId` and `nonce` are the
@ -225,6 +225,29 @@ not implementations of this suite's contract).
## How the suite itself is checked
Measured on 2026-10-19 (UTC), after the SD-JWT verifier gained the rule `hybrid-half` (AIP-25 finding C1, D-535: with the keys of an
AERE hybrid identity the ML-DSA-65 half is judged by default and the Ed25519 half only when the verifier asks for it, `classicalHalf`;
until then the Ed25519 half was the default, so a token signed with it alone verified against the whole hybrid identity). Five vectors
were derived from the existing fresh source `sdjwt` (no fresh source was remade; the issuer's two public JWKs give its AERE public keys,
since the SPKI of a key is canonical): two VALID (the ML-DSA-65 credential against the hybrid keys; the Ed25519 credential with
`classicalHalf`) and three INVALID by `sdjwt.hybrid-half` (the Ed25519 credential with nothing asked; `issuerAlg` EdDSA named without
asking; `classicalHalf` removed). The other SD-JWT and SD-JWT VC vectors changed only in `exercises`, which now lists
`sdjwt.hybrid-half`, and one title; their tokens judged with a plain Ed25519 JWK stay VALID (there is no post-quantum half to lose),
and the verdict of the verifier says `postQuantum: false` for them. On Node.js 24.14.1, offline, with the served reference verifier:
`node proba-conformance.mjs` gives 12 rows green, 0 red, 1 not measured (the 9 vectors that read testnet 28001). 241 rules of 15
verifiers, 631 vectors (`LA ZI`), every rule has a vector (241 of 241), every INVALID vector (472) is its base with one operation
(306) or one declared producer change (166), the published verifiers pass 622 of 622 offline vectors, the independent Python
implementation passes the 65 it claims and reports the other 566 not covered, 101,947 malformed inputs each got a verdict.
`node proba-conformance.mjs --control-negativ --doar sdjwt` (offline) gives 39 rows green, 0 red, 2 not measured (the rules
and device halves left out by `--doar`): 33 of 33 SD-JWT and SD-JWT VC rules proven load-bearing, `sdjwt.hybrid-half` among them
(planted out, exactly its 3 vectors fail). Not run after the change: `--online`, and `--control-negativ` over the rules of the other verifiers.
Run online later the same night (01:54-02:13 UTC), with the reference verifier as served at aere.network/tools (fetched and installed
in an empty folder) and testnet 28001 read: `node proba-conformance.mjs --online` gives 12 rows green, 0 red; the published verifiers
pass 631 of 631 vectors, the independent Python implementation passes the 65 it claims and reports the other 566 not covered, 101,947
malformed inputs and 183 malformed envelope files each got a verdict. `node proba-conformance.mjs --control-negativ --online` gives 323
rows green, 0 red: 241 of 241 rules proven load-bearing through their vectors; the other 82 rows are the conditions of the device
verifier and the controls of the instruments.
Measured on 2026-10-18 (UTC), in the evening, after the identity verifier gained the rule `request` (a presentation committed to the
request the verifier received; the adversarial review of the secrets service) and its four vectors were derived from a new fresh
source (`identityRequest`; every other fresh source kept, so no other vector's input moved; the 65 earlier identity vectors changed

View File

@ -1445,6 +1445,13 @@
"sites": 3,
"says": "the key given is a public EC, OKP or AKP JWK that can be read, and of the algorithm the JWS declares (no algorithm confusion)"
},
{
"id": "sdjwt.hybrid-half",
"source": "hybrid-half",
"level": "authenticity",
"sites": 2,
"says": "with the keys of an AERE hybrid identity (Ed25519 and ML-DSA-65), the ML-DSA-65 half is judged by default; the Ed25519 half alone is judged only when the verifier asks for it (classicalHalf), and the verdict then says it is not post-quantum"
},
{
"id": "sdjwt.signature",
"source": "signature",

View File

@ -416,8 +416,9 @@ const PROASPETE_IN_PLUS = {
const iss = ID.generateKeys(), hol = ID.generateKeys(), strain = ID.generateKeys();
const AUD = 'https://verifier.example', NONCE = 'n-' + crypto.randomBytes(8).toString('hex'), ISS = 'https://issuer.example';
const CL = { given_name: 'Ada', family_name: 'Example', age_over_18: true, nationalities: ['RO', 'DE'], address: { locality: 'Cluj', country: 'RO' } };
const emite = (o = {}) => SJ.issueSdJwt({ issuer: iss, holder: hol, claims: CL, disclosable: ['given_name', 'family_name', 'age_over_18'], arrayDisclosable: ['nationalities'], iss: ISS, iat: NOW, exp: NOW + 365 * 86400, decoys: 2, ...o });
const arata = (sd, reveal, o = {}) => SJ.presentSdJwt({ sdJwt: sd, reveal, holder: hol, audience: AUD, nonce: NONCE, iat: NOW, ...o });
// 2026-10-19 (AIP-25 C1): the recorded source used the Ed25519 half of these AERE keys by default; it is asked for explicitly now
const emite = (o = {}) => SJ.issueSdJwt({ alg: 'EdDSA', holderAlg: 'EdDSA', classicalHalf: true, issuer: iss, holder: hol, claims: CL, disclosable: ['given_name', 'family_name', 'age_over_18'], arrayDisclosable: ['nationalities'], iss: ISS, iat: NOW, exp: NOW + 365 * 86400, decoys: 2, ...o });
const arata = (sd, reveal, o = {}) => SJ.presentSdJwt({ classicalHalf: true, sdJwt: sd, reveal, holder: hol, audience: AUD, nonce: NONCE, iat: NOW, ...o });
const b64u = (x) => Buffer.from(x).toString('base64url'); const dec = (s) => JSON.parse(Buffer.from(s, 'base64url').toString('utf8'));
const jwtDin = (antet, corp, cheie = iss.privat.ed25519) => { const cap = b64u(JSON.stringify(antet)) + '.' + b64u(JSON.stringify(corp)); return cap + '.' + b64u(crypto.sign(null, Buffer.from(cap), cheie)); };
const sha = (d) => crypto.createHash('sha256').update(d).digest('base64url');
@ -427,11 +428,11 @@ const PROASPETE_IN_PLUS = {
const bazaDirect = direct.split('~').slice(0, -1).join('~') + '~';
const kbPeste = (baza, corpKb = {}, cheie = hol.privat.ed25519, antet = { alg: 'EdDSA', typ: 'kb+jwt' }) => baza + jwtDin(antet, { iat: NOW, aud: AUD, nonce: NONCE, sd_hash: sha(baza), ...corpKb }, cheie);
// a hand-made issuer-signed JWT (EdDSA, typ aere+sd-jwt, cnf = the holder key), no key binding
const jeton = (extra, antet = { alg: 'EdDSA', typ: SJ.TYP }) => jwtDin(antet, { iss: ISS, iat: NOW, exp: NOW + 365 * 86400, _sd_alg: 'sha-256', cnf: { jwk: SJ.publicJwk(hol) }, ...extra }) + '~';
const jeton = (extra, antet = { alg: 'EdDSA', typ: SJ.TYP }) => jwtDin(antet, { iss: ISS, iat: NOW, exp: NOW + 365 * 86400, _sd_alg: 'sha-256', cnf: { jwk: SJ.publicJwk(hol, 'EdDSA', { classicalHalf: true }) }, ...extra }) + '~';
const dz = (c) => { const d = b64u(JSON.stringify(c)); return { d, dg: sha(d) }; };
const d1 = dz(['salt-1', 'a', 1]), dSd = dz(['salt-2', '_sd', ['x']]), dRole = dz(['salt-3', 'role', 'admin']), dUnu = dz(['only-a-salt']);
return { now: iso(NOW + 60), later: iso(NOW + 3660), muchLater: iso(NOW + 400 * 86400), audience: AUD, nonce: NONCE, issuer: ISS,
issuerJwk: SJ.publicJwk(iss), issuerJwkMlDsa: SJ.publicJwk(iss, 'ML-DSA-65'), holderJwk: SJ.publicJwk(hol),
issuerJwk: SJ.publicJwk(iss, 'EdDSA', { classicalHalf: true }), issuerJwkMlDsa: SJ.publicJwk(iss, 'ML-DSA-65'), holderJwk: SJ.publicJwk(hol, 'EdDSA', { classicalHalf: true }),
issued: E.sdJwt, direct, directMlDsa: arata(M.sdJwt, ['age_over_18'], { holderAlg: 'ML-DSA-65' }),
forged: {
kbStranger: arata(E.sdJwt, ['age_over_18'], { holder: strain }),
@ -464,26 +465,27 @@ const PROASPETE_IN_PLUS = {
const iss = ID.generateKeys(), hol = ID.generateKeys(), strain = ID.generateKeys();
const AUD = 'https://verifier.example', NONCE = 'n-' + crypto.randomBytes(8).toString('hex'), ISS = 'https://issuer.example', VCT = 'urn:eudi:pid:1', URI = 'https://issuer.example/status/pid/1', IDX = 5;
const CL = { given_name: 'Ada', family_name: 'Example', birthdate: '1990-01-01', age_over_18: true, nationalities: ['RO', 'DE'], address: { locality: 'Cluj', country: 'RO' }, issuing_authority: 'Example Authority', issuing_country: 'RO' };
const emite = (o = {}) => SV.issueSdJwtVc({ issuer: iss, holder: hol, vct: VCT, claims: CL, disclosable: ['given_name', 'family_name', 'birthdate', 'age_over_18', 'address'], arrayDisclosable: ['nationalities'], iss: ISS, iat: NOW, nbf: NOW, exp: NOW + 365 * 86400, status: { status_list: { idx: IDX, uri: URI } }, decoys: 2, ...o });
const arata = (sd, reveal, o = {}) => SV.presentSdJwtVc({ sdJwt: sd, reveal, holder: hol, audience: AUD, nonce: NONCE, iat: NOW, ...o });
const lista = (statuses, bits = 1, o = {}) => SV.issueStatusListJwt({ issuer: iss, uri: URI, statuses, bits, iat: NOW, exp: NOW + 3600, ...o });
// 2026-10-19 (AIP-25 C1): as in the source sdjwt, the Ed25519 half of these AERE keys is asked for explicitly where the recorded source used it
const emite = (o = {}) => SV.issueSdJwtVc({ alg: 'EdDSA', holderAlg: 'EdDSA', classicalHalf: true, issuer: iss, holder: hol, vct: VCT, claims: CL, disclosable: ['given_name', 'family_name', 'birthdate', 'age_over_18', 'address'], arrayDisclosable: ['nationalities'], iss: ISS, iat: NOW, nbf: NOW, exp: NOW + 365 * 86400, status: { status_list: { idx: IDX, uri: URI } }, decoys: 2, ...o });
const arata = (sd, reveal, o = {}) => SV.presentSdJwtVc({ classicalHalf: true, sdJwt: sd, reveal, holder: hol, audience: AUD, nonce: NONCE, iat: NOW, ...o });
const lista = (statuses, bits = 1, o = {}) => SV.issueStatusListJwt({ alg: 'EdDSA', classicalHalf: true, issuer: iss, uri: URI, statuses, bits, iat: NOW, exp: NOW + 3600, ...o });
const b64u = (x) => Buffer.from(x).toString('base64url');
const jwtDin = (antet, corp, cheie = iss.privat.ed25519) => { const cap = b64u(JSON.stringify(antet)) + '.' + b64u(JSON.stringify(corp)); return cap + '.' + b64u(crypto.sign(null, Buffer.from(cap), cheie)); };
const sha = (d) => crypto.createHash('sha256').update(d).digest('base64url');
const T0 = new Array(16).fill(0), REV = T0.map((_, i) => (i === IDX ? 1 : 0)), SUS = T0.map((_, i) => (i === IDX ? 2 : 0));
const E = emite(), M = emite({ alg: 'ML-DSA-65', holderAlg: 'ML-DSA-65' }), faraStare = SV.issueSdJwtVc({ issuer: iss, holder: hol, vct: VCT, claims: CL, disclosable: ['birthdate'], iss: ISS, iat: NOW, exp: NOW + 365 * 86400 });
const E = emite(), M = emite({ alg: 'ML-DSA-65', holderAlg: 'ML-DSA-65' }), faraStare = SV.issueSdJwtVc({ alg: 'EdDSA', holderAlg: 'EdDSA', classicalHalf: true, issuer: iss, holder: hol, vct: VCT, claims: CL, disclosable: ['birthdate'], iss: ISS, iat: NOW, exp: NOW + 365 * 86400 });
const reveal = ['birthdate', 'age_over_18', { element: 'RO', in: 'nationalities' }];
const corpL = JSON.parse(Buffer.from(lista(T0).split('.')[1], 'base64url').toString('utf8'));
const jeton = (extra, dezv = []) => jwtDin({ alg: 'EdDSA', typ: 'dc+sd-jwt' }, { vct: VCT, iss: ISS, iat: NOW, exp: NOW + 365 * 86400, _sd_alg: 'sha-256', cnf: { jwk: SJ.publicJwk(hol) }, ...extra }) + '~' + dezv.map((d) => d + '~').join('');
const jeton = (extra, dezv = []) => jwtDin({ alg: 'EdDSA', typ: 'dc+sd-jwt' }, { vct: VCT, iss: ISS, iat: NOW, exp: NOW + 365 * 86400, _sd_alg: 'sha-256', cnf: { jwk: SJ.publicJwk(hol, 'EdDSA', { classicalHalf: true }) }, ...extra }) + '~' + dezv.map((d) => d + '~').join('');
const dStatus = b64u(JSON.stringify(['salt-s', 'status', { status_list: { idx: 1, uri: URI } }]));
return { now: iso(NOW + 60), audience: AUD, nonce: NONCE, issuer: ISS, vct: VCT, uri: URI, idx: IDX, issuerJwk: SJ.publicJwk(iss), issuerJwkMlDsa: SJ.publicJwk(iss, 'ML-DSA-65'),
return { now: iso(NOW + 60), audience: AUD, nonce: NONCE, issuer: ISS, vct: VCT, uri: URI, idx: IDX, issuerJwk: SJ.publicJwk(iss, 'EdDSA', { classicalHalf: true }), issuerJwkMlDsa: SJ.publicJwk(iss, 'ML-DSA-65'),
direct: arata(E.sdJwt, reveal), directMlDsa: arata(M.sdJwt, reveal, { holderAlg: 'ML-DSA-65' }), noStatus: arata(faraStare.sdJwt, ['birthdate']),
lists: { clean: lista(T0), revoked: lista(REV), suspended: lista(SUS, 2), eightBits: lista(T0, 8), otherUri: lista(T0, 1, { uri: URI + '-other' }), expired: lista(T0, 1, { exp: NOW + 30 }),
stranger: SV.issueStatusListJwt({ issuer: strain, uri: URI, statuses: T0, iat: NOW }), short: SV.issueStatusListJwt({ issuer: iss, uri: URI, statuses: [0, 0, 0, 0], bits: 8, iat: NOW }),
stranger: SV.issueStatusListJwt({ alg: 'EdDSA', classicalHalf: true, issuer: strain, uri: URI, statuses: T0, iat: NOW }), short: SV.issueStatusListJwt({ alg: 'EdDSA', classicalHalf: true, issuer: iss, uri: URI, statuses: [0, 0, 0, 0], bits: 8, iat: NOW }),
typJwt: jwtDin({ alg: 'EdDSA', typ: 'JWT' }, corpL), noIat: jwtDin({ alg: 'EdDSA', typ: 'statuslist+jwt' }, (({ iat, ...r }) => r)(corpL)),
mlDsa: SV.issueStatusListJwt({ issuer: iss, alg: 'ML-DSA-65', uri: URI, statuses: T0, iat: NOW, exp: NOW + 3600 }) },
forged: {
noVct: arata(SJ.issueSdJwt({ issuer: iss, holder: hol, claims: { given_name: 'Ada' }, iss: ISS, iat: NOW, exp: NOW + 365 * 86400, typ: 'dc+sd-jwt' }).sdJwt, []),
noVct: arata(SJ.issueSdJwt({ alg: 'EdDSA', holderAlg: 'EdDSA', classicalHalf: true, issuer: iss, holder: hol, claims: { given_name: 'Ada' }, iss: ISS, iat: NOW, exp: NOW + 365 * 86400, typ: 'dc+sd-jwt' }).sdJwt, []),
statusDisclosed: jeton({ _sd: [sha(dStatus)] }, [dStatus]),
statusIdxNegative: jeton({ status: { status_list: { idx: -1, uri: URI } } }),
statusNotObject: jeton({ status: 'revoked' }),
@ -1230,7 +1232,7 @@ function construieste() {
const srcA = 'producers (sdjwt.mjs: issueSdJwt, presentSdJwt), three hybrid key pairs made and discarded at generation';
const bo = 'sdjwt-presentation/aere.valid', bom = 'sdjwt-presentation/aere-ml-dsa-65.valid', bi = 'sdjwt-presentation/aere-issued.valid';
const intrareA = (sdJwt, o = {}) => ({ sdJwt, issuerKey: X.issuerJwk, issuerAlg: 'EdDSA', audience: X.audience, nonce: X.nonce, now: X.now, expectedIssuer: X.issuer, ...o });
valid(bo, A, 'an SD-JWT issued with AERE keys (EdDSA): two of three disclosable claims and one list element shown, two decoy digests, a key binding JWT for this verifier', srcA, intrareA(X.direct), { exercises: SK, levels: AP });
valid(bo, A, 'an SD-JWT issued with AERE keys (EdDSA), judged with the Ed25519 half given as a plain JWK (classical interoperation: the verdict is not post-quantum): two of three disclosable claims and one list element shown, two decoy digests, a key binding JWT for this verifier', srcA, intrareA(X.direct), { exercises: SK, levels: AP });
valid(bom, A, 'the same credential, issuer and holder keys ML-DSA-65 (RFC 9964, JWK type AKP)', srcA, intrareA(X.directMlDsa, { issuerKey: X.issuerJwkMlDsa, issuerAlg: 'ML-DSA-65' }), { exercises: SK, levels: AP });
valid(bi, A, 'the same SD-JWT as issued (every disclosure, no key binding), judged by a verifier that does not require key binding', srcA, { sdJwt: X.issued, issuerKey: X.issuerJwk, issuerAlg: 'EdDSA', now: X.now, requireKeyBinding: false }, { exercises: SK, levels: AP });
const F = X.forged;
@ -1256,6 +1258,18 @@ function construieste() {
prod('sdjwt-presentation/aere-issued.disclosure-form-not-json', 'a disclosure that is base64url of text that is not JSON', bi, F.disclosureNotJson, 'sdjwt.disclosure-form', 'the issuer signed the digest of a disclosure whose bytes are not JSON');
prod('sdjwt-presentation/aere-issued.disclosure-form-sd', '_sd is a string, not a list of digests', bi, F.sdNotList, 'sdjwt.disclosure-form', 'the issuer signed a payload whose _sd is a string');
inv('sdjwt-presentation/aere-issued.time-years-later', 'the verifier clock is years later: the credential has expired', bi, { op: 'set', path: ['now'], value: X.muchLater }, 'sdjwt.time');
// 2026-10-19 (AIP-25 C1, D-535): the same issuer keys given the way an AERE identity publishes them ({alg, ed25519, mldsa65}, the output
// of `identity-cli.mjs pub`), rebuilt from the two public JWKs of the fresh source (the SPKI of a key is canonical, so this is the object of
// that identity). Against hybrid keys the ML-DSA-65 half is judged; the Ed25519 half only when the verifier asks for it (classicalHalf)
const spki = (jwk) => crypto.createPublicKey({ key: jwk, format: 'jwk' }).export({ type: 'spki', format: 'der' }).toString('base64');
const aerePub = { alg: 'ed25519+ml-dsa-65', ed25519: spki(X.issuerJwk), mldsa65: spki(X.issuerJwkMlDsa) };
const bh = 'sdjwt-presentation/aere-hybrid-keys.valid', bhc = 'sdjwt-presentation/aere-hybrid-keys-classical.valid';
const intrareH = (sdJwt, o = {}) => ({ sdJwt, issuerKey: aerePub, audience: X.audience, nonce: X.nonce, now: X.now, expectedIssuer: X.issuer, ...o });
valid(bh, A, 'the credential signed with the ML-DSA-65 half (issuer and holder), judged against the issuer\'s AERE hybrid keys ({alg, ed25519, mldsa65}) with no algorithm named: the ML-DSA-65 half is the one judged', srcA, intrareH(X.directMlDsa), { exercises: SK, levels: AP });
inv('sdjwt-presentation/aere-hybrid-keys.hybrid-half', 'a credential signed with the Ed25519 half of the same AERE identity alone, against its hybrid keys, by a verifier that asks for nothing (what a holder of the classical key alone can make)', bh, { op: 'set', path: ['sdJwt'], value: X.direct }, 'sdjwt.hybrid-half');
inv('sdjwt-presentation/aere-hybrid-keys.hybrid-half-named', 'the verifier names EdDSA for the AERE hybrid keys without asking for the classical half (classicalHalf)', bh, { op: 'add', path: ['issuerAlg'], value: 'EdDSA' }, 'sdjwt.hybrid-half');
valid(bhc, A, 'the credential signed with the Ed25519 half alone, against the AERE hybrid keys, by a verifier that asks for the classical half (classicalHalf): VALID, and the verdict says it is not post-quantum', srcA, intrareH(X.direct, { classicalHalf: true }), { exercises: SK, levels: AP });
inv('sdjwt-presentation/aere-hybrid-keys-classical.hybrid-half', 'the same, the verifier no longer asking for the classical half', bhc, { op: 'remove', path: ['classicalHalf'] }, 'sdjwt.hybrid-half');
// @sd-jwt/core (openwallet-foundation-labs/identity-common-ts), from the interop fixtures: its tokens, with its public test keys
const srcIo = `@sd-jwt/core ${IO.biblioteci['@sd-jwt/core']} with jose ${IO.biblioteci.jose} (interop/fixturi-interop-sdjwt.json of the identity component, generated ${IO.generat.slice(0, 10)}; its test keys made and discarded at generation)`;
const laIo = new Date(IO.ceasVerificare * 1000).toISOString();

View File

@ -182,7 +182,9 @@ async function judeca(artifact, input, online) {
const vc = artifact === 'sdjwt-vc-presentation';
const M = await incarca(vc ? 'sdjwtvc' : 'sdjwt'); const RB = VERIFICATOARE.sdjwt.reguli, RV = VERIFICATOARE['sdjwt-vc'].reguli;
if (typeof input.now !== 'string') throw new Error('an SD-JWT presentation is judged on the verifier\'s clock: input.now (an RFC 3339 time) is required');
const o = { now: input.now }; for (const k of ['issuerKey', 'issuerAlg', 'audience', 'nonce', 'expectedIssuer', 'requireKeyBinding', 'requireExp', 'maxAgeS', 'expectedTyp', 'expectedVct', 'statusListJwt', 'statusListKey', 'statusListAlg', 'requireStatus']) if (input[k] !== undefined) o[k] = input[k];
// 2026-10-19 (AIP-25 C1): classicalHalf, which the verifier brings (the Ed25519 half of AERE keys judged on request), is passed too: a
// field this adapter does not name never reaches the verifier
const o = { now: input.now }; for (const k of ['issuerKey', 'issuerAlg', 'classicalHalf', 'audience', 'nonce', 'expectedIssuer', 'requireKeyBinding', 'requireExp', 'maxAgeS', 'expectedTyp', 'expectedVct', 'statusListJwt', 'statusListKey', 'statusListAlg', 'requireStatus']) if (input[k] !== undefined) o[k] = input[k];
const r = vc ? M.verifySdJwtVc(input.sdJwt, o) : M.verifySdJwt(input.sdJwt, o);
if (r.valid !== (r.rule == null)) throw new Error('the SD-JWT verifier refused without naming a rule');
if (!r.valid) {
@ -190,7 +192,8 @@ async function judeca(artifact, input, online) {
pica(acc, m[1], m[0], r.reason); nemasurat(acc, m[1] === 'integrity' ? 'authenticity' : 'integrity', 'not-reached', 'the verifier stopped at its first refusal');
} else {
trece(acc, 'integrity', `no rule of the SD-JWT${vc ? ' VC' : ''} verifier refused: ${r.disclosed.length} disclosure(s) bound to the issuer-signed JWT${vc ? ', vct ' + r.vct : ''}`);
trece(acc, 'authenticity', `the issuer-signed JWT verifies (${r.alg}) with the issuer key the verifier gave` + (r.keyBinding ? `; the key binding JWT (${r.keyBinding.alg}) verifies with cnf.jwk for this audience and nonce` : '; no key binding (the verifier did not require one)'));
trece(acc, 'authenticity', `the issuer-signed JWT verifies (${r.alg}) with the issuer key the verifier gave` + (r.keyBinding ? `; the key binding JWT (${r.keyBinding.alg}) verifies with cnf.jwk for this audience and nonce` : '; no key binding (the verifier did not require one)')
+ (r.postQuantum === true ? '; every signature judged is post-quantum (ML-DSA-65)' : r.postQuantum === false ? '; NOT post-quantum: a signature judged is classical' : ''));
if (vc && r.status && r.status.present && !r.status.judged) nemasurat(acc, 'integrity', 'claim-not-checked', `the credential names a status (${r.status.mechanism}${r.status.uri ? ' at ' + r.status.uri : ''}) and no list was judged: the verifier waived it`);
}
for (const l of ['anchoring', 'finality']) nemasurat(acc, l, 'not-judged', 'an SD-JWT is anchored by notarizing an AIP-23 envelope of it, judged as the artifact `envelope`');

View File

@ -190,7 +190,7 @@ const ramase = () => [...Object.values(MODULE).map((m) => path.dirname(fileURLTo
async function malformate() {
const R = await incarca('risc'), C = await incarca('chitanta'), P = await incarca('piata'), B = await incarca('baza'), SC = await incarca('sidecar'), AR = await incarca('arbore'), L = await incarca('ledger'), ID = await incarca('identity'), DV = await incarca('device'), SJ = await incarca('sdjwt'), SV = await incarca('sdjwtvc'), TRm = await incarca('travelrule'), CF = await incarca('compliance'); const clona = (x) => JSON.parse(JSON.stringify(x));
// the SD-JWT verifiers (2026-10-18), called the way the adapter calls them; a VC whose status was waived and not judged is PARTIAL, not accepted
const optSd = (i) => { const o = { now: i.now }; for (const k of ['issuerKey', 'issuerAlg', 'audience', 'nonce', 'expectedIssuer', 'requireKeyBinding', 'requireExp', 'maxAgeS', 'expectedTyp', 'expectedVct', 'statusListJwt', 'statusListKey', 'statusListAlg', 'requireStatus']) if (i[k] !== undefined) o[k] = i[k]; return o; };
const optSd = (i) => { const o = { now: i.now }; for (const k of ['issuerKey', 'issuerAlg', 'classicalHalf', 'audience', 'nonce', 'expectedIssuer', 'requireKeyBinding', 'requireExp', 'maxAgeS', 'expectedTyp', 'expectedVct', 'statusListJwt', 'statusListKey', 'statusListAlg', 'requireStatus']) if (i[k] !== undefined) o[k] = i[k]; return o; };
const J = { 'payment-risk': (i) => R.judeca(i.policy, i.inputs).decision === 'ALLOW', 'payment-receipt': (i) => C.verificaChitanta(i.receipt, { policy: i.policy, inputs: i.inputs, tx: i.tx, receipt: i.txReceipt }).verdict === 'VALID', 'market-timeline': (i) => P.judeca(i).verdict === 'VALID',
'dataset-record': (i) => B.verificaInregistrare(i.record, i.commitment).ok, 'dataset-answer': (i) => B.verificaRaspuns(i.answer, i.commitment).verdict === 'VALID', 'dataset-consistency': (i) => B.verificaConsistentaVersiuni(i.proof, i.older, i.newer).ok,
// the verifiers enrolled after the first four (2026-10-05), called the way the adapter calls them; ai-trust is not here: each case would run the reference verifier several times

View File

@ -260,6 +260,8 @@ export const VERIFICATOARE = {
typ: ['sdjwt.typ', I, 'the issuer-signed JWT carries the explicit type the verifier expects (any ...+sd-jwt by default; RFC 9901 Section 9.11) and the key binding JWT kb+jwt'],
crit: ['sdjwt.crit', I, 'no critical header parameter (crit) is present: none is understood'],
key: ['sdjwt.key', AU, 'the key given is a public EC, OKP or AKP JWK that can be read, and of the algorithm the JWS declares (no algorithm confusion)'],
// 2026-10-19 (AIP-25 C1, D-535; the rule cryptopolicy.hybrid-no-single-half of AIP-25 section 5)
'hybrid-half': ['sdjwt.hybrid-half', AU, 'with the keys of an AERE hybrid identity (Ed25519 and ML-DSA-65), the ML-DSA-65 half is judged by default; the Ed25519 half alone is judged only when the verifier asks for it (classicalHalf), and the verdict then says it is not post-quantum'],
signature: ['sdjwt.signature', AU, 'the JWS signature verifies with that key: the issuer-signed JWT with the issuer key the verifier chose, the key binding JWT with cnf.jwk'],
issuer: ['sdjwt.issuer', AU, 'iss is the issuer the verifier expects, when it names one'],
'sd-alg': ['sdjwt.sd-alg', I, '_sd_alg is sha-256 (or absent), and appears only at the top level of the payload (RFC 9901 Section 4.1.1)'],

View File

@ -1,7 +1,7 @@
{
"v": 1,
"kind": "aere-conformance-vector-index",
"count": 626,
"count": 631,
"artifacts": {
"envelope": 67,
"payment-risk": 11,
@ -14,7 +14,7 @@
"agent-ledger": 18,
"identity-presentation": 69,
"device-bundle": 194,
"sdjwt-presentation": 54,
"sdjwt-presentation": 59,
"sdjwt-vc-presentation": 32,
"travel-rule-binding": 19,
"travel-rule-message": 26,
@ -25,7 +25,7 @@
"dataset-consistency": 3,
"dataset-sample": 2
},
"offline": 617,
"offline": 622,
"online": 9,
"rules": {
"agents.anchor": [
@ -800,6 +800,11 @@
"sdjwt-presentation/rfc9901.form",
"sdjwt-presentation/rfc9901-issued.form-empty"
],
"sdjwt.hybrid-half": [
"sdjwt-presentation/aere-hybrid-keys.hybrid-half",
"sdjwt-presentation/aere-hybrid-keys.hybrid-half-named",
"sdjwt-presentation/aere-hybrid-keys-classical.hybrid-half"
],
"sdjwt.issuer": [
"sdjwt-presentation/rfc9901.issuer"
],
@ -4192,602 +4197,637 @@
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xb17ee5bbb8da8bae3d03143e6160d4d64acf63b55a02c25a16fd4094ed8a9ff8"
"sha256": "0x6297025adb1f6f1632064fac794ec9accfdf172d12928ce62e38eea4cf928c01"
},
{
"id": "sdjwt-presentation/rfc9901-issued.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x04c37a5643c2709acdd97554beecd6f236422d43e65d359c3a9285e98ffbda35"
"sha256": "0xcdfd0d815893e7c8f4513bc6e8587b2e69e02d469e464b57e3c0187cd6698897"
},
{
"id": "sdjwt-presentation/rfc9901.kb-audience",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x0ffcf487db005bcbace1d7d0961737b5642d4eabc6ccec2fdf383974657cf50b"
"sha256": "0x839d3f231fa0af51e74bef7458032b6b9ea091fcb29a83feac3ed1bd38f524d6"
},
{
"id": "sdjwt-presentation/rfc9901.kb-nonce",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xdb638acdc2a716dcdb39bb604193563bb635829be33e71335c591c7e579149f0"
"sha256": "0x97807b3af18b30a6d565885a76fc83619ba21eb1b1035dea545e5e4ea0fc015d"
},
{
"id": "sdjwt-presentation/rfc9901.kb-freshness",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x87d7a9a0b9024a3650ac95e626ed9b6431d8b681e035f4737e7e8769e273eb56"
"sha256": "0xa53df394b1f5fcb38015965544f4901eb023c572a7d2354d3d5d4c384024cd7e"
},
{
"id": "sdjwt-presentation/rfc9901.kb-context",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xe4d777dc0cf33955839d38d08fb6964d443045b41855f124f0b4b07ec6ae8441"
"sha256": "0xe636e6f0bcfcffdccd97e6a57989592d184d38b7738f8575b6d283b51f45b6f2"
},
{
"id": "sdjwt-presentation/rfc9901.issuer",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x79002f5b01ff4319a8ade3c075ab529e4a8f21b0901836495a9b664dd9ea498e"
"sha256": "0xa513d3d4adf019411418c1648dc50f51e5fde7c9cb7ceaf1221cae4be94d2756"
},
{
"id": "sdjwt-presentation/rfc9901.key",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xd4f715d484688437ceaed4de485dfc60d23474474c99cb3d5c5ed08e9c114ad5"
"sha256": "0xfe068cf4af8b01b6948d89e84591f845a08abb484cb9c73cdc7adec8ccb79c4f"
},
{
"id": "sdjwt-presentation/rfc9901.signature",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xbed1f3e911242d854ed61119b0ea7ed3d3ba7b22c66f0093fc411cd07b337ba4"
"sha256": "0xc314cafb0808cca3109e501d8d8a22a21e8cbcf0d61425c17c208d9ee8d915a7"
},
{
"id": "sdjwt-presentation/rfc9901.typ",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x610b0511d94253f4ed741599f8bdc8560de2ce824a6b265b02af851ef2ad2468"
"sha256": "0xc0379e76fd186ebd32a6a3b7c69b93332eca79e2dd222880fdc31415cf998e43"
},
{
"id": "sdjwt-presentation/rfc9901.form-clock",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x0548482f4dd888b221529a681153f98468c05eeceb71124a062ed6cd3fecd4ff"
"sha256": "0x92ff28c6cf96b0efd277217d7d4e63e86c0fdbffce8f5e0968965d4527f93903"
},
{
"id": "sdjwt-presentation/rfc9901.form",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x75c50a18e68f039ee30268349b4f8d596243630283c7aac37e52bfe86a4f4cd9"
"sha256": "0x8cd892946b5019abbe3c9ec60d43d46a218a2cadb187d75beb3465d3a04835a4"
},
{
"id": "sdjwt-presentation/rfc9901.kb-required",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xf7e658e06a4915c8c3c2316e71d94aa39f07f0a8143f711b37cd10c3d215064d"
"sha256": "0x1dd20021e03c45a4e7f698dd294898e83e57b40fd6688f957b01103064f5817e"
},
{
"id": "sdjwt-presentation/rfc9901.kb-sd-hash",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xfbd3aa0ad889053fc367fe07d0ba9c3cb317f9699b5471bdb3945a3b72380ea4"
"sha256": "0x9c3689026ea8eb2d71780a874c817c252b3fc40161d691b4bb298f9c72f1d7c1"
},
{
"id": "sdjwt-presentation/rfc9901-issued.disclosure-twice",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x0e7b8c7215d4a411169962bb2427ad362a5d861508c1c694e7a5efa5a71d42d5"
"sha256": "0x20a06347b8b0854c88de27c9a11c437d3af628fd4beb5891ad1f6c95b95531d0"
},
{
"id": "sdjwt-presentation/rfc9901-issued.form-empty",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x4ed4bd8bfcbd330fed266458bedf5924dcd06683918052546ec20b92b15d1f7b"
"sha256": "0x1361876045b34a515150fb7d09d02bf7b7de1a76d4b5d7aed30057e2cc605e9b"
},
{
"id": "sdjwt-presentation/rfc9901-issued.unreferenced",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x5c948c3cd0334abfacdd0b45c46165d211218516041d21bc966db66c64666283"
"sha256": "0x6221423fedfc063d389d56fc3ee14b75fb1ac49a9ff2cc50b6d032589bf990fd"
},
{
"id": "sdjwt-presentation/aere.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xa4bf25e6c7be85907e2faa208a3cfbc24b4afee8a9bdc42afa7e4a03402c4244"
"sha256": "0x8a837b2ab7d047c497582dc1574b7b2b4f2e8e2aec081db254f81cfd1826e8be"
},
{
"id": "sdjwt-presentation/aere-ml-dsa-65.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x566239bb9b499e3d9880278862d039190862ddc739b81ad047a5bc3cd4c2bd84"
"sha256": "0x9f952f16393b4cd223d746d20149d301ee1a6d5e3ef33207ff52fa520f4427a2"
},
{
"id": "sdjwt-presentation/aere-issued.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x060d56983b8b5866320966db55e0e62bacc03bd50d87f3fabb69909599b6758e"
"sha256": "0x08c2291c7769025d4249793fd10f991e92c4a76660493ff387b56673b2a9d328"
},
{
"id": "sdjwt-presentation/aere.signature-kb",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x6c4a37b0ee1f278f680076721f8dd9ca13ae438b50d9c5845e260433bcaa1cdf"
"sha256": "0x534d097a76d8029fc6cb07ab6cbbc3fcf7c3a5da789f5ed78ab702e887e9b0fa"
},
{
"id": "sdjwt-presentation/aere.kb-claims",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xcf83d7bc18ada8ff77c1912c1c3678afbd93a96b790b8af4eb715c0077f41c0e"
"sha256": "0x381b7b32b17981515e8805d6a52366ce1a2fc446eeae0030041886f615108a94"
},
{
"id": "sdjwt-presentation/aere.typ-kb",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x5d19972b3f596cc41986eacb9ce8e9fe15eefe64d77578d271c9ec323bb80054"
"sha256": "0x8ddf79377615079359055ad9b7823ee40a1542d8fe6b8224edc2fa52b4d24d08"
},
{
"id": "sdjwt-presentation/aere.kb-freshness-exp",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x113fad84b78b77a54a36b694e446bd97501b53088c53dd0b6370b25e1d1c5d18"
"sha256": "0x02680ab12addc099282d46d0a8c54f331d215e53812b6e0cbb9a6f15b90cf1f8"
},
{
"id": "sdjwt-presentation/aere.kb-cnf",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xf9d13dac0ffa00600d47be96bbd5c04e7c59eebd0b247ee9638c7246a321b6c0"
"sha256": "0xbda639e6da6277b9d987b46e62413aa5a6f3a859a5455d7f953eab41eb151370"
},
{
"id": "sdjwt-presentation/aere.time-expired",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x69e121ba34eb04588a2600eb1b8ad64ce72e2f9f995994e2ddad4bd863ce08b3"
"sha256": "0xa7134d24f0f39a869b21a04a60ed0ad7fca1edda55d36e664c6b09b16977e844"
},
{
"id": "sdjwt-presentation/aere.time-not-yet",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x062fcd99cb0ff9fe38a67b91d3aaf1219f57401b0aa24a0c78be9257d759e9ac"
"sha256": "0xbc2e8502b281345d2f8dc151171027bed2a7ba96e49f18685e33c9857511f755"
},
{
"id": "sdjwt-presentation/aere-issued.digest-twice",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x44887dec6503ca912cea3a6ddafa4ed5e01333ab826f5259414dc684402e45f0"
"sha256": "0x916256016730e58fba938df6e1c4b9262481b9acf7dc659a4647999bf71982d8"
},
{
"id": "sdjwt-presentation/aere-issued.sd-alg-nested",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x0ea82f93edb3b19517207915b79574a6da7f1133a257927ef4186cb5d658d3a2"
"sha256": "0xb246f41e5f1d09e7131224b18ac428858044f733261f33aab35b7225e59b9a4e"
},
{
"id": "sdjwt-presentation/aere-issued.sd-alg",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xa2d1384753a66a5dba6f2687500055c6bf37fc2ffdfa338beba4fbc7206e4301"
"sha256": "0x2b8c994c69a9b98c01df329381e2920ad5dbcbf78ec88401e70a827ce0a18276"
},
{
"id": "sdjwt-presentation/aere-issued.disclosure-name",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x132e6e91a14bc3d0d6677269ec6c2a398c3d8e1adb194e09fab8bff5c34c21fe"
"sha256": "0x651b65d7a61d6925d1cdc58b376a486b02aa1e8ad11c75a9d93a8a8faaf5daeb"
},
{
"id": "sdjwt-presentation/aere-issued.disclosure-name-proto",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x5338feb82fe56b769e75c5fb64c3f94efe179401e60b855ca1c87919eacebbd4"
"sha256": "0x45c8b252f83566fa9fd57c501274f906f265d3a53ef15020fbeea152f3527ea8"
},
{
"id": "sdjwt-presentation/aere-issued.claim-conflict",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xed21f15610061eb4f8e1888283913fb96785e8bf2cd9e7afc8d92a98e2cbc47d"
"sha256": "0xda6db391792d9e1e2c94d5bb3afdf928bf6e89c42ccbedf5e801362d1fb092ff"
},
{
"id": "sdjwt-presentation/aere-issued.crit",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xa2ce76f79c13e9faec8f0a172bab8af7d41d0be77d2eb7bda7966c27c1a712db"
"sha256": "0xc8580536436a88e827ce1503ef9036a6b424496f65a63b239a8550fff0e48dd4"
},
{
"id": "sdjwt-presentation/aere-issued.typ",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x66d813e2099009cb947872aff7afba7d53ae5d57d80c4ff30fb44b9d18b3c873"
"sha256": "0xe482ba29d5af3514a58c1e5aa49dc79dce143b37fc6486bf04bc96fae7072a05"
},
{
"id": "sdjwt-presentation/aere-issued.key-confusion",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x170a83409c1388467a3e3a287f21d965aea111738df4bf608ed4c40cdbcf52ac"
"sha256": "0x4f9a01375efe24c351c65f2604ee35a586bb2e0ad3cadade2b0d47528c6606d6"
},
{
"id": "sdjwt-presentation/aere-issued.alg-none",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xdd89f1d66bcb56a2f3dbe8153b8c87801f818be52d616702a4d40edcb5102277"
"sha256": "0x88c9e458a457b7b5864880935c3f4ff62d142542af831d139aad8fe13eb0b9da"
},
{
"id": "sdjwt-presentation/aere-issued.time-no-exp",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xe673e99b16402da40f4fdfef1dc32c77aba7903972bbb277be76ea802366b5e3"
"sha256": "0x5dbea70948a712429000e76a07c552e65815694c2e21feaea02dc53760e9ec65"
},
{
"id": "sdjwt-presentation/aere-issued.disclosure-form",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x9c63eed2d02e6f8207267937799233ff643de6796b3755d44b8c52a60e9739f8"
"sha256": "0xb3f4ffa98533f5f6ed6b9326d877fe94d687602f0eef1716eccbded481f3737a"
},
{
"id": "sdjwt-presentation/aere-issued.disclosure-form-not-json",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xb669d3f8a57b0d926beaf415578e809a3b3e7f90440818a60bc2ae6da92a0373"
"sha256": "0xd39fe089f202df98897ee0e83b9711ef8fc864780ff56ffd206b5dec9c8e6dc8"
},
{
"id": "sdjwt-presentation/aere-issued.disclosure-form-sd",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x6df675c2e2ddda38eca7dcc925af1532418b90318dbdf88c6ac10bbdb9e7e9a1"
"sha256": "0x91706b53e6a0203a94556f33832d3cf105c4176ac8cc69736e69ca2c3422c065"
},
{
"id": "sdjwt-presentation/aere-issued.time-years-later",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xf660f7dea5fe9bedb4495bb7a0df617385b73ef8ad41797d3a6b5ed77303a926"
"sha256": "0x0612c01535b5105dcb806676919a678febb4f217c25cf599598afe82c8aed574"
},
{
"id": "sdjwt-presentation/aere-hybrid-keys.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xfd5df2ce6851c740367dfdd4784a4b87deb9e32d9ac527bc3fbef7d4888086c1"
},
{
"id": "sdjwt-presentation/aere-hybrid-keys.hybrid-half",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xa77ec219167ca7b8084ae329e516f72cb2b527f262643d7365d89bd31e41e43a"
},
{
"id": "sdjwt-presentation/aere-hybrid-keys.hybrid-half-named",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xac0e492b0245d4ede7dd83aed50b76a0fbf86d4e1ab57b3d56893fca5a9cc933"
},
{
"id": "sdjwt-presentation/aere-hybrid-keys-classical.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x7c0630a55e437188440f5c0bcff6b518a822eee133e616de1066b3d49fca6c7b"
},
{
"id": "sdjwt-presentation/aere-hybrid-keys-classical.hybrid-half",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x01fc1c751ed53a96a3a31ccab1ff1a94d6f0f5db65dd22551fc986248566aec9"
},
{
"id": "sdjwt-presentation/sd-jwt-core.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x71d62658266c8f31fa6aeff83fb5565c407d2b981ab78b6a06e90f580791da59"
"sha256": "0x2e0df797423670574d475084c8cdf83a120cfeaab463be1f22f1fef44ec7b337"
},
{
"id": "sdjwt-presentation/sd-jwt-core-es256.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x1a63524779967f5fbd00b39ffed1af4dcee3cbf87e92be2be21020a15142c2ac"
"sha256": "0x6462feb9e415e520d6ebec9c105a0a3902ff8773cca1d66c512d75303b92b184"
},
{
"id": "sdjwt-presentation/sd-jwt-core-ml-dsa-65.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x482b805ad218e84510a35632c63045f310f2b78050d95d0207361ab6bf8b0abc"
"sha256": "0x1a8ff789a4aa9e615090342463bedf88eff748811a0893508829a005785b78a4"
},
{
"id": "sdjwt-presentation/sd-jwt-core-typed.valid",
"artifact": "sdjwt-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xa1d9246df259269051d7a2a7ac3153f7254bb5cc6ff8f37e3c2c2f0368ebbf4f"
"sha256": "0xb5ce2729ad0c98f657fd25bbce6121030d40016d2d64f2f2689983cc39c05e1e"
},
{
"id": "sdjwt-presentation/sd-jwt-core.typ",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xfb5ba1d694fb5f7bf163f49a1e4d02916ad8cea38a0f677347f69b3fe82478e1"
"sha256": "0x3991ca458d7eea09813c0aef5c9312943f9e86f87df4bc8817c3fe19fd159494"
},
{
"id": "sdjwt-presentation/sd-jwt-core.unreferenced",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x456d9abc237881556e309710c823998f2e84b53d3a3a4d3b3878454ef80a32e9"
"sha256": "0xbd7648096d92389853766fa3e475ced4885546d6ec29f698de4553bf338c053e"
},
{
"id": "sdjwt-presentation/sd-jwt-core.kb-audience",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x6cfa3d696a540aaa0ea0b9a721ee4716ee7687bb95413b1119e85f682e0e55dc"
"sha256": "0xd22917dd9e8513c688fd9adb1e46893f9601aaad08d158ae7351445ae34b30cb"
},
{
"id": "sdjwt-presentation/sd-jwt-core.alg",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x8cd27350a3cd59185d43122746f416477403e75afa100bddca2ed8b064be14db"
"sha256": "0xd733a98c57faf812a14b8c0e27daae13d6abb1b172358e240f02072fc2216f72"
},
{
"id": "sdjwt-presentation/sd-jwt-core.digest-twice",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x02a188377b49d09c05ad3b1983bbf66063c6be05aadeb7024348efb90c4afed8"
"sha256": "0x85718dac77c316e78d5d6a9dad9cfe08a38f573aebb188a9b6966eec2a414035"
},
{
"id": "sdjwt-presentation/sd-jwt-core.signature-kb",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x424f7a30fe9735ea5908430cbef3514f1bff7b77ce16ab3e4455fa31e3b1a0d5"
"sha256": "0x9057ca0586b5341940ffd6d61dd87c33b410003d9ccc3366c255d646699f11ed"
},
{
"id": "sdjwt-presentation/sd-jwt-core.kb-sd-hash",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xfc9fbaf5afb2e166b24747502dd4a07cb8adf72b937546a1e7f2f3cf5daf5f6c"
"sha256": "0xa52f7def3a096fe40500d395e16bab1f813e38857358e8bc31b5cafa07baff03"
},
{
"id": "sdjwt-presentation/sd-jwt-core.sd-alg",
"artifact": "sdjwt-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x72a06db812e62ebf82790e5b6ebe2c17d5db41f171fa6d2c09fd66bbe5519fc8"
"sha256": "0xa152555d488deb7e383ea8a14dd71dfbbab23911fd07338427a2770c1fd42a65"
},
{
"id": "sdjwt-vc-presentation/aere-pid.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x4037fa40a084b4c2f1a7af6802b2571a93bc8042aae8b38e4d6793464e1bab8b"
"sha256": "0x331053c263e790ebafd6f84c90bd56cf9d124f8337073ef93a842ca325bb41a4"
},
{
"id": "sdjwt-vc-presentation/aere-pid-ml-dsa-65.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xd9f9a5f9f6ae3565fa24512fb3fc8cf2555c6126bc0712b72959acd2a1aec56b"
"sha256": "0xbc810c7187cc588a04d7ff0f31f34910c680f1912f18be78ebd2f98f579e3109"
},
{
"id": "sdjwt-vc-presentation/aere-no-status.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xa875911438b0d95388b243f86e76406cd5ae2fa8ba20626f04037a6024816890"
"sha256": "0x48d1aefe93ea144d8b75287679e76fb82117b394402dba016ddcaf72d8791c5e"
},
{
"id": "sdjwt-vc-presentation/aere-pid-status-waived.partial",
"artifact": "sdjwt-vc-presentation",
"verdict": "PARTIAL",
"requires": [],
"sha256": "0xb5a2b2ec0165ca31cee3ee3eeed8768f1ba2263738c3efd2f99bdceabf04ab55"
"sha256": "0xcddfd5016f2be573ce9fa7657334d8e155d9c6619c64f58ea4bd2dbc2a2732dd"
},
{
"id": "sdjwt-vc-presentation/aere-pid-8-bits.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x83b6a8c4a65390d5b6debaed5042222620f0a82aff53473792e136925c28195a"
"sha256": "0x9404c128cc2adc14d9ec30bffb8c46c3ff339034e59a67b0baf886b15f567b31"
},
{
"id": "sdjwt-vc-presentation/aere-pid.vct-expected",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x45771debbe260bbbc6e2a7b5fbe551317d4660948581925a158edae9689b08f7"
"sha256": "0xc1f7584db6222f5b154f33409c8befbedd1dda9645e1a397587a75f26af66fbe"
},
{
"id": "sdjwt-vc-presentation/aere-pid.vct-mismatch",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x2f1e4cd09d7184e0a9ec39466de9053100ff48636ee9a33dab389c50abc9af62"
"sha256": "0x97d643dac6be2cffa3e11f372c326db82220e1b584b04d67344d2c7a4a1ecbe4"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-revoked",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xd9a95cc74c4b566d23e0513c25ea2d177ac3e7e426534995d36748fc50ff7552"
"sha256": "0xea8e1d16512572caa537ae6cca28d24b5d79f7fb88d3bec4bf84057af7729ffe"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-suspended",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xa846cc09df82afbe62a374ccf6329cf7d4b2cbfe9ca012696738179d76dc20fe"
"sha256": "0x8d8b6b8be1f0d1e4908afb080abef19f703e6e4c4784edcbd96db7b5491d584a"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-list-other-uri",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xf772ddd4a3807705110eb41028ecd3ab28626de41199710b085215afbbbddd44"
"sha256": "0x915554c96d7b797648806384e5fe750d667ec925ef5950f395575cf549523301"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-list-expired",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x75081bea94d1a739b44ae005d6cc81c46e2a960dd3c4c4ebefd2f8d22419c55b"
"sha256": "0x3f44acb3f3efb77e8054c6147cb8e67d694192468990edf99f7faa61c7308bd5"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-list-stranger",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xa079f4cd56609a180571173a91b1e9fc47b84b94916d68a060a26bcbc80e4537"
"sha256": "0xe7fe2f98ef00ea3dc6086d238cf52825e9f650da7cccf2dcff468c024c66414b"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-list-typ",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x2ad1585933c5901cec2bdae407374f104e95a279e9ab6a66feb339cba355d2b4"
"sha256": "0xacd562584c9d09256a19c48c9467e3c1b4a3645f8b4a7c50846be8334e3ba2f6"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-list-no-iat",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x72a4a8c5085e0c222722413d1e42e71d07a89df6c8fa68067d49fcbcc81a2bd5"
"sha256": "0xc731a9fd905295629cee49e25441b2dec03a385fc4c2be28555267df82ec48f4"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-index",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x22fde994e6e073f8e28f7dffdad024917abce8ae3522de2fe5b7c5e7bc40abf2"
"sha256": "0x1fcd735451afd9dc6df4b3d3f6e1639c6faa13048e874dfc46d592345dfb1984"
},
{
"id": "sdjwt-vc-presentation/aere-pid.status-unjudged",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x3ad94f9eda82f09dab7505fabba4ed0809428c5d8ba86e0fc2f73402cac076a9"
"sha256": "0xd0f8332c496b0d9c36a71a3084d5eb95123803bd18e4525d115a96925b250d51"
},
{
"id": "sdjwt-vc-presentation/aere-pid.vct",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x114f09bf63c5cbe717905385662ab75a3b9fa61e07e779b1168192389d558884"
"sha256": "0xb7bff5186c86b17a56b2fe271a65e5a8fa2926d2196b238d4e5ef0401f8648e9"
},
{
"id": "sdjwt-vc-presentation/aere-pid.disclosed-protected",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xc8a6be1abaa3dae8f31cf26dad961c812502b2d376988f58ef35cd089892caad"
"sha256": "0xbb404bdeff4c014566f8b685a7737dee0fd72ae0993eff915eab7be376a55cd9"
},
{
"id": "sdjwt-vc-presentation/aere-pid.form-idx",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x83f5bc27803169753d4ac30ef44d82f66c73ed6e6842650168696cb6397e8459"
"sha256": "0xe3ee88251f3f7d98b789265b717f2d83e9925598d78fd08d2e4e9c97b462da43"
},
{
"id": "sdjwt-vc-presentation/aere-pid.form-status",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x44c5dddb20d400c6091e9deec56b9ebd69a69c6e7f325907e21720603111fddc"
"sha256": "0xc6f2e11798e8feb64549f364fe109de2432e9c523406e5752a256ba7654eabb3"
},
{
"id": "sdjwt-vc-presentation/aere-pid.form-integrity",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xe6a38bfdfb1ebbd0fea2e1d60ffd6832f3370f927a2bfb3fad03cdd590823f31"
"sha256": "0x018e3f4dddcfe4ba1019751a6c4be4578752656a1102be894cc3ea6881ea1a7d"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0x1404a0597db6f869adaf5ff8abedf8670cb63ba48819083908d3572679e72411"
"sha256": "0x1d2d6e32f2641ca6aff06a401e896aee538bbec7dae3e3cb95216758074d30bb"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc-es256.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xf7b34bf9da366783955d233ad50a17ff7582a04a99532b1cb16d489912dcd372"
"sha256": "0xe7f83fb6c2c8b4bc449d575c14c7670e41a4f7327d01ac378218edcb4a49d9b0"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc-ml-dsa-65.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xdea179ad9cd7ca65e786922c680828a38f0e694ae6c0f263d4fde195982c528f"
"sha256": "0x3e8d5cb4c97a4ee31324cb954e3f1d17429029deeed12698c25015dedd23e2f9"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc-8-bits.valid",
"artifact": "sdjwt-vc-presentation",
"verdict": "VALID",
"requires": [],
"sha256": "0xb8197a79e6faddf9b35fd95754d17dc8aa2d8174fe8d8a3be3239c767bd395ce"
"sha256": "0x01de3dc59b46ea0d28472ef3686782da6f54e5a4264e3159abee983f330ebf34"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc-status-waived.partial",
"artifact": "sdjwt-vc-presentation",
"verdict": "PARTIAL",
"requires": [],
"sha256": "0xa7311135ea7ca068e7bc3f5e95c361f9462bec2b3abf52c30df8475cf9441a43"
"sha256": "0x7564a116e6b9ee22d998f34e682499526bf89a528b3fb44aabe1ff9cdd3221ad"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.status-revoked",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0xeb4ac475c2cd1debe08d4dfc29359e6e9f30419b7cd3c4a01e1a227a14996ef8"
"sha256": "0x7bc0cd827b1568420751b5770cee4754cba50202f63d777b6234822dec4d067f"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.status-suspended",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x1aa605fd51ecb74c7bf6508f10921112938d672483a942398bc2f3f15a49d423"
"sha256": "0xd8f48086eead0fe0625f5925fed796a116917cc5b75dccbfb3a619fa5d1de09d"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.status-list-other-uri",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x4020a11a308284d3570b98e72c5476b28ccd24bde24afeb00a2366966404154f"
"sha256": "0x3da1f851d3ed5cdf4f38f924fc0c73461daabbe451d2a9a00c5f203538101d9e"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.status-list-expired",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x25bbd41833ee8d02cb7d046f1c502a16f826316d8ca246271c37e310635a6b0d"
"sha256": "0x6c5cb2872427359e010e2e34c9a785b82d0fdbe87eeb449ebcadfeb56bac95f8"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.vct-mismatch",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x6d245525ebed4580c4d4044712df02acf084f8c39671516b5328eb73904159ee"
"sha256": "0x956901d80bd4469059ce91439821342b2722de43623778d266aa91b5891c7289"
},
{
"id": "sdjwt-vc-presentation/sd-jwt-vc.status-unjudged",
"artifact": "sdjwt-vc-presentation",
"verdict": "INVALID",
"requires": [],
"sha256": "0x10fed0db565c3f655e2ba85c08651d31fa42b0f7628b30e3295039aa8f9ac6b1"
"sha256": "0xf85981bdc6739c5c56bc67af87e8d95338041e56159aea4ee54d18d2109574c6"
},
{
"id": "travel-rule-binding/beneficiary.valid",

View File

@ -0,0 +1,66 @@
{
"v": 1,
"kind": "aere-conformance-vector",
"id": "sdjwt-presentation/aere-hybrid-keys-classical.hybrid-half",
"artifact": "sdjwt-presentation",
"title": "the same, the verifier no longer asking for the classical half",
"source": "derived from sdjwt-presentation/aere-hybrid-keys-classical.valid",
"requires": [],
"exercises": [
"sdjwt.alg",
"sdjwt.claim-conflict",
"sdjwt.crit",
"sdjwt.digest-twice",
"sdjwt.disclosure-form",
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",
"sdjwt.kb-cnf",
"sdjwt.kb-context",
"sdjwt.kb-freshness",
"sdjwt.kb-nonce",
"sdjwt.kb-required",
"sdjwt.kb-sd-hash",
"sdjwt.key",
"sdjwt.sd-alg",
"sdjwt.signature",
"sdjwt.time",
"sdjwt.typ",
"sdjwt.unreferenced"
],
"base": "sdjwt-presentation/aere-hybrid-keys-classical.valid",
"mutation": {
"op": "remove",
"path": [
"classicalHalf"
]
},
"input": {
"sdJwt": "eyJhbGciOiJFZERTQSIsInR5cCI6ImFlcmUrc2Qtand0In0.eyJuYXRpb25hbGl0aWVzIjpbeyIuLi4iOiJvR1ZLcV9iYUlSbkdjX0x6S2c3Rjd4R0M2OTdOLXJSWjdNbGJMdk9jMzlvIn0seyIuLi4iOiJYU1BvSVhtdkRMMHY4a3BTZ1NGZ3ZuTWZtcy0zTllLdmtYM0cxd2RCNmg4In1dLCJhZGRyZXNzIjp7ImxvY2FsaXR5IjoiQ2x1aiIsImNvdW50cnkiOiJSTyJ9LCJfc2QiOlsiMGl3bk5fZjRkSGhfcUI0SlhyX201OGdoWFNYRmk3LTk0SDR4QnpOdXBMSSIsIjM1QnNjekpxVEdFNEdWY0ZZa0tEMEY3R0wweUlUdlp5MVpSU0x2Y2tpdTAiLCIzWm5SQk9fMGFZbUZCQUl6Tl9QZmdNYVlacUVYdWNibkg1Y2E5RFNNTFdBIiwiYVptbDlYNUU5cDhxaVJvcExVeGtTeUpsXzgtemEzQVRnRWFEanhBQ2o0OCIsImpLSlJ6WS00NmR5cWFHMnliQkk4OUxuT0ZuQ0xRSl9Ddk5rWnlnOFVxQzAiXSwiX3NkX2FsZyI6InNoYS0yNTYiLCJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiaWF0IjoxNzkyMzAyNTUyLCJleHAiOjE4MjM4Mzg1NTIsImNuZiI6eyJqd2siOnsiY3J2IjoiRWQyNTUxOSIsIngiOiJwZGd3WVJzOEtTdl9ESUJvaEFhaWx4MEoxS01xVGkyd2cwVGY3TmJaOFY0Iiwia3R5IjoiT0tQIn19fQ.h75vV6jAkI1n0st_TUrGseDJKEk0RScfX5neSm_CSN2GoVjL2Ml2oKmB0szWDCjjlAcq1Tn1B39KNwEE1dWzBw~WyJSYTAyRkdCZDJmMW5HRlJPUFNUdURnIiwiYWdlX292ZXJfMTgiLHRydWVd~WyJZUVdma1BBSW1UTUpTU09vNmQ1WVJBIiwiUk8iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE3OTIzMDI1NTIsImF1ZCI6Imh0dHBzOi8vdmVyaWZpZXIuZXhhbXBsZSIsIm5vbmNlIjoibi04NzlmYzQxN2UzMzFiYzgwIiwic2RfaGFzaCI6IlBWY1dzVDZ1SVFhUHBRUUM1QUQyUzQ3Q3Z5QllpRTBxQ1RVZUtpd0ZfRlUifQ.i8LKIVBV7X67veBsk-vyyCHouKBFEXP5uLl927e3m3-_JE1hOHuyv0KX2gioAO81kI1FY1TV6xHOiQVF-UyBBg",
"issuerKey": {
"alg": "ed25519+ml-dsa-65",
"ed25519": "MCowBQYDK2VwAyEAhca9rLOG6cMHfk2weCWFz7wily7iDR/Qvhhs6tTQGjA=",
"mldsa65": "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"
},
"audience": "https://verifier.example",
"nonce": "n-879fc417e331bc80",
"now": "2026-10-18T05:50:12.000Z",
"expectedIssuer": "https://issuer.example"
},
"expected": {
"verdict": "INVALID",
"failed": [
"sdjwt.hybrid-half"
],
"levels": {
"integrity": "NOT_MEASURED",
"authenticity": "FAILED",
"anchoring": "NOT_MEASURED",
"finality": "NOT_MEASURED"
}
}
}

View File

@ -0,0 +1,60 @@
{
"v": 1,
"kind": "aere-conformance-vector",
"id": "sdjwt-presentation/aere-hybrid-keys-classical.valid",
"artifact": "sdjwt-presentation",
"title": "the credential signed with the Ed25519 half alone, against the AERE hybrid keys, by a verifier that asks for the classical half (classicalHalf): VALID, and the verdict says it is not post-quantum",
"source": "producers (sdjwt.mjs: issueSdJwt, presentSdJwt), three hybrid key pairs made and discarded at generation",
"requires": [],
"exercises": [
"sdjwt.alg",
"sdjwt.claim-conflict",
"sdjwt.crit",
"sdjwt.digest-twice",
"sdjwt.disclosure-form",
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",
"sdjwt.kb-cnf",
"sdjwt.kb-context",
"sdjwt.kb-freshness",
"sdjwt.kb-nonce",
"sdjwt.kb-required",
"sdjwt.kb-sd-hash",
"sdjwt.key",
"sdjwt.sd-alg",
"sdjwt.signature",
"sdjwt.time",
"sdjwt.typ",
"sdjwt.unreferenced"
],
"base": null,
"mutation": null,
"input": {
"sdJwt": "eyJhbGciOiJFZERTQSIsInR5cCI6ImFlcmUrc2Qtand0In0.eyJuYXRpb25hbGl0aWVzIjpbeyIuLi4iOiJvR1ZLcV9iYUlSbkdjX0x6S2c3Rjd4R0M2OTdOLXJSWjdNbGJMdk9jMzlvIn0seyIuLi4iOiJYU1BvSVhtdkRMMHY4a3BTZ1NGZ3ZuTWZtcy0zTllLdmtYM0cxd2RCNmg4In1dLCJhZGRyZXNzIjp7ImxvY2FsaXR5IjoiQ2x1aiIsImNvdW50cnkiOiJSTyJ9LCJfc2QiOlsiMGl3bk5fZjRkSGhfcUI0SlhyX201OGdoWFNYRmk3LTk0SDR4QnpOdXBMSSIsIjM1QnNjekpxVEdFNEdWY0ZZa0tEMEY3R0wweUlUdlp5MVpSU0x2Y2tpdTAiLCIzWm5SQk9fMGFZbUZCQUl6Tl9QZmdNYVlacUVYdWNibkg1Y2E5RFNNTFdBIiwiYVptbDlYNUU5cDhxaVJvcExVeGtTeUpsXzgtemEzQVRnRWFEanhBQ2o0OCIsImpLSlJ6WS00NmR5cWFHMnliQkk4OUxuT0ZuQ0xRSl9Ddk5rWnlnOFVxQzAiXSwiX3NkX2FsZyI6InNoYS0yNTYiLCJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiaWF0IjoxNzkyMzAyNTUyLCJleHAiOjE4MjM4Mzg1NTIsImNuZiI6eyJqd2siOnsiY3J2IjoiRWQyNTUxOSIsIngiOiJwZGd3WVJzOEtTdl9ESUJvaEFhaWx4MEoxS01xVGkyd2cwVGY3TmJaOFY0Iiwia3R5IjoiT0tQIn19fQ.h75vV6jAkI1n0st_TUrGseDJKEk0RScfX5neSm_CSN2GoVjL2Ml2oKmB0szWDCjjlAcq1Tn1B39KNwEE1dWzBw~WyJSYTAyRkdCZDJmMW5HRlJPUFNUdURnIiwiYWdlX292ZXJfMTgiLHRydWVd~WyJZUVdma1BBSW1UTUpTU09vNmQ1WVJBIiwiUk8iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE3OTIzMDI1NTIsImF1ZCI6Imh0dHBzOi8vdmVyaWZpZXIuZXhhbXBsZSIsIm5vbmNlIjoibi04NzlmYzQxN2UzMzFiYzgwIiwic2RfaGFzaCI6IlBWY1dzVDZ1SVFhUHBRUUM1QUQyUzQ3Q3Z5QllpRTBxQ1RVZUtpd0ZfRlUifQ.i8LKIVBV7X67veBsk-vyyCHouKBFEXP5uLl927e3m3-_JE1hOHuyv0KX2gioAO81kI1FY1TV6xHOiQVF-UyBBg",
"issuerKey": {
"alg": "ed25519+ml-dsa-65",
"ed25519": "MCowBQYDK2VwAyEAhca9rLOG6cMHfk2weCWFz7wily7iDR/Qvhhs6tTQGjA=",
"mldsa65": "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"
},
"audience": "https://verifier.example",
"nonce": "n-879fc417e331bc80",
"now": "2026-10-18T05:50:12.000Z",
"expectedIssuer": "https://issuer.example",
"classicalHalf": true
},
"expected": {
"verdict": "VALID",
"failed": [],
"levels": {
"integrity": "PASSED",
"authenticity": "PASSED",
"anchoring": "NOT_MEASURED",
"finality": "NOT_MEASURED"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,67 @@
{
"v": 1,
"kind": "aere-conformance-vector",
"id": "sdjwt-presentation/aere-hybrid-keys.hybrid-half",
"artifact": "sdjwt-presentation",
"title": "a credential signed with the Ed25519 half of the same AERE identity alone, against its hybrid keys, by a verifier that asks for nothing (what a holder of the classical key alone can make)",
"source": "derived from sdjwt-presentation/aere-hybrid-keys.valid",
"requires": [],
"exercises": [
"sdjwt.alg",
"sdjwt.claim-conflict",
"sdjwt.crit",
"sdjwt.digest-twice",
"sdjwt.disclosure-form",
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",
"sdjwt.kb-cnf",
"sdjwt.kb-context",
"sdjwt.kb-freshness",
"sdjwt.kb-nonce",
"sdjwt.kb-required",
"sdjwt.kb-sd-hash",
"sdjwt.key",
"sdjwt.sd-alg",
"sdjwt.signature",
"sdjwt.time",
"sdjwt.typ",
"sdjwt.unreferenced"
],
"base": "sdjwt-presentation/aere-hybrid-keys.valid",
"mutation": {
"op": "set",
"path": [
"sdJwt"
],
"value": "eyJhbGciOiJFZERTQSIsInR5cCI6ImFlcmUrc2Qtand0In0.eyJuYXRpb25hbGl0aWVzIjpbeyIuLi4iOiJvR1ZLcV9iYUlSbkdjX0x6S2c3Rjd4R0M2OTdOLXJSWjdNbGJMdk9jMzlvIn0seyIuLi4iOiJYU1BvSVhtdkRMMHY4a3BTZ1NGZ3ZuTWZtcy0zTllLdmtYM0cxd2RCNmg4In1dLCJhZGRyZXNzIjp7ImxvY2FsaXR5IjoiQ2x1aiIsImNvdW50cnkiOiJSTyJ9LCJfc2QiOlsiMGl3bk5fZjRkSGhfcUI0SlhyX201OGdoWFNYRmk3LTk0SDR4QnpOdXBMSSIsIjM1QnNjekpxVEdFNEdWY0ZZa0tEMEY3R0wweUlUdlp5MVpSU0x2Y2tpdTAiLCIzWm5SQk9fMGFZbUZCQUl6Tl9QZmdNYVlacUVYdWNibkg1Y2E5RFNNTFdBIiwiYVptbDlYNUU5cDhxaVJvcExVeGtTeUpsXzgtemEzQVRnRWFEanhBQ2o0OCIsImpLSlJ6WS00NmR5cWFHMnliQkk4OUxuT0ZuQ0xRSl9Ddk5rWnlnOFVxQzAiXSwiX3NkX2FsZyI6InNoYS0yNTYiLCJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiaWF0IjoxNzkyMzAyNTUyLCJleHAiOjE4MjM4Mzg1NTIsImNuZiI6eyJqd2siOnsiY3J2IjoiRWQyNTUxOSIsIngiOiJwZGd3WVJzOEtTdl9ESUJvaEFhaWx4MEoxS01xVGkyd2cwVGY3TmJaOFY0Iiwia3R5IjoiT0tQIn19fQ.h75vV6jAkI1n0st_TUrGseDJKEk0RScfX5neSm_CSN2GoVjL2Ml2oKmB0szWDCjjlAcq1Tn1B39KNwEE1dWzBw~WyJSYTAyRkdCZDJmMW5HRlJPUFNUdURnIiwiYWdlX292ZXJfMTgiLHRydWVd~WyJZUVdma1BBSW1UTUpTU09vNmQ1WVJBIiwiUk8iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE3OTIzMDI1NTIsImF1ZCI6Imh0dHBzOi8vdmVyaWZpZXIuZXhhbXBsZSIsIm5vbmNlIjoibi04NzlmYzQxN2UzMzFiYzgwIiwic2RfaGFzaCI6IlBWY1dzVDZ1SVFhUHBRUUM1QUQyUzQ3Q3Z5QllpRTBxQ1RVZUtpd0ZfRlUifQ.i8LKIVBV7X67veBsk-vyyCHouKBFEXP5uLl927e3m3-_JE1hOHuyv0KX2gioAO81kI1FY1TV6xHOiQVF-UyBBg"
},
"input": {
"sdJwt": "eyJhbGciOiJFZERTQSIsInR5cCI6ImFlcmUrc2Qtand0In0.eyJuYXRpb25hbGl0aWVzIjpbeyIuLi4iOiJvR1ZLcV9iYUlSbkdjX0x6S2c3Rjd4R0M2OTdOLXJSWjdNbGJMdk9jMzlvIn0seyIuLi4iOiJYU1BvSVhtdkRMMHY4a3BTZ1NGZ3ZuTWZtcy0zTllLdmtYM0cxd2RCNmg4In1dLCJhZGRyZXNzIjp7ImxvY2FsaXR5IjoiQ2x1aiIsImNvdW50cnkiOiJSTyJ9LCJfc2QiOlsiMGl3bk5fZjRkSGhfcUI0SlhyX201OGdoWFNYRmk3LTk0SDR4QnpOdXBMSSIsIjM1QnNjekpxVEdFNEdWY0ZZa0tEMEY3R0wweUlUdlp5MVpSU0x2Y2tpdTAiLCIzWm5SQk9fMGFZbUZCQUl6Tl9QZmdNYVlacUVYdWNibkg1Y2E5RFNNTFdBIiwiYVptbDlYNUU5cDhxaVJvcExVeGtTeUpsXzgtemEzQVRnRWFEanhBQ2o0OCIsImpLSlJ6WS00NmR5cWFHMnliQkk4OUxuT0ZuQ0xRSl9Ddk5rWnlnOFVxQzAiXSwiX3NkX2FsZyI6InNoYS0yNTYiLCJpc3MiOiJodHRwczovL2lzc3Vlci5leGFtcGxlIiwiaWF0IjoxNzkyMzAyNTUyLCJleHAiOjE4MjM4Mzg1NTIsImNuZiI6eyJqd2siOnsiY3J2IjoiRWQyNTUxOSIsIngiOiJwZGd3WVJzOEtTdl9ESUJvaEFhaWx4MEoxS01xVGkyd2cwVGY3TmJaOFY0Iiwia3R5IjoiT0tQIn19fQ.h75vV6jAkI1n0st_TUrGseDJKEk0RScfX5neSm_CSN2GoVjL2Ml2oKmB0szWDCjjlAcq1Tn1B39KNwEE1dWzBw~WyJSYTAyRkdCZDJmMW5HRlJPUFNUdURnIiwiYWdlX292ZXJfMTgiLHRydWVd~WyJZUVdma1BBSW1UTUpTU09vNmQ1WVJBIiwiUk8iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE3OTIzMDI1NTIsImF1ZCI6Imh0dHBzOi8vdmVyaWZpZXIuZXhhbXBsZSIsIm5vbmNlIjoibi04NzlmYzQxN2UzMzFiYzgwIiwic2RfaGFzaCI6IlBWY1dzVDZ1SVFhUHBRUUM1QUQyUzQ3Q3Z5QllpRTBxQ1RVZUtpd0ZfRlUifQ.i8LKIVBV7X67veBsk-vyyCHouKBFEXP5uLl927e3m3-_JE1hOHuyv0KX2gioAO81kI1FY1TV6xHOiQVF-UyBBg",
"issuerKey": {
"alg": "ed25519+ml-dsa-65",
"ed25519": "MCowBQYDK2VwAyEAhca9rLOG6cMHfk2weCWFz7wily7iDR/Qvhhs6tTQGjA=",
"mldsa65": "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"
},
"audience": "https://verifier.example",
"nonce": "n-879fc417e331bc80",
"now": "2026-10-18T05:50:12.000Z",
"expectedIssuer": "https://issuer.example"
},
"expected": {
"verdict": "INVALID",
"failed": [
"sdjwt.hybrid-half"
],
"levels": {
"integrity": "NOT_MEASURED",
"authenticity": "FAILED",
"anchoring": "NOT_MEASURED",
"finality": "NOT_MEASURED"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -3,7 +3,7 @@
"kind": "aere-conformance-vector",
"id": "sdjwt-presentation/aere.valid",
"artifact": "sdjwt-presentation",
"title": "an SD-JWT issued with AERE keys (EdDSA): two of three disclosable claims and one list element shown, two decoy digests, a key binding JWT for this verifier",
"title": "an SD-JWT issued with AERE keys (EdDSA), judged with the Ed25519 half given as a plain JWK (classical interoperation: the verdict is not post-quantum): two of three disclosable claims and one list element shown, two decoy digests, a key binding JWT for this verifier",
"source": "producers (sdjwt.mjs: issueSdJwt, presentSdJwt), three hybrid key pairs made and discarded at generation",
"requires": [],
"exercises": [
@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

View File

@ -15,6 +15,7 @@
"sdjwt.disclosure-name",
"sdjwt.disclosure-twice",
"sdjwt.form",
"sdjwt.hybrid-half",
"sdjwt.issuer",
"sdjwt.kb-audience",
"sdjwt.kb-claims",

Some files were not shown because too many files have changed in this diff Show More