OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/child/webcrypto/platform_crypto.h" | 5 #include "content/child/webcrypto/platform_crypto.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 #include <openssl/aes.h> | 8 #include <openssl/aes.h> |
9 #include <openssl/evp.h> | 9 #include <openssl/evp.h> |
10 #include <openssl/hmac.h> | 10 #include <openssl/hmac.h> |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 | 46 |
47 private: | 47 private: |
48 const std::vector<unsigned char> key_; | 48 const std::vector<unsigned char> key_; |
49 | 49 |
50 DISALLOW_COPY_AND_ASSIGN(SymKey); | 50 DISALLOW_COPY_AND_ASSIGN(SymKey); |
51 }; | 51 }; |
52 | 52 |
53 namespace { | 53 namespace { |
54 | 54 |
55 const EVP_CIPHER* GetAESCipherByKeyLength(unsigned int key_length_bytes) { | 55 const EVP_CIPHER* GetAESCipherByKeyLength(unsigned int key_length_bytes) { |
56 // OpenSSL supports AES CBC ciphers for only 3 key lengths: 128, 192, 256 bits | 56 // OpenSSL supports AES CBC ciphers for only 2 key lengths: 128, 256 bits |
57 switch (key_length_bytes) { | 57 switch (key_length_bytes) { |
58 case 16: | 58 case 16: |
59 return EVP_aes_128_cbc(); | 59 return EVP_aes_128_cbc(); |
60 case 24: | |
61 return EVP_aes_192_cbc(); | |
62 case 32: | 60 case 32: |
63 return EVP_aes_256_cbc(); | 61 return EVP_aes_256_cbc(); |
64 default: | 62 default: |
65 return NULL; | 63 return NULL; |
66 } | 64 } |
67 } | 65 } |
68 | 66 |
69 const EVP_MD* GetDigest(blink::WebCryptoAlgorithmId id) { | 67 const EVP_MD* GetDigest(blink::WebCryptoAlgorithmId id) { |
70 switch (id) { | 68 switch (id) { |
71 case blink::WebCryptoAlgorithmIdSha1: | 69 case blink::WebCryptoAlgorithmIdSha1: |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 Uint8VectorStart(key->key()), | 430 Uint8VectorStart(key->key()), |
433 key->key().size(), | 431 key->key().size(), |
434 tag_length_bytes, | 432 tag_length_bytes, |
435 NULL)) { | 433 NULL)) { |
436 return Status::OperationError(); | 434 return Status::OperationError(); |
437 } | 435 } |
438 | 436 |
439 crypto::ScopedOpenSSL<EVP_AEAD_CTX, EVP_AEAD_CTX_cleanup>::Type ctx_cleanup( | 437 crypto::ScopedOpenSSL<EVP_AEAD_CTX, EVP_AEAD_CTX_cleanup>::Type ctx_cleanup( |
440 &ctx); | 438 &ctx); |
441 | 439 |
442 ssize_t len; | 440 size_t len; |
| 441 int ok; |
443 | 442 |
444 if (mode == DECRYPT) { | 443 if (mode == DECRYPT) { |
445 if (data.byte_length() < tag_length_bytes) | 444 if (data.byte_length() < tag_length_bytes) |
446 return Status::ErrorDataTooSmall(); | 445 return Status::ErrorDataTooSmall(); |
447 | 446 |
448 buffer->resize(data.byte_length() - tag_length_bytes); | 447 buffer->resize(data.byte_length() - tag_length_bytes); |
449 | 448 |
450 len = EVP_AEAD_CTX_open(&ctx, | 449 ok = EVP_AEAD_CTX_open(&ctx, |
451 Uint8VectorStart(buffer), | 450 Uint8VectorStart(buffer), |
452 buffer->size(), | 451 &len, |
453 iv.bytes(), | 452 buffer->size(), |
454 iv.byte_length(), | 453 iv.bytes(), |
455 data.bytes(), | 454 iv.byte_length(), |
456 data.byte_length(), | 455 data.bytes(), |
457 additional_data.bytes(), | 456 data.byte_length(), |
458 additional_data.byte_length()); | 457 additional_data.bytes(), |
| 458 additional_data.byte_length()); |
459 } else { | 459 } else { |
460 // No need to check for unsigned integer overflow here (seal fails if | 460 // No need to check for unsigned integer overflow here (seal fails if |
461 // the output buffer is too small). | 461 // the output buffer is too small). |
462 buffer->resize(data.byte_length() + tag_length_bytes); | 462 buffer->resize(data.byte_length() + tag_length_bytes); |
463 | 463 |
464 len = EVP_AEAD_CTX_seal(&ctx, | 464 ok = EVP_AEAD_CTX_seal(&ctx, |
465 Uint8VectorStart(buffer), | 465 Uint8VectorStart(buffer), |
466 buffer->size(), | 466 &len, |
467 iv.bytes(), | 467 buffer->size(), |
468 iv.byte_length(), | 468 iv.bytes(), |
469 data.bytes(), | 469 iv.byte_length(), |
470 data.byte_length(), | 470 data.bytes(), |
471 additional_data.bytes(), | 471 data.byte_length(), |
472 additional_data.byte_length()); | 472 additional_data.bytes(), |
| 473 additional_data.byte_length()); |
473 } | 474 } |
474 | 475 |
475 if (len < 0) | 476 if (!ok) |
476 return Status::OperationError(); | 477 return Status::OperationError(); |
477 buffer->resize(len); | 478 buffer->resize(len); |
478 return Status::Success(); | 479 return Status::Success(); |
479 } | 480 } |
480 | 481 |
481 Status EncryptRsaOaep(PublicKey* key, | 482 Status EncryptRsaOaep(PublicKey* key, |
482 const blink::WebCryptoAlgorithm& hash, | 483 const blink::WebCryptoAlgorithm& hash, |
483 const CryptoData& label, | 484 const CryptoData& label, |
484 const CryptoData& data, | 485 const CryptoData& data, |
485 std::vector<uint8>* buffer) { | 486 std::vector<uint8>* buffer) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 blink::WebCryptoKey* key) { | 582 blink::WebCryptoKey* key) { |
582 // TODO(eroman): http://crbug.com/267888 | 583 // TODO(eroman): http://crbug.com/267888 |
583 return false; | 584 return false; |
584 } | 585 } |
585 | 586 |
586 } // namespace platform | 587 } // namespace platform |
587 | 588 |
588 } // namespace webcrypto | 589 } // namespace webcrypto |
589 | 590 |
590 } // namespace content | 591 } // namespace content |
OLD | NEW |