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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 {"SHA-512", 7, blink::WebCryptoAlgorithmIdSha512}, | 68 {"SHA-512", 7, blink::WebCryptoAlgorithmIdSha512}, |
69 {"SHA-384", 7, blink::WebCryptoAlgorithmIdSha384}, | 69 {"SHA-384", 7, blink::WebCryptoAlgorithmIdSha384}, |
70 {"SHA-256", 7, blink::WebCryptoAlgorithmIdSha256}, | 70 {"SHA-256", 7, blink::WebCryptoAlgorithmIdSha256}, |
71 {"AES-CBC", 7, blink::WebCryptoAlgorithmIdAesCbc}, | 71 {"AES-CBC", 7, blink::WebCryptoAlgorithmIdAesCbc}, |
72 {"AES-GCM", 7, blink::WebCryptoAlgorithmIdAesGcm}, | 72 {"AES-GCM", 7, blink::WebCryptoAlgorithmIdAesGcm}, |
73 {"AES-CTR", 7, blink::WebCryptoAlgorithmIdAesCtr}, | 73 {"AES-CTR", 7, blink::WebCryptoAlgorithmIdAesCtr}, |
74 {"RSA-OAEP", 8, blink::WebCryptoAlgorithmIdRsaOaep}, | 74 {"RSA-OAEP", 8, blink::WebCryptoAlgorithmIdRsaOaep}, |
75 {"RSASSA-PKCS1-V1_5", 17, blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5}, | 75 {"RSASSA-PKCS1-V1_5", 17, blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5}, |
76 }; | 76 }; |
77 | 77 |
78 typedef char ParamsTypeOrUndefined; | |
79 const ParamsTypeOrUndefined Undefined = -1; | |
80 | |
81 struct AlgorithmInfo { | |
82 // The canonical (case-sensitive) name for the algorithm. | |
83 const char* name; | |
84 | |
85 // A map from the operation to the expected parameter type of the algorithm. | |
86 // If an operation is not applicable for the algorithm, set to Undefined. | |
87 const ParamsTypeOrUndefined operationToParamsType[blink::WebCryptoOperationL
ast + 1]; | |
88 }; | |
89 | |
90 // A mapping from the algorithm ID to information about the algorithm. | |
91 const AlgorithmInfo algorithmIdToInfo[] = { | |
92 { // Index 0 | |
93 "AES-CBC", { | |
94 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Encrypt | |
95 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // Decrypt | |
96 Undefined, // Sign | |
97 Undefined, // Verify | |
98 Undefined, // Digest | |
99 blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey | |
100 blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey | |
101 Undefined, // DeriveKey | |
102 Undefined, // DeriveBits | |
103 blink::WebCryptoAlgorithmParamsTypeAesCbcParams, // WrapKey | |
104 blink::WebCryptoAlgorithmParamsTypeAesCbcParams // UnwrapKey | |
105 } | |
106 }, { // Index 1 | |
107 "HMAC", { | |
108 Undefined, // Encrypt | |
109 Undefined, // Decrypt | |
110 blink::WebCryptoAlgorithmParamsTypeNone, // Sign | |
111 blink::WebCryptoAlgorithmParamsTypeNone, // Verify | |
112 Undefined, // Digest | |
113 blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams, // GenerateKey | |
114 blink::WebCryptoAlgorithmParamsTypeHmacImportParams, // ImportKey | |
115 Undefined, // DeriveKey | |
116 Undefined, // DeriveBits | |
117 Undefined, // WrapKey | |
118 Undefined // UnwrapKey | |
119 } | |
120 }, { // Index 2 | |
121 "RSASSA-PKCS1-v1_5", { | |
122 Undefined, // Encrypt | |
123 Undefined, // Decrypt | |
124 blink::WebCryptoAlgorithmParamsTypeNone, // Sign | |
125 blink::WebCryptoAlgorithmParamsTypeNone, // Verify | |
126 Undefined, // Digest | |
127 blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams, // Generat
eKey | |
128 blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams, // ImportK
ey | |
129 Undefined, // DeriveKey | |
130 Undefined, // DeriveBits | |
131 Undefined, // WrapKey | |
132 Undefined // UnwrapKey | |
133 } | |
134 }, { // Index 3 | |
135 "SHA-1", { | |
136 Undefined, // Encrypt | |
137 Undefined, // Decrypt | |
138 Undefined, // Sign | |
139 Undefined, // Verify | |
140 blink::WebCryptoAlgorithmParamsTypeNone, // Digest | |
141 Undefined, // GenerateKey | |
142 Undefined, // ImportKey | |
143 Undefined, // DeriveKey | |
144 Undefined, // DeriveBits | |
145 Undefined, // WrapKey | |
146 Undefined // UnwrapKey | |
147 } | |
148 }, { // Index 4 | |
149 "SHA-256", { | |
150 Undefined, // Encrypt | |
151 Undefined, // Decrypt | |
152 Undefined, // Sign | |
153 Undefined, // Verify | |
154 blink::WebCryptoAlgorithmParamsTypeNone, // Digest | |
155 Undefined, // GenerateKey | |
156 Undefined, // ImportKey | |
157 Undefined, // DeriveKey | |
158 Undefined, // DeriveBits | |
159 Undefined, // WrapKey | |
160 Undefined // UnwrapKey | |
161 } | |
162 }, { // Index 5 | |
163 "SHA-384", { | |
164 Undefined, // Encrypt | |
165 Undefined, // Decrypt | |
166 Undefined, // Sign | |
167 Undefined, // Verify | |
168 blink::WebCryptoAlgorithmParamsTypeNone, // Digest | |
169 Undefined, // GenerateKey | |
170 Undefined, // ImportKey | |
171 Undefined, // DeriveKey | |
172 Undefined, // DeriveBits | |
173 Undefined, // WrapKey | |
174 Undefined // UnwrapKey | |
175 } | |
176 }, { // Index 6 | |
177 "SHA-512", { | |
178 Undefined, // Encrypt | |
179 Undefined, // Decrypt | |
180 Undefined, // Sign | |
181 Undefined, // Verify | |
182 blink::WebCryptoAlgorithmParamsTypeNone, // Digest | |
183 Undefined, // GenerateKey | |
184 Undefined, // ImportKey | |
185 Undefined, // DeriveKey | |
186 Undefined, // DeriveBits | |
187 Undefined, // WrapKey | |
188 Undefined // UnwrapKey | |
189 } | |
190 }, { // Index 7 | |
191 "AES-GCM", { | |
192 blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // Encrypt | |
193 blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // Decrypt | |
194 Undefined, // Sign | |
195 Undefined, // Verify | |
196 Undefined, // Digest | |
197 blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey | |
198 blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey | |
199 Undefined, // DeriveKey | |
200 Undefined, // DeriveBits | |
201 blink::WebCryptoAlgorithmParamsTypeAesGcmParams, // WrapKey | |
202 blink::WebCryptoAlgorithmParamsTypeAesGcmParams // UnwrapKey | |
203 } | |
204 }, { // Index 8 | |
205 "RSA-OAEP", { | |
206 blink::WebCryptoAlgorithmParamsTypeRsaOaepParams, // Encrypt | |
207 blink::WebCryptoAlgorithmParamsTypeRsaOaepParams, // Decrypt | |
208 Undefined, // Sign | |
209 Undefined, // Verify | |
210 Undefined, // Digest | |
211 blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams, // Generat
eKey | |
212 blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams, // ImportK
ey | |
213 Undefined, // DeriveKey | |
214 Undefined, // DeriveBits | |
215 blink::WebCryptoAlgorithmParamsTypeRsaOaepParams, // WrapKey | |
216 blink::WebCryptoAlgorithmParamsTypeRsaOaepParams // UnwrapKey | |
217 } | |
218 }, { // Index 9 | |
219 "AES-CTR", { | |
220 blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // Encrypt | |
221 blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // Decrypt | |
222 Undefined, // Sign | |
223 Undefined, // Verify | |
224 Undefined, // Digest | |
225 blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey | |
226 blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey | |
227 Undefined, // DeriveKey | |
228 Undefined, // DeriveBits | |
229 blink::WebCryptoAlgorithmParamsTypeAesCtrParams, // WrapKey | |
230 blink::WebCryptoAlgorithmParamsTypeAesCtrParams // UnwrapKey | |
231 } | |
232 }, { // Index 10 | |
233 "AES-KW", { | |
234 Undefined, // Encrypt | |
235 Undefined, // Decrypt | |
236 Undefined, // Sign | |
237 Undefined, // Verify | |
238 Undefined, // Digest | |
239 blink::WebCryptoAlgorithmParamsTypeAesKeyGenParams, // GenerateKey | |
240 blink::WebCryptoAlgorithmParamsTypeNone, // ImportKey | |
241 Undefined, // DeriveKey | |
242 Undefined, // DeriveBits | |
243 blink::WebCryptoAlgorithmParamsTypeNone, // WrapKey | |
244 blink::WebCryptoAlgorithmParamsTypeNone // UnwrapKey | |
245 } | |
246 }, | |
247 }; | |
248 | |
249 // Initializing the algorithmIdToInfo table above depends on knowing the enum | |
250 // values for algorithm IDs. If those ever change, the table will need to be | |
251 // updated. | |
252 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesCbc == 0, AesCbc_idDoesntMatch); | |
253 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdHmac == 1, Hmac_idDoesntMatch); | |
254 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 == 2, RsaSsaPkcs1v1_5_
idDoesntMatch); | |
255 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha1 == 3, Sha1_idDoesntMatch); | |
256 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha256 == 4, Sha256_idDoesntMatch); | |
257 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha384 == 5, Sha384_idDoesntMatch); | |
258 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdSha512 == 6, Sha512_idDoesntMatch); | |
259 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesGcm == 7, AesGcm_idDoesntMatch); | |
260 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdRsaOaep == 8, RsaOaep_idDoesntMatch); | |
261 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesCtr == 9, AesCtr_idDoesntMatch); | |
262 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdAesKw == 10, AesKw_idDoesntMatch); | |
263 COMPILE_ASSERT(blink::WebCryptoAlgorithmIdLast == 10, Last_idDoesntMatch); | |
264 COMPILE_ASSERT(10 == blink::WebCryptoOperationLast, UpdateParamsMapping); | |
265 | |
266 #if ASSERT_ENABLED | 78 #if ASSERT_ENABLED |
267 | 79 |
268 // Essentially std::is_sorted() (however that function is new to C++11). | 80 // Essentially std::is_sorted() (however that function is new to C++11). |
269 template <typename Iterator> | 81 template <typename Iterator> |
270 bool isSorted(Iterator begin, Iterator end) | 82 bool isSorted(Iterator begin, Iterator end) |
271 { | 83 { |
272 if (begin == end) | 84 if (begin == end) |
273 return true; | 85 return true; |
274 | 86 |
275 Iterator prev = begin; | 87 Iterator prev = begin; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 if (it == end) | 177 if (it == end) |
366 return false; | 178 return false; |
367 | 179 |
368 if (it->algorithmNameLength != algorithmName.length() || !equalIgnoringCase(
algorithmName, it->algorithmName)) | 180 if (it->algorithmNameLength != algorithmName.length() || !equalIgnoringCase(
algorithmName, it->algorithmName)) |
369 return false; | 181 return false; |
370 | 182 |
371 id = it->algorithmId; | 183 id = it->algorithmId; |
372 return true; | 184 return true; |
373 } | 185 } |
374 | 186 |
375 const AlgorithmInfo* lookupAlgorithmInfo(blink::WebCryptoAlgorithmId id) | |
376 { | |
377 if (id < 0 || id >= WTF_ARRAY_LENGTH(algorithmIdToInfo)) | |
378 return 0; | |
379 return &algorithmIdToInfo[id]; | |
380 } | |
381 | |
382 void setSyntaxError(const String& message, AlgorithmError* error) | 187 void setSyntaxError(const String& message, AlgorithmError* error) |
383 { | 188 { |
384 error->errorType = blink::WebCryptoErrorTypeSyntax; | 189 error->errorType = blink::WebCryptoErrorTypeSyntax; |
385 error->errorDetails = message; | 190 error->errorDetails = message; |
386 } | 191 } |
387 | 192 |
388 void setNotSupportedError(const String& message, AlgorithmError* error) | 193 void setNotSupportedError(const String& message, AlgorithmError* error) |
389 { | 194 { |
390 error->errorType = blink::WebCryptoErrorTypeNotSupported; | 195 error->errorType = blink::WebCryptoErrorTypeNotSupported; |
391 error->errorDetails = message; | 196 error->errorDetails = message; |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 if (!lookupAlgorithmIdByName(algorithmName, algorithmId)) { | 694 if (!lookupAlgorithmIdByName(algorithmName, algorithmId)) { |
890 // FIXME: The spec says to return a SyntaxError if the input contains | 695 // FIXME: The spec says to return a SyntaxError if the input contains |
891 // any non-ASCII characters. | 696 // any non-ASCII characters. |
892 setNotSupportedError(context.toString("Unrecognized name"), error); | 697 setNotSupportedError(context.toString("Unrecognized name"), error); |
893 return false; | 698 return false; |
894 } | 699 } |
895 | 700 |
896 // Remove the "Algorithm:" prefix for all subsequent errors. | 701 // Remove the "Algorithm:" prefix for all subsequent errors. |
897 context.removeLast(); | 702 context.removeLast(); |
898 | 703 |
899 const AlgorithmInfo* algorithmInfo = lookupAlgorithmInfo(algorithmId); | 704 const blink::WebCryptoAlgorithmInfo* algorithmInfo = blink::WebCryptoAlgorit
hm::lookupAlgorithmInfo(algorithmId); |
900 | 705 |
901 if (algorithmInfo->operationToParamsType[op] == Undefined) { | 706 if (algorithmInfo->operationToParamsType[op] == blink::WebCryptoAlgorithmInf
o::Undefined) { |
902 context.add(algorithmIdToName(algorithmId)); | 707 context.add(algorithmInfo->name); |
903 setNotSupportedError(context.toString("Unsupported operation", operation
ToString(op)), error); | 708 setNotSupportedError(context.toString("Unsupported operation", operation
ToString(op)), error); |
904 return false; | 709 return false; |
905 } | 710 } |
906 | 711 |
907 blink::WebCryptoAlgorithmParamsType paramsType = static_cast<blink::WebCrypt
oAlgorithmParamsType>(algorithmInfo->operationToParamsType[op]); | 712 blink::WebCryptoAlgorithmParamsType paramsType = static_cast<blink::WebCrypt
oAlgorithmParamsType>(algorithmInfo->operationToParamsType[op]); |
908 | 713 |
909 OwnPtr<blink::WebCryptoAlgorithmParams> params; | 714 OwnPtr<blink::WebCryptoAlgorithmParams> params; |
910 if (!parseAlgorithmParams(raw, paramsType, params, context, error)) | 715 if (!parseAlgorithmParams(raw, paramsType, params, context, error)) |
911 return false; | 716 return false; |
912 | 717 |
913 algorithm = blink::WebCryptoAlgorithm(algorithmId, params.release()); | 718 algorithm = blink::WebCryptoAlgorithm(algorithmId, params.release()); |
914 return true; | 719 return true; |
915 } | 720 } |
916 | 721 |
917 } // namespace | 722 } // namespace |
918 | 723 |
919 bool normalizeAlgorithm(const Dictionary& raw, blink::WebCryptoOperation op, bli
nk::WebCryptoAlgorithm& algorithm, AlgorithmError* error) | 724 bool normalizeAlgorithm(const Dictionary& raw, blink::WebCryptoOperation op, bli
nk::WebCryptoAlgorithm& algorithm, AlgorithmError* error) |
920 { | 725 { |
921 return parseAlgorithm(raw, op, algorithm, ErrorContext(), error); | 726 return parseAlgorithm(raw, op, algorithm, ErrorContext(), error); |
922 } | 727 } |
923 | 728 |
924 const char* algorithmIdToName(blink::WebCryptoAlgorithmId id) | |
925 { | |
926 return lookupAlgorithmInfo(id)->name; | |
927 } | |
928 | |
929 } // namespace WebCore | 729 } // namespace WebCore |
OLD | NEW |