| 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 bf6fcdac8179fcba8f65c315b3ee54ed6803d62b..36ffad457375352abe5e8448e7df7c5150b16c25 100644
|
| --- a/content/renderer/webcrypto/webcrypto_impl_nss.cc
|
| +++ b/content/renderer/webcrypto/webcrypto_impl_nss.cc
|
| @@ -324,6 +324,32 @@ 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* const sym_key = reinterpret_cast<SymKeyHandle*>(key.handle());
|
| +
|
| + if (PK11_ExtractKeyValue(sym_key->key()) != SECSuccess)
|
| + return false;
|
| +
|
| + SECItem* const key_data = PK11_GetKeyData(sym_key->key());
|
| + if (!key_data)
|
| + return false;
|
| + DCHECK(key_data->data);
|
| +
|
| + *buffer = blink::WebArrayBuffer::create(key_data->len, 1);
|
| + memcpy(buffer->data(), key_data->data, key_data->len);
|
| +
|
| + return true;
|
| +}
|
| +
|
| typedef scoped_ptr<CERTSubjectPublicKeyInfo,
|
| crypto::NSSDestroyer<CERTSubjectPublicKeyInfo,
|
| SECKEY_DestroySubjectPublicKeyInfo> >
|
| @@ -826,8 +852,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:
|
|
|