| 'use strict'; |
| |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| const { |
| constants, |
| generateKeyPair, |
| } = require('crypto'); |
| const { |
| testEncryptDecrypt, |
| testSignVerify, |
| } = require('../common/crypto'); |
| |
| // Test RSA-PSS. |
| { |
| generateKeyPair('rsa-pss', { |
| modulusLength: 512, |
| saltLength: 16, |
| hashAlgorithm: 'sha256', |
| mgf1HashAlgorithm: 'sha256' |
| }, common.mustSucceed((publicKey, privateKey) => { |
| assert.strictEqual(publicKey.type, 'public'); |
| assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); |
| assert.deepStrictEqual(publicKey.asymmetricKeyDetails, { |
| modulusLength: 512, |
| publicExponent: 65537n, |
| hashAlgorithm: 'sha256', |
| mgf1HashAlgorithm: 'sha256', |
| saltLength: 16 |
| }); |
| |
| assert.strictEqual(privateKey.type, 'private'); |
| assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); |
| assert.deepStrictEqual(privateKey.asymmetricKeyDetails, { |
| modulusLength: 512, |
| publicExponent: 65537n, |
| hashAlgorithm: 'sha256', |
| mgf1HashAlgorithm: 'sha256', |
| saltLength: 16 |
| }); |
| |
| // Unlike RSA, RSA-PSS does not allow encryption. |
| assert.throws(() => { |
| testEncryptDecrypt(publicKey, privateKey); |
| }, /operation not supported for this keytype/); |
| |
| // RSA-PSS also does not permit signing with PKCS1 padding. |
| assert.throws(() => { |
| testSignVerify({ |
| key: publicKey, |
| padding: constants.RSA_PKCS1_PADDING |
| }, { |
| key: privateKey, |
| padding: constants.RSA_PKCS1_PADDING |
| }); |
| }, /illegal or unsupported padding mode/); |
| |
| // The padding should correctly default to RSA_PKCS1_PSS_PADDING now. |
| testSignVerify(publicKey, privateKey); |
| })); |
| } |