Index: Source/modules/crypto/Key.cpp |
diff --git a/Source/modules/crypto/Key.cpp b/Source/modules/crypto/Key.cpp |
index d10fbd4249dd3403a7e9efe49896250bff693730..b0031c6c2421013688245d14d72f37264ccd79f0 100644 |
--- a/Source/modules/crypto/Key.cpp |
+++ b/Source/modules/crypto/Key.cpp |
@@ -51,32 +51,48 @@ const char* keyTypeToString(WebKit::WebCryptoKeyType type) |
return 0; |
} |
+struct KeyUsageMapping { |
+ WebKit::WebCryptoKeyUsage value; |
+ const char* const name; |
+}; |
+ |
+const KeyUsageMapping keyUsageMappings[] = { |
+ { WebKit::WebCryptoKeyUsageEncrypt, "encrypt" }, |
+ { WebKit::WebCryptoKeyUsageDecrypt, "decrypt" }, |
+ { WebKit::WebCryptoKeyUsageSign, "sign" }, |
+ { WebKit::WebCryptoKeyUsageVerify, "verify" }, |
+ { WebKit::WebCryptoKeyUsageDeriveKey, "deriveKey" }, |
+ { WebKit::WebCryptoKeyUsageWrapKey, "wrapKey" }, |
+ { WebKit::WebCryptoKeyUsageUnwrapKey, "unwrapKey" }, |
+}; |
+ |
+COMPILE_ASSERT(WebKit::EndOfWebCryptoKeyUsage == (1 << 6) + 1, update_keyUsageMappings); |
+ |
const char* keyUsageToString(WebKit::WebCryptoKeyUsage usage) |
{ |
- switch (usage) { |
- case WebKit::WebCryptoKeyUsageEncrypt: |
- return "encrypt"; |
- case WebKit::WebCryptoKeyUsageDecrypt: |
- return "decrypt"; |
- case WebKit::WebCryptoKeyUsageSign: |
- return "sign"; |
- case WebKit::WebCryptoKeyUsageVerify: |
- return "verify"; |
- case WebKit::WebCryptoKeyUsageDeriveKey: |
- return "deriveKey"; |
- case WebKit::WebCryptoKeyUsageWrapKey: |
- return "wrapKey"; |
- case WebKit::WebCryptoKeyUsageUnwrapKey: |
- return "unwrapKey"; |
- case WebKit::EndOfWebCryptoKeyUsage: |
- break; |
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyUsageMappings); ++i) { |
+ if (keyUsageMappings[i].value == usage) |
+ return keyUsageMappings[i].name; |
} |
ASSERT_NOT_REACHED(); |
return 0; |
} |
+WebKit::WebCryptoKeyUsageMask keyUsageStringToMask(const String& usageString) |
+{ |
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyUsageMappings); ++i) { |
+ if (keyUsageMappings[i].name == usageString) |
+ return keyUsageMappings[i].value; |
+ } |
+ return 0; |
+} |
+ |
} // namespace |
+Key::~Key() |
+{ |
+} |
+ |
Key::Key(const WebKit::WebCryptoKey& key) |
: m_key(key) |
{ |
@@ -107,14 +123,47 @@ Algorithm* Key::algorithm() |
Vector<String> Key::usages() const |
{ |
Vector<String> result; |
- |
- // The WebCryptoKeyUsage values are consecutive powers of 2. Test each one in order. |
- for (int i = 0; (1 << i) < WebKit::EndOfWebCryptoKeyUsage; ++i) { |
- WebKit::WebCryptoKeyUsage usage = static_cast<WebKit::WebCryptoKeyUsage>(1 << i); |
+ for (int i = 0; i < WTF_ARRAY_LENGTH(keyUsageMappings); ++i) { |
+ WebKit::WebCryptoKeyUsage usage = keyUsageMappings[i].value; |
if (m_key.usages() & usage) |
result.append(ASCIILiteral(keyUsageToString(usage))); |
} |
return result; |
} |
+bool Key::parseFormat(const String& formatString, WebKit::WebCryptoKeyFormat& format) |
+{ |
+ // There are few enough values that testing serially is fast enough. |
+ if (formatString == "raw") { |
+ format = WebKit::WebCryptoKeyFormatRaw; |
+ return true; |
+ } |
+ if (formatString == "pkcs8") { |
+ format = WebKit::WebCryptoKeyFormatPkcs8; |
+ return true; |
+ } |
+ if (formatString == "spki") { |
+ format = WebKit::WebCryptoKeyFormatSpki; |
+ return true; |
+ } |
+ if (formatString == "jwk") { |
+ format = WebKit::WebCryptoKeyFormatJwk; |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool Key::parseUsageMask(const Vector<String>& usages, WebKit::WebCryptoKeyUsageMask& mask) |
+{ |
+ mask = 0; |
+ for (size_t i = 0; i < usages.size(); ++i) { |
+ WebKit::WebCryptoKeyUsageMask usage = keyUsageStringToMask(usages[i]); |
+ if (!usage) |
+ return false; |
+ mask |= usage; |
+ } |
+ return true; |
+} |
+ |
} // namespace WebCore |