• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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