Add config option to allow insecure decryption with RSA signing keys (#1148)
This commit is contained in:
parent
cc1bdcbae8
commit
2eab8a1ebc
|
@ -120,6 +120,14 @@ export default {
|
||||||
* @property {Boolean} revocations_expire If true, expired revocation signatures are ignored
|
* @property {Boolean} revocations_expire If true, expired revocation signatures are ignored
|
||||||
*/
|
*/
|
||||||
revocations_expire: false,
|
revocations_expire: false,
|
||||||
|
/**
|
||||||
|
* Allow decryption using RSA keys without `encrypt` flag.
|
||||||
|
* This setting is potentially insecure, but it is needed to get around an old openpgpjs bug
|
||||||
|
* where key flags were ignored when selecting a key for encryption.
|
||||||
|
* @memberof module:config
|
||||||
|
* @property {Boolean} allow_insecure_decryption_with_signing_keys
|
||||||
|
*/
|
||||||
|
allow_insecure_decryption_with_signing_keys: false,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @memberof module:config
|
* @memberof module:config
|
||||||
|
|
|
@ -366,6 +366,12 @@ export function isValidDecryptionKeyPacket(signature) {
|
||||||
if (!signature.verified) { // Sanity check
|
if (!signature.verified) { // Sanity check
|
||||||
throw new Error('Signature not verified');
|
throw new Error('Signature not verified');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.allow_insecure_decryption_with_signing_keys) {
|
||||||
|
// This is only relevant for RSA keys, all other signing ciphers cannot decrypt
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return !signature.keyFlags ||
|
return !signature.keyFlags ||
|
||||||
(signature.keyFlags[0] & enums.keyFlags.encrypt_communication) !== 0 ||
|
(signature.keyFlags[0] & enums.keyFlags.encrypt_communication) !== 0 ||
|
||||||
(signature.keyFlags[0] & enums.keyFlags.encrypt_storage) !== 0;
|
(signature.keyFlags[0] & enums.keyFlags.encrypt_storage) !== 0;
|
||||||
|
|
|
@ -1916,6 +1916,55 @@ vqBGKJzmO5q3cECw
|
||||||
=X9kJ
|
=X9kJ
|
||||||
-----END PGP PRIVATE KEY BLOCK-----`;
|
-----END PGP PRIVATE KEY BLOCK-----`;
|
||||||
|
|
||||||
|
|
||||||
|
const rsaSignOnly = `-----BEGIN PGP PRIVATE KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
BZou86lozq7ISvRg1RSIWZ0ZRA==
|
||||||
|
=A9Ts
|
||||||
|
-----END PGP PRIVATE KEY BLOCK-----
|
||||||
|
`;
|
||||||
|
|
||||||
|
const encryptedRsaSignOnly = `-----BEGIN PGP MESSAGE-----
|
||||||
|
|
||||||
|
wcBMAwr9x5ZY6oZmAQf+Lxghg4keIFpEq8a65gFkIfW+chHTDPlfI8xnx6U9
|
||||||
|
HdsICX3Oye5V0ToCVKkEWDxfN1yCfXiYalSNo7ScRZKR7C+j02/pC+FfR6AJ
|
||||||
|
2cvdFoGIrLaXdjXXc/oXbsCCZA4C1DhQqpdORo2qGF0Q6Sm8659B0CfOgYSL
|
||||||
|
fBfKQ5VJngUT5JG8Uek3YuXBufPNhzdmXLHyB2Y2CwKkldi2vo4YNAukDhrR
|
||||||
|
2TojxdNoouhnMm+gloCE1n8huY1vw5F78/uiHen0tmHQ0dxtfk8cc1burgl/
|
||||||
|
zUdJ3Sg6Eu+OC2ae5II63iB5fG+lCwZtfuepWnePDv8RDKNHCVP/LoBNpGOZ
|
||||||
|
U9I6AUkZWdcsueib9ghKDDy+HbUbf2kCJWUnuyeOCKqQifDb8bsLmdQY4Wb6
|
||||||
|
EBeLgD8oZHVsH3NLjPakPw==
|
||||||
|
=STqy
|
||||||
|
-----END PGP MESSAGE-----`
|
||||||
|
|
||||||
function versionSpecificTests() {
|
function versionSpecificTests() {
|
||||||
it('Preferences of generated key', function() {
|
it('Preferences of generated key', function() {
|
||||||
const testPref = function(key) {
|
const testPref = function(key) {
|
||||||
|
@ -2667,6 +2716,26 @@ describe('Key', function() {
|
||||||
await expect(pubKey.getEncryptionKey()).to.be.rejectedWith('Could not find valid encryption key packet in key c076e634d32b498d');
|
await expect(pubKey.getEncryptionKey()).to.be.rejectedWith('Could not find valid encryption key packet in key c076e634d32b498d');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not decrypt using a sign-only RSA key, unless explicitly configured', async function () {
|
||||||
|
const allowSigningKeyDecryption = openpgp.config.allow_insecure_decryption_with_signing_keys;
|
||||||
|
const { keys: [key] } = await openpgp.key.readArmored(rsaSignOnly);
|
||||||
|
try {
|
||||||
|
openpgp.config.allow_insecure_decryption_with_signing_keys = false;
|
||||||
|
await expect(openpgp.decrypt({
|
||||||
|
message: await openpgp.message.readArmored(encryptedRsaSignOnly),
|
||||||
|
privateKeys: key
|
||||||
|
})).to.be.rejectedWith(/Session key decryption failed/);
|
||||||
|
|
||||||
|
openpgp.config.allow_insecure_decryption_with_signing_keys = true;
|
||||||
|
await expect(openpgp.decrypt({
|
||||||
|
message: await openpgp.message.readArmored(encryptedRsaSignOnly),
|
||||||
|
privateKeys: key
|
||||||
|
})).to.be.fulfilled;
|
||||||
|
} finally {
|
||||||
|
openpgp.config.allow_insecure_decryption_with_signing_keys = allowSigningKeyDecryption;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('Method getExpirationTime V4 Key', async function() {
|
it('Method getExpirationTime V4 Key', async function() {
|
||||||
const pubKey = (await openpgp.key.readArmored(twoKeys)).keys[1];
|
const pubKey = (await openpgp.key.readArmored(twoKeys)).keys[1];
|
||||||
expect(pubKey).to.exist;
|
expect(pubKey).to.exist;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user