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 22 matching lines...) Expand all Loading... |
33 #include "bindings/core/v8/ArrayBufferOrArrayBufferView.h" | 33 #include "bindings/core/v8/ArrayBufferOrArrayBufferView.h" |
34 #include "bindings/core/v8/Dictionary.h" | 34 #include "bindings/core/v8/Dictionary.h" |
35 #include "bindings/core/v8/V8ArrayBuffer.h" | 35 #include "bindings/core/v8/V8ArrayBuffer.h" |
36 #include "bindings/core/v8/V8ArrayBufferView.h" | 36 #include "bindings/core/v8/V8ArrayBufferView.h" |
37 #include "bindings/modules/v8/V8CryptoKey.h" | 37 #include "bindings/modules/v8/V8CryptoKey.h" |
38 #include "core/dom/DOMArrayPiece.h" | 38 #include "core/dom/DOMArrayPiece.h" |
39 #include "core/dom/DOMTypedArray.h" | 39 #include "core/dom/DOMTypedArray.h" |
40 #include "public/platform/WebCryptoAlgorithmParams.h" | 40 #include "public/platform/WebCryptoAlgorithmParams.h" |
41 #include "public/platform/WebString.h" | 41 #include "public/platform/WebString.h" |
42 #include "wtf/MathExtras.h" | 42 #include "wtf/MathExtras.h" |
43 #include "wtf/PtrUtil.h" | |
44 #include "wtf/Vector.h" | 43 #include "wtf/Vector.h" |
45 #include "wtf/text/StringBuilder.h" | 44 #include "wtf/text/StringBuilder.h" |
46 #include <algorithm> | 45 #include <algorithm> |
47 #include <memory> | |
48 | 46 |
49 namespace blink { | 47 namespace blink { |
50 | 48 |
51 namespace { | 49 namespace { |
52 | 50 |
53 typedef ArrayBufferOrArrayBufferView BufferSource; | 51 typedef ArrayBufferOrArrayBufferView BufferSource; |
54 | 52 |
55 struct AlgorithmNameMapping { | 53 struct AlgorithmNameMapping { |
56 // Must be an upper case ASCII string. | 54 // Must be an upper case ASCII string. |
57 const char* const algorithmName; | 55 const char* const algorithmName; |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 | 440 |
443 value.setString(algorithmName); | 441 value.setString(algorithmName); |
444 return true; | 442 return true; |
445 } | 443 } |
446 | 444 |
447 // Defined by the WebCrypto spec as: | 445 // Defined by the WebCrypto spec as: |
448 // | 446 // |
449 // dictionary AesCbcParams : Algorithm { | 447 // dictionary AesCbcParams : Algorithm { |
450 // required BufferSource iv; | 448 // required BufferSource iv; |
451 // }; | 449 // }; |
452 bool parseAesCbcParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) | 450 bool parseAesCbcParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
453 { | 451 { |
454 BufferSource ivBufferSource; | 452 BufferSource ivBufferSource; |
455 if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) | 453 if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) |
456 return false; | 454 return false; |
457 | 455 |
458 DOMArrayPiece iv(ivBufferSource); | 456 DOMArrayPiece iv(ivBufferSource); |
459 | 457 |
460 params = wrapUnique(new WebCryptoAesCbcParams(iv.bytes(), iv.byteLength())); | 458 params = adoptPtr(new WebCryptoAesCbcParams(iv.bytes(), iv.byteLength())); |
461 return true; | 459 return true; |
462 } | 460 } |
463 | 461 |
464 // Defined by the WebCrypto spec as: | 462 // Defined by the WebCrypto spec as: |
465 // | 463 // |
466 // dictionary AesKeyGenParams : Algorithm { | 464 // dictionary AesKeyGenParams : Algorithm { |
467 // [EnforceRange] required unsigned short length; | 465 // [EnforceRange] required unsigned short length; |
468 // }; | 466 // }; |
469 bool parseAesKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgori
thmParams>& params, const ErrorContext& context, AlgorithmError* error) | 467 bool parseAesKeyGenParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams
>& params, const ErrorContext& context, AlgorithmError* error) |
470 { | 468 { |
471 uint16_t length; | 469 uint16_t length; |
472 if (!getUint16(raw, "length", length, context, error)) | 470 if (!getUint16(raw, "length", length, context, error)) |
473 return false; | 471 return false; |
474 | 472 |
475 params = wrapUnique(new WebCryptoAesKeyGenParams(length)); | 473 params = adoptPtr(new WebCryptoAesKeyGenParams(length)); |
476 return true; | 474 return true; |
477 } | 475 } |
478 | 476 |
479 bool parseAlgorithmIdentifier(const AlgorithmIdentifier&, WebCryptoOperation, We
bCryptoAlgorithm&, ErrorContext, AlgorithmError*); | 477 bool parseAlgorithmIdentifier(const AlgorithmIdentifier&, WebCryptoOperation, We
bCryptoAlgorithm&, ErrorContext, AlgorithmError*); |
480 | 478 |
481 bool parseHash(const Dictionary& raw, WebCryptoAlgorithm& hash, ErrorContext con
text, AlgorithmError* error) | 479 bool parseHash(const Dictionary& raw, WebCryptoAlgorithm& hash, ErrorContext con
text, AlgorithmError* error) |
482 { | 480 { |
483 AlgorithmIdentifier rawHash; | 481 AlgorithmIdentifier rawHash; |
484 if (!getAlgorithmIdentifier(raw, "hash", rawHash, context, error)) | 482 if (!getAlgorithmIdentifier(raw, "hash", rawHash, context, error)) |
485 return false; | 483 return false; |
486 | 484 |
487 context.add("hash"); | 485 context.add("hash"); |
488 return parseAlgorithmIdentifier(rawHash, WebCryptoOperationDigest, hash, con
text, error); | 486 return parseAlgorithmIdentifier(rawHash, WebCryptoOperationDigest, hash, con
text, error); |
489 } | 487 } |
490 | 488 |
491 // Defined by the WebCrypto spec as: | 489 // Defined by the WebCrypto spec as: |
492 // | 490 // |
493 // dictionary HmacImportParams : Algorithm { | 491 // dictionary HmacImportParams : Algorithm { |
494 // HashAlgorithmIdentifier hash; | 492 // HashAlgorithmIdentifier hash; |
495 // [EnforceRange] unsigned long length; | 493 // [EnforceRange] unsigned long length; |
496 // }; | 494 // }; |
497 // | 495 // |
498 // FIXME: http://crbug.com/438475: The current implementation differs from the | 496 // FIXME: http://crbug.com/438475: The current implementation differs from the |
499 // spec in that the "hash" parameter is required. This seems more sensible, and | 497 // spec in that the "hash" parameter is required. This seems more sensible, and |
500 // is being proposed as a change to the spec. (https://www.w3.org/Bugs/Public/sh
ow_bug.cgi?id=27448). | 498 // is being proposed as a change to the spec. (https://www.w3.org/Bugs/Public/sh
ow_bug.cgi?id=27448). |
501 bool parseHmacImportParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgor
ithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 499 bool parseHmacImportParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParam
s>& params, const ErrorContext& context, AlgorithmError* error) |
502 { | 500 { |
503 WebCryptoAlgorithm hash; | 501 WebCryptoAlgorithm hash; |
504 if (!parseHash(raw, hash, context, error)) | 502 if (!parseHash(raw, hash, context, error)) |
505 return false; | 503 return false; |
506 | 504 |
507 bool hasLength; | 505 bool hasLength; |
508 uint32_t length = 0; | 506 uint32_t length = 0; |
509 if (!getOptionalUint32(raw, "length", hasLength, length, context, error)) | 507 if (!getOptionalUint32(raw, "length", hasLength, length, context, error)) |
510 return false; | 508 return false; |
511 | 509 |
512 params = wrapUnique(new WebCryptoHmacImportParams(hash, hasLength, length)); | 510 params = adoptPtr(new WebCryptoHmacImportParams(hash, hasLength, length)); |
513 return true; | 511 return true; |
514 } | 512 } |
515 | 513 |
516 // Defined by the WebCrypto spec as: | 514 // Defined by the WebCrypto spec as: |
517 // | 515 // |
518 // dictionary HmacKeyGenParams : Algorithm { | 516 // dictionary HmacKeyGenParams : Algorithm { |
519 // required HashAlgorithmIdentifier hash; | 517 // required HashAlgorithmIdentifier hash; |
520 // [EnforceRange] unsigned long length; | 518 // [EnforceRange] unsigned long length; |
521 // }; | 519 // }; |
522 bool parseHmacKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgor
ithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 520 bool parseHmacKeyGenParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParam
s>& params, const ErrorContext& context, AlgorithmError* error) |
523 { | 521 { |
524 WebCryptoAlgorithm hash; | 522 WebCryptoAlgorithm hash; |
525 if (!parseHash(raw, hash, context, error)) | 523 if (!parseHash(raw, hash, context, error)) |
526 return false; | 524 return false; |
527 | 525 |
528 bool hasLength; | 526 bool hasLength; |
529 uint32_t length = 0; | 527 uint32_t length = 0; |
530 if (!getOptionalUint32(raw, "length", hasLength, length, context, error)) | 528 if (!getOptionalUint32(raw, "length", hasLength, length, context, error)) |
531 return false; | 529 return false; |
532 | 530 |
533 params = wrapUnique(new WebCryptoHmacKeyGenParams(hash, hasLength, length)); | 531 params = adoptPtr(new WebCryptoHmacKeyGenParams(hash, hasLength, length)); |
534 return true; | 532 return true; |
535 } | 533 } |
536 | 534 |
537 // Defined by the WebCrypto spec as: | 535 // Defined by the WebCrypto spec as: |
538 // | 536 // |
539 // dictionary RsaHashedImportParams : Algorithm { | 537 // dictionary RsaHashedImportParams : Algorithm { |
540 // required HashAlgorithmIdentifier hash; | 538 // required HashAlgorithmIdentifier hash; |
541 // }; | 539 // }; |
542 bool parseRsaHashedImportParams(const Dictionary& raw, std::unique_ptr<WebCrypto
AlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 540 bool parseRsaHashedImportParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) |
543 { | 541 { |
544 WebCryptoAlgorithm hash; | 542 WebCryptoAlgorithm hash; |
545 if (!parseHash(raw, hash, context, error)) | 543 if (!parseHash(raw, hash, context, error)) |
546 return false; | 544 return false; |
547 | 545 |
548 params = wrapUnique(new WebCryptoRsaHashedImportParams(hash)); | 546 params = adoptPtr(new WebCryptoRsaHashedImportParams(hash)); |
549 return true; | 547 return true; |
550 } | 548 } |
551 | 549 |
552 // Defined by the WebCrypto spec as: | 550 // Defined by the WebCrypto spec as: |
553 // | 551 // |
554 // dictionary RsaKeyGenParams : Algorithm { | 552 // dictionary RsaKeyGenParams : Algorithm { |
555 // [EnforceRange] required unsigned long modulusLength; | 553 // [EnforceRange] required unsigned long modulusLength; |
556 // required BigInteger publicExponent; | 554 // required BigInteger publicExponent; |
557 // }; | 555 // }; |
558 // | 556 // |
559 // dictionary RsaHashedKeyGenParams : RsaKeyGenParams { | 557 // dictionary RsaHashedKeyGenParams : RsaKeyGenParams { |
560 // required HashAlgorithmIdentifier hash; | 558 // required HashAlgorithmIdentifier hash; |
561 // }; | 559 // }; |
562 bool parseRsaHashedKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCrypto
AlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 560 bool parseRsaHashedKeyGenParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) |
563 { | 561 { |
564 uint32_t modulusLength; | 562 uint32_t modulusLength; |
565 if (!getUint32(raw, "modulusLength", modulusLength, context, error)) | 563 if (!getUint32(raw, "modulusLength", modulusLength, context, error)) |
566 return false; | 564 return false; |
567 | 565 |
568 DOMUint8Array* publicExponent = nullptr; | 566 DOMUint8Array* publicExponent = nullptr; |
569 if (!getBigInteger(raw, "publicExponent", publicExponent, context, error)) | 567 if (!getBigInteger(raw, "publicExponent", publicExponent, context, error)) |
570 return false; | 568 return false; |
571 | 569 |
572 WebCryptoAlgorithm hash; | 570 WebCryptoAlgorithm hash; |
573 if (!parseHash(raw, hash, context, error)) | 571 if (!parseHash(raw, hash, context, error)) |
574 return false; | 572 return false; |
575 | 573 |
576 params = wrapUnique(new WebCryptoRsaHashedKeyGenParams(hash, modulusLength,
static_cast<const unsigned char*>(publicExponent->baseAddress()), publicExponent
->byteLength())); | 574 params = adoptPtr(new WebCryptoRsaHashedKeyGenParams(hash, modulusLength, st
atic_cast<const unsigned char*>(publicExponent->baseAddress()), publicExponent->
byteLength())); |
577 return true; | 575 return true; |
578 } | 576 } |
579 | 577 |
580 // Defined by the WebCrypto spec as: | 578 // Defined by the WebCrypto spec as: |
581 // | 579 // |
582 // dictionary AesCtrParams : Algorithm { | 580 // dictionary AesCtrParams : Algorithm { |
583 // required BufferSource counter; | 581 // required BufferSource counter; |
584 // [EnforceRange] required octet length; | 582 // [EnforceRange] required octet length; |
585 // }; | 583 // }; |
586 bool parseAesCtrParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) | 584 bool parseAesCtrParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
587 { | 585 { |
588 BufferSource counterBufferSource; | 586 BufferSource counterBufferSource; |
589 if (!getBufferSource(raw, "counter", counterBufferSource, context, error)) | 587 if (!getBufferSource(raw, "counter", counterBufferSource, context, error)) |
590 return false; | 588 return false; |
591 | 589 |
592 DOMArrayPiece counter(counterBufferSource); | 590 DOMArrayPiece counter(counterBufferSource); |
593 uint8_t length; | 591 uint8_t length; |
594 if (!getUint8(raw, "length", length, context, error)) | 592 if (!getUint8(raw, "length", length, context, error)) |
595 return false; | 593 return false; |
596 | 594 |
597 params = wrapUnique(new WebCryptoAesCtrParams(length, counter.bytes(), count
er.byteLength())); | 595 params = adoptPtr(new WebCryptoAesCtrParams(length, counter.bytes(), counter
.byteLength())); |
598 return true; | 596 return true; |
599 } | 597 } |
600 | 598 |
601 // Defined by the WebCrypto spec as: | 599 // Defined by the WebCrypto spec as: |
602 // | 600 // |
603 // dictionary AesGcmParams : Algorithm { | 601 // dictionary AesGcmParams : Algorithm { |
604 // required BufferSource iv; | 602 // required BufferSource iv; |
605 // BufferSource additionalData; | 603 // BufferSource additionalData; |
606 // [EnforceRange] octet tagLength; | 604 // [EnforceRange] octet tagLength; |
607 // } | 605 // } |
608 bool parseAesGcmParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) | 606 bool parseAesGcmParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
609 { | 607 { |
610 BufferSource ivBufferSource; | 608 BufferSource ivBufferSource; |
611 if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) | 609 if (!getBufferSource(raw, "iv", ivBufferSource, context, error)) |
612 return false; | 610 return false; |
613 | 611 |
614 bool hasAdditionalData; | 612 bool hasAdditionalData; |
615 BufferSource additionalDataBufferSource; | 613 BufferSource additionalDataBufferSource; |
616 if (!getOptionalBufferSource(raw, "additionalData", hasAdditionalData, addit
ionalDataBufferSource, context, error)) | 614 if (!getOptionalBufferSource(raw, "additionalData", hasAdditionalData, addit
ionalDataBufferSource, context, error)) |
617 return false; | 615 return false; |
618 | 616 |
619 uint8_t tagLength = 0; | 617 uint8_t tagLength = 0; |
620 bool hasTagLength; | 618 bool hasTagLength; |
621 if (!getOptionalUint8(raw, "tagLength", hasTagLength, tagLength, context, er
ror)) | 619 if (!getOptionalUint8(raw, "tagLength", hasTagLength, tagLength, context, er
ror)) |
622 return false; | 620 return false; |
623 | 621 |
624 DOMArrayPiece iv(ivBufferSource); | 622 DOMArrayPiece iv(ivBufferSource); |
625 DOMArrayPiece additionalData(additionalDataBufferSource, DOMArrayPiece::Allo
wNullPointToNullWithZeroSize); | 623 DOMArrayPiece additionalData(additionalDataBufferSource, DOMArrayPiece::Allo
wNullPointToNullWithZeroSize); |
626 | 624 |
627 params = wrapUnique(new WebCryptoAesGcmParams(iv.bytes(), iv.byteLength(), h
asAdditionalData, additionalData.bytes(), additionalData.byteLength(), hasTagLen
gth, tagLength)); | 625 params = adoptPtr(new WebCryptoAesGcmParams(iv.bytes(), iv.byteLength(), has
AdditionalData, additionalData.bytes(), additionalData.byteLength(), hasTagLengt
h, tagLength)); |
628 return true; | 626 return true; |
629 } | 627 } |
630 | 628 |
631 // Defined by the WebCrypto spec as: | 629 // Defined by the WebCrypto spec as: |
632 // | 630 // |
633 // dictionary RsaOaepParams : Algorithm { | 631 // dictionary RsaOaepParams : Algorithm { |
634 // BufferSource label; | 632 // BufferSource label; |
635 // }; | 633 // }; |
636 bool parseRsaOaepParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorith
mParams>& params, const ErrorContext& context, AlgorithmError* error) | 634 bool parseRsaOaepParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
637 { | 635 { |
638 bool hasLabel; | 636 bool hasLabel; |
639 BufferSource labelBufferSource; | 637 BufferSource labelBufferSource; |
640 if (!getOptionalBufferSource(raw, "label", hasLabel, labelBufferSource, cont
ext, error)) | 638 if (!getOptionalBufferSource(raw, "label", hasLabel, labelBufferSource, cont
ext, error)) |
641 return false; | 639 return false; |
642 | 640 |
643 DOMArrayPiece label(labelBufferSource, DOMArrayPiece::AllowNullPointToNullWi
thZeroSize); | 641 DOMArrayPiece label(labelBufferSource, DOMArrayPiece::AllowNullPointToNullWi
thZeroSize); |
644 params = wrapUnique(new WebCryptoRsaOaepParams(hasLabel, label.bytes(), labe
l.byteLength())); | 642 params = adoptPtr(new WebCryptoRsaOaepParams(hasLabel, label.bytes(), label.
byteLength())); |
645 return true; | 643 return true; |
646 } | 644 } |
647 | 645 |
648 // Defined by the WebCrypto spec as: | 646 // Defined by the WebCrypto spec as: |
649 // | 647 // |
650 // dictionary RsaPssParams : Algorithm { | 648 // dictionary RsaPssParams : Algorithm { |
651 // [EnforceRange] required unsigned long saltLength; | 649 // [EnforceRange] required unsigned long saltLength; |
652 // }; | 650 // }; |
653 bool parseRsaPssParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) | 651 bool parseRsaPssParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
654 { | 652 { |
655 uint32_t saltLengthBytes; | 653 uint32_t saltLengthBytes; |
656 if (!getUint32(raw, "saltLength", saltLengthBytes, context, error)) | 654 if (!getUint32(raw, "saltLength", saltLengthBytes, context, error)) |
657 return false; | 655 return false; |
658 | 656 |
659 params = wrapUnique(new WebCryptoRsaPssParams(saltLengthBytes)); | 657 params = adoptPtr(new WebCryptoRsaPssParams(saltLengthBytes)); |
660 return true; | 658 return true; |
661 } | 659 } |
662 | 660 |
663 // Defined by the WebCrypto spec as: | 661 // Defined by the WebCrypto spec as: |
664 // | 662 // |
665 // dictionary EcdsaParams : Algorithm { | 663 // dictionary EcdsaParams : Algorithm { |
666 // required HashAlgorithmIdentifier hash; | 664 // required HashAlgorithmIdentifier hash; |
667 // }; | 665 // }; |
668 bool parseEcdsaParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmP
arams>& params, const ErrorContext& context, AlgorithmError* error) | 666 bool parseEcdsaParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>& p
arams, const ErrorContext& context, AlgorithmError* error) |
669 { | 667 { |
670 WebCryptoAlgorithm hash; | 668 WebCryptoAlgorithm hash; |
671 if (!parseHash(raw, hash, context, error)) | 669 if (!parseHash(raw, hash, context, error)) |
672 return false; | 670 return false; |
673 | 671 |
674 params = wrapUnique(new WebCryptoEcdsaParams(hash)); | 672 params = adoptPtr(new WebCryptoEcdsaParams(hash)); |
675 return true; | 673 return true; |
676 } | 674 } |
677 | 675 |
678 struct CurveNameMapping { | 676 struct CurveNameMapping { |
679 const char* const name; | 677 const char* const name; |
680 WebCryptoNamedCurve value; | 678 WebCryptoNamedCurve value; |
681 }; | 679 }; |
682 | 680 |
683 const CurveNameMapping curveNameMappings[] = { | 681 const CurveNameMapping curveNameMappings[] = { |
684 { "P-256", WebCryptoNamedCurveP256 }, | 682 { "P-256", WebCryptoNamedCurveP256 }, |
(...skipping 21 matching lines...) Expand all Loading... |
706 | 704 |
707 setNotSupportedError(context.toString("Unrecognized namedCurve"), error); | 705 setNotSupportedError(context.toString("Unrecognized namedCurve"), error); |
708 return false; | 706 return false; |
709 } | 707 } |
710 | 708 |
711 // Defined by the WebCrypto spec as: | 709 // Defined by the WebCrypto spec as: |
712 // | 710 // |
713 // dictionary EcKeyGenParams : Algorithm { | 711 // dictionary EcKeyGenParams : Algorithm { |
714 // required NamedCurve namedCurve; | 712 // required NamedCurve namedCurve; |
715 // }; | 713 // }; |
716 bool parseEcKeyGenParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorit
hmParams>& params, const ErrorContext& context, AlgorithmError* error) | 714 bool parseEcKeyGenParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>
& params, const ErrorContext& context, AlgorithmError* error) |
717 { | 715 { |
718 WebCryptoNamedCurve namedCurve; | 716 WebCryptoNamedCurve namedCurve; |
719 if (!parseNamedCurve(raw, namedCurve, context, error)) | 717 if (!parseNamedCurve(raw, namedCurve, context, error)) |
720 return false; | 718 return false; |
721 | 719 |
722 params = wrapUnique(new WebCryptoEcKeyGenParams(namedCurve)); | 720 params = adoptPtr(new WebCryptoEcKeyGenParams(namedCurve)); |
723 return true; | 721 return true; |
724 } | 722 } |
725 | 723 |
726 // Defined by the WebCrypto spec as: | 724 // Defined by the WebCrypto spec as: |
727 // | 725 // |
728 // dictionary EcKeyImportParams : Algorithm { | 726 // dictionary EcKeyImportParams : Algorithm { |
729 // required NamedCurve namedCurve; | 727 // required NamedCurve namedCurve; |
730 // }; | 728 // }; |
731 bool parseEcKeyImportParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgo
rithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 729 bool parseEcKeyImportParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmPara
ms>& params, const ErrorContext& context, AlgorithmError* error) |
732 { | 730 { |
733 WebCryptoNamedCurve namedCurve; | 731 WebCryptoNamedCurve namedCurve; |
734 if (!parseNamedCurve(raw, namedCurve, context, error)) | 732 if (!parseNamedCurve(raw, namedCurve, context, error)) |
735 return false; | 733 return false; |
736 | 734 |
737 params = wrapUnique(new WebCryptoEcKeyImportParams(namedCurve)); | 735 params = adoptPtr(new WebCryptoEcKeyImportParams(namedCurve)); |
738 return true; | 736 return true; |
739 } | 737 } |
740 | 738 |
741 // Defined by the WebCrypto spec as: | 739 // Defined by the WebCrypto spec as: |
742 // | 740 // |
743 // dictionary EcdhKeyDeriveParams : Algorithm { | 741 // dictionary EcdhKeyDeriveParams : Algorithm { |
744 // required CryptoKey public; | 742 // required CryptoKey public; |
745 // }; | 743 // }; |
746 bool parseEcdhKeyDeriveParams(const Dictionary& raw, std::unique_ptr<WebCryptoAl
gorithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 744 bool parseEcdhKeyDeriveParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmPa
rams>& params, const ErrorContext& context, AlgorithmError* error) |
747 { | 745 { |
748 v8::Local<v8::Value> v8Value; | 746 v8::Local<v8::Value> v8Value; |
749 if (!raw.get("public", v8Value)) { | 747 if (!raw.get("public", v8Value)) { |
750 setTypeError(context.toString("public", "Missing required property"), er
ror); | 748 setTypeError(context.toString("public", "Missing required property"), er
ror); |
751 return false; | 749 return false; |
752 } | 750 } |
753 | 751 |
754 CryptoKey* cryptoKey = V8CryptoKey::toImplWithTypeCheck(raw.isolate(), v8Val
ue); | 752 CryptoKey* cryptoKey = V8CryptoKey::toImplWithTypeCheck(raw.isolate(), v8Val
ue); |
755 if (!cryptoKey) { | 753 if (!cryptoKey) { |
756 setTypeError(context.toString("public", "Must be a CryptoKey"), error); | 754 setTypeError(context.toString("public", "Must be a CryptoKey"), error); |
757 return false; | 755 return false; |
758 } | 756 } |
759 | 757 |
760 params = wrapUnique(new WebCryptoEcdhKeyDeriveParams(cryptoKey->key())); | 758 params = adoptPtr(new WebCryptoEcdhKeyDeriveParams(cryptoKey->key())); |
761 return true; | 759 return true; |
762 } | 760 } |
763 | 761 |
764 // Defined by the WebCrypto spec as: | 762 // Defined by the WebCrypto spec as: |
765 // | 763 // |
766 // dictionary Pbkdf2Params : Algorithm { | 764 // dictionary Pbkdf2Params : Algorithm { |
767 // required BufferSource salt; | 765 // required BufferSource salt; |
768 // [EnforceRange] required unsigned long iterations; | 766 // [EnforceRange] required unsigned long iterations; |
769 // required HashAlgorithmIdentifier hash; | 767 // required HashAlgorithmIdentifier hash; |
770 // }; | 768 // }; |
771 bool parsePbkdf2Params(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithm
Params>& params, const ErrorContext& context, AlgorithmError* error) | 769 bool parsePbkdf2Params(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>&
params, const ErrorContext& context, AlgorithmError* error) |
772 { | 770 { |
773 BufferSource saltBufferSource; | 771 BufferSource saltBufferSource; |
774 if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) | 772 if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) |
775 return false; | 773 return false; |
776 | 774 |
777 DOMArrayPiece salt(saltBufferSource); | 775 DOMArrayPiece salt(saltBufferSource); |
778 | 776 |
779 uint32_t iterations; | 777 uint32_t iterations; |
780 if (!getUint32(raw, "iterations", iterations, context, error)) | 778 if (!getUint32(raw, "iterations", iterations, context, error)) |
781 return false; | 779 return false; |
782 | 780 |
783 WebCryptoAlgorithm hash; | 781 WebCryptoAlgorithm hash; |
784 if (!parseHash(raw, hash, context, error)) | 782 if (!parseHash(raw, hash, context, error)) |
785 return false; | 783 return false; |
786 params = wrapUnique(new WebCryptoPbkdf2Params(hash, salt.bytes(), salt.byteL
ength(), iterations)); | 784 params = adoptPtr(new WebCryptoPbkdf2Params(hash, salt.bytes(), salt.byteLen
gth(), iterations)); |
787 return true; | 785 return true; |
788 } | 786 } |
789 | 787 |
790 // Defined by the WebCrypto spec as: | 788 // Defined by the WebCrypto spec as: |
791 // | 789 // |
792 // dictionary AesDerivedKeyParams : Algorithm { | 790 // dictionary AesDerivedKeyParams : Algorithm { |
793 // [EnforceRange] required unsigned short length; | 791 // [EnforceRange] required unsigned short length; |
794 // }; | 792 // }; |
795 bool parseAesDerivedKeyParams(const Dictionary& raw, std::unique_ptr<WebCryptoAl
gorithmParams>& params, const ErrorContext& context, AlgorithmError* error) | 793 bool parseAesDerivedKeyParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmPa
rams>& params, const ErrorContext& context, AlgorithmError* error) |
796 { | 794 { |
797 uint16_t length; | 795 uint16_t length; |
798 if (!getUint16(raw, "length", length, context, error)) | 796 if (!getUint16(raw, "length", length, context, error)) |
799 return false; | 797 return false; |
800 | 798 |
801 params = wrapUnique(new WebCryptoAesDerivedKeyParams(length)); | 799 params = adoptPtr(new WebCryptoAesDerivedKeyParams(length)); |
802 return true; | 800 return true; |
803 } | 801 } |
804 | 802 |
805 // FIXME: once the spec has been updated, check that the implementation is | 803 // FIXME: once the spec has been updated, check that the implementation is |
806 // still correct and update this comment. http://crbug.com/399095 | 804 // still correct and update this comment. http://crbug.com/399095 |
807 // | 805 // |
808 // The WebCrypto spec hasn't been updated yet to define HKDF | 806 // The WebCrypto spec hasn't been updated yet to define HKDF |
809 // (https://www.w3.org/Bugs/Public/show_bug.cgi?id=27425). The assumed | 807 // (https://www.w3.org/Bugs/Public/show_bug.cgi?id=27425). The assumed |
810 // parameters are: | 808 // parameters are: |
811 // | 809 // |
812 // dictionary HkdfParams : Algorithm { | 810 // dictionary HkdfParams : Algorithm { |
813 // required HashAlgorithmIdentifier hash; | 811 // required HashAlgorithmIdentifier hash; |
814 // required BufferSource salt; | 812 // required BufferSource salt; |
815 // required BufferSource info; | 813 // required BufferSource info; |
816 // }; | 814 // }; |
817 bool parseHkdfParams(const Dictionary& raw, std::unique_ptr<WebCryptoAlgorithmPa
rams>& params, const ErrorContext& context, AlgorithmError* error) | 815 bool parseHkdfParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>& pa
rams, const ErrorContext& context, AlgorithmError* error) |
818 { | 816 { |
819 WebCryptoAlgorithm hash; | 817 WebCryptoAlgorithm hash; |
820 if (!parseHash(raw, hash, context, error)) | 818 if (!parseHash(raw, hash, context, error)) |
821 return false; | 819 return false; |
822 BufferSource saltBufferSource; | 820 BufferSource saltBufferSource; |
823 if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) | 821 if (!getBufferSource(raw, "salt", saltBufferSource, context, error)) |
824 return false; | 822 return false; |
825 BufferSource infoBufferSource; | 823 BufferSource infoBufferSource; |
826 if (!getBufferSource(raw, "info", infoBufferSource, context, error)) | 824 if (!getBufferSource(raw, "info", infoBufferSource, context, error)) |
827 return false; | 825 return false; |
828 | 826 |
829 DOMArrayPiece salt(saltBufferSource); | 827 DOMArrayPiece salt(saltBufferSource); |
830 DOMArrayPiece info(infoBufferSource); | 828 DOMArrayPiece info(infoBufferSource); |
831 | 829 |
832 params = wrapUnique(new WebCryptoHkdfParams(hash, salt.bytes(), salt.byteLen
gth(), info.bytes(), info.byteLength())); | 830 params = adoptPtr(new WebCryptoHkdfParams(hash, salt.bytes(), salt.byteLengt
h(), info.bytes(), info.byteLength())); |
833 return true; | 831 return true; |
834 } | 832 } |
835 | 833 |
836 bool parseAlgorithmParams(const Dictionary& raw, WebCryptoAlgorithmParamsType ty
pe, std::unique_ptr<WebCryptoAlgorithmParams>& params, ErrorContext& context, Al
gorithmError* error) | 834 bool parseAlgorithmParams(const Dictionary& raw, WebCryptoAlgorithmParamsType ty
pe, OwnPtr<WebCryptoAlgorithmParams>& params, ErrorContext& context, AlgorithmEr
ror* error) |
837 { | 835 { |
838 switch (type) { | 836 switch (type) { |
839 case WebCryptoAlgorithmParamsTypeNone: | 837 case WebCryptoAlgorithmParamsTypeNone: |
840 return true; | 838 return true; |
841 case WebCryptoAlgorithmParamsTypeAesCbcParams: | 839 case WebCryptoAlgorithmParamsTypeAesCbcParams: |
842 context.add("AesCbcParams"); | 840 context.add("AesCbcParams"); |
843 return parseAesCbcParams(raw, params, context, error); | 841 return parseAesCbcParams(raw, params, context, error); |
844 case WebCryptoAlgorithmParamsTypeAesKeyGenParams: | 842 case WebCryptoAlgorithmParamsTypeAesKeyGenParams: |
845 context.add("AesKeyGenParams"); | 843 context.add("AesKeyGenParams"); |
846 return parseAesKeyGenParams(raw, params, context, error); | 844 return parseAesKeyGenParams(raw, params, context, error); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 const WebCryptoAlgorithmInfo* algorithmInfo = WebCryptoAlgorithm::lookupAlgo
rithmInfo(algorithmId); | 935 const WebCryptoAlgorithmInfo* algorithmInfo = WebCryptoAlgorithm::lookupAlgo
rithmInfo(algorithmId); |
938 | 936 |
939 if (algorithmInfo->operationToParamsType[op] == WebCryptoAlgorithmInfo::Unde
fined) { | 937 if (algorithmInfo->operationToParamsType[op] == WebCryptoAlgorithmInfo::Unde
fined) { |
940 context.add(algorithmInfo->name); | 938 context.add(algorithmInfo->name); |
941 setNotSupportedError(context.toString("Unsupported operation", operation
ToString(op)), error); | 939 setNotSupportedError(context.toString("Unsupported operation", operation
ToString(op)), error); |
942 return false; | 940 return false; |
943 } | 941 } |
944 | 942 |
945 WebCryptoAlgorithmParamsType paramsType = static_cast<WebCryptoAlgorithmPara
msType>(algorithmInfo->operationToParamsType[op]); | 943 WebCryptoAlgorithmParamsType paramsType = static_cast<WebCryptoAlgorithmPara
msType>(algorithmInfo->operationToParamsType[op]); |
946 | 944 |
947 std::unique_ptr<WebCryptoAlgorithmParams> params; | 945 OwnPtr<WebCryptoAlgorithmParams> params; |
948 if (!parseAlgorithmParams(raw, paramsType, params, context, error)) | 946 if (!parseAlgorithmParams(raw, paramsType, params, context, error)) |
949 return false; | 947 return false; |
950 | 948 |
951 algorithm = WebCryptoAlgorithm(algorithmId, std::move(params)); | 949 algorithm = WebCryptoAlgorithm(algorithmId, std::move(params)); |
952 return true; | 950 return true; |
953 } | 951 } |
954 | 952 |
955 bool parseAlgorithmIdentifier(const AlgorithmIdentifier& raw, WebCryptoOperation
op, WebCryptoAlgorithm& algorithm, ErrorContext context, AlgorithmError* error) | 953 bool parseAlgorithmIdentifier(const AlgorithmIdentifier& raw, WebCryptoOperation
op, WebCryptoAlgorithm& algorithm, ErrorContext context, AlgorithmError* error) |
956 { | 954 { |
957 context.add("Algorithm"); | 955 context.add("Algorithm"); |
(...skipping 21 matching lines...) Expand all Loading... |
979 } | 977 } |
980 | 978 |
981 } // namespace | 979 } // namespace |
982 | 980 |
983 bool normalizeAlgorithm(const AlgorithmIdentifier& raw, WebCryptoOperation op, W
ebCryptoAlgorithm& algorithm, AlgorithmError* error) | 981 bool normalizeAlgorithm(const AlgorithmIdentifier& raw, WebCryptoOperation op, W
ebCryptoAlgorithm& algorithm, AlgorithmError* error) |
984 { | 982 { |
985 return parseAlgorithmIdentifier(raw, op, algorithm, ErrorContext(), error); | 983 return parseAlgorithmIdentifier(raw, op, algorithm, ErrorContext(), error); |
986 } | 984 } |
987 | 985 |
988 } // namespace blink | 986 } // namespace blink |
OLD | NEW |