// Copyright 2011 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. goog.provide('goog.crypt.HmacTest'); goog.setTestOnly('goog.crypt.HmacTest'); goog.require('goog.crypt.Hmac'); goog.require('goog.crypt.Sha1'); goog.require('goog.crypt.hashTester'); goog.require('goog.testing.jsunit'); function stringToBytes(s) { var bytes = new Array(s.length); for (var i = 0; i < s.length; ++i) { bytes[i] = s.charCodeAt(i) & 255; } return bytes; } function hexToBytes(str) { var arr = []; for (var i = 0; i < str.length; i += 2) { arr.push(parseInt(str.substring(i, i + 2), 16)); } return arr; } function bytesToHex(b) { var hexchars = '0123456789abcdef'; var hexrep = new Array(b.length * 2); for (var i = 0; i < b.length; ++i) { hexrep[i * 2] = hexchars.charAt((b[i] >> 4) & 15); hexrep[i * 2 + 1] = hexchars.charAt(b[i] & 15); } return hexrep.join(''); } /** * helper to get an hmac of the given message with the given key. */ function getHmac(key, message, opt_blockSize) { var hasher = new goog.crypt.Sha1(); var hmacer = new goog.crypt.Hmac(hasher, key, opt_blockSize); return bytesToHex(hmacer.getHmac(message)); } function testBasicOperations() { var hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), 'key', 64); goog.crypt.hashTester.runBasicTests(hmac); } function testBasicOperationsWithNoBlockSize() { var hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), 'key'); goog.crypt.hashTester.runBasicTests(hmac); } function testHmac() { // HMAC test vectors from: // http://tools.ietf.org/html/2202 assertEquals( 'test 1 failed', 'b617318655057264e28bc0b6fb378c8ef146be00', getHmac( hexToBytes('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'), stringToBytes('Hi There'))); assertEquals( 'test 2 failed', 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79', getHmac( stringToBytes('Jefe'), stringToBytes('what do ya want for nothing?'))); assertEquals( 'test 3 failed', '125d7342b9ac11cd91a39af48aa17b4f63f175d3', getHmac( hexToBytes('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), hexToBytes( 'dddddddddddddddddddddddddddddddddddddddd' + 'dddddddddddddddddddddddddddddddddddddddd' + 'dddddddddddddddddddd'))); assertEquals( 'test 4 failed', '4c9007f4026250c6bc8414f9bf50c86c2d7235da', getHmac( hexToBytes('0102030405060708090a0b0c0d0e0f10111213141516171819'), hexToBytes( 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + 'cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + 'cdcdcdcdcdcdcdcdcdcd'))); assertEquals( 'test 5 failed', '4c1a03424b55e07fe7f27be1d58bb9324a9a5a04', getHmac( hexToBytes('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c'), stringToBytes('Test With Truncation'))); assertEquals( 'test 6 failed', 'aa4ae5e15272d00e95705637ce8a3b55ed402112', getHmac( hexToBytes( 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), stringToBytes( 'Test Using Larger Than Block-Size Key - Hash Key First'))); assertEquals( 'test 7 failed', 'b617318655057264e28bc0b6fb378c8ef146be00', getHmac( hexToBytes('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'), stringToBytes('Hi There'), 64)); assertEquals( 'test 8 failed', '941f806707826395dc510add6a45ce9933db976e', getHmac( hexToBytes('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'), stringToBytes('Hi There'), 32)); } /** Regression test for Bug 12863104 */ function testUpdateWithLongKey() { // Calling update() then digest() should give the same result as just // calling getHmac() var key = hexToBytes( 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'); var message = 'Secret Message'; var hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), key); hmac.update(message); var result1 = bytesToHex(hmac.digest()); hmac.reset(); var result2 = bytesToHex(hmac.getHmac(message)); assertEquals('Results must be the same', result1, result2); }