OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |