1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/manager/ssl/tests/unit/test_hmac.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,90 @@ 1.4 +var ScriptableUnicodeConverter = 1.5 + Components.Constructor("@mozilla.org/intl/scriptableunicodeconverter", 1.6 + "nsIScriptableUnicodeConverter"); 1.7 + 1.8 +function getHMAC(data, key, alg) 1.9 +{ 1.10 + var converter = new ScriptableUnicodeConverter(); 1.11 + converter.charset = 'utf8'; 1.12 + var dataarray = converter.convertToByteArray(data); 1.13 + 1.14 + var keyObject = Components.classes["@mozilla.org/security/keyobjectfactory;1"] 1.15 + .getService(Components.interfaces.nsIKeyObjectFactory) 1.16 + .keyFromString(Components.interfaces.nsIKeyObject.HMAC, key); 1.17 + 1.18 + var cryptoHMAC = Components.classes["@mozilla.org/security/hmac;1"] 1.19 + .createInstance(Components.interfaces.nsICryptoHMAC); 1.20 + 1.21 + cryptoHMAC.init(alg, keyObject); 1.22 + cryptoHMAC.update(dataarray, dataarray.length); 1.23 + var digest1 = cryptoHMAC.finish(false); 1.24 + 1.25 + cryptoHMAC.reset(); 1.26 + cryptoHMAC.update(dataarray, dataarray.length); 1.27 + var digest2 = cryptoHMAC.finish(false); 1.28 + 1.29 + do_check_eq(digest1, digest2); 1.30 + 1.31 + return digest1; 1.32 +} 1.33 + 1.34 +function testHMAC(alg) { 1.35 + const key1 = 'MyKey_ABCDEFGHIJKLMN'; 1.36 + const key2 = 'MyKey_01234567890123'; 1.37 + 1.38 + const dataA = "Secret message"; 1.39 + const dataB = "Secres message"; 1.40 + 1.41 + var diegest1a = getHMAC(key1, dataA, alg); 1.42 + var diegest2 = getHMAC(key2, dataA, alg); 1.43 + var diegest1b = getHMAC(key1, dataA, alg); 1.44 + 1.45 + do_check_eq(diegest1a, diegest1b); 1.46 + do_check_neq(diegest1a, diegest2); 1.47 + 1.48 + var diegest1 = getHMAC(key1, dataA, alg); 1.49 + diegest2 = getHMAC(key1, dataB, alg); 1.50 + 1.51 + do_check_neq(diegest1, diegest2); 1.52 + 1.53 + return diegest1; 1.54 +} 1.55 + 1.56 +function hexdigest(data) { 1.57 + return [("0" + data.charCodeAt(i).toString(16)).slice(-2) for (i in data)].join(""); 1.58 +} 1.59 + 1.60 +function testVectors() { 1.61 + // These are test vectors taken from RFC 4231, section 4.3. (Test Case 2) 1.62 + 1.63 + const keyTestVector = "Jefe"; 1.64 + const dataTestVector = "what do ya want for nothing?"; 1.65 + 1.66 + var diegest; 1.67 + /* 1.68 + Bug 356713 1.69 + diegest = hexdigest(getHMAC(dataTestVector, keyTestVector, 1.70 + Components.interfaces.nsICryptoHMAC.SHA224)); 1.71 + do_check_eq(diegest, "a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44"); 1.72 + */ 1.73 + 1.74 + diegest = hexdigest(getHMAC(dataTestVector, keyTestVector, 1.75 + Components.interfaces.nsICryptoHMAC.SHA256)); 1.76 + do_check_eq(diegest, "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"); 1.77 + 1.78 + diegest = hexdigest(getHMAC(dataTestVector, keyTestVector, 1.79 + Components.interfaces.nsICryptoHMAC.SHA384)); 1.80 + do_check_eq(diegest, "af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649"); 1.81 + 1.82 + diegest = hexdigest(getHMAC(dataTestVector, keyTestVector, 1.83 + Components.interfaces.nsICryptoHMAC.SHA512)); 1.84 + do_check_eq(diegest, "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737"); 1.85 +} 1.86 + 1.87 +function run_test() { 1.88 + testVectors(); 1.89 + 1.90 + testHMAC(Components.interfaces.nsICryptoHMAC.SHA1); 1.91 + testHMAC(Components.interfaces.nsICryptoHMAC.SHA512); 1.92 + testHMAC(Components.interfaces.nsICryptoHMAC.MD5); 1.93 +}