Index: content/renderer/webcrypto/webcrypto_impl_nss.cc |
diff --git a/content/renderer/webcrypto/webcrypto_impl_nss.cc b/content/renderer/webcrypto/webcrypto_impl_nss.cc |
index 73319df1a78b837fa4c7a93a762d6307cd06e3f8..29dc04dd9998d4bce3232903394f50c0439d5d79 100644 |
--- a/content/renderer/webcrypto/webcrypto_impl_nss.cc |
+++ b/content/renderer/webcrypto/webcrypto_impl_nss.cc |
@@ -325,6 +325,30 @@ bool ImportKeyInternalRaw( |
return true; |
} |
+bool ExportKeyInternalRaw( |
+ const blink::WebCryptoKey& key, |
+ blink::WebArrayBuffer* buffer) { |
+ |
+ DCHECK(key.handle()); |
+ DCHECK(buffer); |
+ |
+ if (key.type() != blink::WebCryptoKeyTypeSecret || !key.extractable()) |
+ return false; |
+ |
+ SymKeyHandle* sym_key = reinterpret_cast<SymKeyHandle*>(key.handle()); |
+ |
+ if (PK11_ExtractKeyValue(sym_key->key()) != SECSuccess) |
+ return false; |
+ |
+ const SECItem* key_data = PK11_GetKeyData(sym_key->key()); |
+ if (!key_data) |
+ return false; |
+ |
+ *buffer = webcrypto::CreateArrayBuffer(key_data->data, key_data->len); |
+ |
+ return true; |
+} |
+ |
typedef scoped_ptr<CERTSubjectPublicKeyInfo, |
crypto::NSSDestroyer<CERTSubjectPublicKeyInfo, |
SECKEY_DestroySubjectPublicKeyInfo> > |
@@ -424,8 +448,7 @@ bool ExportKeyInternalSpki( |
DCHECK(spki_der->data); |
DCHECK(spki_der->len); |
- *buffer = blink::WebArrayBuffer::create(spki_der->len, 1); |
- memcpy(buffer->data(), spki_der->data, spki_der->len); |
+ *buffer = webcrypto::CreateArrayBuffer(spki_der->data, spki_der->len); |
return true; |
} |
@@ -827,8 +850,7 @@ bool WebCryptoImpl::ExportKeyInternal( |
blink::WebArrayBuffer* buffer) { |
switch (format) { |
case blink::WebCryptoKeyFormatRaw: |
- // TODO(padolph): Implement raw export |
- return false; |
+ return ExportKeyInternalRaw(key, buffer); |
case blink::WebCryptoKeyFormatSpki: |
return ExportKeyInternalSpki(key, buffer); |
case blink::WebCryptoKeyFormatPkcs8: |