current commit
260930.5 · crypto: validate digest output encodings
'use strict';

const common = require('../common');
if (!common.hasCrypto)
  common.skip('missing crypto');

const assert = require('assert');
const crypto = require('crypto');

for (const create of [
  () => crypto.createHash('sha256'),
  () => crypto.createHmac('sha256', 'key'),
]) {
  const expected = create().update('test').digest();
  for (const encoding of ['bad', { toString: () => 'bad' }]) {
    const instance = create().update('test');
    assert.throws(() => instance.digest(encoding), {
      code: 'ERR_UNKNOWN_ENCODING',
      message: 'Unknown encoding: bad',
    });
    // An invalid encoding must not finalize the operation.
    assert.deepStrictEqual(instance.digest(), expected);
  }
  for (const encoding of [undefined, null, '', false, 0, 'buffer', 'BUFFER']) {
    assert.deepStrictEqual(create().update('test').digest(encoding), expected);
  }
  for (const encoding of ['hex', 'HEX', 'base64', 'base64url', 'latin1', 'utf-8']) {
    assert.strictEqual(create().update('test').digest(encoding),
                       expected.toString(encoding));
  }
  assert.strictEqual(
    create().update('test').digest({ toString: () => 'hex' }),
    expected.toString('hex'));
}