Index: Source/platform/exported/WebCryptoAlgorithm.cpp |
diff --git a/Source/platform/exported/WebCryptoAlgorithm.cpp b/Source/platform/exported/WebCryptoAlgorithm.cpp |
index 024b9701c8d97d5e7f2338340f7fe574d1b3ab60..1b9504e83dae5d3c5ecbf68b22cb99e0bcc2d98f 100644 |
--- a/Source/platform/exported/WebCryptoAlgorithm.cpp |
+++ b/Source/platform/exported/WebCryptoAlgorithm.cpp |
@@ -32,11 +32,193 @@ |
#include "public/platform/WebCryptoAlgorithm.h" |
#include "public/platform/WebCryptoAlgorithmParams.h" |
+#include "wtf/Assertions.h" |
#include "wtf/OwnPtr.h" |
+#include "wtf/StdLibExtras.h" |
#include "wtf/ThreadSafeRefCounted.h" |
namespace blink { |
+namespace { |
+ |
+// A mapping from the algorithm ID to information about the algorithm. |
+const WebCryptoAlgorithmInfo algorithmIdToInfo[] = { |
+ { // Index 0 |
+ "AES-CBC", { |
+ WebCryptoAlgorithmParamsTypeAesCbcParams, // Encrypt |
+ WebCryptoAlgorithmParamsTypeAesCbcParams, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmParamsTypeAesCbcParams, // WrapKey |
+ WebCryptoAlgorithmParamsTypeAesCbcParams // UnwrapKey |
+ } |
+ }, { // Index 1 |
+ "HMAC", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmParamsTypeNone, // Sign |
+ WebCryptoAlgorithmParamsTypeNone, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeHmacKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeHmacImportParams, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 2 |
+ "RSASSA-PKCS1-v1_5", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmParamsTypeNone, // Sign |
+ WebCryptoAlgorithmParamsTypeNone, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeRsaHashedImportParams, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 3 |
+ "SHA-1", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmParamsTypeNone, // Digest |
+ WebCryptoAlgorithmInfo::Undefined, // GenerateKey |
+ WebCryptoAlgorithmInfo::Undefined, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 4 |
+ "SHA-256", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmParamsTypeNone, // Digest |
+ WebCryptoAlgorithmInfo::Undefined, // GenerateKey |
+ WebCryptoAlgorithmInfo::Undefined, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 5 |
+ "SHA-384", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmParamsTypeNone, // Digest |
+ WebCryptoAlgorithmInfo::Undefined, // GenerateKey |
+ WebCryptoAlgorithmInfo::Undefined, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 6 |
+ "SHA-512", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmParamsTypeNone, // Digest |
+ WebCryptoAlgorithmInfo::Undefined, // GenerateKey |
+ WebCryptoAlgorithmInfo::Undefined, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmInfo::Undefined, // WrapKey |
+ WebCryptoAlgorithmInfo::Undefined // UnwrapKey |
+ } |
+ }, { // Index 7 |
+ "AES-GCM", { |
+ WebCryptoAlgorithmParamsTypeAesGcmParams, // Encrypt |
+ WebCryptoAlgorithmParamsTypeAesGcmParams, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmParamsTypeAesGcmParams, // WrapKey |
+ WebCryptoAlgorithmParamsTypeAesGcmParams // UnwrapKey |
+ } |
+ }, { // Index 8 |
+ "RSA-OAEP", { |
+ WebCryptoAlgorithmParamsTypeRsaOaepParams, // Encrypt |
+ WebCryptoAlgorithmParamsTypeRsaOaepParams, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeRsaHashedImportParams, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmParamsTypeRsaOaepParams, // WrapKey |
+ WebCryptoAlgorithmParamsTypeRsaOaepParams // UnwrapKey |
+ } |
+ }, { // Index 9 |
+ "AES-CTR", { |
+ WebCryptoAlgorithmParamsTypeAesCtrParams, // Encrypt |
+ WebCryptoAlgorithmParamsTypeAesCtrParams, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmParamsTypeAesCtrParams, // WrapKey |
+ WebCryptoAlgorithmParamsTypeAesCtrParams // UnwrapKey |
+ } |
+ }, { // Index 10 |
+ "AES-KW", { |
+ WebCryptoAlgorithmInfo::Undefined, // Encrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Decrypt |
+ WebCryptoAlgorithmInfo::Undefined, // Sign |
+ WebCryptoAlgorithmInfo::Undefined, // Verify |
+ WebCryptoAlgorithmInfo::Undefined, // Digest |
+ WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveKey |
+ WebCryptoAlgorithmInfo::Undefined, // DeriveBits |
+ WebCryptoAlgorithmParamsTypeNone, // WrapKey |
+ WebCryptoAlgorithmParamsTypeNone // UnwrapKey |
+ } |
+ }, |
+}; |
+ |
+// Initializing the algorithmIdToInfo table above depends on knowing the enum |
+// values for algorithm IDs. If those ever change, the table will need to be |
+// updated. |
+COMPILE_ASSERT(WebCryptoAlgorithmIdAesCbc == 0, AesCbc_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdHmac == 1, Hmac_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 == 2, RsaSsaPkcs1v1_5_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdSha1 == 3, Sha1_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdSha256 == 4, Sha256_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdSha384 == 5, Sha384_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdSha512 == 6, Sha512_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdAesGcm == 7, AesGcm_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdRsaOaep == 8, RsaOaep_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdAesCtr == 9, AesCtr_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdAesKw == 10, AesKw_idDoesntMatch); |
+COMPILE_ASSERT(WebCryptoAlgorithmIdLast == 10, Last_idDoesntMatch); |
+COMPILE_ASSERT(10 == WebCryptoOperationLast, UpdateParamsMapping); |
+ |
+} // namespace |
+ |
class WebCryptoAlgorithmPrivate : public ThreadSafeRefCounted<WebCryptoAlgorithmPrivate> { |
public: |
WebCryptoAlgorithmPrivate(WebCryptoAlgorithmId id, PassOwnPtr<WebCryptoAlgorithmParams> params) |
@@ -64,6 +246,13 @@ WebCryptoAlgorithm WebCryptoAlgorithm::adoptParamsAndCreate(WebCryptoAlgorithmId |
return WebCryptoAlgorithm(id, adoptPtr(params)); |
} |
+const WebCryptoAlgorithmInfo* WebCryptoAlgorithm::lookupAlgorithmInfo(WebCryptoAlgorithmId id) |
+{ |
+ if (id < 0 || id >= WTF_ARRAY_LENGTH(algorithmIdToInfo)) |
+ return 0; |
+ return &algorithmIdToInfo[id]; |
+} |
+ |
bool WebCryptoAlgorithm::isNull() const |
{ |
return m_private.isNull(); |