// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the platformKeys API. var binding = require('binding').Binding.create('platformKeys'); var SubtleCrypto = require('platformKeys.SubtleCrypto').SubtleCrypto; var getPublicKey = require('platformKeys.getPublicKey').getPublicKey; var internalAPI = require('platformKeys.internalAPI'); var keyModule = require('platformKeys.Key'); var Key = keyModule.Key; var KeyType = keyModule.KeyType; var KeyUsage = keyModule.KeyUsage; function createPublicKey(publicKeySpki, algorithm) { return new Key(KeyType.public, publicKeySpki, algorithm, [KeyUsage.verify], true /* extractable */); } function createPrivateKey(publicKeySpki, algorithm) { return new Key(KeyType.private, publicKeySpki, algorithm, [KeyUsage.sign], false /* not extractable */); } binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var subtleCrypto = new SubtleCrypto('' /* tokenId */); apiFunctions.setHandleRequest( 'selectClientCertificates', function(details, callback) { internalAPI.selectClientCertificates(details, function(matches) { if (chrome.runtime.lastError) { callback([]); return; } callback($Array.map(matches, function(match) { // internalAPI.selectClientCertificates returns publicExponent as // ArrayBuffer, but it should be a Uint8Array. if (match.keyAlgorithm.publicExponent) { match.keyAlgorithm.publicExponent = new Uint8Array(match.keyAlgorithm.publicExponent); } return match; })); }); }); apiFunctions.setHandleRequest( 'subtleCrypto', function() { return subtleCrypto }); apiFunctions.setHandleRequest( 'getKeyPair', function(cert, params, callback) { getPublicKey(cert, params, function(publicKey, algorithm) { if (chrome.runtime.lastError) { callback(); return; } callback(createPublicKey(publicKey, algorithm), createPrivateKey(publicKey, algorithm)); }); }); }); exports.binding = binding.generate();