Skip to content

Commit

Permalink
crypto: simplify DSA validation in FIPS mode
Browse files Browse the repository at this point in the history
PR-URL: nodejs#29195
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
  • Loading branch information
tniessen authored and Trott committed Aug 21, 2019
1 parent f769034 commit 61140ff
Showing 1 changed file with 23 additions and 49 deletions.
72 changes: 23 additions & 49 deletions src/node_crypto.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4879,15 +4879,7 @@ static AllocatedBuffer Node_SignFinal(Environment* env,
return AllocatedBuffer();
}

Sign::SignResult Sign::SignFinal(
const ManagedEVPPKey& pkey,
int padding,
const Maybe<int>& salt_len) {
if (!mdctx_)
return SignResult(kSignNotInitialised);

EVPMDPointer mdctx = std::move(mdctx_);

static inline bool ValidateDSAParameters(EVP_PKEY* key) {
#ifdef NODE_FIPS_MODE
/* Validate DSA2 parameters from FIPS 186-4 */
if (FIPS_mode() && EVP_PKEY_DSA == EVP_PKEY_base_id(pkey.get())) {
Expand All @@ -4898,23 +4890,29 @@ Sign::SignResult Sign::SignFinal(
const BIGNUM* q;
DSA_get0_pqg(dsa, nullptr, &q, nullptr);
size_t N = BN_num_bits(q);
bool result = false;

if (L == 1024 && N == 160)
result = true;
else if (L == 2048 && N == 224)
result = true;
else if (L == 2048 && N == 256)
result = true;
else if (L == 3072 && N == 256)
result = true;

if (!result) {
return SignResult(kSignPrivateKey);
}

return (L == 1024 && N == 160) ||
(L == 2048 && N == 224) ||
(L == 2048 && N == 256) ||
(L == 3072 && N == 256)
}
#endif // NODE_FIPS_MODE

return true;
}

Sign::SignResult Sign::SignFinal(
const ManagedEVPPKey& pkey,
int padding,
const Maybe<int>& salt_len) {
if (!mdctx_)
return SignResult(kSignNotInitialised);

EVPMDPointer mdctx = std::move(mdctx_);

if (!ValidateDSAParameters(pkey.get()))
return SignResult(kSignPrivateKey);

AllocatedBuffer buffer =
Node_SignFinal(env(), std::move(mdctx), pkey, padding, salt_len);
Error error = buffer.data() == nullptr ? kSignPrivateKey : kSignOk;
Expand Down Expand Up @@ -4965,32 +4963,8 @@ void SignOneShot(const FunctionCallbackInfo<Value>& args) {
if (!key)
return;

#ifdef NODE_FIPS_MODE
/* Validate DSA2 parameters from FIPS 186-4 */
if (FIPS_mode() && EVP_PKEY_DSA == EVP_PKEY_base_id(key.get())) {
DSA* dsa = EVP_PKEY_get0_DSA(key.get());
const BIGNUM* p;
DSA_get0_pqg(dsa, &p, nullptr, nullptr);
size_t L = BN_num_bits(p);
const BIGNUM* q;
DSA_get0_pqg(dsa, nullptr, &q, nullptr);
size_t N = BN_num_bits(q);
bool result = false;

if (L == 1024 && N == 160)
result = true;
else if (L == 2048 && N == 224)
result = true;
else if (L == 2048 && N == 256)
result = true;
else if (L == 3072 && N == 256)
result = true;

if (!result) {
return CheckThrow(env, SignBase::Error::kSignPrivateKey);
}
}
#endif // NODE_FIPS_MODE
if (!ValidateDSAParameters(key.get()))
return CheckThrow(env, SignBase::Error::kSignPrivateKey);

ArrayBufferViewContents<char> data(args[offset]);

Expand Down

0 comments on commit 61140ff

Please sign in to comment.