Cryptographic operations inventory

A human-readable inventory of where the Praxis AI proxy performs cryptography in production, which provider executes each operation, and its FIPS disposition (#1220).

Versions marked “overview” do not contain this page. Selecting one opens that version’s documentation overview.

On this page

A human-readable inventory of where the Praxis AI proxy performs cryptography in production, which provider executes each operation, and its FIPS disposition (#1220). This document is the findings record; it is not a generated artifact and no checker re-derives it. The machine-enforced invariants that keep the provider story from silently regressing live in two places:

  • Feature-level drift (a pinned provider rerouting off OpenSSL) is caught by [[bans.features]] in deny.toml, run on every PR by cargo deny check (Supply Chain workflow).
  • A non-OpenSSL crypto backend crate entering the FIPS image is caught by cargo xtask fips (xtask/src/fips/graph.rs::DENIED), run on every PR via make lint (fips-deps) and the FIPS workflow.

Pinned crate versions below are documentary — Cargo.lock is the source of truth. Keep this file current by hand when a cryptographic operation or provider changes; drift here breaks no build (the guards above do the enforcing).

Build profiles

The proxy ships two profiles and the inventory tracks both:

  • full — currently standard (make release and the published container). Experimental Responses, the agentic loop and stores require explicit opt-in.
  • fips — the reduced FIPS runtime, built --no-default-features with aws-sigv4-filter, shared from xtask/src/fips.rs::FIPS_FEATURES. The certificate-only PostgreSQL profile is an experimental opt-in.

fips ⊆ full: the FIPS runtime is a subset of the published image. FIPS itself is host-activated (see docs/fips.md); no build feature asserts validation.

Provider selection

The central decision is OpenSSL everywhere:

  • All TLS except the PostgreSQL store (data plane, listeners, AI callouts, the policy Valkey/Redis store) runs on rustls with the installed rustls_openssl CryptoProvider — custom-provider, no bundled ring/aws-lc-rs backend. (The PostgreSQL store uses native-tls; see the exception below.) The provider is installed process-wide at boot and every subsequent rustls primitive (suites, key exchange, signatures, digests, MACs, RNG) executes on OpenSSL libcrypto.
  • All first-party application hashing (AWS SigV4, MCP approval fingerprints, routing digests, the Anthropic safety_identifier) goes through apis::hash = OpenSSL EVP.

Deliberate exceptions, each scoped and documented below:

  • aws-lc-rs executes JWT signature verification only, and only in full (via jsonwebtoken); it is never the TLS executor and must never gain fips.
  • RustCrypto sha2/hmac drive PostgreSQL SCRAM and some upstream policy digests (application-side, full-only) — not the OpenSSL EVP seam.
  • native-tls backs the PostgreSQL store TLS channel (diverges from the rustls data plane; see #1217), resolving to OpenSSL on Linux and the OS TLS stack on macOS/Windows.

Pinned providers

CrateVersionProfilesForbidden features (enforced by cargo deny)Expected-on (not enforced)
quixotic-plecostomus-rustls-openssl0.4.1full, fipsfipstls12
openssl0.10.81full, fipsvendored, aws-lc, aws-lc-fips, unstable_boringssl— (OPENSSL_NO_VENDOR=1)
openssl-sys0.9.117full, fipsvendored, openssl-src, aws-lc, aws-lc-fips, bssl-sys, unstable_boringssl—
rustls0.23.45full, fipsring, aws_lc_rs, fipscustom-provider
aws-lc-rs1.18.1fullfipsaws-lc-sys
jsonwebtoken11.1.0full—aws_lc_rs
native-tls0.2.18full, fips— (version pin only)—

Only the forbidden-features column is machine-enforced — it mirrors the [[bans.features]] deny lists in deny.toml. cargo-deny can require an enabled feature set with allow plus exact = true, but that would also reject every unlisted feature enabled by future dependency updates. We allow those features by design and guard only the backend-changing features. The expected-on features (e.g. rustls custom-provider, rustls_openssl tls12) are therefore not guarded here: removing one would still pass cargo deny check. They are load-bearing for the OpenSSL routing and are instead exercised by the build and the TLS integration tests.

Operations

Disposition legend:

  • non-validated = a FIPS-approvable algorithm executed by the system OpenSSL libcrypto; it becomes validated when the operation runs on a FIPS-activated host, so the remediation is host activation (docs/fips.md, unless noted).
  • excluded-from-fips = the operation executes outside the validated OpenSSL module (in aws-lc-rs or RustCrypto) or uses a non-approved algorithm (MD5, ChaCha20). Host activation cannot validate it — the only remedies are replacing it with an OpenSSL-backed implementation or excluding/disabling the feature. Every such operation is confined to the full profile and is absent from the FIPS image, so it never affects the FIPS build’s compliance; the per-row note names the remediation owner.
  • n/a = encoding/identity/non-security use, no validated primitive required.
  • upstream-owned = implemented and maintained in a Praxis-core/policy crate; its FIPS posture is owned there and is not asserted by this inventory.

Transport TLS, certificate verification & handshake RNG

IDOperationAlgorithmProviderProfilesDisposition
T1rustls CryptoProvider install (process-default)rustls_openssl as the sole provider (no ring)OpenSSL via quixotic-plecostomus-rustls-opensslfull, fipsnon-validated
T2Upstream data-plane TLS (proxy → LLM)TLS 1.2/1.3 client handshakeOpenSSL (installed provider, pingora connector)full, fipsnon-validated
T3AI subrequest callout TLS (OpenAI web/file search, guardrails, external metering, Anthropic web search; compaction and OpenAI MCP tool callouts in full only)TLS 1.2/1.3 over SubRequestConnectorOpenSSL (installed provider)full, fipsnon-validated
T4Downstream listener TLS (client → proxy)TLS 1.2/1.3 server handshake; optional WebPKI client-certOpenSSL (installed provider, ServerConfig)full, fipsnon-validated
T5file_resolve file_url download TLS (SSRF-guarded, redirect-free)TLS 1.2/1.3 over SubRequestConnectorOpenSSL (installed provider)full, fipsnon-validated
T7Policy Valkey/Redis session-store TLS (rediss://)TLS 1.2/1.3 via redis tls-rustlsOpenSSL (installed provider, tokio-rustls)fullnon-validated
T9TLS handshake CSPRNGhandshake randoms + key materialOpenSSL RAND_priv_bytes (provider SecureRandom::fill)full, fipsnon-validated
C1Upstream + sub-request server-cert chain & hostname verifyX.509 path + CertificateVerify + hostname matchrustls-webpki (chain) + OpenSSL (signatures)full, fipsnon-validated
C2Downstream mTLS client-cert verifyX.509 client-cert path + signature (optional CRL)rustls-webpki + OpenSSLfull, fipsnon-validated
C5OS native trust-store loadload system CA anchors (no primitive)rustls-native-certs (+ security-framework macOS, schannel Windows)full, fipsn/a
C6X.509 peer/chain structural parseASN.1 X.509 v3 DER parse (no verify)x509-parser → der-parser → asn1-rs (rusticata)full, fipsupstream-owned

Certificate / key-material handling

IDOperationAlgorithmProviderProfilesDisposition
C3Listener cert + private-key PEM loadPEM→DER decode; PKCS8/PKCS1/SEC1 parse; zeroized on droprustls-pki-types + zeroizefull, fipsn/a
C4Upstream cert SHA-256 fingerprint (telemetry)SHA-256 over DER cert (non-secret)OpenSSL (installed provider)full, fipsn/a
C7JWT verification-key ASN.1/PEM parsePKCS1/PKCS8/SEC1 DER + PEM decodesimple_asn1 + pem (via jsonwebtoken)fulln/a

Application hashing & authentication

IDOperationAlgorithmProviderProfilesDisposition
A1JWT signature verification (identity authn)HS256/RS256/PS256/ES256/EdDSA verify (decode-only)aws-lc-rs 1.18.1 (no fips) via jsonwebtokenfullexcluded-from-fips (runs in aws-lc-rs, not OpenSSL; JWT identity authn is absent from the FIPS image — a FIPS JWT path would need an OpenSSL-backed verifier)
A2OAuth delegated-token cache-key derivationkeyed HMAC-SHA256 (per-process secret)RustCrypto hmac + sha2 (upstream policy)fullupstream-owned
A3AWS SigV4 signing-key + request signatureHMAC-SHA256 signing-key chain (RFC 2104)OpenSSL EVP via apis::hashfull, fipsnon-validated
A4AWS SigV4 payload & canonical-request hashSHA-256OpenSSL EVP via apis::hashfull, fipsnon-validated
A5PostgreSQL SCRAM-SHA-256 SASL authSHA-256 / HMAC / PBKDF2 (RFC 5802/7677)sqlx-postgres (RustCrypto sha2 + hmac)fullexcluded-from-fips (RustCrypto, not OpenSSL; the FIPS store uses certificate auth A10/A11, so password SCRAM is off the FIPS path — #1217)
A6PostgreSQL SCRAM SASLprep normalizationRFC 4013 Unicode normalization (no primitive)stringprep via sqlx-postgresfulln/a
A7PostgreSQL SCRAM client-nonce RNGChaCha20 CSPRNG (OS getrandom-seeded)rand → chacha20 via sqlx-postgresfullexcluded-from-fips (ChaCha20 is not an approved DRBG, and runs in RustCrypto; full-only, same store path as A5 — #1217)
A8PostgreSQL legacy MD5 password authmd5(md5(pw‖user)‖salt)md-5 via sqlx-postgresfullexcluded-from-fips (MD5 is not FIPS-approved; disable md5 auth on the server and use SCRAM or cert auth; full-only — #1217)
A9PostgreSQL cleartext password authcleartext (confidentiality via A10 TLS)secrecy-wrapped (no local primitive)fulln/a
A10PostgreSQL store TLS handshake + cert verifyTLS 1.2/1.3, X.509 chain + hostname (verify-full)sqlx-postgres → native-tls → OpenSSL / OS TLSfull, fipsnon-validated (#1217)
A11PostgreSQL store client-cert mutual TLSTLS mutual auth with client PEM cert/keysqlx-postgres → native-tls → platform TLSfull, fipsnon-validated (#1217)
A12HTTP Basic Auth credential verifyunsalted SHA-256, constant-time compareOpenSSL EVP SHA-256 + subtle (core builtin)full, fipsupstream-owned

Identity & change-detection digests

Non-secret SHA-256 digests via OpenSSL EVP (apis::hash) unless noted.

IDOperationAlgorithmProviderProfilesDisposition
H1MCP approval target-identity fingerprint (binds approval → destination)SHA-256, length-framed, key-sortedOpenSSL EVPfullnon-validated
—MCP approval owner / credential / forwarded-header sub-fingerprints (components of H1)domain-separated SHA-256OpenSSL EVPfullnon-validated
H2Routing candidate stable_id fallbackSHA-256 (fallback only)OpenSSL EVPfull, fipsn/a
H3Routing overlay change-detection hashSHA-256 over file bytesOpenSSL EVPfull, fipsn/a
H4Routing overlay semantic self-checkSHA-256 over JCS/RFC-8785 subsetOpenSSL EVPfull, fipsn/a
—Anthropic user_id → safety_identifierSHA-256 lowercase hex (pseudonymization)OpenSSL EVPfull, fipsn/a
—SSE item change-digest; MCP tools/list opaque id64-bit SipHash-1-3 (std DefaultHasher)Rust std (non-crypto)full/[full]n/a
P1Policy session-identity bindingSHA-256 (anti-forgery)RustCrypto sha2 (upstream policy)fullupstream-owned
P2Valkey session-store key-name derivationSHA-256(session_id) (non-secret)RustCrypto sha2 (upstream policy)fulln/a

Random number generation & identifiers

IDOperationAlgorithmProviderProfilesDisposition
R-1Load-balancing candidate selection RNGChaCha thread-RNG uniform drawrand → chacha20 → getrandomfull, fipsn/a
R-2Correlation / idempotency IDs (resp_; conv_ in full only)microsecond clock + one-time seed + counterpraxis-core IdGeneratorfull, fipsupstream-owned
R-3MCP session id (mcp-session-id)predictable IdGenerator idpraxis-core IdGeneratorfull, fipsupstream-owned
R-4OAuth delegator per-process cache-key secret32-byte OS CSPRNG draw (keys A2)getrandom (upstream policy)fullupstream-owned

Reviewed non-primitives

Several crypto-family-named crates resolve into the graph but are not standalone operations — support/trait layers (digest, crypto-common, const-oid, untrusted), build-host code generators (*-derive, openssl-macros, tiny-keccak), FFI companions, and naming coincidences (aws-smithy-*, openssl-probe, spin, blake2 as a non-secret Pingora cache key). None executes a security primitive on the request path. A crate on the FIPS denylist may never be classified here — a denied name is a real primitive and is tracked as an operation or blocked by cargo xtask fips.

rand_xoshiro is present through metrics-util, but the pinned metrics-exporter-prometheus uses AtomicBucketInstant for histograms and never constructs the AtomicSamplingReservoir that draws from Xoshiro256**. There is no Prometheus sampling RNG operation to inventory.