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