Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .github/scripts/ci_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"registry-platform-hooks",
"registry-platform-httpsec",
"registry-platform-httputil",
"registry-platform-metrics",
"registry-platform-objectstore",
"registry-platform-oidc",
"registry-platform-ratelimit",
Expand All @@ -44,6 +45,8 @@
"registry-platform-sdjwt",
"registry-platform-sqlite",
"registry-platform-testing",
"registry-platform-text",
"registry-platform-x509",
"registry-platform-yaml",
),
"mcp": (
Expand Down Expand Up @@ -113,6 +116,8 @@
"registry-evidence-client-node",
"registry-evidence-client-py",
"registry-evidence-oid4vci",
"registry-evidence-oid4vp",
"registry-evidence-presentation",
"registry-evidence-verifier",
"registry-evidencectl",
),
Expand Down Expand Up @@ -185,6 +190,7 @@
"registry-documentsctl",
"registry-evidence",
"registry-evidence-oid4vci",
"registry-evidence-oid4vp",
"registry-evidencectl",
"registry-manifest-cli",
"registry-mcp",
Expand Down Expand Up @@ -302,8 +308,10 @@
"docs/site/src/content/docs/tutorials/verify-an-assertion-as-a-consumer.mdx",
"products/evidence/examples/fhir/**",
"products/evidence/examples/standalone/**",
"products/evidence/examples/wallet-presentation/**",
"products/evidence/fixtures/interoperability/inji-oid4vci/profile.json",
"products/evidence/fixtures/interoperability/inji-oid4vci/receipt.json",
"products/evidence/fixtures/interoperability/oid4vp-device-run/**",
"products/evidence/scripts/compat/inji-oid4vci-upstream.sh",
"products/evidence/scripts/compat/inji-oid4vci.sh",
# The application tutorial imports the maintained client package, and
Expand Down Expand Up @@ -1361,6 +1369,10 @@ def classify(
# The same generator publishes the evidence-oid4vci runtime grammar
# for the supporting service's configure page.
"products/evidence/generated/oid4vci-runtime/*",
# The wallet presentation API reference and the evidence-oid4vp
# runtime grammar follow the same rule as the delivery service's.
"products/evidence/generated/registry-evidence-oid4vp.openapi.json",
"products/evidence/generated/oid4vp-runtime/*",
"products/breg/generated/authoring/*",
"products/breg/generated/runtime/*",
# The Scheduling configuration reference page is generated from
Expand Down
46 changes: 43 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,11 @@ jobs:
target_a: authcommon_parsers
target_b: sqlite_statement
- group: sd-jwt
target_a: sdjwt_holder_proof
target_b: sdjwt_issuance
target_a: sdjwt_issuance
target_b: sdjwt_presentation_parse
- group: jose
target_a: crypto_jws_parse
target_b: crypto_jwe_decrypt
- group: yaml
target_a: yaml_reader
target_b: yaml_decode
Expand Down Expand Up @@ -455,6 +458,7 @@ jobs:
- group: verifier
target_a: verifier_flattened_jws
target_b: verifier_sd_jwt_vc
target_c: verifier_holder_proof
- group: authoring
target_a: authoring_openapi
target_b: authoring_project
Expand Down Expand Up @@ -486,7 +490,8 @@ jobs:
env:
FUZZ_TARGET_A: ${{ matrix.target_a }}
FUZZ_TARGET_B: ${{ matrix.target_b }}
run: products/evidence/scripts/run-fuzz-smoke.sh "$FUZZ_TARGET_A" "$FUZZ_TARGET_B"
FUZZ_TARGET_C: ${{ matrix.target_c }}
run: products/evidence/scripts/run-fuzz-smoke.sh "$FUZZ_TARGET_A" "$FUZZ_TARGET_B" ${FUZZ_TARGET_C:+"$FUZZ_TARGET_C"}

- name: Upload fuzz failures
if: failure()
Expand All @@ -496,6 +501,7 @@ jobs:
path: |
products/evidence/fuzz/artifacts/${{ matrix.target_a }}/
products/evidence/fuzz/artifacts/${{ matrix.target_b }}/
products/evidence/fuzz/artifacts/${{ matrix.target_c || matrix.target_a }}/
if-no-files-found: ignore

rust-policy:
Expand Down Expand Up @@ -734,6 +740,21 @@ jobs:
- name: Enforce Evidence verifier portability
run: products/evidence/scripts/check-verifier-portability.sh

# A deployment without wallet sources links none of the presentation
# verification dependencies, so the runtime must build without the
# default `wallet-presentation` feature and must not reach that crate.
- name: Build Evidence without wallet presentation
shell: bash
run: |
set -euo pipefail
cargo check --locked -p registry-evidence --no-default-features --all-targets
cargo test --locked -p registry-evidence --no-default-features --test host_protocols
if cargo tree --locked -p registry-evidence --no-default-features -e normal --prefix none \
| grep -q '^registry-evidence-presentation '; then
echo "::error::registry-evidence reaches registry-evidence-presentation without the wallet-presentation feature"
exit 1
fi

- name: Install uv
uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with:
Expand Down Expand Up @@ -1968,6 +1989,7 @@ jobs:
-p registry-documentsctl -p registry-adapterctl
-p registry-evidence -p registry-evidencectl -p registry-manifest-cli
-p registry-breg-mcp -p registry-breg-review -p registry-evidence-oid4vci -p registry-mcp
-p registry-evidence-oid4vp

- name: Run configuration conformance corpus
run: products/platform/scripts/run-config-conformance.sh --strict --bin-dir target/debug
Expand Down Expand Up @@ -2428,6 +2450,24 @@ jobs:
| tee "${RUNNER_TEMP}/evidence-source-recipes.log"
grep -q 'test result: ok\. 1 passed' "${RUNNER_TEMP}/evidence-source-recipes.log" || { echo "::error::expected exactly one passing test for curated_source_recipes_import_check_and_run_the_existing_evaluator"; exit 1; }

- name: Test the composed wallet presentation journey
shell: bash
env:
EVIDENCE_BIN: ${{ github.workspace }}/target/debug/evidence
EVIDENCECTL_BIN: ${{ github.workspace }}/target/debug/evidencectl
run: |
set -euo pipefail
cargo test --locked -p registry-evidence-oid4vp --test evidence_journey \
a_presented_credential_becomes_a_verified_assertion \
-- --ignored --exact \
| tee "${RUNNER_TEMP}/evidence-wallet-journey.log"
grep -q 'test result: ok\. 1 passed' "${RUNNER_TEMP}/evidence-wallet-journey.log" || { echo "::error::expected exactly one passing test for a_presented_credential_becomes_a_verified_assertion"; exit 1; }
cargo test --locked -p registry-evidence-oid4vp --test device_run \
a_simulated_wallet_completes_the_device_run_harness \
-- --ignored --exact \
| tee "${RUNNER_TEMP}/evidence-wallet-device-run.log"
grep -q 'test result: ok\. 1 passed' "${RUNNER_TEMP}/evidence-wallet-device-run.log" || { echo "::error::expected exactly one passing test for a_simulated_wallet_completes_the_device_run_harness"; exit 1; }

- name: Execute the Evidence tutorials with the stock issuer
shell: bash
env:
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/nightly-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,10 @@ jobs:
set -euo pipefail
for target in \
authcommon_parsers \
sdjwt_holder_proof \
crypto_jwe_decrypt \
crypto_jws_parse \
sdjwt_issuance \
sdjwt_presentation_parse \
sqlite_statement \
yaml_decode \
yaml_reader
Expand Down Expand Up @@ -189,6 +191,7 @@ jobs:
for target in \
verifier_flattened_jws \
verifier_sd_jwt_vc \
verifier_holder_proof \
authoring_openapi \
authoring_project
do
Expand Down
23 changes: 20 additions & 3 deletions .gitleaks.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ description = "Ignore the generated, gitignored VS Code test installation."
paths = ["^editors/vscode/\\.vscode-test/"]

[[allowlists]]
description = "Allow synthetic JWT fixtures used only by the platform fuzz harnesses."
description = "Allow synthetic JWT fixtures used only by the Evidence fuzz harnesses."
paths = [
"^products/platform/fuzz/corpus/sdjwt_holder_proof/holder_proof\\.jwt$",
"^products/platform/fuzz/corpus/sdjwt_holder_proof/valid-holder-proof-jwt$",
"^products/evidence/fuzz/corpus/verifier_holder_proof/holder_proof\\.jwt$",
"^products/evidence/fuzz/corpus/verifier_holder_proof/valid-holder-proof-jwt$",
]

[[allowlists]]
Expand Down Expand Up @@ -73,3 +73,20 @@ condition = "AND"
paths = ["^crates/registry-adapterctl/tests/fixtures_replay\\.rs$"]
regexTarget = "line"
regexes = ['''^\s*idempotency-key: [0-9a-f]{64}$''']

[[allowlists]]
description = "Allow the OpenID4VP refusal codes in the client identifier module; they are diagnostic code strings that name a secret or key, not credentials."
condition = "AND"
paths = ["^crates/registry-evidence-oid4vp/src/client_identifier\\.rs$"]
regexTarget = "line"
regexes = ['''=> "evidence\.oid4vp\.[a-z0-9-]+",$''']

[[allowlists]]
description = "Allow the SD-JWT VC presentations in the SD-JWT test vectors: the RFC 9901 section 5.2 example, and a vector generated with the OpenWallet Foundation library from a throwaway issuer key whose public half the vector pins; neither is a credential any deployment trusts."
condition = "AND"
paths = [
"^crates/registry-platform-sdjwt/tests/data/rfc-9901-section-5-2-presentation\\.txt$",
"^crates/registry-evidence-presentation/tests/vectors/es256-pinned-key\\.json$",
]
regexTarget = "line"
regexes = ['''^(\s*"presentation": ")?eyJhbGciOiAiRVMyNTYiLCAidHlwIjogI(mV4YW1wbGUrc2Qtand0In0\.|mRjK3NkLWp3dCIsICJraWQiOiAi)''']
19 changes: 16 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ shared primitives. Integration maintainers own `registry-mcp`, a supporting
composition service over explicit product bindings and the Live Adapter HTTP
contract. Platform owns its neutral `registry-mcp-edge` primitive; product
maintainers own each provider's authority and disclosure semantics.
`registry-breg-mcp`, `registry-breg-review`, and `registry-evidence-oid4vci`
remain supporting services beside their product, not products of their own.
`registry-breg-mcp`, `registry-breg-review`, `registry-evidence-oid4vci`, and
`registry-evidence-oid4vp` remain supporting services beside their product,
not products of their own.

## Repository map

Expand Down Expand Up @@ -109,7 +110,12 @@ remain supporting services beside their product, not products of their own.
| `crates/registry-manifest-*` | Manifest core types and CLI |
| `crates/registry-platform-*` | Shared primitives used by the maintained runtimes and tooling |
| `crates/registry-platform-sqlite` | Shared bounded read-only SQLite security boundary used by Evidence |
| `crates/registry-platform-x509` | Pure X.509 path validation outside TLS, against configured anchors only |
| `crates/registry-platform-text` | Pure, versioned Unicode text normalisation pipelines; products own their named profiles |
| `crates/registry-platform-metrics` | Prometheus text exposition primitive shared by the runtimes |
| `crates/registry-evidence-oid4vci` | Wallet-facing OID4VCI delivery front end for Evidence credentials, and the `evidence-oid4vci` binary |
| `crates/registry-evidence-oid4vp` | Wallet-facing OpenID4VP verifier exchange for holder-presented Evidence sources, and the `evidence-oid4vp` binary |
| `crates/registry-evidence-presentation` | Pure verification of third-party SD-JWT VC presentations against a channel's issuer trust and policy; no network, storage or clock |
| `crates/registry-language-server` | Editor language server for Evidence authoring documents, hosted for adopters by `evidencectl`; product navigation rules add no runtime dependencies |
| `crates/registry-thunderid-tooling` | Tooling-only support for adopter CLIs and integration tests against a pinned upstream ThunderID issuer; no runtime depends on it |
| `crates/registry-cli-docs` | Deterministic CLI reference data generated from Registry Stack Clap command trees, consumed by the docs site's CLI reference build |
Expand Down Expand Up @@ -226,7 +232,14 @@ tracked product material; do not call the product implemented on a subset of
that DoD, and stop before the approved concept's non-goals and future
profiles. `registry-evidence-oid4vci` delivers Evidence credentials to a
wallet over OID4VCI 1.0 Final; it never signs, never holds a holder private
key, and no Evidence crate depends on it at runtime. The optional credential
key, and no Evidence crate depends on it at runtime.
`registry-evidence-oid4vp` runs the OpenID4VP exchange for holder-presented
sources (`products/evidence/CONCEPT.md` section 15.10): it holds a received
presentation in memory only, until Evidence reads it or the result window
ends, and never verifies a credential, decides issuer trust, or signs. Evidence
reads it over its public HTTP contract through a fixed source binding and
verifies the credential itself with `registry-evidence-presentation`; no
Evidence crate depends on the protocol service. The optional credential
status module inside `registry-evidence` (`products/evidence/CONCEPT.md`
section 15.9, approved; its ledger is library code the served runtime does not
call yet) follows these rules: it is the only
Expand Down
Loading
Loading