From 1949e4d55b4eae740049349b3d06f19959b0fb7f Mon Sep 17 00:00:00 2001 From: Gibson Fahnestock Date: Tue, 4 Apr 2017 15:36:15 +0100 Subject: [PATCH] crypto: only try to set FIPS mode if different Turning FIPS mode on (or off) when it's already on (or off) should be a no-op, not an error. PR-URL: https://github.com/nodejs/node/pull/12210 Fixes: https://github.com/nodejs/node/issues/11849 Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Ruben Bridgewater Reviewed-By: James M Snell --- src/node_crypto.cc | 7 +++++-- test/parallel/test-crypto-fips.js | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 9bdb02fe96..3ae6196d02 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -6037,11 +6037,14 @@ void GetFipsCrypto(const FunctionCallbackInfo& args) { void SetFipsCrypto(const FunctionCallbackInfo& args) { Environment* env = Environment::GetCurrent(args); #ifdef NODE_FIPS_MODE - bool mode = args[0]->BooleanValue(); + const bool enabled = FIPS_mode(); + const bool enable = args[0]->BooleanValue(); + if (enable == enabled) + return; // No action needed. if (force_fips_crypto) { return env->ThrowError( "Cannot set FIPS mode, it was forced with --force-fips at startup."); - } else if (!FIPS_mode_set(mode)) { + } else if (!FIPS_mode_set(enable)) { unsigned long err = ERR_get_error(); // NOLINT(runtime/int) return ThrowCryptoError(env, err); } diff --git a/test/parallel/test-crypto-fips.js b/test/parallel/test-crypto-fips.js index da2dd7b0ba..755c6e20c2 100644 --- a/test/parallel/test-crypto-fips.js +++ b/test/parallel/test-crypto-fips.js @@ -212,6 +212,15 @@ testHelper( 'require("crypto").fips = false', process.env); +// --force-fips makes setFipsCrypto enable a no-op (FIPS stays on) +testHelper( + compiledWithFips() ? 'stdout' : 'stderr', + ['--force-fips'], + compiledWithFips() ? FIPS_ENABLED : OPTION_ERROR_STRING, + '(require("crypto").fips = true,' + + 'require("crypto").fips)', + process.env); + // --force-fips and --enable-fips order does not matter testHelper( 'stderr',