FIPS 140-3
Overview
ocync uses aws-lc-rs as its sole TLS crypto provider. On Linux, binaries link AWS-LC FIPS module 4 by default. AWS has submitted module 4 to NIST and it is in process, awaiting certification.
Build variants
| Platform | Binary | Crypto | FIPS |
|---|---|---|---|
| Linux x86_64 | ocync-fips-linux-amd64 | aws-lc-rs (FIPS) | Yes |
| Linux arm64 | ocync-fips-linux-arm64 | aws-lc-rs (FIPS) | Yes |
| macOS arm64 | ocync-macos-arm64 | aws-lc-rs | No |
| Windows x86_64 | ocync-windows-amd64.exe | aws-lc-rs | No |
FIPS mode is a compile-time decision. The fips feature flag links the AWS-LC FIPS module. The non-fips feature flag uses aws-lc-rs without it.
A FIPS build restricts TLS to FIPS-approved algorithms: AES-GCM cipher suites, key exchange over P-256, P-384 or the X25519MLKEM768 post-quantum hybrid, and extended master secret for TLS 1.2. ChaCha20-Poly1305 and plain X25519 are never offered. The restriction covers every TLS client in the binary: reqwest, which AWS and Google authentication also use. A FIPS build checks this at startup and refuses to run if TLS is not FIPS-approved.
rustls counts X25519MLKEM768 as approved through its ML-KEM part, although its own source notes that ML-KEM in the AWS-LC FIPS module is FIPS-pending and that it follows the interpretation some regimes (such as FedRAMP Rev. 5 SC-13) allow for modules in that state. Treat the hybrid as approved only if your assessor accepts that interpretation.
FIPS endpoints for ECR
When AWS_USE_FIPS_ENDPOINT=true, ocync rewrites ECR hostnames to use FIPS endpoints:
123456789012.dkr.ecr.us-east-1.amazonaws.com
-> 123456789012.dkr.ecr-fips.us-east-1.amazonaws.com
With FIPS endpoints, both ends of the connection run FIPS cryptography: the client offers only FIPS-approved algorithms and the endpoint is AWS FIPS-validated. Only ECR has FIPS endpoints among supported registries.
Building with FIPS
FIPS builds require CMake, Go, and Perl for the aws-lc-rs build process:
# FIPS build (default)
cargo build --release
# Non-FIPS build
cargo build --release --no-default-features --features non-fips
Docker images
The latest-fips Docker tag ships the FIPS build:
docker pull public.ecr.aws/clowdhaus/ocync:latest-fips
Verifying FIPS status
The ocync version command reports whether the binary is a FIPS build, the linked cryptographic module, and whether TLS is restricted to FIPS-approved algorithms at runtime:
$ ocync version
ocync 0.9.0
FIPS 140-3: enabled
module: AWS-LC-FIPS 4
release: AWS-LC 4.2.0
tls: approved
module is the AWS-LC-FIPS module number, which is what a NIST validation certificate names. release is the AWS-LC release, which tells builds of one module apart but does not identify a certificate. Non-FIPS builds show FIPS 140-3: disabled and the release. FIPS is a compile-time selection; there is no runtime toggle.
Banned dependencies
ring and native-tls are banned via deny.toml to prevent accidental use of non-aws-lc-rs crypto. reqwest is configured with rustls-no-provider, and the crypto provider is installed explicitly at process startup.