| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 jsonUtf8 = json.utf8(); | 114 jsonUtf8 = json.utf8(); |
| 115 return true; | 115 return true; |
| 116 } | 116 } |
| 117 | 117 |
| 118 SubtleCrypto::SubtleCrypto() | 118 SubtleCrypto::SubtleCrypto() |
| 119 { | 119 { |
| 120 } | 120 } |
| 121 | 121 |
| 122 ScriptPromise SubtleCrypto::encrypt(ScriptState* scriptState, const AlgorithmIde
ntifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) | 122 ScriptPromise SubtleCrypto::encrypt(ScriptState* scriptState, const AlgorithmIde
ntifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) |
| 123 { | 123 { |
| 124 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 124 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 125 ScriptPromise promise = result->promise(); | 125 ScriptPromise promise = result->promise(); |
| 126 | 126 |
| 127 if (!canAccessWebCrypto(scriptState, result.get())) | 127 if (!canAccessWebCrypto(scriptState, result)) |
| 128 return promise; | 128 return promise; |
| 129 | 129 |
| 130 WebCryptoAlgorithm algorithm; | 130 WebCryptoAlgorithm algorithm; |
| 131 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationEncrypt, algorithm, resu
lt.get())) | 131 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationEncrypt, algorithm, resu
lt)) |
| 132 return promise; | 132 return promise; |
| 133 | 133 |
| 134 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageEncrypt, result.
get())) | 134 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageEncrypt, result)
) |
| 135 return promise; | 135 return promise; |
| 136 | 136 |
| 137 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); | 137 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); |
| 138 Platform::current()->crypto()->encrypt(algorithm, key->key(), data.bytes(),
data.byteLength(), result->result()); | 138 Platform::current()->crypto()->encrypt(algorithm, key->key(), data.bytes(),
data.byteLength(), result->result()); |
| 139 return promise; | 139 return promise; |
| 140 } | 140 } |
| 141 | 141 |
| 142 ScriptPromise SubtleCrypto::decrypt(ScriptState* scriptState, const AlgorithmIde
ntifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) | 142 ScriptPromise SubtleCrypto::decrypt(ScriptState* scriptState, const AlgorithmIde
ntifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) |
| 143 { | 143 { |
| 144 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 144 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 145 ScriptPromise promise = result->promise(); | 145 ScriptPromise promise = result->promise(); |
| 146 | 146 |
| 147 if (!canAccessWebCrypto(scriptState, result.get())) | 147 if (!canAccessWebCrypto(scriptState, result)) |
| 148 return promise; | 148 return promise; |
| 149 | 149 |
| 150 WebCryptoAlgorithm algorithm; | 150 WebCryptoAlgorithm algorithm; |
| 151 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDecrypt, algorithm, resu
lt.get())) | 151 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDecrypt, algorithm, resu
lt)) |
| 152 return promise; | 152 return promise; |
| 153 | 153 |
| 154 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDecrypt, result.
get())) | 154 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDecrypt, result)
) |
| 155 return promise; | 155 return promise; |
| 156 | 156 |
| 157 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); | 157 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); |
| 158 Platform::current()->crypto()->decrypt(algorithm, key->key(), data.bytes(),
data.byteLength(), result->result()); | 158 Platform::current()->crypto()->decrypt(algorithm, key->key(), data.bytes(),
data.byteLength(), result->result()); |
| 159 return promise; | 159 return promise; |
| 160 } | 160 } |
| 161 | 161 |
| 162 ScriptPromise SubtleCrypto::sign(ScriptState* scriptState, const AlgorithmIdenti
fier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) | 162 ScriptPromise SubtleCrypto::sign(ScriptState* scriptState, const AlgorithmIdenti
fier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& data) |
| 163 { | 163 { |
| 164 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 164 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 165 ScriptPromise promise = result->promise(); | 165 ScriptPromise promise = result->promise(); |
| 166 | 166 |
| 167 if (!canAccessWebCrypto(scriptState, result.get())) | 167 if (!canAccessWebCrypto(scriptState, result)) |
| 168 return promise; | 168 return promise; |
| 169 | 169 |
| 170 WebCryptoAlgorithm algorithm; | 170 WebCryptoAlgorithm algorithm; |
| 171 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationSign, algorithm, result.
get())) | 171 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationSign, algorithm, result)
) |
| 172 return promise; | 172 return promise; |
| 173 | 173 |
| 174 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageSign, result.get
())) | 174 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageSign, result)) |
| 175 return promise; | 175 return promise; |
| 176 | 176 |
| 177 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); | 177 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); |
| 178 Platform::current()->crypto()->sign(algorithm, key->key(), data.bytes(), dat
a.byteLength(), result->result()); | 178 Platform::current()->crypto()->sign(algorithm, key->key(), data.bytes(), dat
a.byteLength(), result->result()); |
| 179 return promise; | 179 return promise; |
| 180 } | 180 } |
| 181 | 181 |
| 182 ScriptPromise SubtleCrypto::verifySignature(ScriptState* scriptState, const Algo
rithmIdentifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& signature, c
onst DOMArrayPiece& data) | 182 ScriptPromise SubtleCrypto::verifySignature(ScriptState* scriptState, const Algo
rithmIdentifier& rawAlgorithm, CryptoKey* key, const DOMArrayPiece& signature, c
onst DOMArrayPiece& data) |
| 183 { | 183 { |
| 184 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 184 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 185 ScriptPromise promise = result->promise(); | 185 ScriptPromise promise = result->promise(); |
| 186 | 186 |
| 187 if (!canAccessWebCrypto(scriptState, result.get())) | 187 if (!canAccessWebCrypto(scriptState, result)) |
| 188 return promise; | 188 return promise; |
| 189 | 189 |
| 190 WebCryptoAlgorithm algorithm; | 190 WebCryptoAlgorithm algorithm; |
| 191 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationVerify, algorithm, resul
t.get())) | 191 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationVerify, algorithm, resul
t)) |
| 192 return promise; | 192 return promise; |
| 193 | 193 |
| 194 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageVerify, result.g
et())) | 194 if (!key->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageVerify, result)) |
| 195 return promise; | 195 return promise; |
| 196 | 196 |
| 197 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); | 197 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, key->ke
y()); |
| 198 Platform::current()->crypto()->verifySignature(algorithm, key->key(), signat
ure.bytes(), signature.byteLength(), data.bytes(), data.byteLength(), result->re
sult()); | 198 Platform::current()->crypto()->verifySignature(algorithm, key->key(), signat
ure.bytes(), signature.byteLength(), data.bytes(), data.byteLength(), result->re
sult()); |
| 199 return promise; | 199 return promise; |
| 200 } | 200 } |
| 201 | 201 |
| 202 ScriptPromise SubtleCrypto::digest(ScriptState* scriptState, const AlgorithmIden
tifier& rawAlgorithm, const DOMArrayPiece& data) | 202 ScriptPromise SubtleCrypto::digest(ScriptState* scriptState, const AlgorithmIden
tifier& rawAlgorithm, const DOMArrayPiece& data) |
| 203 { | 203 { |
| 204 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 204 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 205 ScriptPromise promise = result->promise(); | 205 ScriptPromise promise = result->promise(); |
| 206 | 206 |
| 207 if (!canAccessWebCrypto(scriptState, result.get())) | 207 if (!canAccessWebCrypto(scriptState, result)) |
| 208 return promise; | 208 return promise; |
| 209 | 209 |
| 210 WebCryptoAlgorithm algorithm; | 210 WebCryptoAlgorithm algorithm; |
| 211 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDigest, algorithm, resul
t.get())) | 211 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDigest, algorithm, resul
t)) |
| 212 return promise; | 212 return promise; |
| 213 | 213 |
| 214 histogramAlgorithm(scriptState->executionContext(), algorithm); | 214 histogramAlgorithm(scriptState->executionContext(), algorithm); |
| 215 Platform::current()->crypto()->digest(algorithm, data.bytes(), data.byteLeng
th(), result->result()); | 215 Platform::current()->crypto()->digest(algorithm, data.bytes(), data.byteLeng
th(), result->result()); |
| 216 return promise; | 216 return promise; |
| 217 } | 217 } |
| 218 | 218 |
| 219 ScriptPromise SubtleCrypto::generateKey(ScriptState* scriptState, const Algorith
mIdentifier& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) | 219 ScriptPromise SubtleCrypto::generateKey(ScriptState* scriptState, const Algorith
mIdentifier& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) |
| 220 { | 220 { |
| 221 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 221 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 222 ScriptPromise promise = result->promise(); | 222 ScriptPromise promise = result->promise(); |
| 223 | 223 |
| 224 if (!canAccessWebCrypto(scriptState, result.get())) | 224 if (!canAccessWebCrypto(scriptState, result)) |
| 225 return promise; | 225 return promise; |
| 226 | 226 |
| 227 WebCryptoKeyUsageMask keyUsages; | 227 WebCryptoKeyUsageMask keyUsages; |
| 228 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result.get())) | 228 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result)) |
| 229 return promise; | 229 return promise; |
| 230 | 230 |
| 231 WebCryptoAlgorithm algorithm; | 231 WebCryptoAlgorithm algorithm; |
| 232 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationGenerateKey, algorithm,
result.get())) | 232 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationGenerateKey, algorithm,
result)) |
| 233 return promise; | 233 return promise; |
| 234 | 234 |
| 235 histogramAlgorithm(scriptState->executionContext(), algorithm); | 235 histogramAlgorithm(scriptState->executionContext(), algorithm); |
| 236 Platform::current()->crypto()->generateKey(algorithm, extractable, keyUsages
, result->result()); | 236 Platform::current()->crypto()->generateKey(algorithm, extractable, keyUsages
, result->result()); |
| 237 return promise; | 237 return promise; |
| 238 } | 238 } |
| 239 | 239 |
| 240 ScriptPromise SubtleCrypto::importKey(ScriptState* scriptState, const String& ra
wFormat, const ArrayBufferOrArrayBufferViewOrDictionary& keyData, const Algorith
mIdentifier& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) | 240 ScriptPromise SubtleCrypto::importKey(ScriptState* scriptState, const String& ra
wFormat, const ArrayBufferOrArrayBufferViewOrDictionary& keyData, const Algorith
mIdentifier& rawAlgorithm, bool extractable, const Vector<String>& rawKeyUsages) |
| 241 { | 241 { |
| 242 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 242 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 243 ScriptPromise promise = result->promise(); | 243 ScriptPromise promise = result->promise(); |
| 244 | 244 |
| 245 if (!canAccessWebCrypto(scriptState, result.get())) | 245 if (!canAccessWebCrypto(scriptState, result)) |
| 246 return promise; | 246 return promise; |
| 247 | 247 |
| 248 WebCryptoKeyFormat format; | 248 WebCryptoKeyFormat format; |
| 249 if (!CryptoKey::parseFormat(rawFormat, format, result.get())) | 249 if (!CryptoKey::parseFormat(rawFormat, format, result)) |
| 250 return promise; | 250 return promise; |
| 251 | 251 |
| 252 if (keyData.isDictionary()) { | 252 if (keyData.isDictionary()) { |
| 253 if (format != WebCryptoKeyFormatJwk) { | 253 if (format != WebCryptoKeyFormatJwk) { |
| 254 result->completeWithError(WebCryptoErrorTypeData, "Key data must be
a buffer for non-JWK formats"); | 254 result->completeWithError(WebCryptoErrorTypeData, "Key data must be
a buffer for non-JWK formats"); |
| 255 return promise; | 255 return promise; |
| 256 } | 256 } |
| 257 } else if (format == WebCryptoKeyFormatJwk) { | 257 } else if (format == WebCryptoKeyFormatJwk) { |
| 258 result->completeWithError(WebCryptoErrorTypeData, "Key data must be an o
bject for JWK import"); | 258 result->completeWithError(WebCryptoErrorTypeData, "Key data must be an o
bject for JWK import"); |
| 259 return promise; | 259 return promise; |
| 260 } | 260 } |
| 261 | 261 |
| 262 WebCryptoKeyUsageMask keyUsages; | 262 WebCryptoKeyUsageMask keyUsages; |
| 263 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result.get())) | 263 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result)) |
| 264 return promise; | 264 return promise; |
| 265 | 265 |
| 266 WebCryptoAlgorithm algorithm; | 266 WebCryptoAlgorithm algorithm; |
| 267 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationImportKey, algorithm, re
sult.get())) | 267 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationImportKey, algorithm, re
sult)) |
| 268 return promise; | 268 return promise; |
| 269 | 269 |
| 270 const unsigned char* ptr = nullptr; | 270 const unsigned char* ptr = nullptr; |
| 271 unsigned len = 0; | 271 unsigned len = 0; |
| 272 | 272 |
| 273 CString jsonUtf8; | 273 CString jsonUtf8; |
| 274 if (keyData.isArrayBuffer()) { | 274 if (keyData.isArrayBuffer()) { |
| 275 ptr = static_cast<const unsigned char*>(keyData.getAsArrayBuffer()->data
()); | 275 ptr = static_cast<const unsigned char*>(keyData.getAsArrayBuffer()->data
()); |
| 276 len = keyData.getAsArrayBuffer()->byteLength(); | 276 len = keyData.getAsArrayBuffer()->byteLength(); |
| 277 } else if (keyData.isArrayBufferView()) { | 277 } else if (keyData.isArrayBufferView()) { |
| 278 ptr = static_cast<const unsigned char*>(keyData.getAsArrayBufferView()->
baseAddress()); | 278 ptr = static_cast<const unsigned char*>(keyData.getAsArrayBufferView()->
baseAddress()); |
| 279 len = keyData.getAsArrayBufferView()->byteLength(); | 279 len = keyData.getAsArrayBufferView()->byteLength(); |
| 280 } else if (keyData.isDictionary()) { | 280 } else if (keyData.isDictionary()) { |
| 281 if (!copyJwkDictionaryToJson(keyData.getAsDictionary(), jsonUtf8, result
.get())) | 281 if (!copyJwkDictionaryToJson(keyData.getAsDictionary(), jsonUtf8, result
)) |
| 282 return promise; | 282 return promise; |
| 283 ptr = reinterpret_cast<const unsigned char*>(jsonUtf8.data()); | 283 ptr = reinterpret_cast<const unsigned char*>(jsonUtf8.data()); |
| 284 len = jsonUtf8.length(); | 284 len = jsonUtf8.length(); |
| 285 } | 285 } |
| 286 histogramAlgorithm(scriptState->executionContext(), algorithm); | 286 histogramAlgorithm(scriptState->executionContext(), algorithm); |
| 287 Platform::current()->crypto()->importKey(format, ptr, len, algorithm, extrac
table, keyUsages, result->result()); | 287 Platform::current()->crypto()->importKey(format, ptr, len, algorithm, extrac
table, keyUsages, result->result()); |
| 288 return promise; | 288 return promise; |
| 289 } | 289 } |
| 290 | 290 |
| 291 ScriptPromise SubtleCrypto::exportKey(ScriptState* scriptState, const String& ra
wFormat, CryptoKey* key) | 291 ScriptPromise SubtleCrypto::exportKey(ScriptState* scriptState, const String& ra
wFormat, CryptoKey* key) |
| 292 { | 292 { |
| 293 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 293 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 294 ScriptPromise promise = result->promise(); | 294 ScriptPromise promise = result->promise(); |
| 295 | 295 |
| 296 if (!canAccessWebCrypto(scriptState, result.get())) | 296 if (!canAccessWebCrypto(scriptState, result)) |
| 297 return promise; | 297 return promise; |
| 298 | 298 |
| 299 WebCryptoKeyFormat format; | 299 WebCryptoKeyFormat format; |
| 300 if (!CryptoKey::parseFormat(rawFormat, format, result.get())) | 300 if (!CryptoKey::parseFormat(rawFormat, format, result)) |
| 301 return promise; | 301 return promise; |
| 302 | 302 |
| 303 if (!key->extractable()) { | 303 if (!key->extractable()) { |
| 304 result->completeWithError(WebCryptoErrorTypeInvalidAccess, "key is not e
xtractable"); | 304 result->completeWithError(WebCryptoErrorTypeInvalidAccess, "key is not e
xtractable"); |
| 305 return promise; | 305 return promise; |
| 306 } | 306 } |
| 307 | 307 |
| 308 histogramKey(scriptState->executionContext(), key->key()); | 308 histogramKey(scriptState->executionContext(), key->key()); |
| 309 Platform::current()->crypto()->exportKey(format, key->key(), result->result(
)); | 309 Platform::current()->crypto()->exportKey(format, key->key(), result->result(
)); |
| 310 return promise; | 310 return promise; |
| 311 } | 311 } |
| 312 | 312 |
| 313 ScriptPromise SubtleCrypto::wrapKey(ScriptState* scriptState, const String& rawF
ormat, CryptoKey* key, CryptoKey* wrappingKey, const AlgorithmIdentifier& rawWra
pAlgorithm) | 313 ScriptPromise SubtleCrypto::wrapKey(ScriptState* scriptState, const String& rawF
ormat, CryptoKey* key, CryptoKey* wrappingKey, const AlgorithmIdentifier& rawWra
pAlgorithm) |
| 314 { | 314 { |
| 315 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 315 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 316 ScriptPromise promise = result->promise(); | 316 ScriptPromise promise = result->promise(); |
| 317 | 317 |
| 318 if (!canAccessWebCrypto(scriptState, result.get())) | 318 if (!canAccessWebCrypto(scriptState, result)) |
| 319 return promise; | 319 return promise; |
| 320 | 320 |
| 321 WebCryptoKeyFormat format; | 321 WebCryptoKeyFormat format; |
| 322 if (!CryptoKey::parseFormat(rawFormat, format, result.get())) | 322 if (!CryptoKey::parseFormat(rawFormat, format, result)) |
| 323 return promise; | 323 return promise; |
| 324 | 324 |
| 325 WebCryptoAlgorithm wrapAlgorithm; | 325 WebCryptoAlgorithm wrapAlgorithm; |
| 326 if (!parseAlgorithm(rawWrapAlgorithm, WebCryptoOperationWrapKey, wrapAlgorit
hm, result.get())) | 326 if (!parseAlgorithm(rawWrapAlgorithm, WebCryptoOperationWrapKey, wrapAlgorit
hm, result)) |
| 327 return promise; | 327 return promise; |
| 328 | 328 |
| 329 if (!key->extractable()) { | 329 if (!key->extractable()) { |
| 330 result->completeWithError(WebCryptoErrorTypeInvalidAccess, "key is not e
xtractable"); | 330 result->completeWithError(WebCryptoErrorTypeInvalidAccess, "key is not e
xtractable"); |
| 331 return promise; | 331 return promise; |
| 332 } | 332 } |
| 333 | 333 |
| 334 if (!wrappingKey->canBeUsedForAlgorithm(wrapAlgorithm, WebCryptoKeyUsageWrap
Key, result.get())) | 334 if (!wrappingKey->canBeUsedForAlgorithm(wrapAlgorithm, WebCryptoKeyUsageWrap
Key, result)) |
| 335 return promise; | 335 return promise; |
| 336 | 336 |
| 337 histogramAlgorithmAndKey(scriptState->executionContext(), wrapAlgorithm, wra
ppingKey->key()); | 337 histogramAlgorithmAndKey(scriptState->executionContext(), wrapAlgorithm, wra
ppingKey->key()); |
| 338 histogramKey(scriptState->executionContext(), key->key()); | 338 histogramKey(scriptState->executionContext(), key->key()); |
| 339 Platform::current()->crypto()->wrapKey(format, key->key(), wrappingKey->key(
), wrapAlgorithm, result->result()); | 339 Platform::current()->crypto()->wrapKey(format, key->key(), wrappingKey->key(
), wrapAlgorithm, result->result()); |
| 340 return promise; | 340 return promise; |
| 341 } | 341 } |
| 342 | 342 |
| 343 ScriptPromise SubtleCrypto::unwrapKey(ScriptState* scriptState, const String& ra
wFormat, const DOMArrayPiece& wrappedKey, CryptoKey* unwrappingKey, const Algori
thmIdentifier& rawUnwrapAlgorithm, const AlgorithmIdentifier& rawUnwrappedKeyAlg
orithm, bool extractable, const Vector<String>& rawKeyUsages) | 343 ScriptPromise SubtleCrypto::unwrapKey(ScriptState* scriptState, const String& ra
wFormat, const DOMArrayPiece& wrappedKey, CryptoKey* unwrappingKey, const Algori
thmIdentifier& rawUnwrapAlgorithm, const AlgorithmIdentifier& rawUnwrappedKeyAlg
orithm, bool extractable, const Vector<String>& rawKeyUsages) |
| 344 { | 344 { |
| 345 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 345 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 346 ScriptPromise promise = result->promise(); | 346 ScriptPromise promise = result->promise(); |
| 347 | 347 |
| 348 if (!canAccessWebCrypto(scriptState, result.get())) | 348 if (!canAccessWebCrypto(scriptState, result)) |
| 349 return promise; | 349 return promise; |
| 350 | 350 |
| 351 WebCryptoKeyFormat format; | 351 WebCryptoKeyFormat format; |
| 352 if (!CryptoKey::parseFormat(rawFormat, format, result.get())) | 352 if (!CryptoKey::parseFormat(rawFormat, format, result)) |
| 353 return promise; | 353 return promise; |
| 354 | 354 |
| 355 WebCryptoKeyUsageMask keyUsages; | 355 WebCryptoKeyUsageMask keyUsages; |
| 356 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result.get())) | 356 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result)) |
| 357 return promise; | 357 return promise; |
| 358 | 358 |
| 359 WebCryptoAlgorithm unwrapAlgorithm; | 359 WebCryptoAlgorithm unwrapAlgorithm; |
| 360 if (!parseAlgorithm(rawUnwrapAlgorithm, WebCryptoOperationUnwrapKey, unwrapA
lgorithm, result.get())) | 360 if (!parseAlgorithm(rawUnwrapAlgorithm, WebCryptoOperationUnwrapKey, unwrapA
lgorithm, result)) |
| 361 return promise; | 361 return promise; |
| 362 | 362 |
| 363 WebCryptoAlgorithm unwrappedKeyAlgorithm; | 363 WebCryptoAlgorithm unwrappedKeyAlgorithm; |
| 364 if (!parseAlgorithm(rawUnwrappedKeyAlgorithm, WebCryptoOperationImportKey, u
nwrappedKeyAlgorithm, result.get())) | 364 if (!parseAlgorithm(rawUnwrappedKeyAlgorithm, WebCryptoOperationImportKey, u
nwrappedKeyAlgorithm, result)) |
| 365 return promise; | 365 return promise; |
| 366 | 366 |
| 367 if (!unwrappingKey->canBeUsedForAlgorithm(unwrapAlgorithm, WebCryptoKeyUsage
UnwrapKey, result.get())) | 367 if (!unwrappingKey->canBeUsedForAlgorithm(unwrapAlgorithm, WebCryptoKeyUsage
UnwrapKey, result)) |
| 368 return promise; | 368 return promise; |
| 369 | 369 |
| 370 histogramAlgorithmAndKey(scriptState->executionContext(), unwrapAlgorithm, u
nwrappingKey->key()); | 370 histogramAlgorithmAndKey(scriptState->executionContext(), unwrapAlgorithm, u
nwrappingKey->key()); |
| 371 histogramAlgorithm(scriptState->executionContext(), unwrappedKeyAlgorithm); | 371 histogramAlgorithm(scriptState->executionContext(), unwrappedKeyAlgorithm); |
| 372 Platform::current()->crypto()->unwrapKey(format, wrappedKey.bytes(), wrapped
Key.byteLength(), unwrappingKey->key(), unwrapAlgorithm, unwrappedKeyAlgorithm,
extractable, keyUsages, result->result()); | 372 Platform::current()->crypto()->unwrapKey(format, wrappedKey.bytes(), wrapped
Key.byteLength(), unwrappingKey->key(), unwrapAlgorithm, unwrappedKeyAlgorithm,
extractable, keyUsages, result->result()); |
| 373 return promise; | 373 return promise; |
| 374 } | 374 } |
| 375 | 375 |
| 376 ScriptPromise SubtleCrypto::deriveBits(ScriptState* scriptState, const Algorithm
Identifier& rawAlgorithm, CryptoKey* baseKey, unsigned lengthBits) | 376 ScriptPromise SubtleCrypto::deriveBits(ScriptState* scriptState, const Algorithm
Identifier& rawAlgorithm, CryptoKey* baseKey, unsigned lengthBits) |
| 377 { | 377 { |
| 378 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 378 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 379 ScriptPromise promise = result->promise(); | 379 ScriptPromise promise = result->promise(); |
| 380 | 380 |
| 381 if (!canAccessWebCrypto(scriptState, result.get())) | 381 if (!canAccessWebCrypto(scriptState, result)) |
| 382 return promise; | 382 return promise; |
| 383 | 383 |
| 384 WebCryptoAlgorithm algorithm; | 384 WebCryptoAlgorithm algorithm; |
| 385 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDeriveBits, algorithm, r
esult.get())) | 385 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDeriveBits, algorithm, r
esult)) |
| 386 return promise; | 386 return promise; |
| 387 | 387 |
| 388 if (!baseKey->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDeriveBits,
result.get())) | 388 if (!baseKey->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDeriveBits,
result)) |
| 389 return promise; | 389 return promise; |
| 390 | 390 |
| 391 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey
->key()); | 391 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey
->key()); |
| 392 Platform::current()->crypto()->deriveBits(algorithm, baseKey->key(), lengthB
its, result->result()); | 392 Platform::current()->crypto()->deriveBits(algorithm, baseKey->key(), lengthB
its, result->result()); |
| 393 return promise; | 393 return promise; |
| 394 } | 394 } |
| 395 | 395 |
| 396 ScriptPromise SubtleCrypto::deriveKey(ScriptState* scriptState, const AlgorithmI
dentifier& rawAlgorithm, CryptoKey* baseKey, const AlgorithmIdentifier& rawDeriv
edKeyType, bool extractable, const Vector<String>& rawKeyUsages) | 396 ScriptPromise SubtleCrypto::deriveKey(ScriptState* scriptState, const AlgorithmI
dentifier& rawAlgorithm, CryptoKey* baseKey, const AlgorithmIdentifier& rawDeriv
edKeyType, bool extractable, const Vector<String>& rawKeyUsages) |
| 397 { | 397 { |
| 398 RefPtrWillBeRawPtr<CryptoResultImpl> result = CryptoResultImpl::create(scrip
tState); | 398 CryptoResultImpl* result = CryptoResultImpl::create(scriptState); |
| 399 ScriptPromise promise = result->promise(); | 399 ScriptPromise promise = result->promise(); |
| 400 | 400 |
| 401 if (!canAccessWebCrypto(scriptState, result.get())) | 401 if (!canAccessWebCrypto(scriptState, result)) |
| 402 return promise; | 402 return promise; |
| 403 | 403 |
| 404 WebCryptoKeyUsageMask keyUsages; | 404 WebCryptoKeyUsageMask keyUsages; |
| 405 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result.get())) | 405 if (!CryptoKey::parseUsageMask(rawKeyUsages, keyUsages, result)) |
| 406 return promise; | 406 return promise; |
| 407 | 407 |
| 408 WebCryptoAlgorithm algorithm; | 408 WebCryptoAlgorithm algorithm; |
| 409 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDeriveBits, algorithm, r
esult.get())) | 409 if (!parseAlgorithm(rawAlgorithm, WebCryptoOperationDeriveBits, algorithm, r
esult)) |
| 410 return promise; | 410 return promise; |
| 411 | 411 |
| 412 if (!baseKey->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDeriveKey, r
esult.get())) | 412 if (!baseKey->canBeUsedForAlgorithm(algorithm, WebCryptoKeyUsageDeriveKey, r
esult)) |
| 413 return promise; | 413 return promise; |
| 414 | 414 |
| 415 WebCryptoAlgorithm importAlgorithm; | 415 WebCryptoAlgorithm importAlgorithm; |
| 416 if (!parseAlgorithm(rawDerivedKeyType, WebCryptoOperationImportKey, importAl
gorithm, result.get())) | 416 if (!parseAlgorithm(rawDerivedKeyType, WebCryptoOperationImportKey, importAl
gorithm, result)) |
| 417 return promise; | 417 return promise; |
| 418 | 418 |
| 419 WebCryptoAlgorithm keyLengthAlgorithm; | 419 WebCryptoAlgorithm keyLengthAlgorithm; |
| 420 if (!parseAlgorithm(rawDerivedKeyType, WebCryptoOperationGetKeyLength, keyLe
ngthAlgorithm, result.get())) | 420 if (!parseAlgorithm(rawDerivedKeyType, WebCryptoOperationGetKeyLength, keyLe
ngthAlgorithm, result)) |
| 421 return promise; | 421 return promise; |
| 422 | 422 |
| 423 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey
->key()); | 423 histogramAlgorithmAndKey(scriptState->executionContext(), algorithm, baseKey
->key()); |
| 424 histogramAlgorithm(scriptState->executionContext(), importAlgorithm); | 424 histogramAlgorithm(scriptState->executionContext(), importAlgorithm); |
| 425 Platform::current()->crypto()->deriveKey(algorithm, baseKey->key(), importAl
gorithm, keyLengthAlgorithm, extractable, keyUsages, result->result()); | 425 Platform::current()->crypto()->deriveKey(algorithm, baseKey->key(), importAl
gorithm, keyLengthAlgorithm, extractable, keyUsages, result->result()); |
| 426 return promise; | 426 return promise; |
| 427 } | 427 } |
| 428 | 428 |
| 429 } // namespace blink | 429 } // namespace blink |
| OLD | NEW |