argon2.js (2110B)
1 function define_tests() { 2 var subtle = self.crypto.subtle; 3 4 var testData = getTestData(); 5 var testVectors = testData.testVectors; 6 7 return setUpBaseKeys().then(function (allKeys) { 8 var baseKeys = allKeys.baseKeys; 9 10 testVectors.forEach(function (vector) { 11 var algorithmName = vector.algorithm; 12 var params = vector.params; 13 var expected = vector.expected; 14 15 var testName = algorithmName + ' deriveBits'; 16 17 // Test deriveBits 18 subsetTest( 19 promise_test, 20 function (test) { 21 var algorithm = Object.assign({ name: algorithmName }, params); 22 return subtle 23 .deriveBits(algorithm, baseKeys[algorithmName], 256) 24 .then( 25 function (derivation) { 26 assert_true( 27 equalBuffers(derivation, expected), 28 'Derived correct key' 29 ); 30 }, 31 function (err) { 32 assert_unreached( 33 'deriveBits failed with error ' + 34 err.name + 35 ': ' + 36 err.message 37 ); 38 } 39 ); 40 }, 41 testName 42 ); 43 }); 44 }); 45 46 function setUpBaseKeys() { 47 var promises = []; 48 var baseKeys = {}; 49 50 testVectors.forEach(function (vector) { 51 var algorithmName = vector.algorithm; 52 var password = vector.password; 53 54 // Key for normal operations 55 promises.push( 56 subtle 57 .importKey('raw-secret', password, algorithmName, false, [ 58 'deriveBits', 59 ]) 60 .then(function (key) { 61 baseKeys[algorithmName] = key; 62 }) 63 ); 64 }); 65 66 return Promise.all(promises).then(function () { 67 return { 68 baseKeys: baseKeys, 69 }; 70 }); 71 } 72 } 73 74 function equalBuffers(a, b) { 75 if (a.byteLength !== b.byteLength) { 76 return false; 77 } 78 79 var aView = new Uint8Array(a); 80 var bView = new Uint8Array(b); 81 82 for (var i = 0; i < aView.length; i++) { 83 if (aView[i] !== bView[i]) { 84 return false; 85 } 86 } 87 88 return true; 89 }