1 2function run_test(algorithmNames, slowTest) { 3 var subtle = crypto.subtle; // Change to test prefixed implementations 4 5 setup({explicit_timeout: true}); 6 7// These tests check that generateKey successfully creates keys 8// when provided any of a wide set of correct parameters. 9// 10// There are a lot of combinations of possible parameters, 11// resulting in a very large number of tests 12// performed. 13 14 15// Setup: define the correct behaviors that should be sought, and create 16// helper functions that generate all possible test parameters for 17// different situations. 18 19 var allTestVectors = [ // Parameters that should work for generateKey 20 {name: "AES-CTR", resultType: CryptoKey, usages: ["encrypt", "decrypt", "wrapKey", "unwrapKey"], mandatoryUsages: []}, 21 {name: "AES-CBC", resultType: CryptoKey, usages: ["encrypt", "decrypt", "wrapKey", "unwrapKey"], mandatoryUsages: []}, 22 {name: "AES-GCM", resultType: CryptoKey, usages: ["encrypt", "decrypt", "wrapKey", "unwrapKey"], mandatoryUsages: []}, 23 {name: "AES-KW", resultType: CryptoKey, usages: ["wrapKey", "unwrapKey"], mandatoryUsages: []}, 24 {name: "HMAC", resultType: CryptoKey, usages: ["sign", "verify"], mandatoryUsages: []}, 25 {name: "RSASSA-PKCS1-v1_5", resultType: "CryptoKeyPair", usages: ["sign", "verify"], mandatoryUsages: ["sign"]}, 26 {name: "RSA-PSS", resultType: "CryptoKeyPair", usages: ["sign", "verify"], mandatoryUsages: ["sign"]}, 27 {name: "RSA-OAEP", resultType: "CryptoKeyPair", usages: ["encrypt", "decrypt", "wrapKey", "unwrapKey"], mandatoryUsages: ["decrypt", "unwrapKey"]}, 28 {name: "ECDSA", resultType: "CryptoKeyPair", usages: ["sign", "verify"], mandatoryUsages: ["sign"]}, 29 {name: "ECDH", resultType: "CryptoKeyPair", usages: ["deriveKey", "deriveBits"], mandatoryUsages: ["deriveKey", "deriveBits"]}, 30 {name: "Ed25519", resultType: "CryptoKeyPair", usages: ["sign", "verify"], mandatoryUsages: ["sign"]}, 31 {name: "Ed448", resultType: "CryptoKeyPair", usages: ["sign", "verify"], mandatoryUsages: ["sign"]}, 32 {name: "X25519", resultType: "CryptoKeyPair", usages: ["deriveKey", "deriveBits"], mandatoryUsages: ["deriveKey", "deriveBits"]}, 33 {name: "X448", resultType: "CryptoKeyPair", usages: ["deriveKey", "deriveBits"], mandatoryUsages: ["deriveKey", "deriveBits"]}, 34 ]; 35 36 var testVectors = []; 37 if (algorithmNames && !Array.isArray(algorithmNames)) { 38 algorithmNames = [algorithmNames]; 39 }; 40 allTestVectors.forEach(function(vector) { 41 if (!algorithmNames || algorithmNames.includes(vector.name)) { 42 testVectors.push(vector); 43 } 44 }); 45 46 function parameterString(algorithm, extractable, usages) { 47 var result = "(" + 48 objectToString(algorithm) + ", " + 49 objectToString(extractable) + ", " + 50 objectToString(usages) + 51 ")"; 52 53 return result; 54 } 55 56 // Test that a given combination of parameters is successful 57 function testSuccess(algorithm, extractable, usages, resultType, testTag) { 58 // algorithm, extractable, and usages are the generateKey parameters 59 // resultType is the expected result, either the CryptoKey object or "CryptoKeyPair" 60 // testTag is a string to prepend to the test name. 61 62 promise_test(function(test) { 63 return subtle.generateKey(algorithm, extractable, usages) 64 .then(function(result) { 65 if (resultType === "CryptoKeyPair") { 66 assert_goodCryptoKey(result.privateKey, algorithm, extractable, usages, "private"); 67 assert_goodCryptoKey(result.publicKey, algorithm, true, usages, "public"); 68 } else { 69 assert_goodCryptoKey(result, algorithm, extractable, usages, "secret"); 70 } 71 }, function(err) { 72 assert_unreached("Threw an unexpected error: " + err.toString()); 73 }); 74 }, testTag + ": generateKey" + parameterString(algorithm, extractable, usages)); 75 } 76 77 // Test all valid sets of parameters for successful 78 // key generation. 79 testVectors.forEach(function(vector) { 80 allNameVariants(vector.name, slowTest).forEach(function(name) { 81 allAlgorithmSpecifiersFor(name).forEach(function(algorithm) { 82 allValidUsages(vector.usages, false, vector.mandatoryUsages).forEach(function(usages) { 83 [false, true].forEach(function(extractable) { 84 subsetTest(testSuccess, algorithm, extractable, usages, vector.resultType, "Success"); 85 }); 86 }); 87 }); 88 }); 89 }); 90 91} 92