Index: Source/bindings/v8/SerializedScriptValue.cpp |
diff --git a/Source/bindings/v8/SerializedScriptValue.cpp b/Source/bindings/v8/SerializedScriptValue.cpp |
index fefbc866b8a84f0a46b3effa9be025f069046230..691fb541814f7d54ac7c34007b8bfb31c2f08f0b 100644 |
--- a/Source/bindings/v8/SerializedScriptValue.cpp |
+++ b/Source/bindings/v8/SerializedScriptValue.cpp |
@@ -37,6 +37,7 @@ |
#include "V8FileList.h" |
#include "V8ImageData.h" |
#include "V8Key.h" |
+#include "V8KeyPair.h" |
#include "V8MessagePort.h" |
#include "bindings/v8/ExceptionState.h" |
#include "bindings/v8/V8Binding.h" |
@@ -225,6 +226,7 @@ enum SerializationTag { |
// props = algorithmId:uint32_t, type:uint32_t, modulusLengthBits:uint32_t, publicExponentLength:uint32_t, publicExponent:byte[publicExponentLength] |
// If subtag=RsaHashedKeyTag: |
// props = <same as for RsaKeyTag>, hashId:uint32_t |
+ CryptoKeyPairTag = 'k', // publicKey:CryptoKey, privateKey:CryptoKey |
ObjectReferenceTag = '^', // ref:uint32_t -> reference table[ref] |
GenerateFreshObjectTag = 'o', // -> empty object allocated an object ID and pushed onto the open stack (ref) |
GenerateFreshSparseArrayTag = 'a', // length:uint32_t -> empty array[length] allocated an object ID and pushed onto the open stack (ref) |
@@ -506,9 +508,10 @@ public: |
doWriteUint32(blobIndices[i]); |
} |
- bool writeCryptoKey(const blink::WebCryptoKey& key) |
+ bool writeCryptoKey(const blink::WebCryptoKey& key, bool includeTag) |
{ |
- append(static_cast<uint8_t>(CryptoKeyTag)); |
+ if (includeTag) |
+ append(static_cast<uint8_t>(CryptoKeyTag)); |
switch (key.algorithm().paramsType()) { |
case blink::WebCryptoKeyAlgorithmParamsTypeAes: |
@@ -537,6 +540,12 @@ public: |
return true; |
} |
+ bool writeCryptoKeyPair(const blink::WebCryptoKey& publicKey, const blink::WebCryptoKey& privateKey) |
+ { |
+ append(static_cast<uint8_t>(CryptoKeyPairTag)); |
+ return writeCryptoKey(publicKey, false) && writeCryptoKey(privateKey, false); |
+ } |
+ |
void writeArrayBuffer(const ArrayBuffer& arrayBuffer) |
{ |
append(ArrayBufferTag); |
@@ -1356,7 +1365,15 @@ private: |
Key* key = V8Key::toNative(value.As<v8::Object>()); |
if (!key) |
return 0; |
jsbell
2014/05/06 20:38:09
(not this cl, but related) nit: return false
eroman
2014/05/06 21:35:17
Done.
|
- return m_writer.writeCryptoKey(key->key()); |
+ return m_writer.writeCryptoKey(key->key(), true); |
+ } |
+ |
+ bool writeCryptoKeyPair(v8::Handle<v8::Value> value) |
+ { |
+ KeyPair* keyPair = V8KeyPair::toNative(value.As<v8::Object>()); |
+ if (!keyPair) |
+ return 0; |
jsbell
2014/05/06 20:38:09
nit: return false
eroman
2014/05/06 21:35:17
Done.
|
+ return m_writer.writeCryptoKeyPair(keyPair->publicKey()->key(), keyPair->privateKey()->key()); |
} |
void writeImageData(v8::Handle<v8::Value> value) |
@@ -1576,6 +1593,9 @@ Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, Stat |
else if (V8Key::hasInstance(value, m_isolate)) { |
if (!writeCryptoKey(value)) |
return handleError(DataCloneError, "Couldn't serialize key data", next); |
+ } else if (V8KeyPair::hasInstance(value, m_isolate)) { |
+ if (!writeCryptoKeyPair(value)) |
+ return handleError(DataCloneError, "Couldn't serialize key data", next); |
} else if (V8ImageData::hasInstance(value, m_isolate)) |
writeImageData(value); |
else if (value->IsRegExp()) |
@@ -1738,6 +1758,11 @@ public: |
return false; |
creator.pushObjectReference(*value); |
break; |
+ case CryptoKeyPairTag: |
+ if (!readCryptoKeyPair(value)) |
+ return false; |
+ creator.pushObjectReference(*value); |
+ break; |
case ImageDataTag: |
if (!readImageData(value)) |
return false; |
@@ -2231,6 +2256,16 @@ private: |
bool readCryptoKey(v8::Handle<v8::Value>* value) |
{ |
+ blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
+ if (!readCryptoKey(key)) |
+ return false; |
+ |
+ *value = toV8(Key::create(key), v8::Handle<v8::Object>(), m_isolate); |
+ return true; |
+ } |
+ |
+ bool readCryptoKey(blink::WebCryptoKey& key) |
+ { |
uint32_t rawKeyType; |
if (!doReadUint32(&rawKeyType)) |
return false; |
@@ -2274,13 +2309,25 @@ private: |
const uint8_t* keyData = m_buffer + m_position; |
m_position += keyDataLength; |
- blink::WebCryptoKey key = blink::WebCryptoKey::createNull(); |
if (!blink::Platform::current()->crypto()->deserializeKeyForClone( |
algorithm, type, extractable, usages, keyData, keyDataLength, key)) { |
return false; |
} |
- *value = toV8(Key::create(key), v8::Handle<v8::Object>(), m_isolate); |
+ return true; |
+ } |
+ |
+ bool readCryptoKeyPair(v8::Handle<v8::Value>* value) |
+ { |
+ blink::WebCryptoKey publicKey = blink::WebCryptoKey::createNull(); |
+ blink::WebCryptoKey privateKey = blink::WebCryptoKey::createNull(); |
+ |
+ if (!readCryptoKey(publicKey) || publicKey.type() != blink::WebCryptoKeyTypePublic) |
+ return false; |
+ if (!readCryptoKey(privateKey) || privateKey.type() != blink::WebCryptoKeyTypePrivate) |
+ return false; |
+ |
+ *value = toV8(KeyPair::create(publicKey, privateKey), v8::Handle<v8::Object>(), m_isolate); |
return true; |
} |