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

Side by Side Diff: content/renderer/webcrypto/webcrypto_util.cc

Issue 178073007: [webcrypto] Update to use the KeyAlgorithm. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove unrelated change that makes public keys extractable Created 6 years, 10 months 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
« no previous file with comments | « content/renderer/webcrypto/webcrypto_util.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/webcrypto/webcrypto_util.h" 5 #include "content/renderer/webcrypto/webcrypto_util.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" 9 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h"
10 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" 10 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h"
11 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
12 #include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h"
13 #endif
11 14
12 namespace content { 15 namespace content {
13 16
14 namespace webcrypto { 17 namespace webcrypto {
15 18
16 bool Status::IsError() const { return type_ == TYPE_ERROR; } 19 bool Status::IsError() const { return type_ == TYPE_ERROR; }
17 20
18 bool Status::IsSuccess() const { return type_ == TYPE_SUCCESS; } 21 bool Status::IsSuccess() const { return type_ == TYPE_SUCCESS; }
19 22
20 bool Status::HasErrorDetails() const { return !error_details_.empty(); } 23 bool Status::HasErrorDetails() const { return !error_details_.empty(); }
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 } 206 }
204 207
205 bool IsHashAlgorithm(blink::WebCryptoAlgorithmId alg_id) { 208 bool IsHashAlgorithm(blink::WebCryptoAlgorithmId alg_id) {
206 return alg_id == blink::WebCryptoAlgorithmIdSha1 || 209 return alg_id == blink::WebCryptoAlgorithmIdSha1 ||
207 alg_id == blink::WebCryptoAlgorithmIdSha224 || 210 alg_id == blink::WebCryptoAlgorithmIdSha224 ||
208 alg_id == blink::WebCryptoAlgorithmIdSha256 || 211 alg_id == blink::WebCryptoAlgorithmIdSha256 ||
209 alg_id == blink::WebCryptoAlgorithmIdSha384 || 212 alg_id == blink::WebCryptoAlgorithmIdSha384 ||
210 alg_id == blink::WebCryptoAlgorithmIdSha512; 213 alg_id == blink::WebCryptoAlgorithmIdSha512;
211 } 214 }
212 215
216 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
213 blink::WebCryptoAlgorithm GetInnerHashAlgorithm( 217 blink::WebCryptoAlgorithm GetInnerHashAlgorithm(
214 const blink::WebCryptoAlgorithm& algorithm) { 218 const blink::WebCryptoAlgorithm& algorithm) {
215 DCHECK(!algorithm.isNull()); 219 DCHECK(!algorithm.isNull());
220 switch (algorithm.paramsType()) {
221 case blink::WebCryptoAlgorithmParamsTypeHmacImportParams:
222 return algorithm.hmacImportParams()->hash();
223 case blink::WebCryptoAlgorithmParamsTypeHmacKeyGenParams:
224 return algorithm.hmacKeyGenParams()->hash();
225 case blink::WebCryptoAlgorithmParamsTypeRsaHashedImportParams:
226 return algorithm.rsaHashedImportParams()->hash();
227 case blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams:
228 return algorithm.rsaHashedKeyGenParams()->hash();
229 default:
230 return blink::WebCryptoAlgorithm::createNull();
231 }
232 }
233 #else
234 blink::WebCryptoAlgorithm GetInnerHashAlgorithm(
235 const blink::WebCryptoAlgorithm& algorithm) {
236 DCHECK(!algorithm.isNull());
216 switch (algorithm.id()) { 237 switch (algorithm.id()) {
217 case blink::WebCryptoAlgorithmIdHmac: 238 case blink::WebCryptoAlgorithmIdHmac:
218 if (algorithm.hmacParams()) 239 if (algorithm.hmacParams())
219 return algorithm.hmacParams()->hash(); 240 return algorithm.hmacParams()->hash();
220 else if (algorithm.hmacKeyParams()) 241 else if (algorithm.hmacKeyParams())
221 return algorithm.hmacKeyParams()->hash(); 242 return algorithm.hmacKeyParams()->hash();
222 break; 243 break;
223 case blink::WebCryptoAlgorithmIdRsaOaep: 244 case blink::WebCryptoAlgorithmIdRsaOaep:
224 if (algorithm.rsaOaepParams()) 245 if (algorithm.rsaOaepParams())
225 return algorithm.rsaOaepParams()->hash(); 246 return algorithm.rsaOaepParams()->hash();
226 break; 247 break;
227 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: 248 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5:
228 if (algorithm.rsaSsaParams()) 249 if (algorithm.rsaSsaParams())
229 return algorithm.rsaSsaParams()->hash(); 250 return algorithm.rsaSsaParams()->hash();
230 break; 251 break;
231 default: 252 default:
232 break; 253 break;
233 } 254 }
234 return blink::WebCryptoAlgorithm::createNull(); 255 return blink::WebCryptoAlgorithm::createNull();
235 } 256 }
257 #endif
236 258
237 blink::WebCryptoAlgorithm CreateAlgorithm(blink::WebCryptoAlgorithmId id) { 259 blink::WebCryptoAlgorithm CreateAlgorithm(blink::WebCryptoAlgorithmId id) {
238 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(id, NULL); 260 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(id, NULL);
239 } 261 }
240 262
241 blink::WebCryptoAlgorithm CreateHmacAlgorithmByHashId( 263 blink::WebCryptoAlgorithm CreateHmacImportAlgorithm(
242 blink::WebCryptoAlgorithmId hash_id) { 264 blink::WebCryptoAlgorithmId hash_id) {
243 DCHECK(IsHashAlgorithm(hash_id)); 265 DCHECK(IsHashAlgorithm(hash_id));
244 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( 266 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
245 blink::WebCryptoAlgorithmIdHmac, 267 blink::WebCryptoAlgorithmIdHmac,
268 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
269 new blink::WebCryptoHmacImportParams(CreateAlgorithm(hash_id)));
270 #else
246 new blink::WebCryptoHmacParams(CreateAlgorithm(hash_id))); 271 new blink::WebCryptoHmacParams(CreateAlgorithm(hash_id)));
272 #endif
247 } 273 }
248 274
249 blink::WebCryptoAlgorithm CreateHmacKeyGenAlgorithm( 275 blink::WebCryptoAlgorithm CreateRsaSsaImportAlgorithm(
250 blink::WebCryptoAlgorithmId hash_id,
251 unsigned int key_length_bytes) {
252 DCHECK(IsHashAlgorithm(hash_id));
253 // key_length_bytes == 0 means unspecified
254 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
255 blink::WebCryptoAlgorithmIdHmac,
256 new blink::WebCryptoHmacKeyParams(
257 CreateAlgorithm(hash_id), (key_length_bytes != 0), key_length_bytes));
258 }
259
260 blink::WebCryptoAlgorithm CreateRsaSsaAlgorithm(
261 blink::WebCryptoAlgorithmId hash_id) { 276 blink::WebCryptoAlgorithmId hash_id) {
262 DCHECK(IsHashAlgorithm(hash_id)); 277 DCHECK(IsHashAlgorithm(hash_id));
263 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( 278 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
264 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5, 279 blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5,
280 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
281 new blink::WebCryptoRsaHashedImportParams(CreateAlgorithm(hash_id)));
282 #else
265 new blink::WebCryptoRsaSsaParams(CreateAlgorithm(hash_id))); 283 new blink::WebCryptoRsaSsaParams(CreateAlgorithm(hash_id)));
284 #endif
266 } 285 }
267 286
268 blink::WebCryptoAlgorithm CreateRsaOaepAlgorithm( 287 blink::WebCryptoAlgorithm CreateRsaOaepImportAlgorithm(
269 blink::WebCryptoAlgorithmId hash_id) { 288 blink::WebCryptoAlgorithmId hash_id) {
270 DCHECK(IsHashAlgorithm(hash_id)); 289 DCHECK(IsHashAlgorithm(hash_id));
271 return blink::WebCryptoAlgorithm::adoptParamsAndCreate( 290 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
272 blink::WebCryptoAlgorithmIdRsaOaep, 291 blink::WebCryptoAlgorithmIdRsaOaep,
292 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
293 new blink::WebCryptoRsaHashedImportParams(
294 CreateAlgorithm(hash_id)));
295 #else
273 new blink::WebCryptoRsaOaepParams( 296 new blink::WebCryptoRsaOaepParams(
274 CreateAlgorithm(hash_id), false, NULL, 0)); 297 CreateAlgorithm(hash_id), false, NULL, 0));
298 #endif
275 } 299 }
276 300
277 blink::WebCryptoAlgorithm CreateRsaKeyGenAlgorithm(
278 blink::WebCryptoAlgorithmId algorithm_id,
279 unsigned int modulus_length,
280 const std::vector<uint8>& public_exponent) {
281 DCHECK(algorithm_id == blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5 ||
282 algorithm_id == blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5 ||
283 algorithm_id == blink::WebCryptoAlgorithmIdRsaOaep);
284 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
285 algorithm_id,
286 new blink::WebCryptoRsaKeyGenParams(
287 modulus_length,
288 webcrypto::Uint8VectorStart(public_exponent),
289 public_exponent.size()));
290 }
291
292 blink::WebCryptoAlgorithm CreateAesCbcAlgorithm(const std::vector<uint8>& iv) {
293 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
294 blink::WebCryptoAlgorithmIdAesCbc,
295 new blink::WebCryptoAesCbcParams(Uint8VectorStart(iv), iv.size()));
296 }
297
298 blink::WebCryptoAlgorithm CreateAesGcmAlgorithm(
299 const std::vector<uint8>& iv,
300 const std::vector<uint8>& additional_data,
301 uint8 tag_length_bytes) {
302 return blink::WebCryptoAlgorithm::adoptParamsAndCreate(
303 blink::WebCryptoAlgorithmIdAesCbc,
304 new blink::WebCryptoAesGcmParams(Uint8VectorStart(iv),
305 iv.size(),
306 additional_data.size() != 0,
307 Uint8VectorStart(additional_data),
308 additional_data.size(),
309 tag_length_bytes != 0,
310 tag_length_bytes));
311 }
312 301
313 unsigned int ShaBlockSizeBytes(blink::WebCryptoAlgorithmId hash_id) { 302 unsigned int ShaBlockSizeBytes(blink::WebCryptoAlgorithmId hash_id) {
314 switch (hash_id) { 303 switch (hash_id) {
315 case blink::WebCryptoAlgorithmIdSha1: 304 case blink::WebCryptoAlgorithmIdSha1:
316 case blink::WebCryptoAlgorithmIdSha224: 305 case blink::WebCryptoAlgorithmIdSha224:
317 case blink::WebCryptoAlgorithmIdSha256: 306 case blink::WebCryptoAlgorithmIdSha256:
318 return 64; 307 return 64;
319 case blink::WebCryptoAlgorithmIdSha384: 308 case blink::WebCryptoAlgorithmIdSha384:
320 case blink::WebCryptoAlgorithmIdSha512: 309 case blink::WebCryptoAlgorithmIdSha512:
321 return 128; 310 return 128;
322 default: 311 default:
323 NOTREACHED(); 312 NOTREACHED();
324 return 0; 313 return 0;
325 } 314 }
326 } 315 }
327 316
317 #ifdef WEBCRYPTO_HAS_KEY_ALGORITHM
318 bool CreateSecretKeyAlgorithm(const blink::WebCryptoAlgorithm& algorithm,
319 unsigned keylen_bytes,
320 blink::WebCryptoKeyAlgorithm* key_algorithm) {
321 switch (algorithm.id()) {
322 case blink::WebCryptoAlgorithmIdHmac: {
323 blink::WebCryptoAlgorithm hash = GetInnerHashAlgorithm(algorithm);
324 if (hash.isNull())
325 return false;
326 *key_algorithm = blink::WebCryptoKeyAlgorithm::adoptParamsAndCreate(
327 algorithm.id(),
328 new blink::WebCryptoHmacKeyAlgorithmParams(hash));
329 return true;
330 }
331 case blink::WebCryptoAlgorithmIdAesKw:
332 case blink::WebCryptoAlgorithmIdAesCbc:
333 case blink::WebCryptoAlgorithmIdAesCtr:
334 case blink::WebCryptoAlgorithmIdAesGcm:
335 *key_algorithm = blink::WebCryptoKeyAlgorithm::adoptParamsAndCreate(
336 algorithm.id(),
337 new blink::WebCryptoAesKeyAlgorithmParams(keylen_bytes * 8));
338 return true;
339 default:
340 return false;
341 }
342 }
343 #else
344 bool CreateSecretKeyAlgorithm(const blink::WebCryptoAlgorithm& algorithm,
345 unsigned keylen_bytes,
346 blink::WebCryptoAlgorithm* key_algorithm) {
347 *key_algorithm = algorithm;
348 return true;
349 }
350 #endif
351
328 } // namespace webcrypto 352 } // namespace webcrypto
329 353
330 } // namespace content 354 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/webcrypto/webcrypto_util.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698