'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const assert = require('assert');
const crypto = require('crypto');
const fixtures = require('../common/fixtures');
const privateKey = fixtures.readKey('rsa_private.pem');
const publicKey = fixtures.readKey('rsa_public.pem');
const data = 'caf\u00e9';
const bytes = Buffer.from(data);
const signature = crypto.sign('sha256', bytes, privateKey);
const factories = [
() => crypto.createHash('sha256'),
() => crypto.createHmac('sha256', 'key'),
() => crypto.createSign('sha256'),
() => crypto.createVerify('sha256'),
() => crypto.createCipheriv('aes-128-ctr', Buffer.alloc(16), Buffer.alloc(16)),
() => crypto.createDecipheriv('aes-128-ctr', Buffer.alloc(16), Buffer.alloc(16)),
];
function finish(instance, data, encoding) {
const result = instance.update(data, encoding);
if (instance instanceof crypto.Hash || instance instanceof crypto.Hmac)
return instance.digest();
if (instance instanceof crypto.Sign)
return instance.sign(privateKey);
if (instance instanceof crypto.Verify)
return instance.verify(publicKey, signature);
return Buffer.concat([result, instance.final()]);
}
for (const create of factories) {
const expected = finish(create(), bytes);
for (const encoding of ['bad', 'buffer']) {
const instance = create();
assert.throws(() => instance.update(data, encoding), {
code: 'ERR_UNKNOWN_ENCODING',
message: `Unknown encoding: ${encoding}`,
});
// Rejected input must not change the operation's state.
assert.deepStrictEqual(finish(instance, bytes), expected);
}
for (const encoding of [undefined, null, '', 'utf8', 'UTF-8']) {
assert.deepStrictEqual(finish(create(), data, encoding), expected);
}
assert.deepStrictEqual(finish(create(), bytes.toString('hex'), 'hex'), expected);
for (const input of [
bytes,
new Uint8Array(bytes),
new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength),
]) {
assert.deepStrictEqual(finish(create(), input, 'bad'), expected);
}
assert.throws(() => create().update('a', 'hex'), {
code: 'ERR_INVALID_ARG_VALUE',
});
}