feat: public-key fingerprints, pqfe recipient commands, and full-coverage supply chain - #81
Merged
Merged
Conversation
…l nine packages - Pin NuGetPackageValidation (2.0.6) and CycloneDX (6.2.0) in the release job — the last floating third-party code that executed there — and set persist-credentials: false on both release checkouts. - Attest .snupkg symbol packages and the SBOM files alongside .nupkg (the docs previously promised snupkg verification that failed by construction; now the claim and the pipeline agree, forward from the next tag). - Add the Analyzers package's missing SBOM. - Extend post-release reproducibility verification from 4 to all 9 lockstep packages (matrix + script cases). - Enable binary package validation in Aws/AzureKeyVault/Gcp against the published 1.7.1 baseline (stale pre-first-publish opt-out removed; all three verified packing clean against the live baseline). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sym7RJ7ehNhbMXytE5rMmS
Public-key fingerprints (both external reviews' convergent ask — the
key-substitution defense): PqHybridPublicKey.GetFingerprint() and
PqSigningPublicKey.GetFingerprint() return pqfp1: + URL-safe Base64 SHA-256
over a domain prefix, purpose tag (recipient/signing can never collide), and
the exported key bytes. Rendering frozen for the pqfp1: prefix; pinned by
FingerprintTests with precomputed vectors. Shared internal helper in the core.
pqfe recipient — the library's defining post-quantum path, usable end-to-end
from the shipped tool for the first time:
recipient keygen <keyfile> [--encrypt] X25519+ML-KEM-768 pair; PQKF opt-in;
prints the fingerprint; 0600, CreateNew,
half-pair cleanup like signing keygen
recipient encrypt <in> <out> --recipient p [--recipient p2 ...] multi-recipient
recipient decrypt <in> <out> --identity k [--untrusted] PQKF auto-detected
recipient fingerprint <pub> stdout, for scripts
Both keygen commands now print the fingerprint and warn on unencrypted keys.
Claim-based overwrite refusal and the unified fail-closed message flow through
unchanged (verified by an end-to-end smoke run: PQKF + raw identities,
2-recipient container, wrong-key rejection leaves no output file).
KEY-MANAGEMENT.md gains the fingerprint-verification section; CLI README and
usage updated; PublicAPI.Unshipped entries added. AOT closure unchanged in
kind (Signing already carried BouncyCastle).
Verified: 321x2 tests green, build clean, live CLI smoke test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Sym7RJ7ehNhbMXytE5rMmS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two commits, both freeze-safe (no byte meaning or reader acceptance changes):
1. Supply-chain hardening (the items unblocked by #76)
persist-credentials: falseon both release checkouts..nupkg+.snupkg+ the SBOM files (the docs previously promised snupkg verification that failed by construction). Analyzers gets its missing SBOM.2. Fingerprints +
pqfe recipient(both external reviews' top feature asks)GetFingerprint()on hybrid-recipient and signing public keys:pqfp1:+ URL-safe Base64 SHA-256 over domain prefix + purpose tag + key bytes. Purpose-separated (recipient/signing can never collide), stable, safe to log/pin, frozen rendering pinned by precomputed test vectors. Documented in KEY-MANAGEMENT.md as the key-substitution defense.recipient keygen(PQKF opt-in, 0600, CreateNew, prints fingerprint),recipient encrypt(multi-recipient),recipient decrypt(--identity, PQKF auto-detect,--untrusted),recipient fingerprint. Inherits the claim-based overwrite refusal and the unified fail-closed error contract.Verification
🤖 Generated with Claude Code
https://claude.ai/code/session_01Sym7RJ7ehNhbMXytE5rMmS