Skip to content

Commit f13d29b

Browse files
panvadanielleadams
authored andcommitted
crypto: clear OpenSSL error queue after calling X509_check_private_key()
Fixes: #45485 PR-URL: #45495 Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
1 parent 54c7b94 commit f13d29b

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

src/crypto/crypto_x509.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,8 @@ void X509Certificate::CheckPrivateKey(const FunctionCallbackInfo<Value>& args) {
453453
ASSIGN_OR_RETURN_UNWRAP(&key, args[0]);
454454
CHECK_EQ(key->Data()->GetKeyType(), kKeyTypePrivate);
455455

456+
ClearErrorOnReturn clear_error_on_return;
457+
456458
args.GetReturnValue().Set(
457459
X509_check_private_key(
458460
cert->get(),

test/parallel/test-crypto-x509.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ if (!common.hasCrypto)
88
const {
99
X509Certificate,
1010
createPrivateKey,
11+
generateKeyPairSync,
1112
} = require('crypto');
1213

1314
const {
@@ -186,10 +187,18 @@ const der = Buffer.from(
186187
code: 'ERR_INVALID_ARG_VALUE'
187188
});
188189

189-
// Confirm failure of X509Certificate:verify() doesn't affect other functions that use OpenSSL.
190-
assert(!x509.verify(x509.publicKey));
191-
// This call should not throw.
192-
createPrivateKey(key);
190+
{
191+
// https://github.com/nodejs/node/issues/45377
192+
// https://github.com/nodejs/node/issues/45485
193+
// Confirm failures of X509Certificate:verify() and X509Certificate:CheckPrivateKey()
194+
// do not affect other functions that use OpenSSL.
195+
// Subsequent calls to e.g. createPrivateKey should not throw.
196+
const keyPair = generateKeyPairSync('ed25519');
197+
assert(!x509.verify(keyPair.publicKey));
198+
createPrivateKey(key);
199+
assert(!x509.checkPrivateKey(keyPair.privateKey));
200+
createPrivateKey(key);
201+
}
193202

194203
// X509Certificate can be cloned via MessageChannel/MessagePort
195204
const mc = new MessageChannel();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy