Index: Source/modules/crypto/NormalizeAlgorithm.cpp |
diff --git a/Source/modules/crypto/NormalizeAlgorithm.cpp b/Source/modules/crypto/NormalizeAlgorithm.cpp |
index c18f469a0d784bb9a9b3d0ff6f30eec8c1e51b4b..4d799e7b3b6c554de036dfa04073da7b0c43973f 100644 |
--- a/Source/modules/crypto/NormalizeAlgorithm.cpp |
+++ b/Source/modules/crypto/NormalizeAlgorithm.cpp |
@@ -60,14 +60,6 @@ struct AlgorithmNameMapping { |
#endif |
}; |
-struct OperationParamsMapping { |
- blink::WebCryptoAlgorithmId algorithmId; |
- AlgorithmOperation operation; |
- blink::WebCryptoAlgorithmParamsType params; |
- |
- bool operator<(const OperationParamsMapping&) const; |
-}; |
- |
// Must be sorted by length, and then by reverse string. |
// Also all names must be upper case ASCII. |
const AlgorithmNameMapping algorithmNameMappings[] = { |
@@ -84,66 +76,210 @@ const AlgorithmNameMapping algorithmNameMappings[] = { |
{"RSASSA-PKCS1-V1_5", 17, blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5}, |
}; |
-// What operations each algorithm supports, and what parameters it expects. |
-// Must be sorted by algorithm id and then operation. |
-const OperationParamsMapping operationParamsMappings[] = { |
- // AES-CBC |
- {blink::WebCryptoAlgorithmIdAesCbc, Encrypt, blink::WebCryptoAlgorithmParamsTypeAesCbcParams}, |
- {blink::WebCryptoAlgorithmIdAesCbc, Decrypt, blink::WebCryptoAlgorithmParamsTypeAesCbcParams}, |
- {blink::WebCryptoAlgorithmIdAesCbc, GenerateKey, blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdAesCbc, ImportKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdAesCbc, WrapKey, blink::WebCryptoAlgorithmParamsTypeAesCbcParams}, |
- {blink::WebCryptoAlgorithmIdAesCbc, UnwrapKey, blink::WebCryptoAlgorithmParamsTypeAesCbcParams}, |
- |
- // HMAC |
- {blink::WebCryptoAlgorithmIdHmac, Sign, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdHmac, Verify, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdHmac, GenerateKey, blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdHmac, ImportKey, blink::WebCryptoAlgorithmParamsTypeHmacImportParams}, |
- |
- // RSASSA-PKCS1-v1_5 |
- {blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, Sign, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, Verify, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, GenerateKey, blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, ImportKey, blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams}, |
- |
- // RSAES-PKCS1-v1_5 |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, Encrypt, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, Decrypt, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, GenerateKey, blink::WebCryptoAlgorithmParamsTypeRsaKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, ImportKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, WrapKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5, UnwrapKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- |
- // SHA-* |
- {blink::WebCryptoAlgorithmIdSha1, Digest, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdSha256, Digest, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdSha384, Digest, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdSha512, Digest, blink::WebCryptoAlgorithmParamsTypeNone}, |
- |
- // AES-GCM |
- {blink::WebCryptoAlgorithmIdAesGcm, Encrypt, blink::WebCryptoAlgorithmParamsTypeAesGcmParams}, |
- {blink::WebCryptoAlgorithmIdAesGcm, Decrypt, blink::WebCryptoAlgorithmParamsTypeAesGcmParams}, |
- {blink::WebCryptoAlgorithmIdAesGcm, GenerateKey, blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdAesGcm, ImportKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdAesGcm, WrapKey, blink::WebCryptoAlgorithmParamsTypeAesGcmParams}, |
- {blink::WebCryptoAlgorithmIdAesGcm, UnwrapKey, blink::WebCryptoAlgorithmParamsTypeAesGcmParams}, |
- |
- // AES-CTR |
- {blink::WebCryptoAlgorithmIdAesCtr, Encrypt, blink::WebCryptoAlgorithmParamsTypeAesCtrParams}, |
- {blink::WebCryptoAlgorithmIdAesCtr, Decrypt, blink::WebCryptoAlgorithmParamsTypeAesCtrParams}, |
- {blink::WebCryptoAlgorithmIdAesCtr, GenerateKey, blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdAesCtr, ImportKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdAesCtr, WrapKey, blink::WebCryptoAlgorithmParamsTypeAesCtrParams}, |
- {blink::WebCryptoAlgorithmIdAesCtr, UnwrapKey, blink::WebCryptoAlgorithmParamsTypeAesCtrParams}, |
- |
- // AES-KW |
- {blink::WebCryptoAlgorithmIdAesKw, GenerateKey, blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams}, |
- {blink::WebCryptoAlgorithmIdAesKw, ImportKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdAesKw, WrapKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
- {blink::WebCryptoAlgorithmIdAesKw, UnwrapKey, blink::WebCryptoAlgorithmParamsTypeNone}, |
+typedef char ParamsTypeOrUndefined; |
+const ParamsTypeOrUndefined Undefined = -1; |
+ |
+struct AlgorithmInfo { |
+ // The canonical (case-sensitive) name for the algorithm. |
+ const char* name; |
+ |
+ // A map from the operation to the expected parameter type of the algorithm. |
+ // If an operation is not applicable for the algorithm, set to Undefined. |
+ const ParamsTypeOrUndefined operationToParamsType[LastAlgorithmOperation + 1]; |
+}; |
+ |
+// A mapping from the algorithm ID to information about the algorithm. |
+const AlgorithmInfo algorithmIdToInfo[] = { |
+ { // Index 0 |
+ "AES-CBC", { |
+ blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Encrypt |
+ blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // WrapKey |
+ blink::WebCryptoAlgorithmParamsTypeAesCbcParams // UnwrapKey |
+ } |
+ }, { // Index 1 |
+ "HMAC", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Sign |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeHmacImportParams, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 2 |
+ "RSASSA-PKCS1-v1_5", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Sign |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 3 |
+ "RSAES-PKCS1-v1_5", { |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Encrypt |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeRsaKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ blink::WebCryptoAlgorithmParamsTypeNone, // WrapKey |
+ blink::WebCryptoAlgorithmParamsTypeNone // UnwrapKey |
+ } |
+ }, { // Index 4 |
+ "SHA-1", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Digest |
+ Undefined, // GenerateKey |
+ Undefined, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 5 |
+ "SHA-256", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Digest |
+ Undefined, // GenerateKey |
+ Undefined, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 6 |
+ "SHA-384", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Digest |
+ Undefined, // GenerateKey |
+ Undefined, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 7 |
+ "SHA-512", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ blink::WebCryptoAlgorithmParamsTypeNone, // Digest |
+ Undefined, // GenerateKey |
+ Undefined, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 8 |
+ "AES-GCM", { |
+ blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // Encrypt |
+ blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // WrapKey |
+ blink::WebCryptoAlgorithmParamsTypeAesGcmParams // UnwrapKey |
+ } |
+ }, { // Index 9 |
+ "RSA-OAEP", { |
+ // FIXME: |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ Undefined, // GenerateKey |
+ Undefined, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ Undefined, // WrapKey |
+ Undefined // UnwrapKey |
+ } |
+ }, { // Index 10 |
+ "AES-CTR", { |
+ blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // Encrypt |
+ blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // WrapKey |
+ blink::WebCryptoAlgorithmParamsTypeAesCtrParams // UnwrapKey |
+ } |
+ }, { // Index 11 |
+ "AES-KW", { |
+ Undefined, // Encrypt |
+ Undefined, // Decrypt |
+ Undefined, // Sign |
+ Undefined, // Verify |
+ Undefined, // Digest |
+ blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey |
+ blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey |
+ Undefined, // DeriveKey |
+ Undefined, // DeriveBits |
+ blink::WebCryptoAlgorithmParamsTypeNone, // WrapKey |
+ blink::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(blink::WebCryptoAlgorithmIdAesCbc == 0, AesCbc_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdHmac == 1, Hmac_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 == 2, RsaSsaPkcs1v1_5_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5 == 3, RsaEsPkcs1v1_5_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha1 == 4, Sha1_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha256 == 5, Sha256_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha384 == 6, Sha384_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha512 == 7, Sha512_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesGcm == 8, AesGcm_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaOaep == 9, RsaOaep_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesCtr == 10, AesCtr_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesKw == 11, AesKw_idDoesntMatch); |
+COMPILE_ASSERT(blink::WebCryptoAlgorithmIdLast == 11, Last_idDoesntMatch); |
+COMPILE_ASSERT(10 == LastAlgorithmOperation, UpdateParamsMapping); |
+ |
#if ASSERT_ENABLED |
// Essentially std::is_sorted() (however that function is new to C++11). |
@@ -203,15 +339,6 @@ bool verifyAlgorithmNameMappings(const AlgorithmNameMapping* begin, const Algori |
} |
#endif |
-bool OperationParamsMapping::operator<(const OperationParamsMapping& o) const |
-{ |
- if (algorithmId < o.algorithmId) |
- return true; |
- if (algorithmId > o.algorithmId) |
- return false; |
- return operation < o.operation; |
-} |
- |
template <typename CharType> |
bool algorithmNameComparator(const AlgorithmNameMapping& a, StringImpl* b) |
{ |
@@ -262,21 +389,11 @@ bool lookupAlgorithmIdByName(const String& algorithmName, blink::WebCryptoAlgori |
return true; |
} |
-bool lookupAlgorithmParamsType(blink::WebCryptoAlgorithmId id, AlgorithmOperation op, blink::WebCryptoAlgorithmParamsType& paramsType) |
+const AlgorithmInfo* lookupAlgorithmInfo(blink::WebCryptoAlgorithmId id) |
{ |
- const OperationParamsMapping* begin = operationParamsMappings; |
- const OperationParamsMapping* end = operationParamsMappings + WTF_ARRAY_LENGTH(operationParamsMappings); |
- |
- ASSERT(isSorted(begin, end)); |
- |
- OperationParamsMapping search = { id, op }; |
- const OperationParamsMapping* it = std::lower_bound(begin, end, search); |
- if (it == end) |
- return false; |
- if (it->algorithmId != id || it->operation != op) |
- return false; |
- paramsType = it->params; |
- return true; |
+ if (id < 0 || id >= WTF_ARRAY_LENGTH(algorithmIdToInfo)) |
+ return 0; |
+ return &algorithmIdToInfo[id]; |
} |
// ErrorContext holds a stack of string literals which describe what was |
@@ -743,14 +860,16 @@ bool parseAlgorithm(const Dictionary& raw, AlgorithmOperation op, blink::WebCryp |
return false; |
} |
- context.add(algorithmIdToName(algorithmId)); |
+ const AlgorithmInfo* algorithmInfo = lookupAlgorithmInfo(algorithmId); |
+ context.add(algorithmInfo->name); |
- blink::WebCryptoAlgorithmParamsType paramsType; |
- if (!lookupAlgorithmParamsType(algorithmId, op, paramsType)) { |
+ if (algorithmInfo->operationToParamsType[op] == Undefined) { |
errorDetails = context.toString("Unsupported operation"); |
return false; |
} |
+ blink::WebCryptoAlgorithmParamsType paramsType = static_cast<blink::WebCryptoAlgorithmParamsType>(algorithmInfo->operationToParamsType[op]); |
+ |
OwnPtr<blink::WebCryptoAlgorithmParams> params; |
if (!parseAlgorithmParams(raw, paramsType, params, context, errorDetails)) |
return false; |
@@ -773,33 +892,7 @@ bool parseAlgorithm(const Dictionary& raw, AlgorithmOperation op, blink::WebCryp |
const char* algorithmIdToName(blink::WebCryptoAlgorithmId id) |
{ |
- switch (id) { |
- case blink::WebCryptoAlgorithmIdAesCbc: |
- return "AES-CBC"; |
- case blink::WebCryptoAlgorithmIdAesCtr: |
- return "AES-CTR"; |
- case blink::WebCryptoAlgorithmIdAesGcm: |
- return "AES-GCM"; |
- case blink::WebCryptoAlgorithmIdHmac: |
- return "HMAC"; |
- case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: |
- return "RSASSA-PKCS1-v1_5"; |
- case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5: |
- return "RSAES-PKCS1-v1_5"; |
- case blink::WebCryptoAlgorithmIdSha1: |
- return "SHA-1"; |
- case blink::WebCryptoAlgorithmIdSha256: |
- return "SHA-256"; |
- case blink::WebCryptoAlgorithmIdSha384: |
- return "SHA-384"; |
- case blink::WebCryptoAlgorithmIdSha512: |
- return "SHA-512"; |
- case blink::WebCryptoAlgorithmIdAesKw: |
- return "AES-KW"; |
- case blink::WebCryptoAlgorithmIdRsaOaep: |
- return "RSA-OAEP"; |
- } |
- return 0; |
+ return lookupAlgorithmInfo(id)->name; |
} |
} // namespace WebCore |