1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "bindings/modules/v8/V8SubtleCrypto.h" 7 8 #include "bindings/modules/v8/V8Key.h" 9 #include "bindings/v8/Dictionary.h" 10 #include "bindings/v8/custom/V8ArrayBufferCustom.h" 11 #include "bindings/v8/custom/V8ArrayBufferViewCustom.h" 12 13 namespace WebCore { 14 15 //////////////////////////////////////////////////////////////////////////////// 16 // Overload resolution for verify() 17 // FIXME: needs support for union types http://crbug.com/240176 18 //////////////////////////////////////////////////////////////////////////////// 19 20 // Promise verify(Dictionary algorithm, Key key, ArrayBuffer signature, ArrayBuffer data); 21 void verify1Method(const v8::FunctionCallbackInfo<v8::Value>& info) 22 { 23 SubtleCrypto* impl = V8SubtleCrypto::toNative(info.Holder()); 24 TONATIVE_VOID(Dictionary, algorithm, Dictionary(info[0], info.GetIsolate())); 25 if (!algorithm.isUndefinedOrNull() && !algorithm.isObject()) { 26 throwTypeError(ExceptionMessages::failedToExecute("verify", "SubtleCrypto", "parameter 1 ('algorithm') is not an object."), info.GetIsolate()); 27 return; 28 } 29 TONATIVE_VOID(Key*, key, V8Key::toNativeWithTypeCheck(info.GetIsolate(), info[1])); 30 TONATIVE_VOID(ArrayBuffer*, signature, info[2]->IsArrayBuffer() ? V8ArrayBuffer::toNative(v8::Handle<v8::ArrayBuffer>::Cast(info[2])) : 0); 31 TONATIVE_VOID(ArrayBuffer*, data, info[3]->IsArrayBuffer() ? V8ArrayBuffer::toNative(v8::Handle<v8::ArrayBuffer>::Cast(info[3])) : 0); 32 v8SetReturnValue(info, impl->verifySignature(ScriptState::current(info.GetIsolate()), algorithm, key, signature, data).v8Value()); 33 } 34 35 // Promise verify(Dictionary algorithm, Key key, ArrayBuffer signature, ArrayBufferView data); 36 void verify2Method(const v8::FunctionCallbackInfo<v8::Value>& info) 37 { 38 SubtleCrypto* impl = V8SubtleCrypto::toNative(info.Holder()); 39 TONATIVE_VOID(Dictionary, algorithm, Dictionary(info[0], info.GetIsolate())); 40 if (!algorithm.isUndefinedOrNull() && !algorithm.isObject()) { 41 throwTypeError(ExceptionMessages::failedToExecute("verify", "SubtleCrypto", "parameter 1 ('algorithm') is not an object."), info.GetIsolate()); 42 return; 43 } 44 TONATIVE_VOID(Key*, key, V8Key::toNativeWithTypeCheck(info.GetIsolate(), info[1])); 45 TONATIVE_VOID(ArrayBuffer*, signature, info[2]->IsArrayBuffer() ? V8ArrayBuffer::toNative(v8::Handle<v8::ArrayBuffer>::Cast(info[2])) : 0); 46 TONATIVE_VOID(ArrayBufferView*, data, info[3]->IsArrayBufferView() ? V8ArrayBufferView::toNative(v8::Handle<v8::ArrayBufferView>::Cast(info[3])) : 0); 47 v8SetReturnValue(info, impl->verifySignature(ScriptState::current(info.GetIsolate()), algorithm, key, signature, data).v8Value()); 48 } 49 50 // Promise verify(Dictionary algorithm, Key key, ArrayBufferView signature, ArrayBuffer data); 51 void verify3Method(const v8::FunctionCallbackInfo<v8::Value>& info) 52 { 53 SubtleCrypto* impl = V8SubtleCrypto::toNative(info.Holder()); 54 TONATIVE_VOID(Dictionary, algorithm, Dictionary(info[0], info.GetIsolate())); 55 if (!algorithm.isUndefinedOrNull() && !algorithm.isObject()) { 56 throwTypeError(ExceptionMessages::failedToExecute("verify", "SubtleCrypto", "parameter 1 ('algorithm') is not an object."), info.GetIsolate()); 57 return; 58 } 59 TONATIVE_VOID(Key*, key, V8Key::toNativeWithTypeCheck(info.GetIsolate(), info[1])); 60 TONATIVE_VOID(ArrayBufferView*, signature, info[2]->IsArrayBufferView() ? V8ArrayBufferView::toNative(v8::Handle<v8::ArrayBufferView>::Cast(info[2])) : 0); 61 TONATIVE_VOID(ArrayBuffer*, data, info[3]->IsArrayBuffer() ? V8ArrayBuffer::toNative(v8::Handle<v8::ArrayBuffer>::Cast(info[3])) : 0); 62 v8SetReturnValue(info, impl->verifySignature(ScriptState::current(info.GetIsolate()), algorithm, key, signature, data).v8Value()); 63 } 64 65 // Promise verify(Dictionary algorithm, Key key, ArrayBufferView signature, ArrayBufferView data); 66 void verify4Method(const v8::FunctionCallbackInfo<v8::Value>& info) 67 { 68 SubtleCrypto* impl = V8SubtleCrypto::toNative(info.Holder()); 69 TONATIVE_VOID(Dictionary, algorithm, Dictionary(info[0], info.GetIsolate())); 70 if (!algorithm.isUndefinedOrNull() && !algorithm.isObject()) { 71 throwTypeError(ExceptionMessages::failedToExecute("verify", "SubtleCrypto", "parameter 1 ('algorithm') is not an object."), info.GetIsolate()); 72 return; 73 } 74 TONATIVE_VOID(Key*, key, V8Key::toNativeWithTypeCheck(info.GetIsolate(), info[1])); 75 TONATIVE_VOID(ArrayBufferView*, signature, info[2]->IsArrayBufferView() ? V8ArrayBufferView::toNative(v8::Handle<v8::ArrayBufferView>::Cast(info[2])) : 0); 76 TONATIVE_VOID(ArrayBufferView*, data, info[3]->IsArrayBufferView() ? V8ArrayBufferView::toNative(v8::Handle<v8::ArrayBufferView>::Cast(info[3])) : 0); 77 v8SetReturnValue(info, impl->verifySignature(ScriptState::current(info.GetIsolate()), algorithm, key, signature, data).v8Value()); 78 } 79 80 void V8SubtleCrypto::verifyMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& info) 81 { 82 v8::Isolate* isolate = info.GetIsolate(); 83 ExceptionState exceptionState(ExceptionState::ExecutionContext, "verify", "SubtleCrypto", info.Holder(), isolate); 84 // typedef (ArrayBuffer or ArrayBufferView) CryptoOperationData; 85 // 86 // Promise verify(Dictionary algorithm, Key key, 87 // CryptoOperationData signature, 88 // CryptoOperationData data); 89 switch (info.Length()) { 90 case 4: 91 // Promise verify(Dictionary algorithm, Key key, ArrayBuffer signature, ArrayBuffer data); 92 if (V8ArrayBuffer::hasInstance(info[2], isolate) 93 && V8ArrayBuffer::hasInstance(info[3], isolate)) { 94 verify1Method(info); 95 return; 96 } 97 // Promise verify(Dictionary algorithm, Key key, ArrayBuffer signature, ArrayBufferView data); 98 if (V8ArrayBuffer::hasInstance(info[2], isolate) 99 && V8ArrayBufferView::hasInstance(info[3], isolate)) { 100 verify2Method(info); 101 return; 102 } 103 // Promise verify(Dictionary algorithm, Key key, ArrayBufferView signature, ArrayBuffer data); 104 if (V8ArrayBufferView::hasInstance(info[2], isolate) 105 && V8ArrayBuffer::hasInstance(info[3], isolate)) { 106 verify3Method(info); 107 return; 108 } 109 // Promise verify(Dictionary algorithm, Key key, ArrayBufferView signature, ArrayBufferView data); 110 if (V8ArrayBufferView::hasInstance(info[2], isolate) 111 && V8ArrayBufferView::hasInstance(info[3], isolate)) { 112 verify4Method(info); 113 return; 114 } 115 break; 116 default: 117 throwArityTypeError(exceptionState, "[4]", info.Length()); 118 return; 119 break; 120 } 121 exceptionState.throwTypeError("No function was found that matched the signature provided."); 122 exceptionState.throwIfNeeded(); 123 } 124 125 } // namespace WebCore 126