diff --git a/libqpdf/QPDFCrypto_gnutls.cc b/libqpdf/QPDFCrypto_gnutls.cc index ce38095..beababc 100644 --- a/libqpdf/QPDFCrypto_gnutls.cc +++ b/libqpdf/QPDFCrypto_gnutls.cc @@ -11,9 +11,17 @@ QPDFCrypto_gnutls::QPDFCrypto_gnutls() : encrypt(false), cbc_mode(false), aes_key_data(nullptr), - aes_key_len(0) + aes_key_len(0), + fips_mode(gnutls_fips140_mode_enabled()) { memset(digest, 0, sizeof(digest)); + + if (fips_mode) { + // Relax FIPS mode for the lifetime of this object + gnutls_fips140_set_mode( + GNUTLS_FIPS140_LAX, + GNUTLS_FIPS140_SET_MODE_THREAD); + } } QPDFCrypto_gnutls::~QPDFCrypto_gnutls() @@ -26,6 +34,13 @@ QPDFCrypto_gnutls::~QPDFCrypto_gnutls() } aes_key_data = nullptr; aes_key_len = 0; + + if (fips_mode) { + // Restore saved FIPS mode + gnutls_fips140_set_mode( + static_cast(fips_mode), + GNUTLS_FIPS140_SET_MODE_THREAD); + } } void diff --git a/libqpdf/qpdf/QPDFCrypto_gnutls.hh b/libqpdf/qpdf/QPDFCrypto_gnutls.hh index 00f2585..84061c2 100644 --- a/libqpdf/qpdf/QPDFCrypto_gnutls.hh +++ b/libqpdf/qpdf/QPDFCrypto_gnutls.hh @@ -53,6 +53,7 @@ class QPDFCrypto_gnutls: public QPDFCryptoImpl char digest[64]; unsigned char const* aes_key_data; size_t aes_key_len; + unsigned fips_mode; }; #endif // QPDFCRYPTO_GNUTLS_HH