Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
e710dd9
gdc: nym_auth verifier config (allowlist, circuit_zk formats) and an …
leifj Oct 20, 2026
4a6c4db
create-pki: SIGNING_CERT_VERIFIER_HOST adds the verifier's dNSName by…
leifj Oct 20, 2026
9be835f
create-pki: verifier SAN re-issue is opt-in per environment (values.v…
leifj Oct 20, 2026
4f4c99e
verifier-nymauth: stage the artifact with readable directories (COPY …
leifj Oct 20, 2026
71a6135
Merge feat/signing-cert-verifier-san (PR 80) into the gdc nym_auth ve…
leifj Oct 20, 2026
7e5790d
gdc: pin vc-verifier to the v5b nym_auth build (vc 2a30a609 + artifac…
leifj Oct 20, 2026
6c2315d
gdc verifier: rulebook v0.4 config (zkp_req, system_id_values, proof_…
leifj Oct 20, 2026
a1d5ae2
gdc: pin vc-verifier to the v0.4 nym_auth build (vc ae33687f + artifa…
leifj Oct 20, 2026
add79b1
gdc: pin vc-verifier to vc 094549cc (refuses a verifier_id without a …
leifj Oct 20, 2026
c5a7897
gdc: nym_auth_pseudonym and nym_auth_pseudonym_age zkp_req presets (s…
leifj Oct 21, 2026
fe53f37
Merge branch 'feat/gdc-nymauth-verifier' into deploy/gdc-nymauth-veri…
leifj Oct 21, 2026
f62b59d
gdc: pin vc-verifier to vc 253a17e92 (writes meta.source_format; the …
leifj Oct 21, 2026
c775877
gdc: age preset window that alice-001 satisfies (born 1980-01-01..200…
leifj Oct 21, 2026
5c98f40
Merge branch 'feat/gdc-nymauth-verifier' into deploy/gdc-nymauth-veri…
leifj Oct 21, 2026
a3491db
gdc: wallet-backend pin to the local integration build faa5e63 (#469 …
leifj Oct 21, 2026
7339c08
gdc: wallet-backend pin to the local integration build 9cb6e57 (faa5e…
leifj Oct 21, 2026
7039b61
gdc: PREPARED PDP policies for verifier_ids (needs go-trust PR 218 re…
leifj Oct 21, 2026
6df3eb1
gdc: pin vc-verifier to vc a56c4be9e (verifier UI fixes) + a PIN PROV…
leifj Oct 21, 2026
bbb66f5
Merge branch 'prep/gdc-pdp-verifier-ids' into deploy/gdc-nymauth-veri…
leifj Oct 21, 2026
20e9177
gdc: PDP to go-trust 0.26.0 (PR 218) with the verifier_ids policies; …
leifj Oct 21, 2026
75d919d
chart: the verifier's credential_metadata no longer lists the pre-aut…
leifj Oct 21, 2026
5ed95cc
golden: fly_up refreshed (verifier config without the twins; values-b…
leifj Oct 21, 2026
6b2f451
Merge pull request #82 from sirosfoundation/fix/verifier-hide-offer-t…
leifj Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,6 @@ fixtures/wrpac-clients/*.issued/

# bootmgr editable install metadata (make install)
*.egg-info/

# nym_auth circuit artifact (decompressed, ~1 MB): a build input for dockerfiles/verifier-nymauth.Dockerfile
fixtures/nym-auth-circuits/*.bin
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ The verifier has matching presentation-request templates in
`eu.europa.ec.eudi.nym_auth.1`, carrying `birth_date` (full-date, tag 1004),
`ssc` - SHA-256 of a 16-byte `secret_seed` the issuer and the prover share -
and optionally `psc` (SHA-256 of a prover-only seed). It exists for
`circuit_zk` presentations: pseudonyms and age predicates proven in zero
`zkp_req` presentations (called `circuit_zk` before rulebook v0.4): pseudonyms and age predicates proven in zero
knowledge, never disclosed. `fixtures/vc-metadata/nym_auth.mdoc.json` is a
byte-for-byte copy of the rulebook's schema until registry.siros.org
publishes it (mdoc types stay vendored even with `REGISTRY=external`).
Expand Down Expand Up @@ -517,6 +517,20 @@ in:** holder-supplied commitments (the `known-offender-matching-psc` configurati
lands, REMOVE the fixed `psc` from `nym_auth*.json`: the issuer refuses any document that already carries a value
for a configured commitment claim.

**Verifying a pseudonym (gdc config; image comes with vc's verifier release).** `environments/gdc.yaml`
`values.verifier.extraConfig` carries `verifier.nym_auth` (SUNET/vc#832): the allowlist entry
`known-offender-matching-ssc` (circuit ids, Ligero block parameters, artifact size and SHA-256 from
zk-cred-longfellow `src/nymauth/profile.rs`; do not copy the digest from vc's `docs/CONFIGURATION.md`, whose
example has 52 zeros in the middle) and `preferred_vp_formats.zkp_req` (`system_id_values`, `proof_system_values`; rulebook v0.4 names). The ~1 MB decompressed artifact cannot
travel as a Fly secret and is not in the vc repo, so `dockerfiles/verifier-nymauth.Dockerfile` bakes it into the
verifier image at `/etc/vc/circuits/nym_auth-ssc.bin`, checking size and digest at build time (build input:
`fixtures/nym-auth-circuits/nym_auth-ssc.bin`, gitignored; the recipe is in the file). The verifier needs the
`zknative` build and refuses to start without `trust.pdp_url`: it takes the issuer key from the HOLDER's own
chain, so the PDP is the only check that key belongs to an issuer (here: action `mdoc-issuer`, the mDOC IACA
registry; a self-signed chain with the same SAN gets decision false). **`verifier_id` is the verifier's client_id exactly as published,
`x509_san_dns:<host of public_url>` with the prefix (rulebook v0.4; the bare host was the rule before), and scopes every
pseudonym: changing it changes every pseudonym this verifier reports.**

### Service Architecture

```
Expand Down
2 changes: 1 addition & 1 deletion chart/templates/04-verifier.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ common:
branding:
favicon_path: /branding-assets/favicon.png
logo_path: /branding-assets/logo.png
credential_metadata: {{- include "siros-id.vc.credentialMetadata" . | nindent 4 }}
credential_metadata: {{- include "siros-id.vc.credentialMetadataVerifier" . | nindent 4 }}
verifier:
public_url: https://{{ $hostnameVerifier }}
api_server:
Expand Down
18 changes: 16 additions & 2 deletions chart/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -144,18 +144,31 @@ the file extension is what distinguishes them on disk.
concern of the issuer-apigw alone, so it is rendered only by the ...Apigw variant below: the other
services have no seed source and must not be handed a block that names one. */ -}}
{{- define "siros-id.vc.credentialMetadata" -}}
{{- include "siros-id.vc.credentialMetadata.render" (list . false) -}}
{{- include "siros-id.vc.credentialMetadata.render" (list . false false) -}}
{{- end -}}

{{- define "siros-id.vc.credentialMetadataApigw" -}}
{{- include "siros-id.vc.credentialMetadata.render" (list . true) -}}
{{- include "siros-id.vc.credentialMetadata.render" (list . true false) -}}
{{- end -}}

{{/*
The verifier's credential_metadata: the same block WITHOUT the pre-authorized offer twins (`<type>_offer`,
authProvider: preauth). A twin is an issuance-only scope, so listing it in the verifier doubled every entry of
its /ui/metadata and picker. Nothing verifier-side resolves a scope by its `_offer` name; the base scope (nym_auth
included, whose zkp_req presets take source_format and doctype_value from it) stays. The issuer keeps its twins: an
offer's credential_configuration_id is resolved against credential_configurations_supported.
*/}}
{{- define "siros-id.vc.credentialMetadataVerifier" -}}
{{- include "siros-id.vc.credentialMetadata.render" (list . false true) -}}
{{- end -}}

{{- define "siros-id.vc.credentialMetadata.render" -}}
{{- $root := index . 0 -}}
{{- $withCommitments := index . 1 -}}
{{- $skipPreauth := index . 2 -}}
{{- $_ := required "You must define credential types in the value features.credentialTypes" $root.Values.features.credentialTypes -}}
{{- range $id, $data := $root.Values.features.credentialTypes }}
{{- if not (and $skipPreauth (eq (default "" $data.issuance.authProvider) "preauth")) }}
{{ $id | quote }}:
{{- /* A pre-authorized twin reads its source's metadata file (see features.credentialTypes.<id>_offer). */}}
{{- $file := $data.metadataFrom | default $id }}
Expand All @@ -181,6 +194,7 @@ the file extension is what distinguishes them on disk.
{{- end }}
{{- end }}
{{- end }}
{{- end }}
{{- end -}}

{{/*
Expand Down
34 changes: 34 additions & 0 deletions dockerfiles/verifier-nymauth.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# The vc verifier image plus the nym_auth circuit artifact, for environments that verify nym_auth pseudonym proofs
# (environments/gdc.yaml, verifier.nym_auth).
#
# The artifact is the DECOMPRESSED Longfellow circuit (1,062,842 bytes). It cannot travel as a Fly file secret
# (base64 of it exceeds the ~1 MiB machine config body) and the vc repo does not carry it, so it is baked in here.
# The size and digest are checked at build time against the values the allowlist entry in environments/gdc.yaml
# states, which are in turn the ones zk-cred-longfellow's src/nymauth/profile.rs ships; vc re-checks both at startup
# and refuses anything else, so a wrong file fails the build rather than the first presentation.
#
# zstd -dc <archive>/longfellow/mdoc/circuits.zst > fixtures/nym-auth-circuits/nym_auth-ssc.bin # gitignored
# docker build -f dockerfiles/verifier-nymauth.Dockerfile \
# --build-arg BASE=registry.fly.io/sirosid-gdc-vc-verifier:<the vc verifier build, zknative> \
# -t registry.fly.io/sirosid-gdc-vc-verifier:local-<epoch> .
#
# The source archive is ours (no repository yet): ~/.cache/nymzip/nym-auth-circuits/longfellow/mdoc/circuits.zst
# (395,608 bytes, sha256 6c4b96ed431ee547a3a2e5b62621943a9a0a44646267653bf2db0fcc269b5c3b). Fetch it from its
# repository once there is one.
ARG BASE
FROM alpine:3.20 AS check
ARG ARTIFACT_BYTES=1062842
ARG ARTIFACT_SHA256=92dd42fdf99673249eec33c7d07850bd9da66fbdab01ef26391e04c8341c1b7f
COPY fixtures/nym-auth-circuits/nym_auth-ssc.bin /nym_auth-ssc.bin
RUN set -e; \
[ "$(wc -c < /nym_auth-ssc.bin)" = "${ARTIFACT_BYTES}" ] || { echo "artifact is not ${ARTIFACT_BYTES} bytes (decompressed?)"; exit 1; }; \
echo "${ARTIFACT_SHA256} /nym_auth-ssc.bin" | sha256sum -c -

# Staged with its directories here: a distroless runtime has no shell to chmod with, and `COPY --chmod` gives the
# directories it creates the FILE's mode (0444: no x bit), which makes the artifact unreadable to the non-root user
# ("open /etc/vc/circuits/nym_auth-ssc.bin: permission denied" at startup).
RUN mkdir -p /out/etc/vc/circuits && cp /nym_auth-ssc.bin /out/etc/vc/circuits/nym_auth-ssc.bin \
&& chmod 0755 /out/etc /out/etc/vc /out/etc/vc/circuits && chmod 0444 /out/etc/vc/circuits/nym_auth-ssc.bin

FROM ${BASE}
COPY --from=check /out/ /
Loading