Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: Source/bindings/v8/SerializedScriptValue.cpp

Issue 195543002: [webcrypto] Implement structured clone of keys (blink-side). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix another comment Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 11 matching lines...) Expand all
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "config.h" 31 #include "config.h"
32 #include "bindings/v8/SerializedScriptValue.h" 32 #include "bindings/v8/SerializedScriptValue.h"
jsbell 2014/03/13 20:16:07 You'll want to bump the wire format version in Ser
eroman 2014/03/14 05:24:33 Done. However I believe reading this with v4 woul
jsbell 2014/03/14 16:33:46 Safe for the browser, but a web app that wrote dat
33 33
34 #include "V8Blob.h" 34 #include "V8Blob.h"
35 #include "V8DOMFileSystem.h" 35 #include "V8DOMFileSystem.h"
36 #include "V8File.h" 36 #include "V8File.h"
37 #include "V8FileList.h" 37 #include "V8FileList.h"
38 #include "V8ImageData.h" 38 #include "V8ImageData.h"
39 #include "V8Key.h"
39 #include "V8MessagePort.h" 40 #include "V8MessagePort.h"
40 #include "bindings/v8/ExceptionState.h" 41 #include "bindings/v8/ExceptionState.h"
41 #include "bindings/v8/ScriptScope.h" 42 #include "bindings/v8/ScriptScope.h"
42 #include "bindings/v8/ScriptState.h" 43 #include "bindings/v8/ScriptState.h"
43 #include "bindings/v8/V8Binding.h" 44 #include "bindings/v8/V8Binding.h"
44 #include "bindings/v8/WorkerScriptController.h" 45 #include "bindings/v8/WorkerScriptController.h"
45 #include "bindings/v8/custom/V8ArrayBufferCustom.h" 46 #include "bindings/v8/custom/V8ArrayBufferCustom.h"
46 #include "bindings/v8/custom/V8ArrayBufferViewCustom.h" 47 #include "bindings/v8/custom/V8ArrayBufferViewCustom.h"
47 #include "bindings/v8/custom/V8DataViewCustom.h" 48 #include "bindings/v8/custom/V8DataViewCustom.h"
48 #include "bindings/v8/custom/V8Float32ArrayCustom.h" 49 #include "bindings/v8/custom/V8Float32ArrayCustom.h"
49 #include "bindings/v8/custom/V8Float64ArrayCustom.h" 50 #include "bindings/v8/custom/V8Float64ArrayCustom.h"
50 #include "bindings/v8/custom/V8Int16ArrayCustom.h" 51 #include "bindings/v8/custom/V8Int16ArrayCustom.h"
51 #include "bindings/v8/custom/V8Int32ArrayCustom.h" 52 #include "bindings/v8/custom/V8Int32ArrayCustom.h"
52 #include "bindings/v8/custom/V8Int8ArrayCustom.h" 53 #include "bindings/v8/custom/V8Int8ArrayCustom.h"
53 #include "bindings/v8/custom/V8Uint16ArrayCustom.h" 54 #include "bindings/v8/custom/V8Uint16ArrayCustom.h"
54 #include "bindings/v8/custom/V8Uint32ArrayCustom.h" 55 #include "bindings/v8/custom/V8Uint32ArrayCustom.h"
55 #include "bindings/v8/custom/V8Uint8ArrayCustom.h" 56 #include "bindings/v8/custom/V8Uint8ArrayCustom.h"
56 #include "bindings/v8/custom/V8Uint8ClampedArrayCustom.h" 57 #include "bindings/v8/custom/V8Uint8ClampedArrayCustom.h"
57 #include "core/dom/ExceptionCode.h" 58 #include "core/dom/ExceptionCode.h"
58 #include "core/dom/MessagePort.h" 59 #include "core/dom/MessagePort.h"
59 #include "core/fileapi/Blob.h" 60 #include "core/fileapi/Blob.h"
60 #include "core/fileapi/File.h" 61 #include "core/fileapi/File.h"
61 #include "core/fileapi/FileList.h" 62 #include "core/fileapi/FileList.h"
62 #include "core/html/ImageData.h" 63 #include "core/html/ImageData.h"
63 #include "core/html/canvas/DataView.h" 64 #include "core/html/canvas/DataView.h"
64 #include "heap/Handle.h" 65 #include "heap/Handle.h"
65 #include "platform/SharedBuffer.h" 66 #include "platform/SharedBuffer.h"
67 #include "public/platform/Platform.h"
68 #include "public/platform/WebCrypto.h"
69 #include "public/platform/WebCryptoKey.h"
70 #include "public/platform/WebCryptoKeyAlgorithm.h"
66 #include "wtf/ArrayBuffer.h" 71 #include "wtf/ArrayBuffer.h"
67 #include "wtf/ArrayBufferContents.h" 72 #include "wtf/ArrayBufferContents.h"
68 #include "wtf/ArrayBufferView.h" 73 #include "wtf/ArrayBufferView.h"
69 #include "wtf/Assertions.h" 74 #include "wtf/Assertions.h"
70 #include "wtf/ByteOrder.h" 75 #include "wtf/ByteOrder.h"
71 #include "wtf/Float32Array.h" 76 #include "wtf/Float32Array.h"
72 #include "wtf/Float64Array.h" 77 #include "wtf/Float64Array.h"
73 #include "wtf/Int16Array.h" 78 #include "wtf/Int16Array.h"
74 #include "wtf/Int32Array.h" 79 #include "wtf/Int32Array.h"
75 #include "wtf/Int8Array.h" 80 #include "wtf/Int8Array.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 ObjectTag = '{', // numProperties:uint32_t -> pops the last object from the open stack; 207 ObjectTag = '{', // numProperties:uint32_t -> pops the last object from the open stack;
203 // fills it with the last numProp erties name,value pairs pushed onto the deserialization stack 208 // fills it with the last numProp erties name,value pairs pushed onto the deserialization stack
204 SparseArrayTag = '@', // numProperties:uint32_t, length:uint32_t -> pops the last object from the open stack; 209 SparseArrayTag = '@', // numProperties:uint32_t, length:uint32_t -> pops the last object from the open stack;
205 // fills it with the last numProperties name,value pairs pushed onto the deserialization st ack 210 // fills it with the last numProperties name,value pairs pushed onto the deserialization st ack
206 DenseArrayTag = '$', // numProperties:uint32_t, length:uint32_t -> pops the last object from the open stack; 211 DenseArrayTag = '$', // numProperties:uint32_t, length:uint32_t -> pops the last object from the open stack;
207 // fills it with the last length elements and numProperties name,value pairs pushed onto des erialization stack 212 // fills it with the last length elements and numProperties name,value pairs pushed onto des erialization stack
208 RegExpTag = 'R', // pattern:RawString, flags:uint32_t -> RegExp (ref) 213 RegExpTag = 'R', // pattern:RawString, flags:uint32_t -> RegExp (ref)
209 ArrayBufferTag = 'B', // byteLength:uint32_t, data:byte[byteLength] -> Array Buffer (ref) 214 ArrayBufferTag = 'B', // byteLength:uint32_t, data:byte[byteLength] -> Array Buffer (ref)
210 ArrayBufferTransferTag = 't', // index:uint32_t -> ArrayBuffer. For ArrayBuf fer transfer 215 ArrayBufferTransferTag = 't', // index:uint32_t -> ArrayBuffer. For ArrayBuf fer transfer
211 ArrayBufferViewTag = 'V', // subtag:byte, byteOffset:uint32_t, byteLength:ui nt32_t -> ArrayBufferView (ref). Consumes an ArrayBuffer from the top of the des erialization stack. 216 ArrayBufferViewTag = 'V', // subtag:byte, byteOffset:uint32_t, byteLength:ui nt32_t -> ArrayBufferView (ref). Consumes an ArrayBuffer from the top of the des erialization stack.
217 CryptoKeyTag = 'K', // subtag:byte, props, usages:uint32_t, keyDataLength:ui nt32_t, keyData:byte[keyDataLength]
218 // If subtag=AesKeyTag:
219 // props = keyLengthBytes:uint32_t, algorithmId:ui nt32_t
220 // If subtag=HmacKeyTag:
221 // props = hashId:uint32_t
222 // If subtag=RsaKeyTag:
223 // props = algorithmId:uint32_t, type:uint32_t, mo dulusLengthBits:uint32_t, publicExponentLength:uint32_t, publicExponent:byte[pub licExponentLength]
224 // If subtag=RsaHashedKeyTag:
225 // props = <same as for RsaKeyTag>, hashId:uint32_ t
212 ObjectReferenceTag = '^', // ref:uint32_t -> reference table[ref] 226 ObjectReferenceTag = '^', // ref:uint32_t -> reference table[ref]
213 GenerateFreshObjectTag = 'o', // -> empty object allocated an object ID and pushed onto the open stack (ref) 227 GenerateFreshObjectTag = 'o', // -> empty object allocated an object ID and pushed onto the open stack (ref)
214 GenerateFreshSparseArrayTag = 'a', // length:uint32_t -> empty array[length] allocated an object ID and pushed onto the open stack (ref) 228 GenerateFreshSparseArrayTag = 'a', // length:uint32_t -> empty array[length] allocated an object ID and pushed onto the open stack (ref)
215 GenerateFreshDenseArrayTag = 'A', // length:uint32_t -> empty array[length] allocated an object ID and pushed onto the open stack (ref) 229 GenerateFreshDenseArrayTag = 'A', // length:uint32_t -> empty array[length] allocated an object ID and pushed onto the open stack (ref)
216 ReferenceCountTag = '?', // refTableSize:uint32_t -> If the reference table is not refTableSize big, fails. 230 ReferenceCountTag = '?', // refTableSize:uint32_t -> If the reference table is not refTableSize big, fails.
217 StringObjectTag = 's', // string:RawString -> new String(string) (ref) 231 StringObjectTag = 's', // string:RawString -> new String(string) (ref)
218 NumberObjectTag = 'n', // value:double -> new Number(value) (ref) 232 NumberObjectTag = 'n', // value:double -> new Number(value) (ref)
219 TrueObjectTag = 'y', // new Boolean(true) (ref) 233 TrueObjectTag = 'y', // new Boolean(true) (ref)
220 FalseObjectTag = 'x', // new Boolean(false) (ref) 234 FalseObjectTag = 'x', // new Boolean(false) (ref)
221 VersionTag = 0xFF // version:uint32_t -> Uses this as the file version. 235 VersionTag = 0xFF // version:uint32_t -> Uses this as the file version.
222 }; 236 };
223 237
224 enum ArrayBufferViewSubTag { 238 enum ArrayBufferViewSubTag {
225 ByteArrayTag = 'b', 239 ByteArrayTag = 'b',
226 UnsignedByteArrayTag = 'B', 240 UnsignedByteArrayTag = 'B',
227 UnsignedByteClampedArrayTag = 'C', 241 UnsignedByteClampedArrayTag = 'C',
228 ShortArrayTag = 'w', 242 ShortArrayTag = 'w',
229 UnsignedShortArrayTag = 'W', 243 UnsignedShortArrayTag = 'W',
230 IntArrayTag = 'd', 244 IntArrayTag = 'd',
231 UnsignedIntArrayTag = 'D', 245 UnsignedIntArrayTag = 'D',
232 FloatArrayTag = 'f', 246 FloatArrayTag = 'f',
233 DoubleArrayTag = 'F', 247 DoubleArrayTag = 'F',
234 DataViewTag = '?' 248 DataViewTag = '?'
235 }; 249 };
236 250
251 enum CryptoKeySubTag {
252 AesKeyTag = 1,
253 HmacKeyTag = 2,
254 RsaKeyTag = 3,
255 RsaHashedKeyTag = 4,
256 // Maximum allowed value is 255
jsbell 2014/03/13 20:16:07 (C++11 enum classes, some day!)
257 };
258
259 enum AssymetricCryptoKeyType {
260 PublicKeyType = 1,
261 PrivateKeyType = 2,
262 // Maximum allowed value is 2^32-1
263 };
264
265 enum CryptoKeyAlgorithmTag {
266 AesCbcTag = 1,
267 HmacTag = 2,
268 RsaSsaPkcs1v1_5Tag = 3,
269 RsaEsPkcs1v1_5Tag = 4,
270 Sha1Tag = 5,
271 Sha224Tag = 6,
272 Sha256Tag = 7,
273 Sha384Tag = 8,
274 Sha512Tag = 9,
275 AesGcmTag = 10,
276 RsaOaepTag = 11,
277 AesCtrTag = 12,
278 AesKwTag = 13,
279 // Maximum allowed value is 2^32-1
280 };
281
282 enum CryptoKeyUsage {
283 // Extractability is not a "usage" in the WebCryptoKeyUsages sense, however
284 // it fits conveniently into this bitfield.
285 ExtractableUsage = 1 << 0,
286
287 EncryptUsage = 1 << 1,
288 DecryptUsage = 1 << 2,
289 SignUsage = 1 << 3,
290 VerifyUsage = 1 << 4,
291 DeriveKeyUsage = 1 << 5,
292 WrapKeyUsage = 1 << 6,
293 UnwrapKeyUsage = 1 << 7,
294 // Maximum allowed value is 1 << 31
295 };
296
237 static bool shouldCheckForCycles(int depth) 297 static bool shouldCheckForCycles(int depth)
238 { 298 {
239 ASSERT(depth >= 0); 299 ASSERT(depth >= 0);
240 // Since we are not required to spot the cycle as soon as it 300 // Since we are not required to spot the cycle as soon as it
241 // happens we can check for cycles only when the current depth 301 // happens we can check for cycles only when the current depth
242 // is a power of two. 302 // is a power of two.
243 return !(depth & (depth - 1)); 303 return !(depth & (depth - 1));
244 } 304 }
245 305
246 static const int maxDepth = 20000; 306 static const int maxDepth = 20000;
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 475
416 void writeFileList(const FileList& fileList) 476 void writeFileList(const FileList& fileList)
417 { 477 {
418 append(FileListTag); 478 append(FileListTag);
419 uint32_t length = fileList.length(); 479 uint32_t length = fileList.length();
420 doWriteUint32(length); 480 doWriteUint32(length);
421 for (unsigned i = 0; i < length; ++i) 481 for (unsigned i = 0; i < length; ++i)
422 doWriteFile(*fileList.item(i)); 482 doWriteFile(*fileList.item(i));
423 } 483 }
424 484
485 bool writeCryptoKey(const blink::WebCryptoKey& key, String& errorMessage)
486 {
487 append(static_cast<uint8_t>(CryptoKeyTag));
jsbell 2014/03/13 20:16:07 None of the other append(XXXXTag) calls bother wit
eroman 2014/03/14 05:24:33 I copied this from surrounding code where I see lo
488
489 switch (key.algorithm().paramsType()) {
490 case blink::WebCryptoKeyAlgorithmParamsTypeAes:
491 doWriteAesKey(key);
492 break;
493 case blink::WebCryptoKeyAlgorithmParamsTypeHmac:
494 doWriteHmacKey(key);
495 break;
496 case blink::WebCryptoKeyAlgorithmParamsTypeRsa:
497 case blink::WebCryptoKeyAlgorithmParamsTypeRsaHashed:
498 doWriteRsaKey(key);
499 break;
500 case blink::WebCryptoKeyAlgorithmParamsTypeNone:
501 ASSERT_NOT_REACHED();
502 return false;
503 }
504
505 doWriteKeyUsages(key.usages(), key.extractable());
506
507 blink::WebVector<uint8_t> keyData;
508 if (!blink::Platform::current()->crypto()->serializeKeyForClone(key, key Data)) {
509 errorMessage = "Couldn't export the key data";
510 return false;
511 }
512
513 doWriteUint32(keyData.size());
514 append(keyData.data(), keyData.size());
515 return true;
516 }
517
425 void writeArrayBuffer(const ArrayBuffer& arrayBuffer) 518 void writeArrayBuffer(const ArrayBuffer& arrayBuffer)
426 { 519 {
427 append(ArrayBufferTag); 520 append(ArrayBufferTag);
428 doWriteArrayBuffer(arrayBuffer); 521 doWriteArrayBuffer(arrayBuffer);
429 } 522 }
430 523
431 void writeArrayBufferView(const ArrayBufferView& arrayBufferView) 524 void writeArrayBufferView(const ArrayBufferView& arrayBufferView)
432 { 525 {
433 append(ArrayBufferViewTag); 526 append(ArrayBufferViewTag);
434 #ifndef NDEBUG 527 #ifndef NDEBUG
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 doWriteUint32(static_cast<uint32_t>(length)); 679 doWriteUint32(static_cast<uint32_t>(length));
587 append(reinterpret_cast<const uint8_t*>(data), length); 680 append(reinterpret_cast<const uint8_t*>(data), length);
588 } 681 }
589 682
590 void doWriteWebCoreString(const String& string) 683 void doWriteWebCoreString(const String& string)
591 { 684 {
592 StringUTF8Adaptor stringUTF8(string); 685 StringUTF8Adaptor stringUTF8(string);
593 doWriteString(stringUTF8.data(), stringUTF8.length()); 686 doWriteString(stringUTF8.data(), stringUTF8.length());
594 } 687 }
595 688
689 void doWriteHmacKey(const blink::WebCryptoKey& key)
690 {
691 ASSERT(key.algorithm().paramsType() == blink::WebCryptoKeyAlgorithmParam sTypeHmac);
692
693 append(static_cast<uint8_t>(HmacKeyTag));
694 doWriteAlgorithmId(key.algorithm().hmacParams()->hash().id());
695 }
696
697 void doWriteAesKey(const blink::WebCryptoKey& key)
698 {
699 ASSERT(key.algorithm().paramsType() == blink::WebCryptoKeyAlgorithmParam sTypeAes);
700
701 append(static_cast<uint8_t>(AesKeyTag));
702 doWriteAlgorithmId(key.algorithm().id());
703 // Converting the key length from bits to bytes is lossless and makes
jsbell 2014/03/13 20:16:07 ASSERT((key.algorithm().aesParams()->lengthBits()
eroman 2014/03/14 05:24:33 Done.
704 // it fit in 1 byte.
705 doWriteUint32(static_cast<uint8_t>(key.algorithm().aesParams()->lengthBi ts() / 8));
706 }
707
708 void doWriteRsaKey(const blink::WebCryptoKey& key)
709 {
710 if (key.algorithm().rsaHashedParams())
711 append(static_cast<uint8_t>(RsaHashedKeyTag));
712 else
713 append(static_cast<uint8_t>(RsaKeyTag));
714
715 doWriteAlgorithmId(key.algorithm().id());
716
717 switch (key.type()) {
718 case blink::WebCryptoKeyTypePublic:
719 doWriteUint32(PublicKeyType);
720 break;
721 case blink::WebCryptoKeyTypePrivate:
722 doWriteUint32(PrivateKeyType);
723 break;
724 case blink::WebCryptoKeyTypeSecret:
725 ASSERT_NOT_REACHED();
726 }
727
728 const blink::WebCryptoRsaKeyAlgorithmParams* params = key.algorithm().rs aParams();
729 doWriteUint32(params->modulusLengthBits());
730 doWriteUint32(params->publicExponent().size());
731 append(params->publicExponent().data(), params->publicExponent().size()) ;
732
733 if (key.algorithm().rsaHashedParams())
734 doWriteAlgorithmId(key.algorithm().rsaHashedParams()->hash().id());
735 }
736
737 void doWriteAlgorithmId(blink::WebCryptoAlgorithmId id)
738 {
739 switch (id) {
740 case blink::WebCryptoAlgorithmIdAesCbc:
741 return doWriteUint32(AesCbcTag);
742 case blink::WebCryptoAlgorithmIdHmac:
743 return doWriteUint32(HmacTag);
744 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5:
745 return doWriteUint32(RsaSsaPkcs1v1_5Tag);
746 case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5:
747 return doWriteUint32(RsaEsPkcs1v1_5Tag);
748 case blink::WebCryptoAlgorithmIdSha1:
749 return doWriteUint32(Sha1Tag);
750 case blink::WebCryptoAlgorithmIdSha224:
751 return doWriteUint32(Sha224Tag);
752 case blink::WebCryptoAlgorithmIdSha256:
753 return doWriteUint32(Sha256Tag);
754 case blink::WebCryptoAlgorithmIdSha384:
755 return doWriteUint32(Sha384Tag);
756 case blink::WebCryptoAlgorithmIdSha512:
757 return doWriteUint32(Sha512Tag);
758 case blink::WebCryptoAlgorithmIdAesGcm:
759 return doWriteUint32(AesGcmTag);
760 case blink::WebCryptoAlgorithmIdRsaOaep:
761 return doWriteUint32(RsaOaepTag);
762 case blink::WebCryptoAlgorithmIdAesCtr:
763 return doWriteUint32(AesCtrTag);
764 case blink::WebCryptoAlgorithmIdAesKw:
765 return doWriteUint32(AesKwTag);
766 }
767 ASSERT_NOT_REACHED();
768 }
769
770 void doWriteKeyUsages(const blink::WebCryptoKeyUsageMask usages, bool extrac table)
771 {
772 // Reminder to update this when adding new key usages.
773 COMPILE_ASSERT(blink::EndOfWebCryptoKeyUsage == (1 << 7) + 1, UpdateMe);
774
775 uint32_t value = 0;
776
777 if (extractable)
778 value |= ExtractableUsage;
779
780 if (usages & blink::WebCryptoKeyUsageEncrypt)
781 value |= EncryptUsage;
782 if (usages & blink::WebCryptoKeyUsageDecrypt)
783 value |= DecryptUsage;
784 if (usages & blink::WebCryptoKeyUsageSign)
785 value |= SignUsage;
786 if (usages & blink::WebCryptoKeyUsageVerify)
787 value |= VerifyUsage;
788 if (usages & blink::WebCryptoKeyUsageDeriveKey)
789 value |= DeriveKeyUsage;
790 if (usages & blink::WebCryptoKeyUsageWrapKey)
791 value |= WrapKeyUsage;
792 if (usages & blink::WebCryptoKeyUsageUnwrapKey)
793 value |= UnwrapKeyUsage;
794
795 doWriteUint32(value);
796 }
797
596 int bytesNeededToWireEncode(uint32_t value) 798 int bytesNeededToWireEncode(uint32_t value)
597 { 799 {
598 int bytes = 1; 800 int bytes = 1;
599 while (true) { 801 while (true) {
600 value >>= varIntShift; 802 value >>= varIntShift;
601 if (!value) 803 if (!value)
602 break; 804 break;
603 ++bytes; 805 ++bytes;
604 } 806 }
605 807
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 { 1293 {
1092 FileList* fileList = V8FileList::toNative(value.As<v8::Object>()); 1294 FileList* fileList = V8FileList::toNative(value.As<v8::Object>());
1093 if (!fileList) 1295 if (!fileList)
1094 return; 1296 return;
1095 m_writer.writeFileList(*fileList); 1297 m_writer.writeFileList(*fileList);
1096 unsigned length = fileList->length(); 1298 unsigned length = fileList->length();
1097 for (unsigned i = 0; i < length; ++i) 1299 for (unsigned i = 0; i < length; ++i)
1098 m_blobDataHandles.add(fileList->item(i)->uuid(), fileList->item(i)-> blobDataHandle()); 1300 m_blobDataHandles.add(fileList->item(i)->uuid(), fileList->item(i)-> blobDataHandle());
1099 } 1301 }
1100 1302
1303 StateBase* writeCryptoKey(v8::Handle<v8::Value> value, StateBase* next)
1304 {
1305 Key* key = V8Key::toNative(value.As<v8::Object>());
1306 if (!key)
1307 return 0;
1308
1309 String errorMessage;
1310 if (!m_writer.writeCryptoKey(key->key(), errorMessage))
1311 return handleError(DataCloneError, errorMessage, next);
1312 return 0;
1313 }
1314
1101 void writeImageData(v8::Handle<v8::Value> value) 1315 void writeImageData(v8::Handle<v8::Value> value)
1102 { 1316 {
1103 ImageData* imageData = V8ImageData::toNative(value.As<v8::Object>()); 1317 ImageData* imageData = V8ImageData::toNative(value.As<v8::Object>());
1104 if (!imageData) 1318 if (!imageData)
1105 return; 1319 return;
1106 Uint8ClampedArray* pixelArray = imageData->data(); 1320 Uint8ClampedArray* pixelArray = imageData->data();
1107 m_writer.writeImageData(imageData->width(), imageData->height(), pixelAr ray->data(), pixelArray->length()); 1321 m_writer.writeImageData(imageData->width(), imageData->height(), pixelAr ray->data(), pixelArray->length());
1108 } 1322 }
1109 1323
1110 void writeRegExp(v8::Handle<v8::Value> value) 1324 void writeRegExp(v8::Handle<v8::Value> value)
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 else if (value->IsArray()) { 1500 else if (value->IsArray()) {
1287 return startArrayState(value.As<v8::Array>(), next); 1501 return startArrayState(value.As<v8::Array>(), next);
1288 } else if (V8File::hasInstance(value, m_isolate)) 1502 } else if (V8File::hasInstance(value, m_isolate))
1289 return writeFile(value, next); 1503 return writeFile(value, next);
1290 else if (V8Blob::hasInstance(value, m_isolate)) 1504 else if (V8Blob::hasInstance(value, m_isolate))
1291 return writeBlob(value, next); 1505 return writeBlob(value, next);
1292 else if (V8DOMFileSystem::hasInstance(value, m_isolate)) 1506 else if (V8DOMFileSystem::hasInstance(value, m_isolate))
1293 return writeDOMFileSystem(value, next); 1507 return writeDOMFileSystem(value, next);
1294 else if (V8FileList::hasInstance(value, m_isolate)) 1508 else if (V8FileList::hasInstance(value, m_isolate))
1295 writeFileList(value); 1509 writeFileList(value);
1510 else if (V8Key::hasInstance(value, m_isolate))
1511 return writeCryptoKey(value, next);
jsbell 2014/03/13 20:16:07 The only reason StateBase is passed to/returned fr
eroman 2014/03/14 05:24:33 Done.
1296 else if (V8ImageData::hasInstance(value, m_isolate)) 1512 else if (V8ImageData::hasInstance(value, m_isolate))
1297 writeImageData(value); 1513 writeImageData(value);
1298 else if (value->IsRegExp()) 1514 else if (value->IsRegExp())
1299 writeRegExp(value); 1515 writeRegExp(value);
1300 else if (V8ArrayBuffer::hasInstance(value, m_isolate)) 1516 else if (V8ArrayBuffer::hasInstance(value, m_isolate))
1301 return writeArrayBuffer(value, next); 1517 return writeArrayBuffer(value, next);
1302 else if (value->IsObject()) { 1518 else if (value->IsObject()) {
1303 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError()) 1519 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat iveError())
1304 return handleError(DataCloneError, "An object could not be clone d.", next); 1520 return handleError(DataCloneError, "An object could not be clone d.", next);
1305 return startObjectState(jsObject, next); 1521 return startObjectState(jsObject, next);
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 case DOMFileSystemTag: 1655 case DOMFileSystemTag:
1440 if (!readDOMFileSystem(value)) 1656 if (!readDOMFileSystem(value))
1441 return false; 1657 return false;
1442 creator.pushObjectReference(*value); 1658 creator.pushObjectReference(*value);
1443 break; 1659 break;
1444 case FileListTag: 1660 case FileListTag:
1445 if (!readFileList(value)) 1661 if (!readFileList(value))
1446 return false; 1662 return false;
1447 creator.pushObjectReference(*value); 1663 creator.pushObjectReference(*value);
1448 break; 1664 break;
1665 case CryptoKeyTag:
1666 if (!readCryptoKey(value))
1667 return false;
1668 creator.pushObjectReference(*value);
1669 break;
1449 case ImageDataTag: 1670 case ImageDataTag:
1450 if (!readImageData(value)) 1671 if (!readImageData(value))
1451 return false; 1672 return false;
1452 creator.pushObjectReference(*value); 1673 creator.pushObjectReference(*value);
1453 break; 1674 break;
1454 1675
1455 case RegExpTag: 1676 case RegExpTag:
1456 if (!readRegExp(value)) 1677 if (!readRegExp(value))
1457 return false; 1678 return false;
1458 creator.pushObjectReference(*value); 1679 creator.pushObjectReference(*value);
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 for (unsigned i = 0; i < length; ++i) { 2123 for (unsigned i = 0; i < length; ++i) {
1903 RefPtrWillBeRawPtr<File> file = doReadFileHelper(); 2124 RefPtrWillBeRawPtr<File> file = doReadFileHelper();
1904 if (!file) 2125 if (!file)
1905 return false; 2126 return false;
1906 fileList->append(file.release()); 2127 fileList->append(file.release());
1907 } 2128 }
1908 *value = toV8(fileList.release(), v8::Handle<v8::Object>(), m_isolate); 2129 *value = toV8(fileList.release(), v8::Handle<v8::Object>(), m_isolate);
1909 return true; 2130 return true;
1910 } 2131 }
1911 2132
2133 bool readCryptoKey(v8::Handle<v8::Value>* value)
2134 {
2135 uint32_t rawKeyType;
2136 if (!doReadUint32(&rawKeyType))
2137 return false;
2138
2139 blink::WebCryptoKeyAlgorithm algorithm;
2140 blink::WebCryptoKeyType type;
2141
2142 switch (static_cast<CryptoKeySubTag>(rawKeyType)) {
2143 case AesKeyTag:
2144 if (!doReadAesKey(algorithm, type))
2145 return false;
2146 break;
2147 case HmacKeyTag:
2148 if (!doReadHmacKey(algorithm, type))
2149 return false;
2150 break;
2151 case RsaKeyTag:
2152 if (!doReadRsaKey(false, algorithm, type))
2153 return false;
2154 break;
2155 case RsaHashedKeyTag:
2156 if (!doReadRsaKey(true, algorithm, type))
2157 return false;
2158 break;
2159 default:
2160 return false;
2161 }
2162
2163 blink::WebCryptoKeyUsageMask usages;
2164 bool extractable;
2165 if (!doReadKeyUsages(usages, extractable))
2166 return false;
2167
2168 uint32_t keyDataLength;
2169 if (!doReadUint32(&keyDataLength))
2170 return false;
2171
2172 if (m_position + keyDataLength > m_length)
2173 return false;
2174
2175 const uint8_t* keyData = m_buffer + m_position;
2176 m_position += keyDataLength;
2177
2178 blink::WebCryptoKey key = blink::WebCryptoKey::createNull();
2179 if (!blink::Platform::current()->crypto()->deserializeKeyForClone(
2180 algorithm, type, extractable, usages, keyData, keyDataLength, key)) {
2181 return false;
2182 }
2183
2184 RefPtrWillBeRawPtr<Key> k = Key::create(key);
2185 *value = toV8(k.release(), v8::Handle<v8::Object>(), m_isolate);
2186 return true;
2187 }
2188
1912 PassRefPtrWillBeRawPtr<File> doReadFileHelper() 2189 PassRefPtrWillBeRawPtr<File> doReadFileHelper()
1913 { 2190 {
1914 if (m_version < 3) 2191 if (m_version < 3)
1915 return nullptr; 2192 return nullptr;
1916 String path; 2193 String path;
1917 String name; 2194 String name;
1918 String relativePath; 2195 String relativePath;
1919 String uuid; 2196 String uuid;
1920 String type; 2197 String type;
1921 uint32_t hasSnapshot = 0; 2198 uint32_t hasSnapshot = 0;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 // the blob in the src process happens to still exist at the time the de st process is deserializing. 2268 // the blob in the src process happens to still exist at the time the de st process is deserializing.
1992 // For example in sharedWorker.postMesssage(...). 2269 // For example in sharedWorker.postMesssage(...).
1993 BlobDataHandleMap::const_iterator it = m_blobDataHandles.find(uuid); 2270 BlobDataHandleMap::const_iterator it = m_blobDataHandles.find(uuid);
1994 if (it != m_blobDataHandles.end()) { 2271 if (it != m_blobDataHandles.end()) {
1995 // make assertions about type and size? 2272 // make assertions about type and size?
1996 return it->value; 2273 return it->value;
1997 } 2274 }
1998 return BlobDataHandle::create(uuid, type, size); 2275 return BlobDataHandle::create(uuid, type, size);
1999 } 2276 }
2000 2277
2278 bool doReadHmacKey(blink::WebCryptoKeyAlgorithm& algorithm, blink::WebCrypto KeyType& type)
2279 {
2280 blink::WebCryptoAlgorithmId hash;
2281 if (!doReadAlgorithmId(hash))
2282 return false;
2283 algorithm = blink::WebCryptoKeyAlgorithm::createHmac(hash);
2284 type = blink::WebCryptoKeyTypeSecret;
2285 return !algorithm.isNull();
2286 }
2287
2288 bool doReadAesKey(blink::WebCryptoKeyAlgorithm& algorithm, blink::WebCryptoK eyType& type)
2289 {
2290 blink::WebCryptoAlgorithmId id;
2291 if (!doReadAlgorithmId(id))
2292 return false;
2293 uint32_t lengthBytes;
2294 if (!doReadUint32(&lengthBytes))
2295 return false;
2296 algorithm = blink::WebCryptoKeyAlgorithm::createAes(id, lengthBytes * 8) ;
2297 type = blink::WebCryptoKeyTypeSecret;
2298 return !algorithm.isNull();
2299 }
2300
2301 bool doReadRsaKey(bool hasHash, blink::WebCryptoKeyAlgorithm& algorithm, bli nk::WebCryptoKeyType& type)
2302 {
2303 blink::WebCryptoAlgorithmId id;
2304 if (!doReadAlgorithmId(id))
2305 return false;
2306
2307 uint32_t rawType;
2308 if (!doReadUint32(&rawType))
2309 return false;
2310
2311 switch (static_cast<AssymetricCryptoKeyType>(rawType)) {
2312 case PublicKeyType:
2313 type = blink::WebCryptoKeyTypePublic;
2314 break;
2315 case PrivateKeyType:
2316 type = blink::WebCryptoKeyTypePrivate;
2317 break;
2318 default:
2319 return false;
2320 }
2321
2322 uint32_t modulusLengthBits;
2323 if (!doReadUint32(&modulusLengthBits))
2324 return false;
2325
2326 uint32_t publicExponentSize;
2327 if (!doReadUint32(&publicExponentSize))
2328 return false;
2329
2330 if (m_position + publicExponentSize > m_length)
2331 return false;
2332
2333 const uint8_t* publicExponent = m_buffer + m_position;
2334 m_position += publicExponentSize;
2335
2336 if (hasHash) {
2337 blink::WebCryptoAlgorithmId hash;
2338 if (!doReadAlgorithmId(hash))
2339 return false;
2340 algorithm = blink::WebCryptoKeyAlgorithm::createRsaHashed(id, modulu sLengthBits, publicExponent, publicExponentSize, hash);
2341 } else {
2342 algorithm = blink::WebCryptoKeyAlgorithm::createRsa(id, modulusLengt hBits, publicExponent, publicExponentSize);
2343 }
2344
2345 return !algorithm.isNull();
2346 }
2347
2348 bool doReadAlgorithmId(blink::WebCryptoAlgorithmId& id)
2349 {
2350 uint32_t rawId;
2351 if (!doReadUint32(&rawId))
2352 return false;
2353
2354 switch (static_cast<CryptoKeyAlgorithmTag>(rawId)) {
2355 case AesCbcTag:
2356 id = blink::WebCryptoAlgorithmIdAesCbc;
2357 return true;
2358 case HmacTag:
2359 id = blink::WebCryptoAlgorithmIdHmac;
2360 return true;
2361 case RsaSsaPkcs1v1_5Tag:
2362 id = blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5;
2363 return true;
2364 case RsaEsPkcs1v1_5Tag:
2365 id = blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5;
2366 return true;
2367 case Sha1Tag:
2368 id = blink::WebCryptoAlgorithmIdSha1;
2369 return true;
2370 case Sha224Tag:
2371 id = blink::WebCryptoAlgorithmIdSha224;
2372 return true;
2373 case Sha256Tag:
2374 id = blink::WebCryptoAlgorithmIdSha256;
2375 return true;
2376 case Sha384Tag:
2377 id = blink::WebCryptoAlgorithmIdSha384;
2378 return true;
2379 case Sha512Tag:
2380 id = blink::WebCryptoAlgorithmIdSha512;
2381 return true;
2382 case AesGcmTag:
2383 id = blink::WebCryptoAlgorithmIdAesGcm;
2384 return true;
2385 case RsaOaepTag:
2386 id = blink::WebCryptoAlgorithmIdRsaOaep;
2387 return true;
2388 case AesCtrTag:
2389 id = blink::WebCryptoAlgorithmIdAesCtr;
2390 return true;
2391 case AesKwTag:
2392 id = blink::WebCryptoAlgorithmIdAesKw;
2393 return true;
2394 }
2395
2396 return false;
2397 }
2398
2399 bool doReadKeyUsages(blink::WebCryptoKeyUsageMask& usages, bool& extractable )
2400 {
2401 // Reminder to update this when adding new key usages.
2402 COMPILE_ASSERT(blink::EndOfWebCryptoKeyUsage == (1 << 7) + 1, UpdateMe);
2403
2404 uint32_t rawUsages;
2405 if (!doReadUint32(&rawUsages))
2406 return false;
2407
2408 usages = 0;
2409
2410 extractable = rawUsages & ExtractableUsage;
2411
2412 if (rawUsages & EncryptUsage)
2413 usages |= blink::WebCryptoKeyUsageEncrypt;
2414 if (rawUsages & DecryptUsage)
2415 usages |= blink::WebCryptoKeyUsageDecrypt;
2416 if (rawUsages & SignUsage)
2417 usages |= blink::WebCryptoKeyUsageSign;
2418 if (rawUsages & VerifyUsage)
2419 usages |= blink::WebCryptoKeyUsageVerify;
2420 if (rawUsages & DeriveKeyUsage)
2421 usages |= blink::WebCryptoKeyUsageDeriveKey;
2422 if (rawUsages & WrapKeyUsage)
2423 usages |= blink::WebCryptoKeyUsageWrapKey;
2424 if (rawUsages & UnwrapKeyUsage)
2425 usages |= blink::WebCryptoKeyUsageUnwrapKey;
2426
2427 // Note that if the serialized data contained an unrecognized usage it
2428 // is silenty discarded here rather than erroring.
jsbell 2014/03/13 20:16:07 Why? If that's the case, there could be subtle dif
eroman 2014/03/14 05:24:33 Done. Sorry, it was laziness on my part. Do you
jsbell 2014/03/14 16:33:46 I don't think we have those elsewhere. File a trac
2429
2430 return true;
2431 }
2432
2001 const uint8_t* m_buffer; 2433 const uint8_t* m_buffer;
2002 const unsigned m_length; 2434 const unsigned m_length;
2003 unsigned m_position; 2435 unsigned m_position;
2004 uint32_t m_version; 2436 uint32_t m_version;
2005 v8::Isolate* m_isolate; 2437 v8::Isolate* m_isolate;
2006 const BlobDataHandleMap& m_blobDataHandles; 2438 const BlobDataHandleMap& m_blobDataHandles;
2007 }; 2439 };
2008 2440
2009 2441
2010 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray; 2442 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray;
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
2510 // If the allocated memory was not registered before, then this class is lik ely 2942 // If the allocated memory was not registered before, then this class is lik ely
2511 // used in a context other then Worker's onmessage environment and the prese nce of 2943 // used in a context other then Worker's onmessage environment and the prese nce of
2512 // current v8 context is not guaranteed. Avoid calling v8 then. 2944 // current v8 context is not guaranteed. Avoid calling v8 then.
2513 if (m_externallyAllocatedMemory) { 2945 if (m_externallyAllocatedMemory) {
2514 ASSERT(v8::Isolate::GetCurrent()); 2946 ASSERT(v8::Isolate::GetCurrent());
2515 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_exte rnallyAllocatedMemory); 2947 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_exte rnallyAllocatedMemory);
2516 } 2948 }
2517 } 2949 }
2518 2950
2519 } // namespace WebCore 2951 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698