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