| Index: chrome/renderer/resources/extensions/platform_keys_custom_bindings.js | 
| diff --git a/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js b/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js | 
| index c9eb65956994cbb80d7cf254eee766f26d365b4c..9320e021722770c8020e6753d9d49d439038f32c 100644 | 
| --- a/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js | 
| +++ b/chrome/renderer/resources/extensions/platform_keys_custom_bindings.js | 
| @@ -6,19 +6,53 @@ | 
|  | 
| 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, callback); | 
| +        internalAPI.selectClientCertificates(details, function(matches) { | 
| +          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) { | 
| +          callback(createPublicKey(publicKey, algorithm), | 
| +                   createPrivateKey(publicKey, algorithm)); | 
| +        }); | 
| +      }); | 
| }); | 
|  | 
| exports.binding = binding.generate(); | 
|  |