Index: Source/modules/crypto/SubtleCrypto.cpp |
diff --git a/Source/modules/crypto/SubtleCrypto.cpp b/Source/modules/crypto/SubtleCrypto.cpp |
index b219eef7649dce6ac8aa2e83290f84c0795e3995..608b516c82d583ca7713606ddddbf800a78b3fd5 100644 |
--- a/Source/modules/crypto/SubtleCrypto.cpp |
+++ b/Source/modules/crypto/SubtleCrypto.cpp |
@@ -34,105 +34,41 @@ |
#include "bindings/v8/ExceptionState.h" |
#include "core/dom/ExceptionCode.h" |
#include "modules/crypto/CryptoOperation.h" |
+#include "modules/crypto/Key.h" |
+#include "modules/crypto/KeyOperation.h" |
#include "modules/crypto/NormalizeAlgorithm.h" |
#include "public/platform/Platform.h" |
-#include "public/platform/WebArrayBuffer.h" // FIXME: temporary |
#include "public/platform/WebCrypto.h" |
-#include "wtf/ArrayBuffer.h" |
#include "wtf/ArrayBufferView.h" |
-#include "wtf/SHA1.h" // FIXME: temporary |
- |
namespace WebCore { |
-namespace { |
- |
-// FIXME: The following are temporary implementations of what *should* go on the |
-// embedder's side. Since SHA1 is easily implemented, this serves as |
-// a useful proof of concept to get layout tests up and running and |
-// returning correct results, until the embedder's side is implemented. |
-//------------------------------------------------------------------------------ |
-class DummyOperation : public WebKit::WebCryptoOperation { |
-public: |
- explicit DummyOperation(WebKit::WebCryptoOperationResult* result) : m_result(result) { } |
- |
- virtual void process(const unsigned char* bytes, size_t size) OVERRIDE |
- { |
- m_result->completeWithError(); |
- delete this; |
- } |
- |
- virtual void abort() OVERRIDE |
- { |
- delete this; |
- } |
- |
- virtual void finish() OVERRIDE |
- { |
- m_result->completeWithError(); |
- delete this; |
- } |
- |
-protected: |
- WebKit::WebCryptoOperationResult* m_result; |
-}; |
- |
-class MockSha1Operation : public DummyOperation { |
-public: |
- explicit MockSha1Operation(WebKit::WebCryptoOperationResult* result) : DummyOperation(result) { } |
+// FIXME: Outstanding KeyOperations and CryptoOperations should be aborted when |
+// tearing down SubtleCrypto (to avoid problems completing a |
+// ScriptPromiseResolver which is no longer valid). |
- virtual void process(const unsigned char* bytes, size_t size) OVERRIDE |
- { |
- m_sha1.addBytes(bytes, size); |
- } |
- |
- virtual void finish() OVERRIDE |
- { |
- Vector<uint8_t, 20> hash; |
- m_sha1.computeHash(hash); |
- |
- WebKit::WebArrayBuffer buffer = WebKit::WebArrayBuffer::create(hash.size(), 1); |
- memcpy(buffer.data(), hash.data(), hash.size()); |
- |
- m_result->completeWithArrayBuffer(buffer); |
- delete this; |
- } |
- |
-private: |
- SHA1 m_sha1; |
-}; |
- |
-class MockPlatformCrypto : public WebKit::WebCrypto { |
-public: |
- virtual void digest(const WebKit::WebCryptoAlgorithm& algorithm, WebKit::WebCryptoOperationResult* result) OVERRIDE |
- { |
- if (algorithm.id() == WebKit::WebCryptoAlgorithmIdSha1) { |
- result->initializationSucceded(new MockSha1Operation(result)); |
- } else { |
- // Don't fail synchronously, since existing layout tests rely on |
- // digest for testing algorithm normalization. |
- result->initializationSucceded(new DummyOperation(result)); |
- } |
- } |
-}; |
+namespace { |
-WebKit::WebCrypto* mockPlatformCrypto() |
+// FIXME: Temporary |
+PassRefPtr<CryptoOperation> dummyOperation(const Dictionary& rawAlgorithm, AlgorithmOperation operationType, ExceptionState& es) |
{ |
- DEFINE_STATIC_LOCAL(MockPlatformCrypto, crypto, ()); |
- return &crypto; |
-} |
+ WebKit::WebCrypto* platformCrypto = WebKit::Platform::current()->crypto(); |
+ if (!platformCrypto) { |
+ es.throwDOMException(NotSupportedError); |
+ return 0; |
+ } |
-PassRefPtr<CryptoOperation> doDummyOperation(const Dictionary& rawAlgorithm, AlgorithmOperation operationType, ExceptionState& es) |
-{ |
WebKit::WebCryptoAlgorithm algorithm; |
if (!normalizeAlgorithm(rawAlgorithm, operationType, algorithm, es)) |
return 0; |
- RefPtr<CryptoOperation> op = CryptoOperation::create(algorithm, &es); |
- op->initializationSucceded(new DummyOperation(op.get())); |
- return op.release(); |
+ RefPtr<CryptoOperationImpl> opImpl = CryptoOperationImpl::create(); |
+ WebKit::WebCryptoOperationResult result(opImpl.get()); |
+ platformCrypto->digest(algorithm, result); |
+ if (opImpl->throwInitializationError(es)) |
+ return 0; |
+ return CryptoOperation::create(algorithm, opImpl.get()); |
} |
-//------------------------------------------------------------------------------ |
} // namespace |
@@ -143,27 +79,27 @@ SubtleCrypto::SubtleCrypto() |
PassRefPtr<CryptoOperation> SubtleCrypto::encrypt(const Dictionary& rawAlgorithm, ExceptionState& es) |
{ |
- return doDummyOperation(rawAlgorithm, Encrypt, es); |
+ return dummyOperation(rawAlgorithm, Encrypt, es); |
} |
PassRefPtr<CryptoOperation> SubtleCrypto::decrypt(const Dictionary& rawAlgorithm, ExceptionState& es) |
{ |
- return doDummyOperation(rawAlgorithm, Decrypt, es); |
+ return dummyOperation(rawAlgorithm, Decrypt, es); |
} |
PassRefPtr<CryptoOperation> SubtleCrypto::sign(const Dictionary& rawAlgorithm, ExceptionState& es) |
{ |
- return doDummyOperation(rawAlgorithm, Sign, es); |
+ return dummyOperation(rawAlgorithm, Sign, es); |
} |
PassRefPtr<CryptoOperation> SubtleCrypto::verifySignature(const Dictionary& rawAlgorithm, ExceptionState& es) |
{ |
- return doDummyOperation(rawAlgorithm, Verify, es); |
+ return dummyOperation(rawAlgorithm, Verify, es); |
} |
PassRefPtr<CryptoOperation> SubtleCrypto::digest(const Dictionary& rawAlgorithm, ExceptionState& es) |
{ |
- WebKit::WebCrypto* platformCrypto = mockPlatformCrypto(); |
+ WebKit::WebCrypto* platformCrypto = WebKit::Platform::current()->crypto(); |
if (!platformCrypto) { |
es.throwDOMException(NotSupportedError); |
return 0; |
@@ -173,9 +109,44 @@ PassRefPtr<CryptoOperation> SubtleCrypto::digest(const Dictionary& rawAlgorithm, |
if (!normalizeAlgorithm(rawAlgorithm, Digest, algorithm, es)) |
return 0; |
- RefPtr<CryptoOperation> op = CryptoOperation::create(algorithm, &es); |
- platformCrypto->digest(algorithm, op.get()); |
- return op.release(); |
+ RefPtr<CryptoOperationImpl> opImpl = CryptoOperationImpl::create(); |
+ WebKit::WebCryptoOperationResult result(opImpl.get()); |
+ platformCrypto->digest(algorithm, result); |
+ if (opImpl->throwInitializationError(es)) |
+ return 0; |
+ return CryptoOperation::create(algorithm, opImpl.get()); |
+} |
+ |
+ScriptObject SubtleCrypto::importKey(const String& rawFormat, ArrayBufferView* keyData, const Dictionary& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages, ExceptionState& es) |
+{ |
+ WebKit::WebCrypto* platformCrypto = WebKit::Platform::current()->crypto(); |
+ if (!platformCrypto) { |
+ es.throwDOMException(NotSupportedError); |
+ return ScriptObject(); |
+ } |
+ |
+ WebKit::WebCryptoKeyUsageMask keyUsages; |
+ if (!Key::parseUsageMask(rawKeyUsages, keyUsages)) { |
+ es.throwDOMException(TypeError); |
+ return ScriptObject(); |
+ } |
+ |
+ WebKit::WebCryptoKeyFormat format; |
+ if (!Key::parseFormat(rawFormat, format)) { |
+ es.throwDOMException(TypeError); |
+ return ScriptObject(); |
+ } |
+ |
+ WebKit::WebCryptoAlgorithm algorithm; |
+ if (!normalizeAlgorithmForImportKey(rawAlgorithm, algorithm, es)) |
+ return ScriptObject(); |
+ |
+ const unsigned char* keyDataBytes = static_cast<unsigned char*>(keyData->baseAddress()); |
+ |
+ RefPtr<KeyOperation> keyOp = KeyOperation::create(); |
+ WebKit::WebCryptoKeyOperationResult result(keyOp.get()); |
+ platformCrypto->importKey(format, keyDataBytes, keyData->byteLength(), algorithm, extractable, keyUsages, result); |
+ return keyOp->returnValue(es); |
} |
} // namespace WebCore |