verify: --require-rooted-signer (reject did:key self-attestation) - #324
Conversation
…estation A bare did:key signer is a self-attestation: the key is its own identity with no key-state log behind it, so it cannot be rotated or revoked — a leaked release key stays valid forever, and --expect-signer (issuer-equality) still passes it. The new --require-rooted-signer policy demands a rotatable, revocable did:keri signer and fails closed on a did:key self-attestation. Applied after cryptographic verification; like --expect-signer it can only narrow a valid verdict, never widen it. Pure unrooted_signer_rejected helper + adversarial unit test (did:key rejected, did:keri accepted, policy-off is a no-op). Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Auths Commit Verification
Result: ❌ 0/1 commits verified How to fixCommit 1. Install auths macOS: 2. One-time setup (creates your identity and configures Git) auths init3. Sign this branch and push auths sign origin/main..HEAD
git push --force-with-leaseFor CI to verify the signer, commit an identity bundle: auths id export-bundle --alias main --output .auths/ci-bundle.json --max-age-secs 31536000 |
…ted-signer refusal + freshness summary) Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1
Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1
Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1
Auths Commit Verification
Result: ❌ 0/2 commits verified (1 skipped) How to fixCommit 1. Install auths macOS: 2. One-time setup (creates your identity and configures Git) auths init3. Sign this branch and push auths sign origin/main..HEAD
git push --force-with-leaseFor CI to verify the signer, commit an identity bundle: auths id export-bundle --alias main --output .auths/ci-bundle.json --max-age-secs 31536000 |
Auths Commit Verification
Result: ❌ 0/4 commits verified (1 skipped) How to fixCommit 1. Install auths macOS: 2. One-time setup (creates your identity and configures Git) auths init3. Sign this branch and push auths sign origin/main..HEAD
git push --force-with-leaseFor CI to verify the signer, commit an identity bundle: auths id export-bundle --alias main --output .auths/ci-bundle.json --max-age-secs 31536000 |
* feat(verify): --require-rooted-signer rejects a bare did:key self-attestation A bare did:key signer is a self-attestation: the key is its own identity with no key-state log behind it, so it cannot be rotated or revoked — a leaked release key stays valid forever, and --expect-signer (issuer-equality) still passes it. The new --require-rooted-signer policy demands a rotatable, revocable did:keri signer and fails closed on a did:key self-attestation. Applied after cryptographic verification; like --expect-signer it can only narrow a valid verdict, never widen it. Pure unrooted_signer_rejected helper + adversarial unit test (did:key rejected, did:keri accepted, policy-off is a no-op). Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1 * build: remove verify commits Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1 * build: remove verify commits Auths-Id: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Device: did:keri:EB5cPHY0t-ejNC_rUzPS1dclTvd6kG-R9mQzjozCuGgd Auths-Anchor-Seq: 1
What
Adds
auths artifact verify --require-rooted-signer: a post-verification policy that fails closed when the verified signer is a baredid:keyself-attestation (issuer == subject == key), accepting only a rotatable, revocabledid:kerisigner.Why (issue #300, Flag 3)
The release attestation today can sign with a bare
did:keyworkload key —issuer == subject == device_public_key, a self-attestation with no key-state log. A leaked release key stays valid forever;--expect-signeronly pins the key by equality, so it still passes a leaked key. Adid:kerisigner is backed by a KEL (rotation + revocation + recovery), which is the durable release identity #300 calls for.The verify side already trust-chains and authenticates (it resolves the current key from an authenticated KEL when a bundle is supplied); the no-bundle
did:keypath self-verifies. This flag lets the verifier require the rotatable identity.Scope / what's NOT here (for the reviewer)
did:keriorg identity for signing — is a tooling/process change (the SDK already supportsdid:keri-rooted dual-signed attestations); not in this PR.unrooted_signer_rejected+ adversarial unit test. An end-to-end test (a realdid:keyattestation rejected viahandle_verify) would strengthen it — flagging for the reviewer to request if desired.Full gate green (build, 56 verify tests, fmt, deny, error-docs).