'use strict'; const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); const assert = require('assert'); const { generateKeyPair, } = require('crypto'); const { assertApproximateSize, testSignVerify, spkiExp, } = require('../common/crypto'); // Test async DSA key generation. { const privateKeyEncoding = { type: 'pkcs8', format: 'der' }; generateKeyPair('dsa', { modulusLength: common.hasOpenSSL3 ? 2048 : 512, divisorLength: 256, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { cipher: 'aes-128-cbc', passphrase: 'secret', ...privateKeyEncoding } }, common.mustSucceed((publicKey, privateKeyDER) => { assert.strictEqual(typeof publicKey, 'string'); assert.match(publicKey, spkiExp); // The private key is DER-encoded. assert(Buffer.isBuffer(privateKeyDER)); assertApproximateSize(publicKey, common.hasOpenSSL3 ? 1194 : 440); assertApproximateSize(privateKeyDER, common.hasOpenSSL3 ? 721 : 336); // Since the private key is encrypted, signing shouldn't work anymore. assert.throws(() => { return testSignVerify(publicKey, { key: privateKeyDER, ...privateKeyEncoding }); }, { name: 'TypeError', code: 'ERR_MISSING_PASSPHRASE', message: 'Passphrase required for encrypted key' }); // Signing should work with the correct password. testSignVerify(publicKey, { key: privateKeyDER, ...privateKeyEncoding, passphrase: 'secret' }); })); }