| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 AlgorithmError error; | 54 AlgorithmError error; |
| 55 bool success = NormalizeAlgorithm(raw, op, algorithm, &error); | 55 bool success = NormalizeAlgorithm(raw, op, algorithm, &error); |
| 56 if (!success) | 56 if (!success) |
| 57 result->CompleteWithError(error.error_type, error.error_details); | 57 result->CompleteWithError(error.error_type, error.error_details); |
| 58 return success; | 58 return success; |
| 59 } | 59 } |
| 60 | 60 |
| 61 static bool CanAccessWebCrypto(ScriptState* script_state, | 61 static bool CanAccessWebCrypto(ScriptState* script_state, |
| 62 CryptoResult* result) { | 62 CryptoResult* result) { |
| 63 String error_message; | 63 String error_message; |
| 64 if (!script_state->GetExecutionContext()->IsSecureContext( | 64 if (!ExecutionContext::From(script_state) |
| 65 error_message, ExecutionContext::kWebCryptoSecureContextCheck)) { | 65 ->IsSecureContext(error_message, |
| 66 ExecutionContext::kWebCryptoSecureContextCheck)) { |
| 66 result->CompleteWithError(kWebCryptoErrorTypeNotSupported, error_message); | 67 result->CompleteWithError(kWebCryptoErrorTypeNotSupported, error_message); |
| 67 return false; | 68 return false; |
| 68 } | 69 } |
| 69 | 70 |
| 70 if (!script_state->GetExecutionContext()->IsSecureContext()) { | 71 if (!ExecutionContext::From(script_state)->IsSecureContext()) { |
| 71 Deprecation::CountDeprecation( | 72 Deprecation::CountDeprecation( |
| 72 script_state->GetExecutionContext(), | 73 ExecutionContext::From(script_state), |
| 73 UseCounter::kSubtleCryptoOnlyStrictSecureContextCheckFailed); | 74 UseCounter::kSubtleCryptoOnlyStrictSecureContextCheckFailed); |
| 74 } | 75 } |
| 75 | 76 |
| 76 return true; | 77 return true; |
| 77 } | 78 } |
| 78 | 79 |
| 79 static bool CopyStringProperty(const char* property, | 80 static bool CopyStringProperty(const char* property, |
| 80 const Dictionary& source, | 81 const Dictionary& source, |
| 81 JSONObject* destination) { | 82 JSONObject* destination) { |
| 82 String value; | 83 String value; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 // 14.3.1.8: If the name member of normalizedAlgorithm is not equal to the | 207 // 14.3.1.8: If the name member of normalizedAlgorithm is not equal to the |
| 207 // name attribute of the [[algorithm]] internal slot of key then | 208 // name attribute of the [[algorithm]] internal slot of key then |
| 208 // throw an InvalidAccessError. | 209 // throw an InvalidAccessError. |
| 209 // | 210 // |
| 210 // 14.3.1.9: If the [[usages]] internal slot of key does not contain an | 211 // 14.3.1.9: If the [[usages]] internal slot of key does not contain an |
| 211 // entry that is "encrypt", then throw an InvalidAccessError. | 212 // entry that is "encrypt", then throw an InvalidAccessError. |
| 212 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, | 213 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, |
| 213 kWebCryptoKeyUsageEncrypt, result)) | 214 kWebCryptoKeyUsageEncrypt, result)) |
| 214 return promise; | 215 return promise; |
| 215 | 216 |
| 216 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 217 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 217 normalized_algorithm, key->Key()); | 218 normalized_algorithm, key->Key()); |
| 218 Platform::Current()->Crypto()->Encrypt(normalized_algorithm, key->Key(), | 219 Platform::Current()->Crypto()->Encrypt(normalized_algorithm, key->Key(), |
| 219 std::move(data), result->Result()); | 220 std::move(data), result->Result()); |
| 220 return promise; | 221 return promise; |
| 221 } | 222 } |
| 222 | 223 |
| 223 ScriptPromise SubtleCrypto::decrypt(ScriptState* script_state, | 224 ScriptPromise SubtleCrypto::decrypt(ScriptState* script_state, |
| 224 const AlgorithmIdentifier& raw_algorithm, | 225 const AlgorithmIdentifier& raw_algorithm, |
| 225 CryptoKey* key, | 226 CryptoKey* key, |
| 226 const BufferSource& raw_data) { | 227 const BufferSource& raw_data) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 247 // 14.3.2.8: If the name member of normalizedAlgorithm is not equal to the | 248 // 14.3.2.8: If the name member of normalizedAlgorithm is not equal to the |
| 248 // name attribute of the [[algorithm]] internal slot of key then | 249 // name attribute of the [[algorithm]] internal slot of key then |
| 249 // throw an InvalidAccessError. | 250 // throw an InvalidAccessError. |
| 250 // | 251 // |
| 251 // 14.3.2.9: If the [[usages]] internal slot of key does not contain an | 252 // 14.3.2.9: If the [[usages]] internal slot of key does not contain an |
| 252 // entry that is "decrypt", then throw an InvalidAccessError. | 253 // entry that is "decrypt", then throw an InvalidAccessError. |
| 253 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, | 254 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, |
| 254 kWebCryptoKeyUsageDecrypt, result)) | 255 kWebCryptoKeyUsageDecrypt, result)) |
| 255 return promise; | 256 return promise; |
| 256 | 257 |
| 257 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 258 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 258 normalized_algorithm, key->Key()); | 259 normalized_algorithm, key->Key()); |
| 259 Platform::Current()->Crypto()->Decrypt(normalized_algorithm, key->Key(), | 260 Platform::Current()->Crypto()->Decrypt(normalized_algorithm, key->Key(), |
| 260 std::move(data), result->Result()); | 261 std::move(data), result->Result()); |
| 261 return promise; | 262 return promise; |
| 262 } | 263 } |
| 263 | 264 |
| 264 ScriptPromise SubtleCrypto::sign(ScriptState* script_state, | 265 ScriptPromise SubtleCrypto::sign(ScriptState* script_state, |
| 265 const AlgorithmIdentifier& raw_algorithm, | 266 const AlgorithmIdentifier& raw_algorithm, |
| 266 CryptoKey* key, | 267 CryptoKey* key, |
| 267 const BufferSource& raw_data) { | 268 const BufferSource& raw_data) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 288 // 14.3.3.8: If the name member of normalizedAlgorithm is not equal to the | 289 // 14.3.3.8: If the name member of normalizedAlgorithm is not equal to the |
| 289 // name attribute of the [[algorithm]] internal slot of key then | 290 // name attribute of the [[algorithm]] internal slot of key then |
| 290 // throw an InvalidAccessError. | 291 // throw an InvalidAccessError. |
| 291 // | 292 // |
| 292 // 14.3.3.9: If the [[usages]] internal slot of key does not contain an | 293 // 14.3.3.9: If the [[usages]] internal slot of key does not contain an |
| 293 // entry that is "sign", then throw an InvalidAccessError. | 294 // entry that is "sign", then throw an InvalidAccessError. |
| 294 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, kWebCryptoKeyUsageSign, | 295 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, kWebCryptoKeyUsageSign, |
| 295 result)) | 296 result)) |
| 296 return promise; | 297 return promise; |
| 297 | 298 |
| 298 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 299 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 299 normalized_algorithm, key->Key()); | 300 normalized_algorithm, key->Key()); |
| 300 Platform::Current()->Crypto()->Sign(normalized_algorithm, key->Key(), | 301 Platform::Current()->Crypto()->Sign(normalized_algorithm, key->Key(), |
| 301 std::move(data), result->Result()); | 302 std::move(data), result->Result()); |
| 302 return promise; | 303 return promise; |
| 303 } | 304 } |
| 304 | 305 |
| 305 ScriptPromise SubtleCrypto::verifySignature( | 306 ScriptPromise SubtleCrypto::verifySignature( |
| 306 ScriptState* script_state, | 307 ScriptState* script_state, |
| 307 const AlgorithmIdentifier& raw_algorithm, | 308 const AlgorithmIdentifier& raw_algorithm, |
| 308 CryptoKey* key, | 309 CryptoKey* key, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 335 // 14.3.4.9: If the name member of normalizedAlgorithm is not equal to the | 336 // 14.3.4.9: If the name member of normalizedAlgorithm is not equal to the |
| 336 // name attribute of the [[algorithm]] internal slot of key then | 337 // name attribute of the [[algorithm]] internal slot of key then |
| 337 // throw an InvalidAccessError. | 338 // throw an InvalidAccessError. |
| 338 // | 339 // |
| 339 // 14.3.4.10: If the [[usages]] internal slot of key does not contain an | 340 // 14.3.4.10: If the [[usages]] internal slot of key does not contain an |
| 340 // entry that is "verify", then throw an InvalidAccessError. | 341 // entry that is "verify", then throw an InvalidAccessError. |
| 341 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, | 342 if (!key->CanBeUsedForAlgorithm(normalized_algorithm, |
| 342 kWebCryptoKeyUsageVerify, result)) | 343 kWebCryptoKeyUsageVerify, result)) |
| 343 return promise; | 344 return promise; |
| 344 | 345 |
| 345 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 346 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 346 normalized_algorithm, key->Key()); | 347 normalized_algorithm, key->Key()); |
| 347 Platform::Current()->Crypto()->VerifySignature( | 348 Platform::Current()->Crypto()->VerifySignature( |
| 348 normalized_algorithm, key->Key(), std::move(signature), std::move(data), | 349 normalized_algorithm, key->Key(), std::move(signature), std::move(data), |
| 349 result->Result()); | 350 result->Result()); |
| 350 return promise; | 351 return promise; |
| 351 } | 352 } |
| 352 | 353 |
| 353 ScriptPromise SubtleCrypto::digest(ScriptState* script_state, | 354 ScriptPromise SubtleCrypto::digest(ScriptState* script_state, |
| 354 const AlgorithmIdentifier& raw_algorithm, | 355 const AlgorithmIdentifier& raw_algorithm, |
| 355 const BufferSource& raw_data) { | 356 const BufferSource& raw_data) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 366 // by the data parameter passed to the digest method. | 367 // by the data parameter passed to the digest method. |
| 367 WebVector<uint8_t> data = CopyBytes(raw_data); | 368 WebVector<uint8_t> data = CopyBytes(raw_data); |
| 368 | 369 |
| 369 // 14.3.5.3: Let normalizedAlgorithm be the result of normalizing an | 370 // 14.3.5.3: Let normalizedAlgorithm be the result of normalizing an |
| 370 // algorithm, with alg set to algorithm and op set to "digest". | 371 // algorithm, with alg set to algorithm and op set to "digest". |
| 371 WebCryptoAlgorithm normalized_algorithm; | 372 WebCryptoAlgorithm normalized_algorithm; |
| 372 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationDigest, | 373 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationDigest, |
| 373 normalized_algorithm, result)) | 374 normalized_algorithm, result)) |
| 374 return promise; | 375 return promise; |
| 375 | 376 |
| 376 HistogramAlgorithm(script_state->GetExecutionContext(), normalized_algorithm); | 377 HistogramAlgorithm(ExecutionContext::From(script_state), |
| 378 normalized_algorithm); |
| 377 Platform::Current()->Crypto()->Digest(normalized_algorithm, std::move(data), | 379 Platform::Current()->Crypto()->Digest(normalized_algorithm, std::move(data), |
| 378 result->Result()); | 380 result->Result()); |
| 379 return promise; | 381 return promise; |
| 380 } | 382 } |
| 381 | 383 |
| 382 ScriptPromise SubtleCrypto::generateKey( | 384 ScriptPromise SubtleCrypto::generateKey( |
| 383 ScriptState* script_state, | 385 ScriptState* script_state, |
| 384 const AlgorithmIdentifier& raw_algorithm, | 386 const AlgorithmIdentifier& raw_algorithm, |
| 385 bool extractable, | 387 bool extractable, |
| 386 const Vector<String>& raw_key_usages) { | 388 const Vector<String>& raw_key_usages) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 402 // "generateKey". | 404 // "generateKey". |
| 403 WebCryptoAlgorithm normalized_algorithm; | 405 WebCryptoAlgorithm normalized_algorithm; |
| 404 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationGenerateKey, | 406 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationGenerateKey, |
| 405 normalized_algorithm, result)) | 407 normalized_algorithm, result)) |
| 406 return promise; | 408 return promise; |
| 407 | 409 |
| 408 // NOTE: Steps (8) and (9) disallow empty usages on secret and private | 410 // NOTE: Steps (8) and (9) disallow empty usages on secret and private |
| 409 // keys. This normative requirement is enforced by the platform | 411 // keys. This normative requirement is enforced by the platform |
| 410 // implementation in the call below. | 412 // implementation in the call below. |
| 411 | 413 |
| 412 HistogramAlgorithm(script_state->GetExecutionContext(), normalized_algorithm); | 414 HistogramAlgorithm(ExecutionContext::From(script_state), |
| 415 normalized_algorithm); |
| 413 Platform::Current()->Crypto()->GenerateKey(normalized_algorithm, extractable, | 416 Platform::Current()->Crypto()->GenerateKey(normalized_algorithm, extractable, |
| 414 key_usages, result->Result()); | 417 key_usages, result->Result()); |
| 415 return promise; | 418 return promise; |
| 416 } | 419 } |
| 417 | 420 |
| 418 ScriptPromise SubtleCrypto::importKey( | 421 ScriptPromise SubtleCrypto::importKey( |
| 419 ScriptState* script_state, | 422 ScriptState* script_state, |
| 420 const String& raw_format, | 423 const String& raw_format, |
| 421 const ArrayBufferOrArrayBufferViewOrDictionary& raw_key_data, | 424 const ArrayBufferOrArrayBufferViewOrDictionary& raw_key_data, |
| 422 const AlgorithmIdentifier& raw_algorithm, | 425 const AlgorithmIdentifier& raw_algorithm, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 } | 491 } |
| 489 | 492 |
| 490 // 14.3.9.3: Let normalizedAlgorithm be the result of normalizing an | 493 // 14.3.9.3: Let normalizedAlgorithm be the result of normalizing an |
| 491 // algorithm, with alg set to algorithm and op set to | 494 // algorithm, with alg set to algorithm and op set to |
| 492 // "importKey". | 495 // "importKey". |
| 493 WebCryptoAlgorithm normalized_algorithm; | 496 WebCryptoAlgorithm normalized_algorithm; |
| 494 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationImportKey, | 497 if (!ParseAlgorithm(raw_algorithm, kWebCryptoOperationImportKey, |
| 495 normalized_algorithm, result)) | 498 normalized_algorithm, result)) |
| 496 return promise; | 499 return promise; |
| 497 | 500 |
| 498 HistogramAlgorithm(script_state->GetExecutionContext(), normalized_algorithm); | 501 HistogramAlgorithm(ExecutionContext::From(script_state), |
| 502 normalized_algorithm); |
| 499 Platform::Current()->Crypto()->ImportKey(format, std::move(key_data), | 503 Platform::Current()->Crypto()->ImportKey(format, std::move(key_data), |
| 500 normalized_algorithm, extractable, | 504 normalized_algorithm, extractable, |
| 501 key_usages, result->Result()); | 505 key_usages, result->Result()); |
| 502 return promise; | 506 return promise; |
| 503 } | 507 } |
| 504 | 508 |
| 505 ScriptPromise SubtleCrypto::exportKey(ScriptState* script_state, | 509 ScriptPromise SubtleCrypto::exportKey(ScriptState* script_state, |
| 506 const String& raw_format, | 510 const String& raw_format, |
| 507 CryptoKey* key) { | 511 CryptoKey* key) { |
| 508 // Method described by: | 512 // Method described by: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 519 return promise; | 523 return promise; |
| 520 | 524 |
| 521 // 14.3.10.6: If the [[extractable]] internal slot of key is false, then | 525 // 14.3.10.6: If the [[extractable]] internal slot of key is false, then |
| 522 // throw an InvalidAccessError. | 526 // throw an InvalidAccessError. |
| 523 if (!key->extractable()) { | 527 if (!key->extractable()) { |
| 524 result->CompleteWithError(kWebCryptoErrorTypeInvalidAccess, | 528 result->CompleteWithError(kWebCryptoErrorTypeInvalidAccess, |
| 525 "key is not extractable"); | 529 "key is not extractable"); |
| 526 return promise; | 530 return promise; |
| 527 } | 531 } |
| 528 | 532 |
| 529 HistogramKey(script_state->GetExecutionContext(), key->Key()); | 533 HistogramKey(ExecutionContext::From(script_state), key->Key()); |
| 530 Platform::Current()->Crypto()->ExportKey(format, key->Key(), | 534 Platform::Current()->Crypto()->ExportKey(format, key->Key(), |
| 531 result->Result()); | 535 result->Result()); |
| 532 return promise; | 536 return promise; |
| 533 } | 537 } |
| 534 | 538 |
| 535 ScriptPromise SubtleCrypto::wrapKey( | 539 ScriptPromise SubtleCrypto::wrapKey( |
| 536 ScriptState* script_state, | 540 ScriptState* script_state, |
| 537 const String& raw_format, | 541 const String& raw_format, |
| 538 CryptoKey* key, | 542 CryptoKey* key, |
| 539 CryptoKey* wrapping_key, | 543 CryptoKey* wrapping_key, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 // the spec order. | 582 // the spec order. |
| 579 | 583 |
| 580 // 14.3.11.12: If the [[extractable]] internal slot of key is false, then | 584 // 14.3.11.12: If the [[extractable]] internal slot of key is false, then |
| 581 // throw an InvalidAccessError. | 585 // throw an InvalidAccessError. |
| 582 if (!key->extractable()) { | 586 if (!key->extractable()) { |
| 583 result->CompleteWithError(kWebCryptoErrorTypeInvalidAccess, | 587 result->CompleteWithError(kWebCryptoErrorTypeInvalidAccess, |
| 584 "key is not extractable"); | 588 "key is not extractable"); |
| 585 return promise; | 589 return promise; |
| 586 } | 590 } |
| 587 | 591 |
| 588 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 592 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 589 normalized_algorithm, wrapping_key->Key()); | 593 normalized_algorithm, wrapping_key->Key()); |
| 590 HistogramKey(script_state->GetExecutionContext(), key->Key()); | 594 HistogramKey(ExecutionContext::From(script_state), key->Key()); |
| 591 Platform::Current()->Crypto()->WrapKey( | 595 Platform::Current()->Crypto()->WrapKey( |
| 592 format, key->Key(), wrapping_key->Key(), normalized_algorithm, | 596 format, key->Key(), wrapping_key->Key(), normalized_algorithm, |
| 593 result->Result()); | 597 result->Result()); |
| 594 return promise; | 598 return promise; |
| 595 } | 599 } |
| 596 | 600 |
| 597 ScriptPromise SubtleCrypto::unwrapKey( | 601 ScriptPromise SubtleCrypto::unwrapKey( |
| 598 ScriptState* script_state, | 602 ScriptState* script_state, |
| 599 const String& raw_format, | 603 const String& raw_format, |
| 600 const BufferSource& raw_wrapped_key, | 604 const BufferSource& raw_wrapped_key, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 // contain an entry that is "unwrapKey", then throw an | 657 // contain an entry that is "unwrapKey", then throw an |
| 654 // InvalidAccessError. | 658 // InvalidAccessError. |
| 655 if (!unwrapping_key->CanBeUsedForAlgorithm( | 659 if (!unwrapping_key->CanBeUsedForAlgorithm( |
| 656 normalized_algorithm, kWebCryptoKeyUsageUnwrapKey, result)) | 660 normalized_algorithm, kWebCryptoKeyUsageUnwrapKey, result)) |
| 657 return promise; | 661 return promise; |
| 658 | 662 |
| 659 // NOTE: Step (16) disallows empty usages on secret and private keys. This | 663 // NOTE: Step (16) disallows empty usages on secret and private keys. This |
| 660 // normative requirement is enforced by the platform implementation in the | 664 // normative requirement is enforced by the platform implementation in the |
| 661 // call below. | 665 // call below. |
| 662 | 666 |
| 663 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 667 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 664 normalized_algorithm, unwrapping_key->Key()); | 668 normalized_algorithm, unwrapping_key->Key()); |
| 665 HistogramAlgorithm(script_state->GetExecutionContext(), | 669 HistogramAlgorithm(ExecutionContext::From(script_state), |
| 666 normalized_key_algorithm); | 670 normalized_key_algorithm); |
| 667 Platform::Current()->Crypto()->UnwrapKey( | 671 Platform::Current()->Crypto()->UnwrapKey( |
| 668 format, std::move(wrapped_key), unwrapping_key->Key(), | 672 format, std::move(wrapped_key), unwrapping_key->Key(), |
| 669 normalized_algorithm, normalized_key_algorithm, extractable, key_usages, | 673 normalized_algorithm, normalized_key_algorithm, extractable, key_usages, |
| 670 result->Result()); | 674 result->Result()); |
| 671 return promise; | 675 return promise; |
| 672 } | 676 } |
| 673 | 677 |
| 674 ScriptPromise SubtleCrypto::deriveBits(ScriptState* script_state, | 678 ScriptPromise SubtleCrypto::deriveBits(ScriptState* script_state, |
| 675 const AlgorithmIdentifier& raw_algorithm, | 679 const AlgorithmIdentifier& raw_algorithm, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 695 // 14.3.8.7: If the name member of normalizedAlgorithm is not equal to the | 699 // 14.3.8.7: If the name member of normalizedAlgorithm is not equal to the |
| 696 // name attribute of the [[algorithm]] internal slot of baseKey | 700 // name attribute of the [[algorithm]] internal slot of baseKey |
| 697 // then throw an InvalidAccessError. | 701 // then throw an InvalidAccessError. |
| 698 // | 702 // |
| 699 // 14.3.8.8: If the [[usages]] internal slot of baseKey does not contain an | 703 // 14.3.8.8: If the [[usages]] internal slot of baseKey does not contain an |
| 700 // entry that is "deriveBits", then throw an InvalidAccessError. | 704 // entry that is "deriveBits", then throw an InvalidAccessError. |
| 701 if (!base_key->CanBeUsedForAlgorithm(normalized_algorithm, | 705 if (!base_key->CanBeUsedForAlgorithm(normalized_algorithm, |
| 702 kWebCryptoKeyUsageDeriveBits, result)) | 706 kWebCryptoKeyUsageDeriveBits, result)) |
| 703 return promise; | 707 return promise; |
| 704 | 708 |
| 705 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 709 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 706 normalized_algorithm, base_key->Key()); | 710 normalized_algorithm, base_key->Key()); |
| 707 Platform::Current()->Crypto()->DeriveBits( | 711 Platform::Current()->Crypto()->DeriveBits( |
| 708 normalized_algorithm, base_key->Key(), length_bits, result->Result()); | 712 normalized_algorithm, base_key->Key(), length_bits, result->Result()); |
| 709 return promise; | 713 return promise; |
| 710 } | 714 } |
| 711 | 715 |
| 712 ScriptPromise SubtleCrypto::deriveKey( | 716 ScriptPromise SubtleCrypto::deriveKey( |
| 713 ScriptState* script_state, | 717 ScriptState* script_state, |
| 714 const AlgorithmIdentifier& raw_algorithm, | 718 const AlgorithmIdentifier& raw_algorithm, |
| 715 CryptoKey* base_key, | 719 CryptoKey* base_key, |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 // 14.3.7.12: If the [[usages]] internal slot of baseKey does not contain | 769 // 14.3.7.12: If the [[usages]] internal slot of baseKey does not contain |
| 766 // an entry that is "deriveKey", then throw an InvalidAccessError. | 770 // an entry that is "deriveKey", then throw an InvalidAccessError. |
| 767 if (!base_key->CanBeUsedForAlgorithm(normalized_algorithm, | 771 if (!base_key->CanBeUsedForAlgorithm(normalized_algorithm, |
| 768 kWebCryptoKeyUsageDeriveKey, result)) | 772 kWebCryptoKeyUsageDeriveKey, result)) |
| 769 return promise; | 773 return promise; |
| 770 | 774 |
| 771 // NOTE: Step (16) disallows empty usages on secret and private keys. This | 775 // NOTE: Step (16) disallows empty usages on secret and private keys. This |
| 772 // normative requirement is enforced by the platform implementation in the | 776 // normative requirement is enforced by the platform implementation in the |
| 773 // call below. | 777 // call below. |
| 774 | 778 |
| 775 HistogramAlgorithmAndKey(script_state->GetExecutionContext(), | 779 HistogramAlgorithmAndKey(ExecutionContext::From(script_state), |
| 776 normalized_algorithm, base_key->Key()); | 780 normalized_algorithm, base_key->Key()); |
| 777 HistogramAlgorithm(script_state->GetExecutionContext(), | 781 HistogramAlgorithm(ExecutionContext::From(script_state), |
| 778 normalized_derived_key_algorithm); | 782 normalized_derived_key_algorithm); |
| 779 Platform::Current()->Crypto()->DeriveKey( | 783 Platform::Current()->Crypto()->DeriveKey( |
| 780 normalized_algorithm, base_key->Key(), normalized_derived_key_algorithm, | 784 normalized_algorithm, base_key->Key(), normalized_derived_key_algorithm, |
| 781 key_length_algorithm, extractable, key_usages, result->Result()); | 785 key_length_algorithm, extractable, key_usages, result->Result()); |
| 782 return promise; | 786 return promise; |
| 783 } | 787 } |
| 784 | 788 |
| 785 } // namespace blink | 789 } // namespace blink |
| OLD | NEW |