Index: chrome/test/data/extensions/api_test/enterprise_platform_keys/basic.js |
diff --git a/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic.js b/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic.js |
index e515f87fc86cd16e3f9cdbca02aad40da16f280b..6684d9fbe6a80f4e24135fe8b34e8ecb6b08a5d3 100644 |
--- a/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic.js |
+++ b/chrome/test/data/extensions/api_test/enterprise_platform_keys/basic.js |
@@ -7,6 +7,8 @@ |
'use strict'; |
+var systemTokenEnabled = (location.href.indexOf("systemTokenEnabled") != -1); |
+ |
var assertEq = chrome.test.assertEq; |
var assertTrue = chrome.test.assertTrue; |
var assertThrows = chrome.test.assertThrows; |
@@ -245,6 +247,11 @@ function sortCerts(certs) { |
* The order of |expectedCerts| is ignored. Afterwards calls |callback|. |
*/ |
function assertCertsStored(token, expectedCerts, callback) { |
+ if (!token) { |
+ if (callback) |
+ callback(); |
+ return; |
+ } |
chrome.enterprise.platformKeys.getCertificates( |
token.id, |
callbackPass(function(actualCerts) { |
@@ -301,13 +308,17 @@ function beforeTests(callback) { |
getTokens(function(userToken, systemToken) { |
if (!userToken) |
fail('no user token'); |
- if (userToken.id != 'user') |
- fail('user token is not named "user".'); |
+ assertEq('user', userToken.id); |
- if (!systemToken) |
- fail('no system token'); |
- if (systemToken.id != 'system') |
- fail('system token is not named "system".'); |
+ if (systemTokenEnabled) { |
+ if (!systemToken) |
+ fail('no system token'); |
+ assertEq('system', systemToken.id); |
+ } else { |
+ assertEq(null, |
+ systemToken, |
+ 'system token is disabled, but found the token nonetheless.'); |
+ } |
callback(userToken, systemToken); |
}); |
@@ -431,223 +442,304 @@ function generateKeyAndVerify(token, algorithm, data, callback) { |
}), function(error) { fail("Verification failed: " + error); }); |
} |
-function runTests(userToken, systemToken) { |
- chrome.test.runTests([ |
- function hasSubtleCryptoMethods() { |
- assertTrue(!!userToken.subtleCrypto.generateKey, |
- "user token has no generateKey method"); |
- assertTrue(!!userToken.subtleCrypto.sign, |
- "user token has no sign method"); |
- assertTrue(!!userToken.subtleCrypto.exportKey, |
- "user token has no exportKey method"); |
- succeed(); |
- }, |
+function testInitiallyNoCerts(token) { |
+ assertCertsStored(token, []); |
+} |
- function initiallyNoCerts() { |
- assertCertsStored(userToken, []); |
- assertCertsStored(systemToken, []); |
- }, |
+function testHasSubtleCryptoMethods(token) { |
+ assertTrue(!!token.subtleCrypto.generateKey, |
+ "token has no generateKey method"); |
+ assertTrue(!!token.subtleCrypto.sign, "token has no sign method"); |
+ assertTrue(!!token.subtleCrypto.exportKey, |
+ "token has no exportKey method"); |
+ succeed(); |
+} |
- // Generates a key and signs some data with it. Verifies the signature using |
- // WebCrypto. Verifies also that a second sign operation fails. |
- function generateKeyAndSign() { |
- var algorithm = { |
- name: "RSASSA-PKCS1-v1_5", |
- // RsaHashedKeyGenParams |
- modulusLength: 512, |
- // Equivalent to 65537 |
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
- hash: { |
- name: "SHA-1", |
- } |
- }; |
- |
- // Some random data to sign. |
- var data = new Uint8Array([0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]); |
- generateKeyAndVerify(userToken, |
- algorithm, |
- data, |
- callbackPass(function(keyPair) { |
- // Try to sign data with the same key a second time, which |
- // must fail. |
- var signParams = {name: 'RSASSA-PKCS1-v1_5'}; |
- userToken.subtleCrypto.sign(signParams, keyPair.privateKey, data).then( |
- function(signature) { |
- fail("Second sign call was expected to fail."); |
- }, |
+// Generates a key and signs some data with it. Verifies the signature using |
+// WebCrypto. Verifies also that a second sign operation fails. |
+function testGenerateKeyAndSign(token) { |
+ var algorithm = { |
+ name: "RSASSA-PKCS1-v1_5", |
+ // RsaHashedKeyGenParams |
+ modulusLength: 512, |
+ // Equivalent to 65537 |
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
+ hash: { |
+ name: "SHA-1", |
+ } |
+ }; |
+ |
+ // Some random data to sign. |
+ var data = new Uint8Array([0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]); |
+ generateKeyAndVerify(token, |
+ algorithm, |
+ data, |
+ callbackPass(function(keyPair) { |
+ // Try to sign data with the same key a second time, which |
+ // must fail. |
+ var signParams = {name: 'RSASSA-PKCS1-v1_5'}; |
+ token.subtleCrypto.sign(signParams, keyPair.privateKey, data).then( |
+ function(signature) { fail("Second sign call was expected to fail."); }, |
+ callbackPass(function(error) { |
+ assertTrue(error instanceof Error); |
+ assertEq('The operation failed for an operation-specific reason', |
+ error.message); |
+ })); |
+ })); |
+} |
+ |
+// Generates a key and signs some data with other parameters. Verifies the |
+// signature using WebCrypto. |
+function testGenerateKeyAndSignOtherParameters(token) { |
+ var algorithm = { |
+ name: "RSASSA-PKCS1-v1_5", |
+ // RsaHashedKeyGenParams |
+ modulusLength: 1024, |
+ // Equivalent to 65537 |
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
+ hash: { |
+ name: "SHA-512", |
+ } |
+ }; |
+ |
+ // Some random data to sign. |
+ var data = new Uint8Array([5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 0, 0, 254]); |
+ generateKeyAndVerify(token, algorithm, data, callbackPass()); |
+} |
+ |
+// Call generate key with invalid algorithm parameter, missing |
+// modulusLength. |
+function testAlgorithmParameterMissingModulusLength(token) { |
+ var algorithm = { |
+ name: "RSASSA-PKCS1-v1_5", |
+ // Equivalent to 65537 |
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
+ hash: { |
+ name: "SHA-1", |
+ } |
+ }; |
+ token.subtleCrypto.generateKey(algorithm, false, ['sign']) |
+ .then(function(keyPair) { fail('generateKey was expected to fail'); }, |
callbackPass(function(error) { |
- assertTrue(error instanceof Error); |
- assertEq('The operation failed for an operation-specific reason', |
- error.message); |
- })); |
- })); |
- }, |
+ assertTrue(error instanceof Error); |
+ assertEq('A required parameter was missing or out-of-range', error.message); |
+ })); |
+} |
- // Generates a key and signs some data with other parameters. Verifies the |
- // signature using WebCrypto. |
- function generateKeyAndSignOtherParameters() { |
- var algorithm = { |
- name: "RSASSA-PKCS1-v1_5", |
- // RsaHashedKeyGenParams |
- modulusLength: 1024, |
- // Equivalent to 65537 |
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
- hash: { |
- name: "SHA-512", |
- } |
- }; |
+// Call generate key with invalid algorithm parameter, missing hash. |
+function testAlgorithmParameterMissingHash(token) { |
+ var algorithm = { |
+ name: 'RSASSA-PKCS1-v1_5', |
+ modulusLength: 512, |
+ // Equivalent to 65537 |
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
+ }; |
+ token.subtleCrypto.generateKey(algorithm, false, ['sign']) |
+ .then(function(keyPair) { fail('generateKey was expected to fail'); }, |
+ callbackPass(function(error) { |
+ assertEq( |
+ new Error('Error: A required parameter was missing our out-of-range'), |
+ error); |
+ })); |
+} |
- // Some random data to sign. |
- var data = new Uint8Array([5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 0, 0, 254]); |
- generateKeyAndVerify(userToken, algorithm, data, callbackPass()); |
- }, |
+// Call generate key with invalid algorithm parameter, unsupported public |
+// exponent. |
+function testAlgorithmParameterUnsupportedPublicExponent(token) { |
+ var algorithm = { |
+ name: 'RSASSA-PKCS1-v1_5', |
+ modulusLength: 512, |
+ // Different from 65537. |
+ publicExponent: new Uint8Array([0x01, 0x01]), |
+ }; |
+ token.subtleCrypto.generateKey(algorithm, false, ['sign']) |
+ .then(function(keyPair) { fail('generateKey was expected to fail'); }, |
+ callbackPass(function(error) { |
+ assertTrue(error instanceof Error); |
+ assertEq('A required parameter was missing or out-of-range', error.message); |
+ })); |
+} |
+function testImportInvalidCert(token) { |
+ var invalidCert = new ArrayBuffer(16); |
+ chrome.enterprise.platformKeys.importCertificate( |
+ token.id, |
+ invalidCert, |
+ callbackFail('Certificate is not a valid X.509 certificate.')); |
+} |
+ |
+function testRemoveUnknownCert(token) { |
+ chrome.enterprise.platformKeys.removeCertificate( |
+ token.id, cert2.buffer, callbackFail('Certificate could not be found.')); |
+} |
+ |
+function testRemoveInvalidCert(token) { |
+ var invalidCert = new ArrayBuffer(16); |
+ chrome.enterprise.platformKeys.removeCertificate( |
+ token.id, |
+ invalidCert, |
+ callbackFail('Certificate is not a valid X.509 certificate.')); |
+} |
+ |
+function bindTestsToToken(tests, token) { |
+ return tests.map(function(test) { |
+ var bound = test.bind(undefined, token); |
+ bound.generatedName = test.name; |
+ return bound; |
+ }); |
+} |
+ |
+function runTests(userToken, systemToken) { |
+ // These tests don't depend on keys being loaded on C++ side (which will be |
+ // removed by tests below) and are run for each available token. |
+ var testsIndependentOfKeysWithTokenParameter = [ |
+ testInitiallyNoCerts, |
+ testHasSubtleCryptoMethods, |
+ testRemoveUnknownCert, |
+ testGenerateKeyAndSign, |
+ testGenerateKeyAndSignOtherParameters, |
+ testAlgorithmParameterMissingModulusLength, |
+ testAlgorithmParameterMissingHash, |
+ testAlgorithmParameterUnsupportedPublicExponent, |
+ testImportInvalidCert, |
+ testRemoveInvalidCert, |
+ ]; |
+ var testsIndependentOfKeys = |
+ bindTestsToToken(testsIndependentOfKeysWithTokenParameter, userToken); |
+ if (systemToken) { |
+ testsIndependentOfKeys.concat(bindTestsToToken( |
+ testsIndependentOfKeysWithTokenParameter, systemToken)); |
+ } |
+ |
+ // These tests are not parameterized and work with the keys loaded by the C++ |
+ // side and potentially remove these keys from the tokens. |
+ var testsNotParameterized = [ |
// Importing a cert should fail, if the private key is stored in another |
// token. |
- // This uses the cert that refers to the privateKeyPkcs8, which was imported |
- // on C++'s side. |
+ // This uses the certs that refers to the privateKeyPkcs8User and |
+ // privateKeyPkcs8System keys, which were imported on C++'s side. |
function importCertWithKeyInOtherToken() { |
- chrome.enterprise.platformKeys.importCertificate( |
- systemToken.id, cert1a.buffer, callbackFail('Key not found.')); |
+ if (!systemToken) { |
+ succeed(); |
+ return; |
+ } |
+ |
+ function importToSystemWithKeyInUserToken(callback) { |
+ chrome.enterprise.platformKeys.importCertificate( |
+ systemToken.id, |
+ cert1a.buffer, |
+ callbackFail('Key not found.', callback)); |
+ } |
+ function importToUserWithKeyInSystemToken(callback) { |
+ chrome.enterprise.platformKeys.importCertificate( |
+ userToken.id, |
+ certSystem.buffer, |
+ callbackFail('Key not found.', callback)); |
+ } |
+ |
+ importToSystemWithKeyInUserToken( |
+ importToUserWithKeyInSystemToken.bind(null, null)); |
}, |
- // Imports and removes certificates for privateKeyPkcs8User, which was |
+ // Imports and removes certificates for privateKeyPkcs8User and |
+ // privateKeyPkcs8System (if the system token is enabled), which were |
// imported on C++'s side. |
- // Note: After this test, privateKeyPkcs8User is not stored anymore! |
- function importAndRemoveCertsToUserToken() { |
- runAsyncSequence([ |
- chrome.enterprise.platformKeys.importCertificate.bind( |
- null, userToken.id, cert1a.buffer), |
- assertCertsStored.bind(null, userToken, [cert1a]), |
- // Importing the same cert again shouldn't change anything. |
- chrome.enterprise.platformKeys.importCertificate.bind( |
- null, userToken.id, cert1a.buffer), |
- assertCertsStored.bind(null, userToken, [cert1a]), |
- // Importing another certificate should succeed. |
- chrome.enterprise.platformKeys.importCertificate.bind( |
- null, userToken.id, cert1b.buffer), |
- assertCertsStored.bind(null, userToken, [cert1a, cert1b]), |
- // Shouldn't affect the system token. |
- assertCertsStored.bind(null, systemToken, []), |
- chrome.enterprise.platformKeys.removeCertificate.bind( |
- null, userToken.id, cert1a.buffer), |
- assertCertsStored.bind(null, userToken, [cert1b]), |
- chrome.enterprise.platformKeys.removeCertificate.bind( |
- null, userToken.id, cert1b.buffer), |
- assertCertsStored.bind(null, userToken, []) |
- ]); |
- }, |
- |
- // Imports and removes certificates for privateKeyPkcs8System, which was |
- // imported on C++'s side. |
- // Note: After this test, privateKeyPkcs8System is not stored anymore! |
- function importAndRemoveCertsToSystemToken() { |
- runAsyncSequence([ |
- chrome.enterprise.platformKeys.importCertificate.bind( |
- null, systemToken.id, certSystem.buffer), |
- assertCertsStored.bind(null, systemToken, [certSystem]), |
- // Importing the same cert again shouldn't change anything. |
- chrome.enterprise.platformKeys.importCertificate.bind( |
- null, systemToken.id, certSystem.buffer), |
- assertCertsStored.bind(null, systemToken, [certSystem]), |
- // Shouldn't affect the user token. |
- assertCertsStored.bind(null, userToken, []), |
- chrome.enterprise.platformKeys.removeCertificate.bind( |
- null, systemToken.id, certSystem.buffer), |
- assertCertsStored.bind(null, systemToken, []), |
- ]); |
- }, |
- |
- // Call generate key with invalid algorithm parameter, missing |
- // modulusLength. |
- function algorithmParameterMissingModulusLength() { |
- var algorithm = { |
- name: "RSASSA-PKCS1-v1_5", |
- // Equivalent to 65537 |
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
- hash: { |
- name: "SHA-1", |
- } |
- }; |
- userToken.subtleCrypto.generateKey(algorithm, false, ['sign']).then( |
- function(keyPair) { fail('generateKey was expected to fail'); }, |
- callbackPass(function(error) { |
- assertTrue(error instanceof Error); |
- assertEq('A required parameter was missing or out-of-range', |
- error.message); |
- })); |
+ // Note: After this test, privateKeyPkcs8User and privateKeyPkcs8System are |
+ // not stored anymore! |
+ function importAndRemoveCerts() { |
+ if (systemToken) { |
+ runAsyncSequence([ |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a]), |
+ |
+ // Importing the same cert again shouldn't change anything. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a]), |
+ |
+ // The system token should still be empty. |
+ assertCertsStored.bind(null, systemToken, []), |
+ |
+ // Importing to the system token should not affect the user token. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, systemToken.id, certSystem.buffer), |
+ assertCertsStored.bind(null, systemToken, [certSystem]), |
+ assertCertsStored.bind(null, userToken, [cert1a]), |
+ |
+ // Importing the same cert again to the system token shouldn't change |
+ // anything. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, systemToken.id, certSystem.buffer), |
+ assertCertsStored.bind(null, systemToken, [certSystem]), |
+ |
+ // Importing another certificate should succeed. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1b.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a, cert1b]), |
+ |
+ // Remove cert1a. |
+ chrome.enterprise.platformKeys.removeCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1b]), |
+ |
+ // Remove certSystem. |
+ chrome.enterprise.platformKeys.removeCertificate.bind( |
+ null, systemToken.id, certSystem.buffer), |
+ assertCertsStored.bind(null, systemToken, []), |
+ assertCertsStored.bind(null, userToken, [cert1b]), |
+ |
+ // Remove cert1b. |
+ chrome.enterprise.platformKeys.removeCertificate.bind( |
+ null, userToken.id, cert1b.buffer), |
+ assertCertsStored.bind(null, userToken, []) |
+ ]); |
+ } else { |
+ runAsyncSequence([ |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a]), |
+ // Importing the same cert again shouldn't change anything. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a]), |
+ // Importing another certificate should succeed. |
+ chrome.enterprise.platformKeys.importCertificate.bind( |
+ null, userToken.id, cert1b.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1a, cert1b]), |
+ chrome.enterprise.platformKeys.removeCertificate.bind( |
+ null, userToken.id, cert1a.buffer), |
+ assertCertsStored.bind(null, userToken, [cert1b]), |
+ chrome.enterprise.platformKeys.removeCertificate.bind( |
+ null, userToken.id, cert1b.buffer), |
+ assertCertsStored.bind(null, userToken, []) |
+ ]); |
+ } |
}, |
- // Call generate key with invalid algorithm parameter, missing hash. |
- function algorithmParameterMissingHash() { |
- var algorithm = { |
- name: 'RSASSA-PKCS1-v1_5', |
- modulusLength: 512, |
- // Equivalent to 65537 |
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]), |
- }; |
- userToken.subtleCrypto.generateKey(algorithm, false, ['sign']).then( |
- function(keyPair) { fail('generateKey was expected to fail'); }, |
- callbackPass(function(error) { |
- assertEq( |
- new Error('Error: A required parameter was missing our out-of-range'), |
- error); |
- })); |
- }, |
- |
- // Call generate key with invalid algorithm parameter, unsupported public |
- // exponent. |
- function algorithmParameterUnsupportedPublicExponent() { |
- var algorithm = { |
- name: 'RSASSA-PKCS1-v1_5', |
- modulusLength: 512, |
- // Different from 65537. |
- publicExponent: new Uint8Array([0x01, 0x01]), |
- }; |
- userToken.subtleCrypto.generateKey(algorithm, false, ['sign']).then( |
- function(keyPair) { fail('generateKey was expected to fail'); }, |
- callbackPass(function(error) { |
- assertTrue(error instanceof Error); |
- assertEq('A required parameter was missing or out-of-range', |
- error.message); |
- })); |
+ function getCertsInvalidToken() { |
+ chrome.enterprise.platformKeys.getCertificates( |
+ 'invalid token id', callbackFail('The token is not valid.')); |
}, |
// Imports a certificate for which no private key was imported/generated |
// before. |
- function missingPrivateKey() { |
+ function missingPrivateKeyUserToken() { |
chrome.enterprise.platformKeys.importCertificate( |
userToken.id, cert2.buffer, callbackFail('Key not found.')); |
}, |
- function importInvalidCert() { |
- var invalidCert = new ArrayBuffer(16); |
+ function missingPrivateKeySystemToken() { |
+ if (!systemToken) { |
+ succeed(); |
+ return; |
+ } |
chrome.enterprise.platformKeys.importCertificate( |
- userToken.id, |
- invalidCert, |
- callbackFail('Certificate is not a valid X.509 certificate.')); |
- }, |
- |
- function removeUnknownCert() { |
- chrome.enterprise.platformKeys.removeCertificate( |
- userToken.id, |
- cert2.buffer, |
- callbackFail('Certificate could not be found.')); |
- }, |
- |
- function removeInvalidCert() { |
- var invalidCert = new ArrayBuffer(16); |
- chrome.enterprise.platformKeys.removeCertificate( |
- userToken.id, |
- invalidCert, |
- callbackFail('Certificate is not a valid X.509 certificate.')); |
- }, |
- |
- function getCertsInvalidToken() { |
- chrome.enterprise.platformKeys.getCertificates( |
- 'invalid token id', callbackFail('The token is not valid.')); |
+ systemToken.id, certSystem.buffer, callbackFail('Key not found.')); |
} |
- ]); |
+ ]; |
+ |
+ chrome.test.runTests(testsIndependentOfKeys.concat(testsNotParameterized)); |
} |
beforeTests(runTests); |