Skip to content

Standards Compliance

dotsecenv aligns with several NIST and IETF standards for cryptographic operations. This page documents:

Compliance Standards — specify how to use cryptographic primitives securely:

  • FIPS 140-3 — Security requirements for cryptographic modules
  • FIPS 186-5 — Digital Signature Standard (approved algorithms)
  • RFC 9580 — OpenPGP with mandatory AEAD encryption

Foundational Standards — define the cryptographic primitives themselves:

  • FIPS 197 — Advanced Encryption Standard (AES)
  • FIPS 180-4 — Secure Hash Standard (SHA-2 family)

Understanding these standards helps organizations deploy dotsecenv in regulated environments.


FIPS 140-3 defines security requirements for cryptographic modules. dotsecenv leverages Go’s native FIPS 140-3 cryptographic module, introduced in Go 1.24.

The Go Cryptographic Module v1.0.0 holds CAVP certificate A6650, validating the cryptographic algorithm implementations. This certificate confirms that AES, SHA-2, RSA, ECDSA, and other primitives produce correct outputs per NIST test vectors.

IdentifierDescription
A6650CAVP certificate number
v1.0.0Module version frozen for validation
GeomysOrganization pursuing CMVP certification

The module is currently on the CMVP Modules In Process list with status “Review Pending” and underwent a security audit by Trail of Bits.

This module is built directly into Go’s standard library and requires no external C dependencies or cgo bindings. The validated module provides:

  • Mandatory self-tests — Module integrity verification at startup
  • NIST SP 800-90A DRBG — Approved deterministic random bit generator
  • Approved algorithms — All cryptographic operations use FIPS-approved algorithms

FIPS 140-3 validation applies to the runtime Operating Environment—not the build environment. Because Go compiles to standalone, statically-linked binaries with no foreign function interface overhead, the resulting executable is portable and deterministic regardless of where it was compiled.

Our official releases are built on GitHub Actions runners (Ubuntu-based), but the cryptographic operations execute within your deployment environment.

When you run dotsecenv on a NIST-listed Operating Environment, the Go Cryptographic Module operates in its validated configuration:

PlatformVersions
Red Hat Enterprise Linux9
Amazon Linux2023
Oracle Linux9
SUSE Linux Enterprise Server15
Alpine LinuxLatest
macOS (Apple Silicon)11–15
Windows Server2016–2025
FreeBSD12–14

The Geomys validation (the organization pursuing FIPS 140-3 certification for Go’s crypto module) also includes Vendor Affirmed coverage for generic Linux 3.10+ on x86-64 and ARM architectures, providing broad compatibility across modern Linux distributions.

Setting the GOFIPS140 environment variable during build locks the binary to a specific cryptographic module version:

Terminal window
GOFIPS140=v1.0.0 go build -o dotsecenv ./cmd/dotsecenv

Verify which module version was embedded in any binary:

Terminal window
go version -m ./dotsecenv

The v1.0.0 identifier is significant:

Build FlagBehavior
GOFIPS140=v1.0.0Locks to the exact snapshot submitted to CAVP/CMVP
GOFIPS140=latestUses whatever module ships with your Go version
GOFIPS140=offDisables FIPS mode (default)

Using v1.0.0 ensures:

  • Validated code path — The binary uses the exact cryptographic implementation that was formally tested and awarded certificate A6650
  • Deterministic behavior — Runtime behavior matches what was audited by Trail of Bits
  • Compliance evidence — Auditors can verify the module version matches the NIST validation record

dotsecenv is open source, and we encourage security-conscious organizations to fork and build the project on infrastructure under their direct control—whether air-gapped systems, internal CI/CD pipelines, or hardened build servers.

RequirementValue
Go version1.24 or later
Build flagGOFIPS140=v1.0.0
RuntimeListed Operating Environment

The following standards define the cryptographic algorithms themselves. dotsecenv uses these primitives within the compliance framework established by FIPS 140-3 and FIPS 186-5.

FIPS 197 defines the AES block cipher algorithm. dotsecenv uses AES-256 exclusively for symmetric encryption of secrets.

PropertyValue
Block size128 bits
Key size256 bits (AES-256)
ModeGCM (per NIST SP 800-38D)

FIPS 180-4 defines the SHA-2 family of hash functions. dotsecenv uses SHA-256 and SHA-512 for integrity verification and signatures.

HashOutput SizeUsage in dotsecenv
SHA-256256 bitsStandard key operations
SHA-512512 bitsHigh-strength keys (RSA-4096, ECC P-521)

dotsecenv automatically selects the appropriate hash strength based on key parameters:

Key strength ≥ 256 bits (RSA-4096, ECC P-521) → SHA-512
Key strength < 256 bits (RSA-3072, ECC P-384) → SHA-256

This follows security best practices for matching hash strength to key strength.

SHA-2 hashes serve multiple purposes in dotsecenv:

PurposeDescription
Integrity verificationDetect tampering in vault entries
Digital signaturesHash-then-sign for identity and secret signatures
Key bindingLink subkeys to primary keys in OpenPGP
FingerprintsKey identification (transitioning from SHA-1 to SHA-256)

FIPS 186-5 (2023) specifies approved algorithms for digital signatures. dotsecenv enforces these standards for all vault signatures.

AlgorithmParametersStatus
RSA2048-bit minimum, 3072-bit recommendedApproved
ECDSAP-256, P-384, P-521 curvesApproved
EdDSAEd25519, Ed448Approved
DSADeprecated (removed)

