Skip to content

Commit

Permalink
crypto: add cipher update/final methods encoding validation
Browse files Browse the repository at this point in the history
Refs #45189
  • Loading branch information
vitpavlenko authored and panva committed Jan 12, 2023
1 parent 91ca2d4 commit ca20150
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lib/internal/crypto/cipher.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const {
ERR_CRYPTO_INVALID_STATE,
ERR_INVALID_ARG_TYPE,
ERR_INVALID_ARG_VALUE,
ERR_UNKNOWN_ENCODING,
}
} = require('internal/errors');

Expand Down Expand Up @@ -91,9 +92,14 @@ const privateDecrypt = rsaFunctionFor(_privateDecrypt, RSA_PKCS1_OAEP_PADDING,
'private');

function getDecoder(decoder, encoding) {
encoding = normalizeEncoding(encoding);
const normalizedEncoding = normalizeEncoding(encoding);
decoder = decoder || new StringDecoder(encoding);
assert(decoder.encoding === encoding, 'Cannot change encoding');
if (decoder.encoding !== normalizedEncoding) {
if (normalizedEncoding === undefined) {
throw new ERR_UNKNOWN_ENCODING(encoding);
}
assert(false, 'Cannot change encoding');
}
return decoder;
}

Expand Down
52 changes: 52 additions & 0 deletions test/parallel/test-crypto-encoding-validation-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');

// This test checks if error is thrown in case of wrong encoding provided into cipher.

const assert = require('assert');
const { createCipheriv, randomBytes } = require('crypto');

const createCipher = () => {
return createCipheriv('aes-256-cbc', randomBytes(32), randomBytes(16));
};

{
const cipher = createCipher();
cipher.update('test', 'utf-8', 'utf-8');

assert.throws(
() => cipher.update('666f6f', 'hex', 'hex'),
{ message: /Cannot change encoding/ }
);
}

{
const cipher = createCipher();
cipher.update('test', 'utf-8', 'utf-8');

assert.throws(
() => cipher.final('hex'),
{ message: /Cannot change encoding/ }
);
}

{
const cipher = createCipher();
cipher.update('test', 'utf-8', 'utf-8');

assert.throws(
() => cipher.final('bad2'),
{ message: /^Unknown encoding: bad2$/, code: 'ERR_UNKNOWN_ENCODING' }
);
}

{
const cipher = createCipher();

assert.throws(
() => cipher.update('test', 'utf-8', 'bad3'),
{ message: /^Unknown encoding: bad3$/, code: 'ERR_UNKNOWN_ENCODING' }
);
}

0 comments on commit ca20150

Please sign in to comment.