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

Unified Diff: Source/modules/crypto/SubtleCrypto.cpp

Issue 19776013: WebCrypto: Refactor the WebCryptoOperation interface to support errors. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase onto master Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/modules/crypto/CryptoOperation.cpp ('k') | public/platform/WebCrypto.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/crypto/SubtleCrypto.cpp
diff --git a/Source/modules/crypto/SubtleCrypto.cpp b/Source/modules/crypto/SubtleCrypto.cpp
index 4b3153eb6175204a6271316e75aa8273ea372c9f..3bbc7031e6443d4f21643486e789bf6c848a47cd 100644
--- a/Source/modules/crypto/SubtleCrypto.cpp
+++ b/Source/modules/crypto/SubtleCrypto.cpp
@@ -34,6 +34,7 @@
#include "core/dom/ExceptionCode.h"
#include "modules/crypto/CryptoOperation.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"
@@ -52,28 +53,39 @@ namespace {
//------------------------------------------------------------------------------
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
{
- ASSERT_NOT_REACHED();
+ m_result->completeWithError();
+ delete this;
}
+
virtual void abort() OVERRIDE
{
delete this;
}
- virtual void finish(WebKit::WebCryptoOperationResult* result) OVERRIDE
+
+ virtual void finish() OVERRIDE
{
- ASSERT_NOT_REACHED();
+ m_result->completeWithError();
+ delete this;
}
+
+protected:
+ WebKit::WebCryptoOperationResult* m_result;
};
class MockSha1Operation : public DummyOperation {
public:
+ explicit MockSha1Operation(WebKit::WebCryptoOperationResult* result) : DummyOperation(result) { }
+
virtual void process(const unsigned char* bytes, size_t size) OVERRIDE
{
m_sha1.addBytes(bytes, size);
}
- virtual void finish(WebKit::WebCryptoOperationResult* result) OVERRIDE
+ virtual void finish() OVERRIDE
{
Vector<uint8_t, 20> hash;
m_sha1.computeHash(hash);
@@ -81,13 +93,47 @@ public:
WebKit::WebArrayBuffer buffer = WebKit::WebArrayBuffer::create(hash.size(), 1);
memcpy(buffer.data(), hash.data(), hash.size());
- result->setArrayBuffer(buffer);
+ m_result->completeWithArrayBuffer(buffer);
delete this;
}
private:
SHA1 m_sha1;
};
+
+class MockPlatformCrypto : public WebKit::WebCrypto {
+public:
+ // FIXME: delete
+ virtual WebKit::WebCryptoOperation* digest(const WebKit::WebCryptoAlgorithm&) { return 0; }
+
+ virtual void digest2(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));
+ }
+ }
+};
+
+WebKit::WebCrypto* mockPlatformCrypto()
+{
+ DEFINE_STATIC_LOCAL(MockPlatformCrypto, crypto, ());
+ return &crypto;
+}
+
+PassRefPtr<CryptoOperation> doDummyOperation(const Dictionary& rawAlgorithm, AlgorithmOperation operationType, ExceptionCode& ec)
+{
+ WebKit::WebCryptoAlgorithm algorithm;
+ if (!normalizeAlgorithm(rawAlgorithm, operationType, algorithm, ec))
+ return 0;
+
+ RefPtr<CryptoOperation> op = CryptoOperation::create(algorithm, &ec);
+ op->initializationSucceded(new DummyOperation(op.get()));
+ return op.release();
+}
//------------------------------------------------------------------------------
} // namespace
@@ -99,47 +145,39 @@ SubtleCrypto::SubtleCrypto()
PassRefPtr<CryptoOperation> SubtleCrypto::encrypt(const Dictionary& rawAlgorithm, ExceptionCode& ec)
{
- WebKit::WebCryptoAlgorithm algorithm;
- if (!normalizeAlgorithm(rawAlgorithm, Encrypt, algorithm, ec))
- return 0;
- return CryptoOperation::create(algorithm, new DummyOperation);
+ return doDummyOperation(rawAlgorithm, Encrypt, ec);
}
PassRefPtr<CryptoOperation> SubtleCrypto::decrypt(const Dictionary& rawAlgorithm, ExceptionCode& ec)
{
- WebKit::WebCryptoAlgorithm algorithm;
- if (!normalizeAlgorithm(rawAlgorithm, Decrypt, algorithm, ec))
- return 0;
- return CryptoOperation::create(algorithm, new DummyOperation);
+ return doDummyOperation(rawAlgorithm, Decrypt, ec);
}
PassRefPtr<CryptoOperation> SubtleCrypto::sign(const Dictionary& rawAlgorithm, ExceptionCode& ec)
{
- WebKit::WebCryptoAlgorithm algorithm;
- if (!normalizeAlgorithm(rawAlgorithm, Sign, algorithm, ec))
- return 0;
- return CryptoOperation::create(algorithm, new DummyOperation);
+ return doDummyOperation(rawAlgorithm, Sign, ec);
}
PassRefPtr<CryptoOperation> SubtleCrypto::verifySignature(const Dictionary& rawAlgorithm, ExceptionCode& ec)
{
- WebKit::WebCryptoAlgorithm algorithm;
- if (!normalizeAlgorithm(rawAlgorithm, Verify, algorithm, ec))
- return 0;
- return CryptoOperation::create(algorithm, new DummyOperation);
+ return doDummyOperation(rawAlgorithm, Verify, ec);
}
PassRefPtr<CryptoOperation> SubtleCrypto::digest(const Dictionary& rawAlgorithm, ExceptionCode& ec)
{
+ WebKit::WebCrypto* platformCrypto = mockPlatformCrypto();
+ if (!platformCrypto) {
+ ec = NotSupportedError;
+ return 0;
+ }
+
WebKit::WebCryptoAlgorithm algorithm;
if (!normalizeAlgorithm(rawAlgorithm, Digest, algorithm, ec))
return 0;
- // FIXME: Create the WebCryptoImplementation by calling out to
- // Platform::crypto() instead.
- WebKit::WebCryptoOperation* operationImpl = algorithm.id() == WebKit::WebCryptoAlgorithmIdSha1 ? new MockSha1Operation : new DummyOperation;
-
- return CryptoOperation::create(algorithm, operationImpl);
+ RefPtr<CryptoOperation> op = CryptoOperation::create(algorithm, &ec);
+ platformCrypto->digest2(algorithm, op.get());
+ return op.release();
}
} // namespace WebCore
« no previous file with comments | « Source/modules/crypto/CryptoOperation.cpp ('k') | public/platform/WebCrypto.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698