dotsecenv validates GPG key algorithms against FIPS 186-5 requirements. The default configuration enforces:

approved_algorithms:
- rsa:3072
- ecdsa:p384
- eddsa:ed25519

Keys using weaker algorithms are rejected during encryption and signing operations.

Every vault entry is signed using a FIPS 186-5 compliant algorithm. The signature covers:

Entry signature covers:
├── Secret key name
├── Available-to list (fingerprints)
├── Encrypted value blob
├── Timestamp
└── Originator fingerprint

Modifications to any field cause signature verification to fail:

Terminal window
dotsecenv validate
# ✓ Vault header: valid
# ✓ Identity entries: 2 valid
# ✗ Secret entry 5: signature mismatch
# Error: vault validation failed
AlgorithmMinimumRecommended
RSA2048-bit3072-bit or 4096-bit
ECDSAP-256P-384 or P-521
EdDSAEd25519Ed25519 or Ed448

RFC 9580 (2024) is the updated OpenPGP standard, replacing RFC 4880. dotsecenv uses the RFC 9580 profile which enforces authenticated encryption.

RFC 9580 mandates Authenticated Encryption with Associated Data (AEAD) for all symmetric encryption. dotsecenv uses AES-256-GCM as the symmetric cipher:

// Use RFC9580 profile which enforces AEAD with AES-256-GCM
// RFC 9580 is the updated OpenPGP standard with mandatory AEAD support
PropertyValue
CipherAES-256
ModeGCM (Galois/Counter Mode)
Nonce12 octets (96 bits)
Auth tag16 octets (128 bits)
StandardNIST SP 800-38D

GCM mode provides both confidentiality and integrity in a single operation:

  • Authenticated — Tampering is detected via the 128-bit authentication tag
  • Efficient — Hardware-accelerated on modern CPUs (AES-NI)
  • Parallelizable — GCM allows parallel encryption/decryption
  • FIPS-approved — Compliant with NIST SP 800-38D
FeatureRFC 4880RFC 9580
Symmetric encryptionCFB modeAEAD mandatory
Default cipher3DES/AES-128AES-256-GCM
SignaturesRSA, DSA, ECDSAEd25519/Ed448 preferred
Key derivationS2K (simple)Argon2
Versionv4 keysv6 keys

dotsecenv explicitly disables compression to prevent CRIME/BREACH-style side-channel attacks:

// Explicitly disable compression per RFC 9580 (avoids CRIME-style side-channel attacks)
encHandle, err := pgp.Encryption().Recipients(recipients).CompressWith(constants.NoCompression).New()

When data is compressed before encryption, the ciphertext length varies based on plaintext content. Attackers can exploit this:

  1. CRIME attack — Inject known strings into plaintext
  2. Observe ciphertext length — Compressed duplicates are shorter
  3. Iterate — Guess secrets character by character
CompressionRatioSpeedSecurity Risk
BZIP2BestSlowestLength leakage
ZLIBGoodFastLength leakage
ZIPGoodFastLength leakage
UncompressedNoneFastestSafe

dotsecenv uses hybrid encryption combining symmetric and asymmetric cryptography:

┌─────────────────────────────────────────────────────────────┐
│ Secret Value │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Symmetric Encryption (AES-256-GCM) │
│ │
│ Random session key (256-bit) + Nonce (96-bit) │
│ → Encrypted data + Authentication tag │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Asymmetric Encryption (GPG) │
│ │
│ Session key encrypted for each recipient's public key │
│ → One key blob per authorized identity │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Cryptographic Signature (GPG) │
│ │
│ SHA-256/SHA-512 hash signed with originator's key │
│ → Detached signature for integrity + non-repudiation │
└─────────────────────────────────────────────────────────────┘

Hybrid encryption enables efficient multi-recipient encryption:

ComponentSizeOperations per Recipient
Session key256 bitsEncrypted once per recipient (fast, tiny payload)
Secret dataVariableEncrypted once total with AES (fast)

For 10 recipients, this means:

  • 1 AES encryption of the full payload
  • 10 RSA/ECC encryptions of the 256-bit session key

Without hybrid encryption, you would need 10 full asymmetric encryptions—orders of magnitude slower for large secrets.

Each secret value blob contains:

┌─────────────────────────────────────────┐
│ Encrypted Value Blob │
├─────────────────────────────────────────┤
│ AES-256-GCM nonce (96 bits) │
│ AES-256-GCM ciphertext │
│ AES-256-GCM auth tag (128 bits) │
│ GPG-encrypted session key (per-user) │
│ Detached GPG signature (FIPS 186-5) │
└─────────────────────────────────────────┘

These standards specify how to use cryptographic primitives securely:

StandardScopedotsecenv Compliance
FIPS 140-3Cryptographic modulesGo 1.24+ native module (CAVP A6650)
FIPS 186-5Digital signaturesRSA, ECDSA, EdDSA; DSA rejected
NIST SP 800-38DGCM modeAES-256-GCM for symmetric encryption
RFC 9580OpenPGPAEAD mandatory, v6 key support

These standards define the cryptographic primitives themselves:

StandardDefinesdotsecenv Usage
FIPS 197AES block cipherAES-256 for symmetric encryption
FIPS 180-4SHA-2 hash familySHA-256/SHA-512 for integrity and signatures