| Index: Source/modules/crypto/SubtleCrypto.cpp
|
| diff --git a/Source/modules/crypto/SubtleCrypto.cpp b/Source/modules/crypto/SubtleCrypto.cpp
|
| index ef175c3eccb18a037c1f336d64242fcb94e3a1d8..60b7056e4849734e4e307952c14d4766bde69038 100644
|
| --- a/Source/modules/crypto/SubtleCrypto.cpp
|
| +++ b/Source/modules/crypto/SubtleCrypto.cpp
|
| @@ -46,6 +46,18 @@ namespace WebCore {
|
|
|
| namespace {
|
|
|
| +bool parseAlgorithm(const Dictionary& rawAlgorithm, AlgorithmOperation operationType, blink::WebCryptoAlgorithm &algorithm, ExceptionState& exceptionState, CryptoResult* result)
|
| +{
|
| + String errorDetails;
|
| + if (parseAlgorithm(rawAlgorithm, operationType, algorithm, errorDetails, exceptionState))
|
| + return true;
|
| +
|
| + if (!exceptionState.hadException())
|
| + result->completeWithError(errorDetails);
|
| +
|
| + return false;
|
| +}
|
| +
|
| ScriptPromise startCryptoOperation(const Dictionary& rawAlgorithm, Key* key, AlgorithmOperation operationType, ArrayBufferView* signature, ArrayBufferView* dataBuffer, ExceptionState& exceptionState)
|
| {
|
| bool requiresKey = operationType != Digest;
|
| @@ -65,19 +77,22 @@ ScriptPromise startCryptoOperation(const Dictionary& rawAlgorithm, Key* key, Alg
|
| return ScriptPromise();
|
| }
|
|
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| blink::WebCryptoAlgorithm algorithm;
|
| - if (!normalizeAlgorithm(rawAlgorithm, operationType, algorithm, exceptionState))
|
| - return ScriptPromise();
|
| + if (!parseAlgorithm(rawAlgorithm, operationType, algorithm, exceptionState, result.get()))
|
| + return promise;
|
|
|
| - if (requiresKey && !key->canBeUsedForAlgorithm(algorithm, operationType, exceptionState))
|
| - return ScriptPromise();
|
| + String errorDetails;
|
| + if (requiresKey && !key->canBeUsedForAlgorithm(algorithm, operationType, errorDetails)) {
|
| + result->completeWithError(errorDetails);
|
| + return promise;
|
| + }
|
|
|
| const unsigned char* data = static_cast<const unsigned char*>(dataBuffer->baseAddress());
|
| unsigned dataSize = dataBuffer->byteLength();
|
|
|
| - ScriptPromise promise = ScriptPromise::createPending();
|
| - RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| -
|
| switch (operationType) {
|
| case Encrypt:
|
| blink::Platform::current()->crypto()->encrypt(algorithm, key->key(), data, dataSize, result->result());
|
| @@ -140,12 +155,13 @@ ScriptPromise SubtleCrypto::generateKey(const Dictionary& rawAlgorithm, bool ext
|
| if (!Key::parseUsageMask(rawKeyUsages, keyUsages, exceptionState))
|
| return ScriptPromise();
|
|
|
| - blink::WebCryptoAlgorithm algorithm;
|
| - if (!normalizeAlgorithm(rawAlgorithm, GenerateKey, algorithm, exceptionState))
|
| - return ScriptPromise();
|
| -
|
| ScriptPromise promise = ScriptPromise::createPending();
|
| RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| + blink::WebCryptoAlgorithm algorithm;
|
| + if (!parseAlgorithm(rawAlgorithm, GenerateKey, algorithm, exceptionState, result.get()))
|
| + return promise;
|
| +
|
| blink::Platform::current()->crypto()->generateKey(algorithm, extractable, keyUsages, result->result());
|
| return promise;
|
| }
|
| @@ -165,15 +181,16 @@ ScriptPromise SubtleCrypto::importKey(const String& rawFormat, ArrayBufferView*
|
| if (!Key::parseUsageMask(rawKeyUsages, keyUsages, exceptionState))
|
| return ScriptPromise();
|
|
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| // The algorithm is optional.
|
| blink::WebCryptoAlgorithm algorithm;
|
| - if (!rawAlgorithm.isUndefinedOrNull() && !normalizeAlgorithm(rawAlgorithm, ImportKey, algorithm, exceptionState))
|
| - return ScriptPromise();
|
| + if (!rawAlgorithm.isUndefinedOrNull() && !parseAlgorithm(rawAlgorithm, ImportKey, algorithm, exceptionState, result.get()))
|
| + return promise;
|
|
|
| const unsigned char* keyDataBytes = static_cast<unsigned char*>(keyData->baseAddress());
|
|
|
| - ScriptPromise promise = ScriptPromise::createPending();
|
| - RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| blink::Platform::current()->crypto()->importKey(format, keyDataBytes, keyData->byteLength(), algorithm, extractable, keyUsages, result->result());
|
| return promise;
|
| }
|
| @@ -189,13 +206,14 @@ ScriptPromise SubtleCrypto::exportKey(const String& rawFormat, Key* key, Excepti
|
| return ScriptPromise();
|
| }
|
|
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| if (!key->extractable()) {
|
| - exceptionState.throwDOMException(NotSupportedError, "key is not extractable");
|
| - return ScriptPromise();
|
| + result->completeWithError("key is not extractable");
|
| + return promise;
|
| }
|
|
|
| - ScriptPromise promise = ScriptPromise::createPending();
|
| - RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| blink::Platform::current()->crypto()->exportKey(format, key->key(), result->result());
|
| return promise;
|
| }
|
| @@ -216,20 +234,24 @@ ScriptPromise SubtleCrypto::wrapKey(const String& rawFormat, Key* key, Key* wrap
|
| return ScriptPromise();
|
| }
|
|
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| blink::WebCryptoAlgorithm wrapAlgorithm;
|
| - if (!normalizeAlgorithm(rawWrapAlgorithm, WrapKey, wrapAlgorithm, exceptionState))
|
| - return ScriptPromise();
|
| + if (!parseAlgorithm(rawWrapAlgorithm, WrapKey, wrapAlgorithm, exceptionState, result.get()))
|
| + return promise;
|
|
|
| if (!key->extractable()) {
|
| - exceptionState.throwDOMException(NotSupportedError, "key is not extractable");
|
| - return ScriptPromise();
|
| + result->completeWithError("key is not extractable");
|
| + return promise;
|
| }
|
|
|
| - if (!wrappingKey->canBeUsedForAlgorithm(wrapAlgorithm, WrapKey, exceptionState))
|
| - return ScriptPromise();
|
| + String errorDetails;
|
| + if (!wrappingKey->canBeUsedForAlgorithm(wrapAlgorithm, WrapKey, errorDetails)) {
|
| + result->completeWithError(errorDetails);
|
| + return promise;
|
| + }
|
|
|
| - ScriptPromise promise = ScriptPromise::createPending();
|
| - RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| blink::Platform::current()->crypto()->wrapKey(format, key->key(), wrappingKey->key(), wrapAlgorithm, result->result());
|
| return promise;
|
| }
|
| @@ -250,27 +272,31 @@ ScriptPromise SubtleCrypto::unwrapKey(const String& rawFormat, ArrayBufferView*
|
| return ScriptPromise();
|
| }
|
|
|
| - blink::WebCryptoAlgorithm unwrapAlgorithm;
|
| - if (!normalizeAlgorithm(rawUnwrapAlgorithm, UnwrapKey, unwrapAlgorithm, exceptionState))
|
| + blink::WebCryptoKeyUsageMask keyUsages;
|
| + if (!Key::parseUsageMask(rawKeyUsages, keyUsages, exceptionState))
|
| return ScriptPromise();
|
|
|
| + ScriptPromise promise = ScriptPromise::createPending();
|
| + RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| +
|
| + blink::WebCryptoAlgorithm unwrapAlgorithm;
|
| + if (!parseAlgorithm(rawUnwrapAlgorithm, UnwrapKey, unwrapAlgorithm, exceptionState, result.get()))
|
| + return promise;
|
| +
|
| // The unwrappedKeyAlgorithm is optional.
|
| blink::WebCryptoAlgorithm unwrappedKeyAlgorithm;
|
| - if (!rawUnwrappedKeyAlgorithm.isUndefinedOrNull() && !normalizeAlgorithm(rawUnwrappedKeyAlgorithm, ImportKey, unwrappedKeyAlgorithm, exceptionState))
|
| - return ScriptPromise();
|
| -
|
| - blink::WebCryptoKeyUsageMask keyUsages;
|
| - if (!Key::parseUsageMask(rawKeyUsages, keyUsages, exceptionState))
|
| - return ScriptPromise();
|
| + if (!rawUnwrappedKeyAlgorithm.isUndefinedOrNull() && !parseAlgorithm(rawUnwrappedKeyAlgorithm, ImportKey, unwrappedKeyAlgorithm, exceptionState, result.get()))
|
| + return promise;
|
|
|
| - if (!unwrappingKey->canBeUsedForAlgorithm(unwrapAlgorithm, UnwrapKey, exceptionState))
|
| - return ScriptPromise();
|
| + String errorDetails;
|
| + if (!unwrappingKey->canBeUsedForAlgorithm(unwrapAlgorithm, UnwrapKey, errorDetails)) {
|
| + result->completeWithError(errorDetails);
|
| + return promise;
|
| + }
|
|
|
| const unsigned char* wrappedKeyData = static_cast<const unsigned char*>(wrappedKey->baseAddress());
|
| unsigned wrappedKeyDataSize = wrappedKey->byteLength();
|
|
|
| - ScriptPromise promise = ScriptPromise::createPending();
|
| - RefPtr<CryptoResultImpl> result = CryptoResultImpl::create(promise);
|
| blink::Platform::current()->crypto()->unwrapKey(format, wrappedKeyData, wrappedKeyDataSize, unwrappingKey->key(), unwrapAlgorithm, unwrappedKeyAlgorithm, extractable, keyUsages, result->result());
|
| return promise;
|
| }
|
|
|