| 'use strict'; |
| const common = require('../common'); |
| if (!common.hasCrypto) |
| common.skip('missing crypto'); |
| |
| const assert = require('assert'); |
| const crypto = require('crypto'); |
| |
| // 'should consider equal strings to be equal' |
| assert.strictEqual( |
| crypto.timingSafeEqual(Buffer.from('foo'), Buffer.from('foo')), |
| true |
| ); |
| |
| // 'should consider unequal strings to be unequal' |
| assert.strictEqual( |
| crypto.timingSafeEqual(Buffer.from('foo'), Buffer.from('bar')), |
| false |
| ); |
| |
| { |
| // Test TypedArrays with different lengths but equal byteLengths. |
| const buf = crypto.randomBytes(16).buffer; |
| const a1 = new Uint8Array(buf); |
| const a2 = new Uint16Array(buf); |
| const a3 = new Uint32Array(buf); |
| |
| for (const left of [a1, a2, a3]) { |
| for (const right of [a1, a2, a3]) { |
| assert.strictEqual(crypto.timingSafeEqual(left, right), true); |
| } |
| } |
| } |
| |
| assert.throws( |
| () => crypto.timingSafeEqual(Buffer.from([1, 2, 3]), Buffer.from([1, 2])), |
| { |
| code: 'ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH', |
| name: 'RangeError', |
| message: 'Input buffers must have the same byte length' |
| } |
| ); |
| |
| assert.throws( |
| () => crypto.timingSafeEqual('not a buffer', Buffer.from([1, 2])), |
| { |
| code: 'ERR_INVALID_ARG_TYPE', |
| name: 'TypeError', |
| message: |
| 'The "buf1" argument must be an instance of Buffer, TypedArray, or ' + |
| "DataView. Received type string ('not a buffer')" |
| } |
| ); |
| |
| assert.throws( |
| () => crypto.timingSafeEqual(Buffer.from([1, 2]), 'not a buffer'), |
| { |
| code: 'ERR_INVALID_ARG_TYPE', |
| name: 'TypeError', |
| message: |
| 'The "buf2" argument must be an instance of Buffer, TypedArray, or ' + |
| "DataView. Received type string ('not a buffer')" |
| } |
| ); |