Index: chrome/common/extensions/docs/templates/intros/enterprise_platformKeys.html |
diff --git a/chrome/common/extensions/docs/templates/intros/enterprise_platformKeys.html b/chrome/common/extensions/docs/templates/intros/enterprise_platformKeys.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..94772f6f80a878ae665b550474e7e53e27930d0d |
--- /dev/null |
+++ b/chrome/common/extensions/docs/templates/intros/enterprise_platformKeys.html |
@@ -0,0 +1,82 @@ |
+<p class="note"> |
+<strong>Note: </strong> |
+This API is only available on Chrome OS and to |
+<a href="https://support.google.com/chrome/a/answer/1375694?hl=en">extensions pre-installed by policy</a>. |
+</p> |
+ |
+<h2 id="usage">Usage</h2> |
+ |
+Typical usage of this API to enroll a client certificate follows these steps: |
+<ul> |
+ <li>Get all available tokens using $(ref:enterprise.platformKeys.getTokens). |
+ </li> |
+ <li>Find the Token with <code>id</code> equal <code>"user"</code>. Use this |
+ Token subsequently.</li> |
+ <li>Generate a key pair using the <code>generateKey</code> Token method |
+ (defined in SubtleCrypto). This will return handle to the key.</li> |
+ <li>Export the public key using the <code>exportKey</code> Token method |
+ (defined in SubtleCrypto). |
+ <li>Create the signature of the certification request's data using the |
+ <code>sign</code> Token method (defined in SubtleCrypto).</li> |
+ <li>Complete the certification request and send it to the certification |
+ authority.</li> |
+ <li>If a certificate is received, import it using |
+ $(ref:enterprise.platformKeys.importCertificate)</li> |
+</ul> |
+ |
+<p> |
+Here's an example that shows the major API interaction except the building and sending of the certification request: |
+</p> |
+ |
+<pre data-filename="background.js"> |
+function getUserToken(callback) { |
+ chrome.enterprise.platformKeys.getTokens(function(tokens) { |
+ for (var i = 0; i < tokens.length; i++) { |
+ if (tokens[i].id == "user") { |
+ callback(tokens[i]); |
+ return; |
+ } |
+ } |
+ callback(undefined); |
+ }); |
+} |
+ |
+function generateAndSign(userToken) { |
+ var data = new Uint8Array([0, 5, 1, 2, 3, 4, 5, 6]); |
+ var algorithm = { |
+ name: "RSASSA-PKCS1-v1_5", |
+ // RsaHashedKeyGenParams |
+ modulusLength: 2048, |
+ publicExponent: |
+ new Uint8Array([0x01, 0x00, 0x01]), // Equivalent to 65537 |
+ hash: { |
+ name: "SHA-1", |
+ } |
+ }; |
+ var cachedKeyPair; |
+ userToken.subtleCrypto.generateKey(algorithm, false, ["sign"]) |
+ .then(function(keyPair) { |
+ cachedKeyPair = keyPair; |
+ return userToken.subtleCrypto.exportKey("spki", keyPair.publicKey); |
+ }, |
+ console.log.bind(console)) |
+ .then(function(publicKeySpki) { |
+ // Build the Certification Request using the public key. |
+ return userToken.subtleCrypto.sign( |
+ {name : "RSASSA-PKCS1-v1_5"}, cachedKeyPair.privateKey, data); |
+ }, |
+ console.log.bind(console)) |
+ .then(function(signature) { |
+ // Complete the Certification Request with |signature|. |
+ // Send out the request to the CA, calling back |
+ // onClientCertificateReceived. |
+ }, |
+ console.log.bind(console)); |
+} |
+ |
+function onClientCertificateReceived(userToken, certificate) { |
+ chrome.enterprise.platformKeys.importCertificate(userToken.id, certificate); |
+} |
+ |
+getUserToken(generateAndSign); |
+</pre> |