Index: chrome/renderer/resources/extensions/enterprise_platform_keys/key.js |
diff --git a/chrome/renderer/resources/extensions/enterprise_platform_keys/key.js b/chrome/renderer/resources/extensions/enterprise_platform_keys/key.js |
index 7d146cc69acc1193153a4b3355984d5eca741bf8..11ffa64ed2dd949611168d7182e063c98532a9ac 100644 |
--- a/chrome/renderer/resources/extensions/enterprise_platform_keys/key.js |
+++ b/chrome/renderer/resources/extensions/enterprise_platform_keys/key.js |
@@ -22,6 +22,36 @@ var KeyUsage = { |
verify: 'verify' |
}; |
+// Copies |value| recursively. |value| must not contain cyclic references. |
+// Copies only nested structures of non-object types (like number), Array, |
+// Uint8Array and the directly owned properties of objects (it ignores |
+// prototypes). |
+function deepCopy(value) { |
+ if (value === null) |
+ return null; |
+ if (typeof(value) !== 'object') |
+ return value; |
+ |
+ var copy = null; |
+ if (Array.isArray(value) ) { |
+ copy = new Array(); |
+ for (var i = 0; i < value.length; i++) |
+ copy[i] = deepCopy(value[i]); |
+ } else if (value.__proto__.constructor.name === 'Uint8Array') { |
+ copy = new Uint8Array(value.length); |
+ for (var i = 0; i < value.length; i++) |
+ copy[i] = value[i]; |
+ } else { |
+ copy = new Object(); |
+ for (var key in value) { |
+ if (!value.hasOwnProperty(key)) |
+ continue; |
+ copy[key] = deepCopy(value[key]); |
+ } |
+ } |
+ return copy; |
+} |
+ |
/** |
* Implementation of WebCrypto.Key used in enterprise.platformKeys. |
* @param {KeyType} type The type of the new key. |
@@ -40,10 +70,19 @@ var KeyImpl = function(type, publicKeySpki, algorithm, usages, extractable) { |
this.extractable = extractable; |
}; |
-var Key = |
- utils.expose('Key', |
- KeyImpl, |
- {readonly:['extractable', 'type', 'algorithm', 'usages']}); |
+var KeyBase = function() {}; |
+ |
+Object.defineProperty(KeyBase.prototype, 'algorithm', { |
+ enumerable: true, |
+ get: function() { |
+ return deepCopy(privates(this).impl.algorithm); |
+ } |
+}); |
+ |
+var Key = utils.expose( |
+ 'Key', |
+ KeyImpl, |
+ {superclass: KeyBase, readonly: ['extractable', 'type', 'usages']}); |
/** |
* Returns |key|'s Subject Public Key Info. Throws an exception if |key| is not |