diff -ur gnutls-3.3.8.orig/lib/fips.c gnutls-3.3.8/lib/fips.c --- gnutls-3.3.8.orig/lib/fips.c 2014-09-04 21:05:54.000000000 +0200 +++ gnutls-3.3.8/lib/fips.c 2014-11-18 09:46:47.376148426 +0100 @@ -37,6 +37,8 @@ #define FIPS_KERNEL_FILE "/proc/sys/crypto/fips_enabled" #define FIPS_SYSTEM_FILE "/etc/system-fips" +static int _fips_mode = -1; + /* Returns: * 0 - FIPS mode disabled * 1 - FIPS mode enabled and enforced @@ -46,21 +48,20 @@ { unsigned f1p = 0, f2p; FILE* fd; -static int fips_mode = -1; const char *p; - if (fips_mode != -1) - return fips_mode; + if (_fips_mode != -1) + return _fips_mode; p = getenv("GNUTLS_FORCE_FIPS_MODE"); if (p) { if (p[0] == '1') - fips_mode = 1; + _fips_mode = 1; else if (p[0] == '2') - fips_mode = 2; + _fips_mode = 2; else - fips_mode = 0; - return fips_mode; + _fips_mode = 0; + return _fips_mode; } fd = fopen(FIPS_KERNEL_FILE, "r"); @@ -76,20 +77,29 @@ if (f1p != 0 && f2p != 0) { _gnutls_debug_log("FIPS140-2 mode enabled\n"); - fips_mode = 1; - return fips_mode; + _fips_mode = 1; + return _fips_mode; } if (f2p != 0) { /* a funny state where self tests are performed * and ignored */ _gnutls_debug_log("FIPS140-2 ZOMBIE mode enabled\n"); - fips_mode = 2; - return fips_mode; + _fips_mode = 2; + return _fips_mode; } - fips_mode = 0; - return fips_mode; + _fips_mode = 0; + return _fips_mode; +} + +/* This _fips_mode == 2 is a strange mode where checks are being + * performed, but its output is ignored. */ +void _gnutls_fips_mode_reset_zombie(void) +{ + if (_fips_mode == 2) { + _fips_mode = 0; + } } #define GNUTLS_LIBRARY_NAME "libgnutls.so.28" @@ -367,6 +377,9 @@ goto error; } + if (_fips_mode == 2) + _fips_mode = 0; + return 0; error: Only in gnutls-3.3.8/lib: fips.c.orig diff -ur gnutls-3.3.8.orig/lib/fips.h gnutls-3.3.8/lib/fips.h --- gnutls-3.3.8.orig/lib/fips.h 2014-09-04 21:05:54.000000000 +0200 +++ gnutls-3.3.8/lib/fips.h 2014-11-18 09:46:47.377148445 +0100 @@ -55,6 +55,7 @@ int _gnutls_fips_perform_self_checks1(void); int _gnutls_fips_perform_self_checks2(void); +void _gnutls_fips_mode_reset_zombie(void); #ifdef ENABLE_FIPS140 unsigned _gnutls_fips_mode_enabled(void); diff -ur gnutls-3.3.8.orig/lib/gnutls_global.c gnutls-3.3.8/lib/gnutls_global.c --- gnutls-3.3.8.orig/lib/gnutls_global.c 2014-09-04 21:05:54.000000000 +0200 +++ gnutls-3.3.8/lib/gnutls_global.c 2014-11-18 09:46:47.377148445 +0100 @@ -326,6 +326,7 @@ goto out; } } + _gnutls_fips_mode_reset_zombie(); } #endif _gnutls_switch_lib_state(LIB_STATE_OPERATIONAL); Only in gnutls-3.3.8/lib: gnutls_global.c.orig