Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(573)

Side by Side Diff: Source/modules/crypto/NormalizeAlgorithm.cpp

Issue 295423004: Expose WebCrypto's algorithm normalization. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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/NormalizeAlgorithm.h" 32 #include "modules/crypto/NormalizeAlgorithm.h"
33 33
34 #include "bindings/v8/Dictionary.h" 34 #include "bindings/v8/Dictionary.h"
35 #include "platform/CryptoResult.h"
36 #include "platform/NotImplemented.h" 35 #include "platform/NotImplemented.h"
37 #include "public/platform/WebCryptoAlgorithmParams.h" 36 #include "public/platform/WebCryptoAlgorithmParams.h"
38 #include "public/platform/WebString.h" 37 #include "public/platform/WebString.h"
39 #include "wtf/ArrayBuffer.h" 38 #include "wtf/ArrayBuffer.h"
40 #include "wtf/ArrayBufferView.h" 39 #include "wtf/ArrayBufferView.h"
41 #include "wtf/MathExtras.h" 40 #include "wtf/MathExtras.h"
42 #include "wtf/Uint8Array.h" 41 #include "wtf/Uint8Array.h"
43 #include "wtf/Vector.h" 42 #include "wtf/Vector.h"
44 #include "wtf/text/StringBuilder.h" 43 #include "wtf/text/StringBuilder.h"
45 #include <algorithm> 44 #include <algorithm>
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 78
80 typedef char ParamsTypeOrUndefined; 79 typedef char ParamsTypeOrUndefined;
81 const ParamsTypeOrUndefined Undefined = -1; 80 const ParamsTypeOrUndefined Undefined = -1;
82 81
83 struct AlgorithmInfo { 82 struct AlgorithmInfo {
84 // The canonical (case-sensitive) name for the algorithm. 83 // The canonical (case-sensitive) name for the algorithm.
85 const char* name; 84 const char* name;
86 85
87 // A map from the operation to the expected parameter type of the algorithm. 86 // A map from the operation to the expected parameter type of the algorithm.
88 // If an operation is not applicable for the algorithm, set to Undefined. 87 // If an operation is not applicable for the algorithm, set to Undefined.
89 const ParamsTypeOrUndefined operationToParamsType[LastAlgorithmOperation + 1 ]; 88 const ParamsTypeOrUndefined operationToParamsType[blink::LastAlgorithmOperat ion + 1];
90 }; 89 };
91 90
92 // A mapping from the algorithm ID to information about the algorithm. 91 // A mapping from the algorithm ID to information about the algorithm.
93 const AlgorithmInfo algorithmIdToInfo[] = { 92 const AlgorithmInfo algorithmIdToInfo[] = {
94 { // Index 0 93 { // Index 0
95 "AES-CBC", { 94 "AES-CBC", {
96 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Encrypt 95 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Encrypt
97 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Decrypt 96 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Decrypt
98 Undefined, // Sign 97 Undefined, // Sign
99 Undefined, // Verify 98 Undefined, // Verify
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5 == 3, RsaEsPkcs1v1_5_id DoesntMatch); 270 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5 == 3, RsaEsPkcs1v1_5_id DoesntMatch);
272 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha1 == 4, Sha1_idDoesntMatch); 271 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha1 == 4, Sha1_idDoesntMatch);
273 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha256 == 5, Sha256_idDoesntMatch); 272 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha256 == 5, Sha256_idDoesntMatch);
274 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha384 == 6, Sha384_idDoesntMatch); 273 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha384 == 6, Sha384_idDoesntMatch);
275 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha512 == 7, Sha512_idDoesntMatch); 274 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha512 == 7, Sha512_idDoesntMatch);
276 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesGcm == 8, AesGcm_idDoesntMatch); 275 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesGcm == 8, AesGcm_idDoesntMatch);
277 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaOaep == 9, RsaOaep_idDoesntMatch); 276 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaOaep == 9, RsaOaep_idDoesntMatch);
278 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesCtr == 10, AesCtr_idDoesntMatch); 277 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesCtr == 10, AesCtr_idDoesntMatch);
279 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesKw == 11, AesKw_idDoesntMatch); 278 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesKw == 11, AesKw_idDoesntMatch);
280 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdLast == 11, Last_idDoesntMatch); 279 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdLast == 11, Last_idDoesntMatch);
281 COMPILE_ASSERT(10 == LastAlgorithmOperation, UpdateParamsMapping); 280 COMPILE_ASSERT(10 == blink::LastAlgorithmOperation, UpdateParamsMapping);
282 281
283 #if ASSERT_ENABLED 282 #if ASSERT_ENABLED
284 283
285 // Essentially std::is_sorted() (however that function is new to C++11). 284 // Essentially std::is_sorted() (however that function is new to C++11).
286 template <typename Iterator> 285 template <typename Iterator>
287 bool isSorted(Iterator begin, Iterator end) 286 bool isSorted(Iterator begin, Iterator end)
288 { 287 {
289 if (begin == end) 288 if (begin == end)
290 return true; 289 return true;
291 290
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 return true; 388 return true;
390 } 389 }
391 390
392 const AlgorithmInfo* lookupAlgorithmInfo(blink::WebCryptoAlgorithmId id) 391 const AlgorithmInfo* lookupAlgorithmInfo(blink::WebCryptoAlgorithmId id)
393 { 392 {
394 if (id < 0 || id >= WTF_ARRAY_LENGTH(algorithmIdToInfo)) 393 if (id < 0 || id >= WTF_ARRAY_LENGTH(algorithmIdToInfo))
395 return 0; 394 return 0;
396 return &algorithmIdToInfo[id]; 395 return &algorithmIdToInfo[id];
397 } 396 }
398 397
399 void completeWithSyntaxError(const String& message, CryptoResult* result) 398 void setSyntaxError(const String& message, AlgorithmError* error)
400 { 399 {
401 result->completeWithError(blink::WebCryptoErrorTypeSyntax, message); 400 error->errorType = blink::WebCryptoErrorTypeSyntax;
401 error->errorDetails = message;
402 } 402 }
403 403
404 void completeWithNotSupportedError(const String& message, CryptoResult* result) 404 void setNotSupportedError(const String& message, AlgorithmError* error)
405 { 405 {
406 result->completeWithError(blink::WebCryptoErrorTypeNotSupported, message); 406 error->errorType = blink::WebCryptoErrorTypeNotSupported;
407 error->errorDetails = message;
407 } 408 }
408 409
409 void completeWithDataError(const String& message, CryptoResult* result) 410 void setDataError(const String& message, AlgorithmError* error)
410 { 411 {
411 result->completeWithError(blink::WebCryptoErrorTypeData, message); 412 error->errorType = blink::WebCryptoErrorTypeData;
413 error->errorDetails = message;
412 } 414 }
413 415
414 // ErrorContext holds a stack of string literals which describe what was 416 // ErrorContext holds a stack of string literals which describe what was
415 // happening at the time the error occurred. This is helpful because 417 // happening at the time the error occurred. This is helpful because
416 // parsing of the algorithm dictionary can be recursive and it is difficult to 418 // parsing of the algorithm dictionary can be recursive and it is difficult to
417 // tell what went wrong from a failure alone. 419 // tell what went wrong from a failure alone.
418 class ErrorContext { 420 class ErrorContext {
419 public: 421 public:
420 void add(const char* message) 422 void add(const char* message)
421 { 423 {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 // This inline size is large enough to avoid having to grow the Vector in 471 // This inline size is large enough to avoid having to grow the Vector in
470 // the majority of cases (up to 1 nested algorithm identifier). 472 // the majority of cases (up to 1 nested algorithm identifier).
471 Vector<const char*, 10> m_messages; 473 Vector<const char*, 10> m_messages;
472 }; 474 };
473 475
474 // Defined by the WebCrypto spec as: 476 // Defined by the WebCrypto spec as:
475 // 477 //
476 // typedef (ArrayBuffer or ArrayBufferView) CryptoOperationData; 478 // typedef (ArrayBuffer or ArrayBufferView) CryptoOperationData;
477 // 479 //
478 // FIXME: Currently only supports ArrayBufferView. 480 // FIXME: Currently only supports ArrayBufferView.
479 bool getOptionalCryptoOperationData(const Dictionary& raw, const char* propertyN ame, bool& hasProperty, RefPtr<ArrayBufferView>& buffer, const ErrorContext& con text, CryptoResult* result) 481 bool getOptionalCryptoOperationData(const Dictionary& raw, const char* propertyN ame, bool& hasProperty, RefPtr<ArrayBufferView>& buffer, const ErrorContext& con text, AlgorithmError* error)
480 { 482 {
481 if (!raw.get(propertyName, buffer)) { 483 if (!raw.get(propertyName, buffer)) {
482 hasProperty = false; 484 hasProperty = false;
483 return true; 485 return true;
484 } 486 }
485 487
486 hasProperty = true; 488 hasProperty = true;
487 489
488 if (!buffer) { 490 if (!buffer) {
489 completeWithSyntaxError(context.toString(propertyName, "Not an ArrayBuff erView"), result); 491 setSyntaxError(context.toString(propertyName, "Not an ArrayBufferView"), error);
490 return false; 492 return false;
491 } 493 }
492 494
493 return true; 495 return true;
494 } 496 }
495 497
496 // Defined by the WebCrypto spec as: 498 // Defined by the WebCrypto spec as:
497 // 499 //
498 // typedef (ArrayBuffer or ArrayBufferView) CryptoOperationData; 500 // typedef (ArrayBuffer or ArrayBufferView) CryptoOperationData;
499 // 501 //
500 // FIXME: Currently only supports ArrayBufferView. 502 // FIXME: Currently only supports ArrayBufferView.
501 bool getCryptoOperationData(const Dictionary& raw, const char* propertyName, Ref Ptr<ArrayBufferView>& buffer, const ErrorContext& context, CryptoResult* result) 503 bool getCryptoOperationData(const Dictionary& raw, const char* propertyName, Ref Ptr<ArrayBufferView>& buffer, const ErrorContext& context, AlgorithmError* error )
502 { 504 {
503 bool hasProperty; 505 bool hasProperty;
504 bool ok = getOptionalCryptoOperationData(raw, propertyName, hasProperty, buf fer, context, result); 506 bool ok = getOptionalCryptoOperationData(raw, propertyName, hasProperty, buf fer, context, error);
505 if (!hasProperty) { 507 if (!hasProperty) {
506 completeWithSyntaxError(context.toString(propertyName, "Missing required property"), result); 508 setSyntaxError(context.toString(propertyName, "Missing required property "), error);
507 return false; 509 return false;
508 } 510 }
509 return ok; 511 return ok;
510 } 512 }
511 513
512 bool getUint8Array(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ErrorContext& context, CryptoResult* result) 514 bool getUint8Array(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ErrorContext& context, AlgorithmError* error)
513 { 515 {
514 if (!raw.get(propertyName, array) || !array) { 516 if (!raw.get(propertyName, array) || !array) {
515 completeWithSyntaxError(context.toString(propertyName, "Missing or not a Uint8Array"), result); 517 setSyntaxError(context.toString(propertyName, "Missing or not a Uint8Arr ay"), error);
516 return false; 518 return false;
517 } 519 }
518 return true; 520 return true;
519 } 521 }
520 522
521 // Defined by the WebCrypto spec as: 523 // Defined by the WebCrypto spec as:
522 // 524 //
523 // typedef Uint8Array BigInteger; 525 // typedef Uint8Array BigInteger;
524 bool getBigInteger(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ErrorContext& context, CryptoResult* result) 526 bool getBigInteger(const Dictionary& raw, const char* propertyName, RefPtr<Uint8 Array>& array, const ErrorContext& context, AlgorithmError* error)
525 { 527 {
526 if (!getUint8Array(raw, propertyName, array, context, result)) 528 if (!getUint8Array(raw, propertyName, array, context, error))
527 return false; 529 return false;
528 530
529 if (!array->byteLength()) { 531 if (!array->byteLength()) {
530 completeWithSyntaxError(context.toString(propertyName, "BigInteger shoul d not be empty"), result); 532 setSyntaxError(context.toString(propertyName, "BigInteger should not be empty"), error);
531 return false; 533 return false;
532 } 534 }
533 535
534 if (!raw.get(propertyName, array) || !array) { 536 if (!raw.get(propertyName, array) || !array) {
535 completeWithSyntaxError(context.toString(propertyName, "Missing or not a Uint8Array"), result); 537 setSyntaxError(context.toString(propertyName, "Missing or not a Uint8Arr ay"), error);
536 return false; 538 return false;
537 } 539 }
538 return true; 540 return true;
539 } 541 }
540 542
541 // Gets an integer according to WebIDL's [EnforceRange]. 543 // Gets an integer according to WebIDL's [EnforceRange].
542 bool getOptionalInteger(const Dictionary& raw, const char* propertyName, bool& h asProperty, double& value, double minValue, double maxValue, const ErrorContext& context, CryptoResult* result) 544 bool getOptionalInteger(const Dictionary& raw, const char* propertyName, bool& h asProperty, double& value, double minValue, double maxValue, const ErrorContext& context, AlgorithmError* error)
543 { 545 {
544 double number; 546 double number;
545 bool ok = raw.get(propertyName, number, hasProperty); 547 bool ok = raw.get(propertyName, number, hasProperty);
546 548
547 if (!hasProperty) 549 if (!hasProperty)
548 return true; 550 return true;
549 551
550 if (!ok || std::isnan(number)) { 552 if (!ok || std::isnan(number)) {
551 completeWithSyntaxError(context.toString(propertyName, "Is not a number" ), result); 553 setSyntaxError(context.toString(propertyName, "Is not a number"), error) ;
552 return false; 554 return false;
553 } 555 }
554 556
555 number = trunc(number); 557 number = trunc(number);
556 558
557 if (std::isinf(number) || number < minValue || number > maxValue) { 559 if (std::isinf(number) || number < minValue || number > maxValue) {
558 completeWithSyntaxError(context.toString(propertyName, "Outside of numer ic range"), result); 560 setSyntaxError(context.toString(propertyName, "Outside of numeric range" ), error);
559 return false; 561 return false;
560 } 562 }
561 563
562 value = number; 564 value = number;
563 return true; 565 return true;
564 } 566 }
565 567
566 bool getInteger(const Dictionary& raw, const char* propertyName, double& value, double minValue, double maxValue, const ErrorContext& context, CryptoResult* res ult) 568 bool getInteger(const Dictionary& raw, const char* propertyName, double& value, double minValue, double maxValue, const ErrorContext& context, AlgorithmError* e rror)
567 { 569 {
568 bool hasProperty; 570 bool hasProperty;
569 if (!getOptionalInteger(raw, propertyName, hasProperty, value, minValue, max Value, context, result)) 571 if (!getOptionalInteger(raw, propertyName, hasProperty, value, minValue, max Value, context, error))
570 return false; 572 return false;
571 573
572 if (!hasProperty) { 574 if (!hasProperty) {
573 completeWithSyntaxError(context.toString(propertyName, "Missing required property"), result); 575 setSyntaxError(context.toString(propertyName, "Missing required property "), error);
574 return false; 576 return false;
575 } 577 }
576 578
577 return true; 579 return true;
578 } 580 }
579 581
580 bool getUint32(const Dictionary& raw, const char* propertyName, uint32_t& value, const ErrorContext& context, CryptoResult* result) 582 bool getUint32(const Dictionary& raw, const char* propertyName, uint32_t& value, const ErrorContext& context, AlgorithmError* error)
581 { 583 {
582 double number; 584 double number;
583 if (!getInteger(raw, propertyName, number, 0, 0xFFFFFFFF, context, result)) 585 if (!getInteger(raw, propertyName, number, 0, 0xFFFFFFFF, context, error))
584 return false; 586 return false;
585 value = number; 587 value = number;
586 return true; 588 return true;
587 } 589 }
588 590
589 bool getUint16(const Dictionary& raw, const char* propertyName, uint16_t& value, const ErrorContext& context, CryptoResult* result) 591 bool getUint16(const Dictionary& raw, const char* propertyName, uint16_t& value, const ErrorContext& context, AlgorithmError* error)
590 { 592 {
591 double number; 593 double number;
592 if (!getInteger(raw, propertyName, number, 0, 0xFFFF, context, result)) 594 if (!getInteger(raw, propertyName, number, 0, 0xFFFF, context, error))
593 return false; 595 return false;
594 value = number; 596 value = number;
595 return true; 597 return true;
596 } 598 }
597 599
598 bool getUint8(const Dictionary& raw, const char* propertyName, uint8_t& value, c onst ErrorContext& context, CryptoResult* result) 600 bool getUint8(const Dictionary& raw, const char* propertyName, uint8_t& value, c onst ErrorContext& context, AlgorithmError* error)
599 { 601 {
600 double number; 602 double number;
601 if (!getInteger(raw, propertyName, number, 0, 0xFF, context, result)) 603 if (!getInteger(raw, propertyName, number, 0, 0xFF, context, error))
602 return false; 604 return false;
603 value = number; 605 value = number;
604 return true; 606 return true;
605 } 607 }
606 608
607 bool getOptionalUint32(const Dictionary& raw, const char* propertyName, bool& ha sValue, uint32_t& value, const ErrorContext& context, CryptoResult* result) 609 bool getOptionalUint32(const Dictionary& raw, const char* propertyName, bool& ha sValue, uint32_t& value, const ErrorContext& context, AlgorithmError* error)
608 { 610 {
609 double number; 611 double number;
610 if (!getOptionalInteger(raw, propertyName, hasValue, number, 0, 0xFFFFFFFF, context, result)) 612 if (!getOptionalInteger(raw, propertyName, hasValue, number, 0, 0xFFFFFFFF, context, error))
611 return false; 613 return false;
612 if (hasValue) 614 if (hasValue)
613 value = number; 615 value = number;
614 return true; 616 return true;
615 } 617 }
616 618
617 // Defined by the WebCrypto spec as: 619 // Defined by the WebCrypto spec as:
618 // 620 //
619 // dictionary AesCbcParams : Algorithm { 621 // dictionary AesCbcParams : Algorithm {
620 // CryptoOperationData iv; 622 // CryptoOperationData iv;
621 // }; 623 // };
622 bool parseAesCbcParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, CryptoResult* result) 624 bool parseAesCbcParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, AlgorithmError* error)
623 { 625 {
624 RefPtr<ArrayBufferView> iv; 626 RefPtr<ArrayBufferView> iv;
625 if (!getCryptoOperationData(raw, "iv", iv, context, result)) 627 if (!getCryptoOperationData(raw, "iv", iv, context, error))
626 return false; 628 return false;
627 629
628 if (iv->byteLength() != 16) { 630 if (iv->byteLength() != 16) {
629 completeWithDataError(context.toString("iv", "Must be 16 bytes"), result ); 631 setDataError(context.toString("iv", "Must be 16 bytes"), error);
630 return false; 632 return false;
631 } 633 }
632 634
633 params = adoptPtr(new blink::WebCryptoAesCbcParams(static_cast<unsigned char *>(iv->baseAddress()), iv->byteLength())); 635 params = adoptPtr(new blink::WebCryptoAesCbcParams(static_cast<unsigned char *>(iv->baseAddress()), iv->byteLength()));
634 return true; 636 return true;
635 } 637 }
636 638
637 // Defined by the WebCrypto spec as: 639 // Defined by the WebCrypto spec as:
638 // 640 //
639 // dictionary AesKeyGenParams : Algorithm { 641 // dictionary AesKeyGenParams : Algorithm {
640 // [EnforceRange] unsigned short length; 642 // [EnforceRange] unsigned short length;
641 // }; 643 // };
642 bool parseAesKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorith mParams>& params, const ErrorContext& context, CryptoResult* result) 644 bool parseAesKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorith mParams>& params, const ErrorContext& context, AlgorithmError* error)
643 { 645 {
644 uint16_t length; 646 uint16_t length;
645 if (!getUint16(raw, "length", length, context, result)) 647 if (!getUint16(raw, "length", length, context, error))
646 return false; 648 return false;
647 649
648 params = adoptPtr(new blink::WebCryptoAesKeyGenParams(length)); 650 params = adoptPtr(new blink::WebCryptoAesKeyGenParams(length));
649 return true; 651 return true;
650 } 652 }
651 653
652 bool parseAlgorithm(const Dictionary&, AlgorithmOperation, blink::WebCryptoAlgor ithm&, ErrorContext, CryptoResult*); 654 bool parseAlgorithm(const Dictionary&, blink::AlgorithmOperation, blink::WebCryp toAlgorithm&, ErrorContext, AlgorithmError*);
653 655
654 bool parseHash(const Dictionary& raw, blink::WebCryptoAlgorithm& hash, ErrorCont ext context, CryptoResult* result) 656 bool parseHash(const Dictionary& raw, blink::WebCryptoAlgorithm& hash, ErrorCont ext context, AlgorithmError* error)
655 { 657 {
656 Dictionary rawHash; 658 Dictionary rawHash;
657 if (!raw.get("hash", rawHash)) { 659 if (!raw.get("hash", rawHash)) {
658 completeWithSyntaxError(context.toString("hash", "Missing or not a dicti onary"), result); 660 setSyntaxError(context.toString("hash", "Missing or not a dictionary"), error);
659 return false; 661 return false;
660 } 662 }
661 663
662 context.add("hash"); 664 context.add("hash");
663 return parseAlgorithm(rawHash, Digest, hash, context, result); 665 return parseAlgorithm(rawHash, blink::Digest, hash, context, error);
664 } 666 }
665 667
666 // Defined by the WebCrypto spec as: 668 // Defined by the WebCrypto spec as:
667 // 669 //
668 // dictionary HmacImportParams : Algorithm { 670 // dictionary HmacImportParams : Algorithm {
669 // AlgorithmIdentifier hash; 671 // AlgorithmIdentifier hash;
670 // }; 672 // };
671 bool parseHmacImportParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorit hmParams>& params, const ErrorContext& context, CryptoResult* result) 673 bool parseHmacImportParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorit hmParams>& params, const ErrorContext& context, AlgorithmError* error)
672 { 674 {
673 blink::WebCryptoAlgorithm hash; 675 blink::WebCryptoAlgorithm hash;
674 if (!parseHash(raw, hash, context, result)) 676 if (!parseHash(raw, hash, context, error))
675 return false; 677 return false;
676 678
677 params = adoptPtr(new blink::WebCryptoHmacImportParams(hash)); 679 params = adoptPtr(new blink::WebCryptoHmacImportParams(hash));
678 return true; 680 return true;
679 } 681 }
680 682
681 // Defined by the WebCrypto spec as: 683 // Defined by the WebCrypto spec as:
682 // 684 //
683 // dictionary HmacKeyGenParams : Algorithm { 685 // dictionary HmacKeyGenParams : Algorithm {
684 // AlgorithmIdentifier hash; 686 // AlgorithmIdentifier hash;
685 // // The length (in bits) of the key to generate. If unspecified, the 687 // // The length (in bits) of the key to generate. If unspecified, the
686 // // recommended length will be used, which is the size of the associated hash function's block 688 // // recommended length will be used, which is the size of the associated hash function's block
687 // // size. 689 // // size.
688 // unsigned long length; 690 // unsigned long length;
689 // }; 691 // };
690 bool parseHmacKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorit hmParams>& params, const ErrorContext& context, CryptoResult* result) 692 bool parseHmacKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorit hmParams>& params, const ErrorContext& context, AlgorithmError* error)
691 { 693 {
692 blink::WebCryptoAlgorithm hash; 694 blink::WebCryptoAlgorithm hash;
693 if (!parseHash(raw, hash, context, result)) 695 if (!parseHash(raw, hash, context, error))
694 return false; 696 return false;
695 697
696 bool hasLength; 698 bool hasLength;
697 uint32_t length = 0; 699 uint32_t length = 0;
698 if (!getOptionalUint32(raw, "length", hasLength, length, context, result)) 700 if (!getOptionalUint32(raw, "length", hasLength, length, context, error))
699 return false; 701 return false;
700 702
701 params = adoptPtr(new blink::WebCryptoHmacKeyGenParams(hash, hasLength, leng th)); 703 params = adoptPtr(new blink::WebCryptoHmacKeyGenParams(hash, hasLength, leng th));
702 return true; 704 return true;
703 } 705 }
704 706
705 // Defined by the WebCrypto spec as: 707 // Defined by the WebCrypto spec as:
706 // 708 //
707 // dictionary RsaHashedImportParams { 709 // dictionary RsaHashedImportParams {
708 // AlgorithmIdentifier hash; 710 // AlgorithmIdentifier hash;
709 // }; 711 // };
710 bool parseRsaHashedImportParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAl gorithmParams>& params, const ErrorContext& context, CryptoResult* result) 712 bool parseRsaHashedImportParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAl gorithmParams>& params, const ErrorContext& context, AlgorithmError* error)
711 { 713 {
712 blink::WebCryptoAlgorithm hash; 714 blink::WebCryptoAlgorithm hash;
713 if (!parseHash(raw, hash, context, result)) 715 if (!parseHash(raw, hash, context, error))
714 return false; 716 return false;
715 717
716 params = adoptPtr(new blink::WebCryptoRsaHashedImportParams(hash)); 718 params = adoptPtr(new blink::WebCryptoRsaHashedImportParams(hash));
717 return true; 719 return true;
718 } 720 }
719 721
720 // Defined by the WebCrypto spec as: 722 // Defined by the WebCrypto spec as:
721 // 723 //
722 // dictionary RsaKeyGenParams : Algorithm { 724 // dictionary RsaKeyGenParams : Algorithm {
723 // unsigned long modulusLength; 725 // unsigned long modulusLength;
724 // BigInteger publicExponent; 726 // BigInteger publicExponent;
725 // }; 727 // };
726 bool parseRsaKeyGenParams(const Dictionary& raw, uint32_t& modulusLength, RefPtr <Uint8Array>& publicExponent, const ErrorContext& context, CryptoResult* result) 728 bool parseRsaKeyGenParams(const Dictionary& raw, uint32_t& modulusLength, RefPtr <Uint8Array>& publicExponent, const ErrorContext& context, AlgorithmError* error )
727 { 729 {
728 if (!getUint32(raw, "modulusLength", modulusLength, context, result)) 730 if (!getUint32(raw, "modulusLength", modulusLength, context, error))
729 return false; 731 return false;
730 732
731 if (!getBigInteger(raw, "publicExponent", publicExponent, context, result)) 733 if (!getBigInteger(raw, "publicExponent", publicExponent, context, error))
732 return false; 734 return false;
733 735
734 return true; 736 return true;
735 } 737 }
736 738
737 bool parseRsaKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorith mParams>& params, const ErrorContext& context, CryptoResult* result) 739 bool parseRsaKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorith mParams>& params, const ErrorContext& context, AlgorithmError* error)
738 { 740 {
739 uint32_t modulusLength; 741 uint32_t modulusLength;
740 RefPtr<Uint8Array> publicExponent; 742 RefPtr<Uint8Array> publicExponent;
741 if (!parseRsaKeyGenParams(raw, modulusLength, publicExponent, context, resul t)) 743 if (!parseRsaKeyGenParams(raw, modulusLength, publicExponent, context, error ))
742 return false; 744 return false;
743 745
744 params = adoptPtr(new blink::WebCryptoRsaKeyGenParams(modulusLength, static_ cast<const unsigned char*>(publicExponent->baseAddress()), publicExponent->byteL ength())); 746 params = adoptPtr(new blink::WebCryptoRsaKeyGenParams(modulusLength, static_ cast<const unsigned char*>(publicExponent->baseAddress()), publicExponent->byteL ength()));
745 return true; 747 return true;
746 } 748 }
747 749
748 // Defined by the WebCrypto spec as: 750 // Defined by the WebCrypto spec as:
749 // 751 //
750 // dictionary RsaHashedKeyGenParams : RsaKeyGenParams { 752 // dictionary RsaHashedKeyGenParams : RsaKeyGenParams {
751 // AlgorithmIdentifier hash; 753 // AlgorithmIdentifier hash;
752 // }; 754 // };
753 bool parseRsaHashedKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAl gorithmParams>& params, const ErrorContext& context, CryptoResult* result) 755 bool parseRsaHashedKeyGenParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAl gorithmParams>& params, const ErrorContext& context, AlgorithmError* error)
754 { 756 {
755 uint32_t modulusLength; 757 uint32_t modulusLength;
756 RefPtr<Uint8Array> publicExponent; 758 RefPtr<Uint8Array> publicExponent;
757 if (!parseRsaKeyGenParams(raw, modulusLength, publicExponent, context, resul t)) 759 if (!parseRsaKeyGenParams(raw, modulusLength, publicExponent, context, error ))
758 return false; 760 return false;
759 761
760 blink::WebCryptoAlgorithm hash; 762 blink::WebCryptoAlgorithm hash;
761 if (!parseHash(raw, hash, context, result)) 763 if (!parseHash(raw, hash, context, error))
762 return false; 764 return false;
763 765
764 params = adoptPtr(new blink::WebCryptoRsaHashedKeyGenParams(hash, modulusLen gth, static_cast<const unsigned char*>(publicExponent->baseAddress()), publicExp onent->byteLength())); 766 params = adoptPtr(new blink::WebCryptoRsaHashedKeyGenParams(hash, modulusLen gth, static_cast<const unsigned char*>(publicExponent->baseAddress()), publicExp onent->byteLength()));
765 return true; 767 return true;
766 } 768 }
767 769
768 // Defined by the WebCrypto spec as: 770 // Defined by the WebCrypto spec as:
769 // 771 //
770 // dictionary AesCtrParams : Algorithm { 772 // dictionary AesCtrParams : Algorithm {
771 // CryptoOperationData counter; 773 // CryptoOperationData counter;
772 // [EnforceRange] octet length; 774 // [EnforceRange] octet length;
773 // }; 775 // };
774 bool parseAesCtrParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, CryptoResult* result) 776 bool parseAesCtrParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, AlgorithmError* error)
775 { 777 {
776 RefPtr<ArrayBufferView> counter; 778 RefPtr<ArrayBufferView> counter;
777 if (!getCryptoOperationData(raw, "counter", counter, context, result)) 779 if (!getCryptoOperationData(raw, "counter", counter, context, error))
778 return false; 780 return false;
779 781
780 uint8_t length; 782 uint8_t length;
781 if (!getUint8(raw, "length", length, context, result)) 783 if (!getUint8(raw, "length", length, context, error))
782 return false; 784 return false;
783 785
784 params = adoptPtr(new blink::WebCryptoAesCtrParams(length, static_cast<const unsigned char*>(counter->baseAddress()), counter->byteLength())); 786 params = adoptPtr(new blink::WebCryptoAesCtrParams(length, static_cast<const unsigned char*>(counter->baseAddress()), counter->byteLength()));
785 return true; 787 return true;
786 } 788 }
787 789
788 // Defined by the WebCrypto spec as: 790 // Defined by the WebCrypto spec as:
789 // 791 //
790 // dictionary AesGcmParams : Algorithm { 792 // dictionary AesGcmParams : Algorithm {
791 // CryptoOperationData iv; 793 // CryptoOperationData iv;
792 // CryptoOperationData? additionalData; 794 // CryptoOperationData? additionalData;
793 // [EnforceRange] octet? tagLength; // May be 0-128 795 // [EnforceRange] octet? tagLength; // May be 0-128
794 // } 796 // }
795 bool parseAesGcmParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, CryptoResult* result) 797 bool parseAesGcmParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmPa rams>& params, const ErrorContext& context, AlgorithmError* error)
796 { 798 {
797 RefPtr<ArrayBufferView> iv; 799 RefPtr<ArrayBufferView> iv;
798 if (!getCryptoOperationData(raw, "iv", iv, context, result)) 800 if (!getCryptoOperationData(raw, "iv", iv, context, error))
799 return false; 801 return false;
800 802
801 bool hasAdditionalData; 803 bool hasAdditionalData;
802 RefPtr<ArrayBufferView> additionalData; 804 RefPtr<ArrayBufferView> additionalData;
803 if (!getOptionalCryptoOperationData(raw, "additionalData", hasAdditionalData , additionalData, context, result)) 805 if (!getOptionalCryptoOperationData(raw, "additionalData", hasAdditionalData , additionalData, context, error))
804 return false; 806 return false;
805 807
806 double tagLength; 808 double tagLength;
807 bool hasTagLength; 809 bool hasTagLength;
808 if (!getOptionalInteger(raw, "tagLength", hasTagLength, tagLength, 0, 128, c ontext, result)) 810 if (!getOptionalInteger(raw, "tagLength", hasTagLength, tagLength, 0, 128, c ontext, error))
809 return false; 811 return false;
810 812
811 const unsigned char* ivStart = static_cast<const unsigned char*>(iv->baseAdd ress()); 813 const unsigned char* ivStart = static_cast<const unsigned char*>(iv->baseAdd ress());
812 unsigned ivLength = iv->byteLength(); 814 unsigned ivLength = iv->byteLength();
813 815
814 const unsigned char* additionalDataStart = hasAdditionalData ? static_cast<c onst unsigned char*>(additionalData->baseAddress()) : 0; 816 const unsigned char* additionalDataStart = hasAdditionalData ? static_cast<c onst unsigned char*>(additionalData->baseAddress()) : 0;
815 unsigned additionalDataLength = hasAdditionalData ? additionalData->byteLeng th() : 0; 817 unsigned additionalDataLength = hasAdditionalData ? additionalData->byteLeng th() : 0;
816 818
817 params = adoptPtr(new blink::WebCryptoAesGcmParams(ivStart, ivLength, hasAdd itionalData, additionalDataStart, additionalDataLength, hasTagLength, tagLength) ); 819 params = adoptPtr(new blink::WebCryptoAesGcmParams(ivStart, ivLength, hasAdd itionalData, additionalDataStart, additionalDataLength, hasTagLength, tagLength) );
818 return true; 820 return true;
819 } 821 }
820 822
821 // Defined by the WebCrypto spec as: 823 // Defined by the WebCrypto spec as:
822 // 824 //
823 // dictionary RsaOaepParams : Algorithm { 825 // dictionary RsaOaepParams : Algorithm {
824 // CryptoOperationData? label; 826 // CryptoOperationData? label;
825 // }; 827 // };
826 bool parseRsaOaepParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmP arams>& params, const ErrorContext& context, CryptoResult* result) 828 bool parseRsaOaepParams(const Dictionary& raw, OwnPtr<blink::WebCryptoAlgorithmP arams>& params, const ErrorContext& context, AlgorithmError* error)
827 { 829 {
828 bool hasLabel; 830 bool hasLabel;
829 RefPtr<ArrayBufferView> label; 831 RefPtr<ArrayBufferView> label;
830 if (!getOptionalCryptoOperationData(raw, "label", hasLabel, label, context, result)) 832 if (!getOptionalCryptoOperationData(raw, "label", hasLabel, label, context, error))
831 return false; 833 return false;
832 834
833 const unsigned char* labelStart = hasLabel ? static_cast<const unsigned char *>(label->baseAddress()) : 0; 835 const unsigned char* labelStart = hasLabel ? static_cast<const unsigned char *>(label->baseAddress()) : 0;
834 unsigned labelLength = hasLabel ? label->byteLength() : 0; 836 unsigned labelLength = hasLabel ? label->byteLength() : 0;
835 837
836 params = adoptPtr(new blink::WebCryptoRsaOaepParams(hasLabel, labelStart, la belLength)); 838 params = adoptPtr(new blink::WebCryptoRsaOaepParams(hasLabel, labelStart, la belLength));
837 return true; 839 return true;
838 } 840 }
839 841
840 bool parseAlgorithmParams(const Dictionary& raw, blink::WebCryptoAlgorithmParams Type type, OwnPtr<blink::WebCryptoAlgorithmParams>& params, ErrorContext& contex t, CryptoResult* result) 842 bool parseAlgorithmParams(const Dictionary& raw, blink::WebCryptoAlgorithmParams Type type, OwnPtr<blink::WebCryptoAlgorithmParams>& params, ErrorContext& contex t, AlgorithmError* error)
841 { 843 {
842 switch (type) { 844 switch (type) {
843 case blink::WebCryptoAlgorithmParamsTypeNone: 845 case blink::WebCryptoAlgorithmParamsTypeNone:
844 return true; 846 return true;
845 case blink::WebCryptoAlgorithmParamsTypeAesCbcParams: 847 case blink::WebCryptoAlgorithmParamsTypeAesCbcParams:
846 context.add("AesCbcParams"); 848 context.add("AesCbcParams");
847 return parseAesCbcParams(raw, params, context, result); 849 return parseAesCbcParams(raw, params, context, error);
848 case blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams: 850 case blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams:
849 context.add("AesKeyGenParams"); 851 context.add("AesKeyGenParams");
850 return parseAesKeyGenParams(raw, params, context, result); 852 return parseAesKeyGenParams(raw, params, context, error);
851 case blink::WebCryptoAlgorithmParamsTypeHmacImportParams: 853 case blink::WebCryptoAlgorithmParamsTypeHmacImportParams:
852 context.add("HmacImportParams"); 854 context.add("HmacImportParams");
853 return parseHmacImportParams(raw, params, context, result); 855 return parseHmacImportParams(raw, params, context, error);
854 case blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams: 856 case blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams:
855 context.add("HmacKeyGenParams"); 857 context.add("HmacKeyGenParams");
856 return parseHmacKeyGenParams(raw, params, context, result); 858 return parseHmacKeyGenParams(raw, params, context, error);
857 case blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams: 859 case blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams:
858 context.add("RsaHashedKeyGenParams"); 860 context.add("RsaHashedKeyGenParams");
859 return parseRsaHashedKeyGenParams(raw, params, context, result); 861 return parseRsaHashedKeyGenParams(raw, params, context, error);
860 case blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams: 862 case blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams:
861 context.add("RsaHashedImportParams"); 863 context.add("RsaHashedImportParams");
862 return parseRsaHashedImportParams(raw, params, context, result); 864 return parseRsaHashedImportParams(raw, params, context, error);
863 case blink::WebCryptoAlgorithmParamsTypeRsaKeyGenParams: 865 case blink::WebCryptoAlgorithmParamsTypeRsaKeyGenParams:
864 context.add("RsaKeyGenParams"); 866 context.add("RsaKeyGenParams");
865 return parseRsaKeyGenParams(raw, params, context, result); 867 return parseRsaKeyGenParams(raw, params, context, error);
866 case blink::WebCryptoAlgorithmParamsTypeAesCtrParams: 868 case blink::WebCryptoAlgorithmParamsTypeAesCtrParams:
867 context.add("AesCtrParams"); 869 context.add("AesCtrParams");
868 return parseAesCtrParams(raw, params, context, result); 870 return parseAesCtrParams(raw, params, context, error);
869 case blink::WebCryptoAlgorithmParamsTypeAesGcmParams: 871 case blink::WebCryptoAlgorithmParamsTypeAesGcmParams:
870 context.add("AesGcmParams"); 872 context.add("AesGcmParams");
871 return parseAesGcmParams(raw, params, context, result); 873 return parseAesGcmParams(raw, params, context, error);
872 case blink::WebCryptoAlgorithmParamsTypeRsaOaepParams: 874 case blink::WebCryptoAlgorithmParamsTypeRsaOaepParams:
873 context.add("RsaOaepParams"); 875 context.add("RsaOaepParams");
874 return parseRsaOaepParams(raw, params, context, result); 876 return parseRsaOaepParams(raw, params, context, error);
875 break; 877 break;
876 } 878 }
877 ASSERT_NOT_REACHED(); 879 ASSERT_NOT_REACHED();
878 return false; 880 return false;
879 } 881 }
880 882
881 const char* operationToString(AlgorithmOperation op) 883 const char* operationToString(blink::AlgorithmOperation op)
882 { 884 {
883 switch (op) { 885 switch (op) {
884 case Encrypt: 886 case blink::Encrypt:
885 return "encrypt"; 887 return "encrypt";
886 case Decrypt: 888 case blink::Decrypt:
887 return "decrypt"; 889 return "decrypt";
888 case Sign: 890 case blink::Sign:
889 return "sign"; 891 return "sign";
890 case Verify: 892 case blink::Verify:
891 return "verify"; 893 return "verify";
892 case Digest: 894 case blink::Digest:
893 return "digest"; 895 return "digest";
894 case GenerateKey: 896 case blink::GenerateKey:
895 return "generateKey"; 897 return "generateKey";
896 case ImportKey: 898 case blink::ImportKey:
897 return "importKey"; 899 return "importKey";
898 case DeriveKey: 900 case blink::DeriveKey:
899 return "deriveKey"; 901 return "deriveKey";
900 case DeriveBits: 902 case blink::DeriveBits:
901 return "deriveBits"; 903 return "deriveBits";
902 case WrapKey: 904 case blink::WrapKey:
903 return "wrapKey"; 905 return "wrapKey";
904 case UnwrapKey: 906 case blink::UnwrapKey:
905 return "unwrapKey"; 907 return "unwrapKey";
906 } 908 }
907 return 0; 909 return 0;
908 } 910 }
909 911
910 bool parseAlgorithm(const Dictionary& raw, AlgorithmOperation op, blink::WebCryp toAlgorithm& algorithm, ErrorContext context, CryptoResult* result) 912 bool parseAlgorithm(const Dictionary& raw, blink::AlgorithmOperation op, blink:: WebCryptoAlgorithm& algorithm, ErrorContext context, AlgorithmError* error)
911 { 913 {
912 context.add("Algorithm"); 914 context.add("Algorithm");
913 915
914 if (!raw.isObject()) { 916 if (!raw.isObject()) {
915 completeWithSyntaxError(context.toString("Not an object"), result); 917 setSyntaxError(context.toString("Not an object"), error);
916 return false; 918 return false;
917 } 919 }
918 920
919 String algorithmName; 921 String algorithmName;
920 if (!raw.get("name", algorithmName)) { 922 if (!raw.get("name", algorithmName)) {
921 completeWithSyntaxError(context.toString("name", "Missing or not a strin g"), result); 923 setSyntaxError(context.toString("name", "Missing or not a string"), erro r);
922 return false; 924 return false;
923 } 925 }
924 926
925 blink::WebCryptoAlgorithmId algorithmId; 927 blink::WebCryptoAlgorithmId algorithmId;
926 if (!lookupAlgorithmIdByName(algorithmName, algorithmId)) { 928 if (!lookupAlgorithmIdByName(algorithmName, algorithmId)) {
927 // FIXME: The spec says to return a SyntaxError if the input contains 929 // FIXME: The spec says to return a SyntaxError if the input contains
928 // any non-ASCII characters. 930 // any non-ASCII characters.
929 completeWithNotSupportedError(context.toString("Unrecognized name"), res ult); 931 setNotSupportedError(context.toString("Unrecognized name"), error);
930 return false; 932 return false;
931 } 933 }
932 934
933 // Remove the "Algorithm:" prefix for all subsequent errors. 935 // Remove the "Algorithm:" prefix for all subsequent errors.
934 context.removeLast(); 936 context.removeLast();
935 937
936 const AlgorithmInfo* algorithmInfo = lookupAlgorithmInfo(algorithmId); 938 const AlgorithmInfo* algorithmInfo = lookupAlgorithmInfo(algorithmId);
937 939
938 if (algorithmInfo->operationToParamsType[op] == Undefined) { 940 if (algorithmInfo->operationToParamsType[op] == Undefined) {
939 context.add(algorithmIdToName(algorithmId)); 941 context.add(algorithmIdToName(algorithmId));
940 completeWithNotSupportedError(context.toString("Unsupported operation", operationToString(op)), result); 942 setNotSupportedError(context.toString("Unsupported operation", operation ToString(op)), error);
941 return false; 943 return false;
942 } 944 }
943 945
944 blink::WebCryptoAlgorithmParamsType paramsType = static_cast<blink::WebCrypt oAlgorithmParamsType>(algorithmInfo->operationToParamsType[op]); 946 blink::WebCryptoAlgorithmParamsType paramsType = static_cast<blink::WebCrypt oAlgorithmParamsType>(algorithmInfo->operationToParamsType[op]);
945 947
946 OwnPtr<blink::WebCryptoAlgorithmParams> params; 948 OwnPtr<blink::WebCryptoAlgorithmParams> params;
947 if (!parseAlgorithmParams(raw, paramsType, params, context, result)) 949 if (!parseAlgorithmParams(raw, paramsType, params, context, error))
948 return false; 950 return false;
949 951
950 algorithm = blink::WebCryptoAlgorithm(algorithmId, params.release()); 952 algorithm = blink::WebCryptoAlgorithm(algorithmId, params.release());
951 return true; 953 return true;
952 } 954 }
953 955
954 } // namespace 956 } // namespace
955 957
956 bool parseAlgorithm(const Dictionary& raw, AlgorithmOperation op, blink::WebCryp toAlgorithm& algorithm, CryptoResult* result) 958 bool normalizeAlgorithm(const Dictionary& raw, blink::AlgorithmOperation op, bli nk::WebCryptoAlgorithm& algorithm, AlgorithmError* error)
957 { 959 {
958 return parseAlgorithm(raw, op, algorithm, ErrorContext(), result); 960 return parseAlgorithm(raw, op, algorithm, ErrorContext(), error);
959 } 961 }
960 962
961 const char* algorithmIdToName(blink::WebCryptoAlgorithmId id) 963 const char* algorithmIdToName(blink::WebCryptoAlgorithmId id)
962 { 964 {
963 return lookupAlgorithmInfo(id)->name; 965 return lookupAlgorithmInfo(id)->name;
964 } 966 }
965 967
966 } // namespace WebCore 968 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698