Insights / Cryptography

FIPS 140-3 Transition Guide: What Defense Contractors Need to Know

The CMVP has moved on. FIPS 140-2 is sunsetting. Here is your engineer's guide to navigating the new ISO/IEC 19790 aligned landscape.

10 min read

The Historical List Deadline

As of September 2026, existing FIPS 140-2 certificates have moved to the "Historical" list. For US Federal and DoD contracts, new procurements generally require active FIPS 140-3 validation. Do not start a new design in 2026 based on OpenSSL FIPS 140-2 FOM 2.0.

Why the Move to ISO/IEC 19790?

NIST finally recognized that maintaining a US-only standard (FIPS 140-2) created unnecessary friction for global vendors. FIPS 140-3 is technically a wrapper around ISO/IEC 19790:2012 (Security Requirements) and ISO/IEC 24759:2017 (Test Requirements).

This alignment means:

Engineering Deep Dive: What Breaks in Your Code?

1. The "Degraded" State Machine

FIPS 140-2 was largely binary: FIPS_mode_set(1) succeeded or failed. FIPS 140-3 (ISO 19790 Section 7.2.4.2) introduces the Degraded State.

// FIPS 140-3 POST (Power-On Self Test) Logic
if (perform_kat_tests() != SUCCESS) {
    if (is_soft_error()) {
        // Module must enter DEGRADED state
        // Crypto operations disabled, but Status Output still valid
        set_module_state(STATE_DEGRADED);
        alert_admin("Self-test failed, crypto disabled.");
    } else {
        // Critical error, hard panic
        set_module_state(STATE_ERROR);
        abort(); 
    }
}

Your application must be able to query this state. If the crypto module goes degraded, does your entire application crash, or can it gracefully fallback to a "Maintenance Mode"?

2. Entropy is No Longer "Implied" (SP 800-90B)

Under FIPS 140-2, many software modules assumed the OS /dev/urandom provided sufficient entropy. Under FIPS 140-3 + SP 800-90B, you must explicitly validate the entropy source.

If you are using a user-space implementation (like Bouncy Castle or OpenSSL FIPS provider), you cannot simply trust the underlying OS without evidence. You often need to implement Continuous Random Number Generator Tests (CRNGT) or health tests on the ingest.

3. Zeroization is "Active Overwrite"

ISO 19790 Section 7.9 requires zeroization of all unprotected SSPs. Compiler optimizations are your enemy here. memset() calls are often optimized away by GCC/Clang if the variable is not used afterward.

The Fix: Use secure wipe primitives or volatile pointers.

void secure_zero(void *v, size_t n) {
    volatile unsigned char *p = v;
    while (n--) *p++ = 0;
}

// Usage
secure_zero(aes_key, sizeof(aes_key));

Module Lifecycle & Revalidation

One of the most painful aspects of 140-3 is the 5-year sunset on algorithm certificates (ACVP). If you link against a FIPS module validated in 2021, its algorithm certs might expire in 2026, rendering the module invalid for new procurements even if the software hasn't changed.

CMVP Statuses Decoded

Status Meaning for Procurement
Active Gold standard. Acceptable for new and existing systems.
Historical Acceptable for existing systems. Discouraged/Prohibited for new designs.
Revoked Module has a security vulnerability. Replace immediately.

Alterra's FIPS Compliance Framework

We provide a pre-validated FIPS 140-3 wrapper for our defense clients. Instead of managing `fips_provider.conf` and entropy sources yourself, our SDK ensures:

"Don't get stuck in the lab."

A failed FIPS lab test costs $50k+ and 6 months of delay. Let us pre-validate your architecture against SP 800-140x requirements.

Get a Pre-Assessment

Related Articles