File
Blob: src/workerd/api/node/tests/crypto_hmac-test.js
| 1 | // Copyright (c) 2017-2023 Cloudflare, Inc. |
| 2 | // Licensed under the Apache 2.0 license found in the LICENSE file or at: |
| 3 | // https://opensource.org/licenses/Apache-2.0 |
| 4 | // |
| 5 | // Adapted from Node.js. Copyright Joyent, Inc. and other Node contributors. |
| 6 | // |
| 7 | // Permission is hereby granted, free of charge, to any person obtaining a |
| 8 | // copy of this software and associated documentation files (the |
| 9 | // "Software"), to deal in the Software without restriction, including |
| 10 | // without limitation the rights to use, copy, modify, merge, publish, |
| 11 | // distribute, sublicense, and/or sell copies of the Software, and to permit |
| 12 | // persons to whom the Software is furnished to do so, subject to the |
| 13 | // following conditions: |
| 14 | // |
| 15 | // The above copyright notice and this permission notice shall be included |
| 16 | // in all copies or substantial portions of the Software. |
| 17 | // |
| 18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| 19 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 20 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| 21 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
| 22 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
| 23 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
| 24 | // USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 25 | |
| 26 | 'use strict'; |
| 27 | |
| 28 | import { Buffer } from 'node:buffer'; |
| 29 | import * as assert from 'node:assert'; |
| 30 | import * as crypto from 'node:crypto'; |
| 31 | |
| 32 | export const hmac_error_tests = { |
| 33 | async test(ctrl, env, ctx) { |
| 34 | { |
| 35 | const Hmac = crypto.Hmac; |
| 36 | const instance = crypto.Hmac('sha256', 'Node'); |
| 37 | assert.ok( |
| 38 | instance instanceof Hmac, |
| 39 | 'Hmac is expected to return a new instance' + |
| 40 | ' when called without `new`' |
| 41 | ); |
| 42 | } |
| 43 | |
| 44 | assert.throws(() => crypto.createHmac(null), { |
| 45 | code: 'ERR_INVALID_ARG_TYPE', |
| 46 | name: 'TypeError', |
| 47 | message: 'The "hmac" argument must be of type string. Received null', |
| 48 | }); |
| 49 | |
| 50 | assert.throws( |
| 51 | () => |
| 52 | crypto.createHmac('sha256', 'key').digest({ |
| 53 | toString: () => { |
| 54 | throw new Error('boom'); |
| 55 | }, |
| 56 | }), |
| 57 | { |
| 58 | name: 'Error', |
| 59 | message: 'boom', |
| 60 | } |
| 61 | ); |
| 62 | |
| 63 | assert.throws(() => crypto.createHmac('sha1', null), { |
| 64 | code: 'ERR_INVALID_ARG_TYPE', |
| 65 | name: 'TypeError', |
| 66 | }); |
| 67 | }, |
| 68 | }; |
| 69 | |
| 70 | function testHmac(algo, key, data, expected) { |
| 71 | if (!Array.isArray(data)) data = [data]; |
| 72 | |
| 73 | // If the key is a Buffer, test Hmac with a key object as well. |
| 74 | const keyWrappers = [ |
| 75 | (key) => key, |
| 76 | ...(typeof key === 'string' ? [] : [crypto.createSecretKey]), |
| 77 | ]; |
| 78 | |
| 79 | for (const keyWrapper of keyWrappers) { |
| 80 | const hmac = crypto.createHmac(algo, keyWrapper(key)); |
| 81 | for (const chunk of data) hmac.update(chunk); |
| 82 | const actual = hmac.digest('hex'); |
| 83 | assert.strictEqual(actual, expected); |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | export const hmac_correctness_tests = { |
| 88 | async test(ctrl, env, ctx) { |
| 89 | { |
| 90 | // Test HMAC with multiple updates. |
| 91 | testHmac( |
| 92 | 'sha1', |
| 93 | 'Node', |
| 94 | ['some data', 'to hmac'], |
| 95 | '19fd6e1ba73d9ed2224dd5094a71babe85d9a892' |
| 96 | ); |
| 97 | } |
| 98 | |
| 99 | // Test HMAC (Wikipedia Test Cases) |
| 100 | const wikipedia = [ |
| 101 | { |
| 102 | key: 'key', |
| 103 | data: 'The quick brown fox jumps over the lazy dog', |
| 104 | hmac: { |
| 105 | // HMACs lifted from Wikipedia. |
| 106 | md5: '80070713463e7749b90c2dc24911e275', |
| 107 | sha1: 'de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9', |
| 108 | sha256: |
| 109 | 'f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc' + |
| 110 | '2d1a3cd8', |
| 111 | }, |
| 112 | }, |
| 113 | { |
| 114 | key: 'key', |
| 115 | data: '', |
| 116 | hmac: { |
| 117 | // Intermediate test to help debugging. |
| 118 | md5: '63530468a04e386459855da0063b6596', |
| 119 | sha1: 'f42bb0eeb018ebbd4597ae7213711ec60760843f', |
| 120 | sha256: |
| 121 | '5d5d139563c95b5967b9bd9a8c9b233a9dedb45072794cd232dc1b74' + |
| 122 | '832607d0', |
| 123 | }, |
| 124 | }, |
| 125 | { |
| 126 | key: '', |
| 127 | data: 'The quick brown fox jumps over the lazy dog', |
| 128 | hmac: { |
| 129 | // Intermediate test to help debugging. |
| 130 | md5: 'ad262969c53bc16032f160081c4a07a0', |
| 131 | sha1: '2ba7f707ad5f187c412de3106583c3111d668de8', |
| 132 | sha256: |
| 133 | 'fb011e6154a19b9a4c767373c305275a5a69e8b68b0b4c9200c383dc' + |
| 134 | 'ed19a416', |
| 135 | }, |
| 136 | }, |
| 137 | { |
| 138 | key: '', |
| 139 | data: '', |
| 140 | hmac: { |
| 141 | // HMACs lifted from Wikipedia. |
| 142 | md5: '74e6f7298a9c2d168935f58c001bad88', |
| 143 | sha1: 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d', |
| 144 | sha256: |
| 145 | 'b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c71214' + |
| 146 | '4292c5ad', |
| 147 | }, |
| 148 | }, |
| 149 | ]; |
| 150 | |
| 151 | for (const { key, data, hmac } of wikipedia) { |
| 152 | for (const hash in hmac) testHmac(hash, key, data, hmac[hash]); |
| 153 | } |
| 154 | |
| 155 | // Test HMAC-SHA-* (rfc 4231 Test Cases) |
| 156 | const rfc4231 = [ |
| 157 | { |
| 158 | key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), |
| 159 | data: Buffer.from('4869205468657265', 'hex'), // 'Hi There' |
| 160 | hmac: { |
| 161 | sha224: '896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22', |
| 162 | sha256: |
| 163 | 'b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c' + |
| 164 | '2e32cff7', |
| 165 | sha384: |
| 166 | 'afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c' + |
| 167 | '7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6', |
| 168 | sha512: |
| 169 | '87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b305' + |
| 170 | '45e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f170' + |
| 171 | '2e696c203a126854', |
| 172 | }, |
| 173 | }, |
| 174 | { |
| 175 | key: Buffer.from('4a656665', 'hex'), // 'Jefe' |
| 176 | data: Buffer.from( |
| 177 | '7768617420646f2079612077616e7420666f72206e6f74686' + '96e673f', |
| 178 | 'hex' |
| 179 | ), // 'what do ya want for nothing?' |
| 180 | hmac: { |
| 181 | sha224: 'a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44', |
| 182 | sha256: |
| 183 | '5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b9' + |
| 184 | '64ec3843', |
| 185 | sha384: |
| 186 | 'af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec373' + |
| 187 | '6322445e8e2240ca5e69e2c78b3239ecfab21649', |
| 188 | sha512: |
| 189 | '164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7' + |
| 190 | 'ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b' + |
| 191 | '636e070a38bce737', |
| 192 | }, |
| 193 | }, |
| 194 | { |
| 195 | key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), |
| 196 | data: Buffer.from( |
| 197 | 'ddddddddddddddddddddddddddddddddddddddddddddddddd' + |
| 198 | 'ddddddddddddddddddddddddddddddddddddddddddddddddddd', |
| 199 | 'hex' |
| 200 | ), |
| 201 | hmac: { |
| 202 | sha224: '7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea', |
| 203 | sha256: |
| 204 | '773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514' + |
| 205 | 'ced565fe', |
| 206 | sha384: |
| 207 | '88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e5' + |
| 208 | '5966144b2a5ab39dc13814b94e3ab6e101a34f27', |
| 209 | sha512: |
| 210 | 'fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33' + |
| 211 | 'b2279d39bf3e848279a722c806b485a47e67c807b946a337bee89426' + |
| 212 | '74278859e13292fb', |
| 213 | }, |
| 214 | }, |
| 215 | { |
| 216 | key: Buffer.from( |
| 217 | '0102030405060708090a0b0c0d0e0f10111213141516171819', |
| 218 | 'hex' |
| 219 | ), |
| 220 | data: Buffer.from( |
| 221 | 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + |
| 222 | 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', |
| 223 | 'hex' |
| 224 | ), |
| 225 | hmac: { |
| 226 | sha224: '6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a', |
| 227 | sha256: |
| 228 | '82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff4' + |
| 229 | '6729665b', |
| 230 | sha384: |
| 231 | '3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e' + |
| 232 | '1f573b4e6801dd23c4a7d679ccf8a386c674cffb', |
| 233 | sha512: |
| 234 | 'b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050' + |
| 235 | '361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2d' + |
| 236 | 'e2adebeb10a298dd', |
| 237 | }, |
| 238 | }, |
| 239 | |
| 240 | { |
| 241 | key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), |
| 242 | // 'Test With Truncation' |
| 243 | data: Buffer.from('546573742057697468205472756e636174696f6e', 'hex'), |
| 244 | hmac: { |
| 245 | sha224: '0e2aea68a90c8d37c988bcdb9fca6fa8', |
| 246 | sha256: 'a3b6167473100ee06e0c796c2955552b', |
| 247 | sha384: '3abf34c3503b2a23a46efc619baef897', |
| 248 | sha512: '415fad6271580a531d4179bc891d87a6', |
| 249 | }, |
| 250 | truncate: true, |
| 251 | }, |
| 252 | { |
| 253 | key: Buffer.from( |
| 254 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 255 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 256 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 257 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 258 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 259 | 'aaaaaaaaaaaa', |
| 260 | 'hex' |
| 261 | ), |
| 262 | // 'Test Using Larger Than Block-Size Key - Hash Key First' |
| 263 | data: Buffer.from( |
| 264 | '54657374205573696e67204c6172676572205468616e20426' + |
| 265 | 'c6f636b2d53697a65204b6579202d2048617368204b657920' + |
| 266 | '4669727374', |
| 267 | 'hex' |
| 268 | ), |
| 269 | hmac: { |
| 270 | sha224: '95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e', |
| 271 | sha256: |
| 272 | '60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f' + |
| 273 | '0ee37f54', |
| 274 | sha384: |
| 275 | '4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05' + |
| 276 | '033ac4c60c2ef6ab4030fe8296248df163f44952', |
| 277 | sha512: |
| 278 | '80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b0137' + |
| 279 | '83f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec' + |
| 280 | '8b915a985d786598', |
| 281 | }, |
| 282 | }, |
| 283 | { |
| 284 | key: Buffer.from( |
| 285 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 286 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 287 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 288 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 289 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 290 | 'aaaaaaaaaaaa', |
| 291 | 'hex' |
| 292 | ), |
| 293 | // 'This is a test using a larger than block-size key and a larger ' + |
| 294 | // 'than block-size data. The key needs to be hashed before being ' + |
| 295 | // 'used by the HMAC algorithm.' |
| 296 | data: Buffer.from( |
| 297 | '5468697320697320612074657374207573696e672061206c6' + |
| 298 | '172676572207468616e20626c6f636b2d73697a65206b6579' + |
| 299 | '20616e642061206c6172676572207468616e20626c6f636b2' + |
| 300 | 'd73697a6520646174612e20546865206b6579206e65656473' + |
| 301 | '20746f20626520686173686564206265666f7265206265696' + |
| 302 | 'e6720757365642062792074686520484d414320616c676f72' + |
| 303 | '6974686d2e', |
| 304 | 'hex' |
| 305 | ), |
| 306 | hmac: { |
| 307 | sha224: '3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1', |
| 308 | sha256: |
| 309 | '9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f5153' + |
| 310 | '5c3a35e2', |
| 311 | sha384: |
| 312 | '6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82' + |
| 313 | '461e99c5a678cc31e799176d3860e6110c46523e', |
| 314 | sha512: |
| 315 | 'e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d' + |
| 316 | '20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de04460' + |
| 317 | '65c97440fa8c6a58', |
| 318 | }, |
| 319 | }, |
| 320 | ]; |
| 321 | |
| 322 | for (let i = 0, l = rfc4231.length; i < l; i++) { |
| 323 | for (const hash in rfc4231[i].hmac) { |
| 324 | const str = crypto.createHmac(hash, rfc4231[i].key); |
| 325 | str.end(rfc4231[i].data); |
| 326 | let strRes = str.read().toString('hex'); |
| 327 | let actual = crypto |
| 328 | .createHmac(hash, rfc4231[i].key) |
| 329 | .update(rfc4231[i].data) |
| 330 | .digest('hex'); |
| 331 | if (rfc4231[i].truncate) { |
| 332 | actual = actual.substr(0, 32); // first 128 bits == 32 hex chars |
| 333 | strRes = strRes.substr(0, 32); |
| 334 | } |
| 335 | const expected = rfc4231[i].hmac[hash]; |
| 336 | assert.strictEqual( |
| 337 | actual, |
| 338 | expected, |
| 339 | `Test HMAC-${hash} rfc 4231 case ${i + 1}: ${actual} must be ${expected}` |
| 340 | ); |
| 341 | assert.strictEqual( |
| 342 | actual, |
| 343 | strRes, |
| 344 | `Should get same result from stream (hash: ${hash} and case: ${i + 1})` + |
| 345 | ` => ${actual} must be ${strRes}` |
| 346 | ); |
| 347 | } |
| 348 | } |
| 349 | |
| 350 | // Test HMAC-MD5/SHA1 (rfc 2202 Test Cases) |
| 351 | const rfc2202_md5 = [ |
| 352 | { |
| 353 | key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), |
| 354 | data: 'Hi There', |
| 355 | hmac: '9294727a3638bb1c13f48ef8158bfc9d', |
| 356 | }, |
| 357 | { |
| 358 | key: 'Jefe', |
| 359 | data: 'what do ya want for nothing?', |
| 360 | hmac: '750c783e6ab0b503eaa86e310a5db738', |
| 361 | }, |
| 362 | { |
| 363 | key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), |
| 364 | data: Buffer.from( |
| 365 | 'ddddddddddddddddddddddddddddddddddddddddddddddddd' + |
| 366 | 'ddddddddddddddddddddddddddddddddddddddddddddddddddd', |
| 367 | 'hex' |
| 368 | ), |
| 369 | hmac: '56be34521d144c88dbb8c733f0e8b3f6', |
| 370 | }, |
| 371 | { |
| 372 | key: Buffer.from( |
| 373 | '0102030405060708090a0b0c0d0e0f10111213141516171819', |
| 374 | 'hex' |
| 375 | ), |
| 376 | data: Buffer.from( |
| 377 | 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + |
| 378 | 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + |
| 379 | 'cdcdcdcdcd', |
| 380 | 'hex' |
| 381 | ), |
| 382 | hmac: '697eaf0aca3a3aea3a75164746ffaa79', |
| 383 | }, |
| 384 | { |
| 385 | key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), |
| 386 | data: 'Test With Truncation', |
| 387 | hmac: '56461ef2342edc00f9bab995690efd4c', |
| 388 | }, |
| 389 | { |
| 390 | key: Buffer.from( |
| 391 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 392 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 393 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 394 | 'aaaaaaaaaaaaaaaaaaaaaa', |
| 395 | 'hex' |
| 396 | ), |
| 397 | data: 'Test Using Larger Than Block-Size Key - Hash Key First', |
| 398 | hmac: '6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd', |
| 399 | }, |
| 400 | { |
| 401 | key: Buffer.from( |
| 402 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 403 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 404 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 405 | 'aaaaaaaaaaaaaaaaaaaaaa', |
| 406 | 'hex' |
| 407 | ), |
| 408 | data: |
| 409 | 'Test Using Larger Than Block-Size Key and Larger Than One ' + |
| 410 | 'Block-Size Data', |
| 411 | hmac: '6f630fad67cda0ee1fb1f562db3aa53e', |
| 412 | }, |
| 413 | ]; |
| 414 | |
| 415 | for (const { key, data, hmac } of rfc2202_md5) |
| 416 | testHmac('md5', key, data, hmac); |
| 417 | |
| 418 | const rfc2202_sha1 = [ |
| 419 | { |
| 420 | key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), |
| 421 | data: 'Hi There', |
| 422 | hmac: 'b617318655057264e28bc0b6fb378c8ef146be00', |
| 423 | }, |
| 424 | { |
| 425 | key: 'Jefe', |
| 426 | data: 'what do ya want for nothing?', |
| 427 | hmac: 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79', |
| 428 | }, |
| 429 | { |
| 430 | key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), |
| 431 | data: Buffer.from( |
| 432 | 'ddddddddddddddddddddddddddddddddddddddddddddd' + |
| 433 | 'ddddddddddddddddddddddddddddddddddddddddddddd' + |
| 434 | 'dddddddddd', |
| 435 | 'hex' |
| 436 | ), |
| 437 | hmac: '125d7342b9ac11cd91a39af48aa17b4f63f175d3', |
| 438 | }, |
| 439 | { |
| 440 | key: Buffer.from( |
| 441 | '0102030405060708090a0b0c0d0e0f10111213141516171819', |
| 442 | 'hex' |
| 443 | ), |
| 444 | data: Buffer.from( |
| 445 | 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + |
| 446 | 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + |
| 447 | 'cdcdcdcdcd', |
| 448 | 'hex' |
| 449 | ), |
| 450 | hmac: '4c9007f4026250c6bc8414f9bf50c86c2d7235da', |
| 451 | }, |
| 452 | { |
| 453 | key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), |
| 454 | data: 'Test With Truncation', |
| 455 | hmac: '4c1a03424b55e07fe7f27be1d58bb9324a9a5a04', |
| 456 | }, |
| 457 | { |
| 458 | key: Buffer.from( |
| 459 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 460 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 461 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 462 | 'aaaaaaaaaaaaaaaaaaaaaa', |
| 463 | 'hex' |
| 464 | ), |
| 465 | data: 'Test Using Larger Than Block-Size Key - Hash Key First', |
| 466 | hmac: 'aa4ae5e15272d00e95705637ce8a3b55ed402112', |
| 467 | }, |
| 468 | { |
| 469 | key: Buffer.from( |
| 470 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 471 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 472 | 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + |
| 473 | 'aaaaaaaaaaaaaaaaaaaaaa', |
| 474 | 'hex' |
| 475 | ), |
| 476 | data: |
| 477 | 'Test Using Larger Than Block-Size Key and Larger Than One ' + |
| 478 | 'Block-Size Data', |
| 479 | hmac: 'e8e99d0f45237d786d6bbaa7965c7808bbff1a91', |
| 480 | }, |
| 481 | ]; |
| 482 | |
| 483 | for (const { key, data, hmac } of rfc2202_sha1) |
| 484 | testHmac('sha1', key, data, hmac); |
| 485 | }, |
| 486 | }; |
| 487 | |
| 488 | export const hmac_misc_tests = { |
| 489 | async test(ctrl, env, ctx) { |
| 490 | assert.strictEqual( |
| 491 | crypto.createHmac('sha256', 'w00t').digest('ucs2'), |
| 492 | crypto.createHmac('sha256', 'w00t').digest().toString('ucs2') |
| 493 | ); |
| 494 | |
| 495 | // Check initialized -> uninitialized state transition after calling digest(). |
| 496 | { |
| 497 | const expected = |
| 498 | '\u0010\u0041\u0052\u00c5\u00bf\u00dc\u00a0\u007b\u00c6\u0033' + |
| 499 | '\u00ee\u00bd\u0046\u0019\u009f\u0002\u0055\u00c9\u00f4\u009d'; |
| 500 | { |
| 501 | const h = crypto.createHmac('sha1', 'key').update('data'); |
| 502 | assert.deepStrictEqual( |
| 503 | h.digest('buffer'), |
| 504 | Buffer.from(expected, 'latin1') |
| 505 | ); |
| 506 | assert.deepStrictEqual(h.digest('buffer'), Buffer.from('')); |
| 507 | } |
| 508 | { |
| 509 | const h = crypto.createHmac('sha1', 'key').update('data'); |
| 510 | assert.strictEqual(h.digest('latin1'), expected); |
| 511 | assert.strictEqual(h.digest('latin1'), ''); |
| 512 | } |
| 513 | } |
| 514 | |
| 515 | // Check initialized -> uninitialized state transition after calling digest(). |
| 516 | // Calls to update() omitted intentionally. |
| 517 | { |
| 518 | const expected = |
| 519 | '\u00f4\u002b\u00b0\u00ee\u00b0\u0018\u00eb\u00bd\u0045\u0097' + |
| 520 | '\u00ae\u0072\u0013\u0071\u001e\u00c6\u0007\u0060\u0084\u003f'; |
| 521 | { |
| 522 | const h = crypto.createHmac('sha1', 'key'); |
| 523 | assert.deepStrictEqual( |
| 524 | h.digest('buffer'), |
| 525 | Buffer.from(expected, 'latin1') |
| 526 | ); |
| 527 | assert.deepStrictEqual(h.digest('buffer'), Buffer.from('')); |
| 528 | } |
| 529 | { |
| 530 | const h = crypto.createHmac('sha1', 'key'); |
| 531 | assert.strictEqual(h.digest('latin1'), expected); |
| 532 | assert.strictEqual(h.digest('latin1'), ''); |
| 533 | } |
| 534 | } |
| 535 | |
| 536 | { |
| 537 | assert.throws( |
| 538 | () => crypto.createHmac('sha7', 'key'), |
| 539 | /Digest method not supported/ |
| 540 | ); |
| 541 | } |
| 542 | |
| 543 | { |
| 544 | const buf = Buffer.alloc(0); |
| 545 | const keyObject = crypto.createSecretKey(Buffer.alloc(0)); |
| 546 | assert.deepStrictEqual( |
| 547 | crypto.createHmac('sha256', buf).update('foo').digest(), |
| 548 | crypto.createHmac('sha256', keyObject).update('foo').digest() |
| 549 | ); |
| 550 | } |
| 551 | }, |
| 552 | }; |