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

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

Issue 707743002: WebCrypto: Add ECDSA algorithm (Blink side). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase onto master Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #if ENABLE(ASSERT) 54 #if ENABLE(ASSERT)
55 bool operator<(const AlgorithmNameMapping&) const; 55 bool operator<(const AlgorithmNameMapping&) const;
56 #endif 56 #endif
57 }; 57 };
58 58
59 // Must be sorted by length, and then by reverse string. 59 // Must be sorted by length, and then by reverse string.
60 // Also all names must be upper case ASCII. 60 // Also all names must be upper case ASCII.
61 const AlgorithmNameMapping algorithmNameMappings[] = { 61 const AlgorithmNameMapping algorithmNameMappings[] = {
62 {"HMAC", 4, WebCryptoAlgorithmIdHmac}, 62 {"HMAC", 4, WebCryptoAlgorithmIdHmac},
63 {"SHA-1", 5, WebCryptoAlgorithmIdSha1}, 63 {"SHA-1", 5, WebCryptoAlgorithmIdSha1},
64 {"ECDSA", 5, WebCryptoAlgorithmIdEcdsa},
64 {"AES-KW", 6, WebCryptoAlgorithmIdAesKw}, 65 {"AES-KW", 6, WebCryptoAlgorithmIdAesKw},
65 {"SHA-512", 7, WebCryptoAlgorithmIdSha512}, 66 {"SHA-512", 7, WebCryptoAlgorithmIdSha512},
66 {"SHA-384", 7, WebCryptoAlgorithmIdSha384}, 67 {"SHA-384", 7, WebCryptoAlgorithmIdSha384},
67 {"SHA-256", 7, WebCryptoAlgorithmIdSha256}, 68 {"SHA-256", 7, WebCryptoAlgorithmIdSha256},
68 {"AES-CBC", 7, WebCryptoAlgorithmIdAesCbc}, 69 {"AES-CBC", 7, WebCryptoAlgorithmIdAesCbc},
69 {"AES-GCM", 7, WebCryptoAlgorithmIdAesGcm}, 70 {"AES-GCM", 7, WebCryptoAlgorithmIdAesGcm},
70 {"AES-CTR", 7, WebCryptoAlgorithmIdAesCtr}, 71 {"AES-CTR", 7, WebCryptoAlgorithmIdAesCtr},
71 {"RSA-PSS", 7, WebCryptoAlgorithmIdRsaPss}, 72 {"RSA-PSS", 7, WebCryptoAlgorithmIdRsaPss},
72 {"RSA-OAEP", 8, WebCryptoAlgorithmIdRsaOaep}, 73 {"RSA-OAEP", 8, WebCryptoAlgorithmIdRsaOaep},
73 {"RSASSA-PKCS1-V1_5", 17, WebCryptoAlgorithmIdRsaSsaPkcs1v1_5}, 74 {"RSASSA-PKCS1-V1_5", 17, WebCryptoAlgorithmIdRsaSsaPkcs1v1_5},
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 bool parseRsaPssParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error) 615 bool parseRsaPssParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>& params, const ErrorContext& context, AlgorithmError* error)
615 { 616 {
616 uint32_t saltLengthBytes; 617 uint32_t saltLengthBytes;
617 if (!getUint32(raw, "saltLength", saltLengthBytes, context, error)) 618 if (!getUint32(raw, "saltLength", saltLengthBytes, context, error))
618 return false; 619 return false;
619 620
620 params = adoptPtr(new WebCryptoRsaPssParams(saltLengthBytes)); 621 params = adoptPtr(new WebCryptoRsaPssParams(saltLengthBytes));
621 return true; 622 return true;
622 } 623 }
623 624
625 // Defined by the WebCrypto spec as:
626 //
627 // dictionary EcdsaParams : Algorithm {
628 // required HashAlgorithmIdentifier hash;
629 // };
630 bool parseEcdsaParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams>& p arams, const ErrorContext& context, AlgorithmError* error)
631 {
632 WebCryptoAlgorithm hash;
633 if (!parseHash(raw, hash, context, error))
634 return false;
635
636 params = adoptPtr(new WebCryptoEcdsaParams(hash));
637 return true;
638 }
639
640 struct CurveNameMapping {
641 const char* const name;
642 WebCryptoNamedCurve value;
643 };
644
645 const CurveNameMapping curveNameMappings[] = {
646 { "P-256", WebCryptoNamedCurveP256 },
647 { "P-384", WebCryptoNamedCurveP384 },
648 { "P-521", WebCryptoNamedCurveP521 }
649 };
650
651 // Reminder to update curveNameMappings when adding a new curve.
652 COMPILE_ASSERT(WebCryptoNamedCurveLast + 1 == WTF_ARRAY_LENGTH(curveNameMappings ), UPDATE_curveNameMappings);
653
654 bool parseNamedCurve(const Dictionary& raw, WebCryptoNamedCurve& namedCurve, Err orContext context, AlgorithmError* error)
655 {
656 String namedCurveString;
657 if (!DictionaryHelper::get(raw, "namedCurve", namedCurveString)) {
658 setSyntaxError(context.toString("namedCurve", "Missing or not a string") , error);
659 return false;
660 }
661
662 for (size_t i = 0; i < WTF_ARRAY_LENGTH(curveNameMappings); ++i) {
663 if (curveNameMappings[i].name == namedCurveString) {
664 namedCurve = curveNameMappings[i].value;
665 return true;
666 }
667 }
668
669 setNotSupportedError(context.toString("Unrecognized namedCurve"), error);
670 return false;
671 }
672
673 // Defined by the WebCrypto spec as:
674 //
675 // dictionary EcKeyGenParams : Algorithm {
676 // required NamedCurve namedCurve;
677 // };
678 bool parseEcKeyGenParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmParams> & params, const ErrorContext& context, AlgorithmError* error)
679 {
680 WebCryptoNamedCurve namedCurve;
681 if (!parseNamedCurve(raw, namedCurve, context, error))
682 return false;
683
684 params = adoptPtr(new WebCryptoEcKeyGenParams(namedCurve));
685 return true;
686 }
687
688 // Defined by the WebCrypto spec as:
689 //
690 // dictionary EcKeyImportParams : Algorithm {
691 // required NamedCurve namedCurve;
692 // };
693 bool parseEcKeyImportParams(const Dictionary& raw, OwnPtr<WebCryptoAlgorithmPara ms>& params, const ErrorContext& context, AlgorithmError* error)
694 {
695 WebCryptoNamedCurve namedCurve;
696 if (!parseNamedCurve(raw, namedCurve, context, error))
697 return false;
698
699 params = adoptPtr(new WebCryptoEcKeyImportParams(namedCurve));
700 return true;
701 }
702
624 bool parseAlgorithmParams(const Dictionary& raw, WebCryptoAlgorithmParamsType ty pe, OwnPtr<WebCryptoAlgorithmParams>& params, ErrorContext& context, AlgorithmEr ror* error) 703 bool parseAlgorithmParams(const Dictionary& raw, WebCryptoAlgorithmParamsType ty pe, OwnPtr<WebCryptoAlgorithmParams>& params, ErrorContext& context, AlgorithmEr ror* error)
625 { 704 {
626 switch (type) { 705 switch (type) {
627 case WebCryptoAlgorithmParamsTypeNone: 706 case WebCryptoAlgorithmParamsTypeNone:
628 return true; 707 return true;
629 case WebCryptoAlgorithmParamsTypeAesCbcParams: 708 case WebCryptoAlgorithmParamsTypeAesCbcParams:
630 context.add("AesCbcParams"); 709 context.add("AesCbcParams");
631 return parseAesCbcParams(raw, params, context, error); 710 return parseAesCbcParams(raw, params, context, error);
632 case WebCryptoAlgorithmParamsTypeAesKeyGenParams: 711 case WebCryptoAlgorithmParamsTypeAesKeyGenParams:
633 context.add("AesKeyGenParams"); 712 context.add("AesKeyGenParams");
(...skipping 15 matching lines...) Expand all
649 return parseAesCtrParams(raw, params, context, error); 728 return parseAesCtrParams(raw, params, context, error);
650 case WebCryptoAlgorithmParamsTypeAesGcmParams: 729 case WebCryptoAlgorithmParamsTypeAesGcmParams:
651 context.add("AesGcmParams"); 730 context.add("AesGcmParams");
652 return parseAesGcmParams(raw, params, context, error); 731 return parseAesGcmParams(raw, params, context, error);
653 case WebCryptoAlgorithmParamsTypeRsaOaepParams: 732 case WebCryptoAlgorithmParamsTypeRsaOaepParams:
654 context.add("RsaOaepParams"); 733 context.add("RsaOaepParams");
655 return parseRsaOaepParams(raw, params, context, error); 734 return parseRsaOaepParams(raw, params, context, error);
656 case WebCryptoAlgorithmParamsTypeRsaPssParams: 735 case WebCryptoAlgorithmParamsTypeRsaPssParams:
657 context.add("RsaPssParams"); 736 context.add("RsaPssParams");
658 return parseRsaPssParams(raw, params, context, error); 737 return parseRsaPssParams(raw, params, context, error);
738 case WebCryptoAlgorithmParamsTypeEcdsaParams:
739 context.add("EcdsaParams");
740 return parseEcdsaParams(raw, params, context, error);
741 case WebCryptoAlgorithmParamsTypeEcKeyGenParams:
742 context.add("EcKeyGenParams");
743 return parseEcKeyGenParams(raw, params, context, error);
744 case WebCryptoAlgorithmParamsTypeEcKeyImportParams:
745 context.add("EcKeyImportParams");
746 return parseEcKeyImportParams(raw, params, context, error);
659 } 747 }
660 ASSERT_NOT_REACHED(); 748 ASSERT_NOT_REACHED();
661 return false; 749 return false;
662 } 750 }
663 751
664 const char* operationToString(WebCryptoOperation op) 752 const char* operationToString(WebCryptoOperation op)
665 { 753 {
666 switch (op) { 754 switch (op) {
667 case WebCryptoOperationEncrypt: 755 case WebCryptoOperationEncrypt:
668 return "encrypt"; 756 return "encrypt";
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 } 823 }
736 824
737 } // namespace 825 } // namespace
738 826
739 bool normalizeAlgorithm(const Dictionary& raw, WebCryptoOperation op, WebCryptoA lgorithm& algorithm, AlgorithmError* error) 827 bool normalizeAlgorithm(const Dictionary& raw, WebCryptoOperation op, WebCryptoA lgorithm& algorithm, AlgorithmError* error)
740 { 828 {
741 return parseAlgorithm(raw, op, algorithm, ErrorContext(), error); 829 return parseAlgorithm(raw, op, algorithm, ErrorContext(), error);
742 } 830 }
743 831
744 } // namespace blink 832 } // namespace blink
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/SerializedScriptValue.cpp ('k') | Source/modules/crypto/SubtleCrypto.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698