| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "modules/crypto/Key.h" | 32 #include "modules/crypto/Key.h" |
| 33 | 33 |
| 34 #include "bindings/v8/ExceptionState.h" | 34 #include "bindings/v8/ExceptionState.h" |
| 35 #include "core/dom/ExceptionCode.h" | 35 #include "core/dom/ExceptionCode.h" |
| 36 #include "modules/crypto/Algorithm.h" | 36 #include "modules/crypto/Algorithm.h" |
| 37 #include "platform/CryptoResult.h" |
| 37 #include "public/platform/WebCryptoAlgorithmParams.h" | 38 #include "public/platform/WebCryptoAlgorithmParams.h" |
| 39 #include "public/platform/WebString.h" |
| 38 | 40 |
| 39 namespace WebCore { | 41 namespace WebCore { |
| 40 | 42 |
| 41 DEFINE_GC_INFO(Key); | 43 DEFINE_GC_INFO(Key); |
| 42 | 44 |
| 43 namespace { | 45 namespace { |
| 44 | 46 |
| 45 const char* keyTypeToString(blink::WebCryptoKeyType type) | 47 const char* keyTypeToString(blink::WebCryptoKeyType type) |
| 46 { | 48 { |
| 47 switch (type) { | 49 switch (type) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 { | 172 { |
| 171 Vector<String> result; | 173 Vector<String> result; |
| 172 for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyUsageMappings); ++i) { | 174 for (size_t i = 0; i < WTF_ARRAY_LENGTH(keyUsageMappings); ++i) { |
| 173 blink::WebCryptoKeyUsage usage = keyUsageMappings[i].value; | 175 blink::WebCryptoKeyUsage usage = keyUsageMappings[i].value; |
| 174 if (m_key.usages() & usage) | 176 if (m_key.usages() & usage) |
| 175 result.append(keyUsageToString(usage)); | 177 result.append(keyUsageToString(usage)); |
| 176 } | 178 } |
| 177 return result; | 179 return result; |
| 178 } | 180 } |
| 179 | 181 |
| 180 bool Key::canBeUsedForAlgorithm(const blink::WebCryptoAlgorithm& algorithm, Algo
rithmOperation op, String& errorDetails) const | 182 bool Key::canBeUsedForAlgorithm(const blink::WebCryptoAlgorithm& algorithm, Algo
rithmOperation op, CryptoResult* result) const |
| 181 { | 183 { |
| 182 if (!(m_key.usages() & toKeyUsage(op))) { | 184 if (!(m_key.usages() & toKeyUsage(op))) { |
| 183 errorDetails = "key.usages does not permit this operation"; | 185 result->completeWithError("key.usages does not permit this operation"); |
| 184 return false; | 186 return false; |
| 185 } | 187 } |
| 186 | 188 |
| 187 if (m_key.algorithm().id() != algorithm.id()) { | 189 if (m_key.algorithm().id() != algorithm.id()) { |
| 188 errorDetails = "key.algorithm does not match that of operation"; | 190 result->completeWithError("key.algorithm does not match that of operatio
n"); |
| 189 return false; | 191 return false; |
| 190 } | 192 } |
| 191 | 193 |
| 192 // Verify that the algorithm-specific parameters for the key conform to the | 194 // Verify that the algorithm-specific parameters for the key conform to the |
| 193 // algorithm. | 195 // algorithm. |
| 194 // FIXME: This is incomplete and not future proof. Operational parameters | 196 // FIXME: This is incomplete and not future proof. Operational parameters |
| 195 // should be enumerated when defining new parameters. | 197 // should be enumerated when defining new parameters. |
| 196 | 198 |
| 197 if (m_key.algorithm().id() == blink::WebCryptoAlgorithmIdHmac) { | 199 if (m_key.algorithm().id() == blink::WebCryptoAlgorithmIdHmac) { |
| 198 blink::WebCryptoAlgorithmId keyHash; | 200 blink::WebCryptoAlgorithmId keyHash; |
| 199 blink::WebCryptoAlgorithmId algorithmHash; | 201 blink::WebCryptoAlgorithmId algorithmHash; |
| 200 if (!getHmacHashId(m_key.algorithm(), keyHash) || !getHmacHashId(algorit
hm, algorithmHash) || keyHash != algorithmHash) { | 202 if (!getHmacHashId(m_key.algorithm(), keyHash) || !getHmacHashId(algorit
hm, algorithmHash) || keyHash != algorithmHash) { |
| 201 errorDetails = "key.algorithm does not match that of operation (HMAC
's hash differs)"; | 203 result->completeWithError("key.algorithm does not match that of oper
ation (HMAC's hash differs)"); |
| 202 return false; | 204 return false; |
| 203 } | 205 } |
| 204 } | 206 } |
| 205 | 207 |
| 206 return true; | 208 return true; |
| 207 } | 209 } |
| 208 | 210 |
| 209 bool Key::parseFormat(const String& formatString, blink::WebCryptoKeyFormat& for
mat, ExceptionState& exceptionState) | 211 bool Key::parseFormat(const String& formatString, blink::WebCryptoKeyFormat& for
mat, CryptoResult* result) |
| 210 { | 212 { |
| 211 // There are few enough values that testing serially is fast enough. | 213 // There are few enough values that testing serially is fast enough. |
| 212 if (formatString == "raw") { | 214 if (formatString == "raw") { |
| 213 format = blink::WebCryptoKeyFormatRaw; | 215 format = blink::WebCryptoKeyFormatRaw; |
| 214 return true; | 216 return true; |
| 215 } | 217 } |
| 216 if (formatString == "pkcs8") { | 218 if (formatString == "pkcs8") { |
| 217 format = blink::WebCryptoKeyFormatPkcs8; | 219 format = blink::WebCryptoKeyFormatPkcs8; |
| 218 return true; | 220 return true; |
| 219 } | 221 } |
| 220 if (formatString == "spki") { | 222 if (formatString == "spki") { |
| 221 format = blink::WebCryptoKeyFormatSpki; | 223 format = blink::WebCryptoKeyFormatSpki; |
| 222 return true; | 224 return true; |
| 223 } | 225 } |
| 224 if (formatString == "jwk") { | 226 if (formatString == "jwk") { |
| 225 format = blink::WebCryptoKeyFormatJwk; | 227 format = blink::WebCryptoKeyFormatJwk; |
| 226 return true; | 228 return true; |
| 227 } | 229 } |
| 228 | 230 |
| 229 exceptionState.throwTypeError("Invalid keyFormat argument"); | 231 result->completeWithError("Invalid keyFormat argument"); |
| 230 return false; | 232 return false; |
| 231 } | 233 } |
| 232 | 234 |
| 233 bool Key::parseUsageMask(const Vector<String>& usages, blink::WebCryptoKeyUsageM
ask& mask, ExceptionState& exceptionState) | 235 bool Key::parseUsageMask(const Vector<String>& usages, blink::WebCryptoKeyUsageM
ask& mask, CryptoResult* result) |
| 234 { | 236 { |
| 235 mask = 0; | 237 mask = 0; |
| 236 for (size_t i = 0; i < usages.size(); ++i) { | 238 for (size_t i = 0; i < usages.size(); ++i) { |
| 237 blink::WebCryptoKeyUsageMask usage = keyUsageStringToMask(usages[i]); | 239 blink::WebCryptoKeyUsageMask usage = keyUsageStringToMask(usages[i]); |
| 238 if (!usage) { | 240 if (!usage) { |
| 239 exceptionState.throwTypeError("Invalid keyUsages argument"); | 241 result->completeWithError("Invalid keyUsages argument"); |
| 240 return false; | 242 return false; |
| 241 } | 243 } |
| 242 mask |= usage; | 244 mask |= usage; |
| 243 } | 245 } |
| 244 return true; | 246 return true; |
| 245 } | 247 } |
| 246 | 248 |
| 247 void Key::trace(Visitor* visitor) | 249 void Key::trace(Visitor* visitor) |
| 248 { | 250 { |
| 249 visitor->trace(m_algorithm); | 251 visitor->trace(m_algorithm); |
| 250 } | 252 } |
| 251 | 253 |
| 252 } // namespace WebCore | 254 } // namespace WebCore |
| OLD | NEW |