Skip to content

Commit

Permalink
src: fix crypto.privateEncrypt fails first time
Browse files Browse the repository at this point in the history
crypto.privateEncrypt fails for the first time after
crypto.generateKeyPairSync with certain parameters
Because the error stack is not cleaned up
when crypto.generateKeyPairSync exits.

Fixes: #40814
  • Loading branch information
liuxingbaoyu committed Apr 20, 2022
1 parent 1fe5d56 commit 686d32a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/crypto/crypto_keys.cc
Expand Up @@ -318,6 +318,7 @@ MaybeLocal<Value> WritePrivateKey(
}
}

MarkPopErrorOnReturn mark_pop_error_on_return;
bool err;

PKEncodingType encoding_type = config.type_.ToChecked();
Expand Down
35 changes: 35 additions & 0 deletions test/parallel/test-crypto-aes-128-ecb.js
@@ -0,0 +1,35 @@
'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');

const assert = require('assert');
const crypto = require('crypto');

const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-128-ecb',
passphrase: 'abcdef'
}
});
assert.notStrictEqual(privateKey.toString(), '');

const msg = 'The quick brown fox jumps over the lazy dog';

const encryptedString = crypto.privateEncrypt({
key: privateKey,
passphrase: 'abcdef'
}, Buffer.from(msg)).toString('base64');
const decryptedString = crypto.publicDecrypt(publicKey, Buffer.from(encryptedString, 'base64')).toString();
console.log(`Encrypted: ${encryptedString}`);
console.log(`Decrypted: ${decryptedString}`);

assert.notStrictEqual(encryptedString, '');
assert.strictEqual(decryptedString, msg);

0 comments on commit 686d32a

Please sign in to comment.