Index: trunk/src/content/child/webcrypto/platform_crypto_openssl.cc |
=================================================================== |
--- trunk/src/content/child/webcrypto/platform_crypto_openssl.cc (revision 283844) |
+++ trunk/src/content/child/webcrypto/platform_crypto_openssl.cc (working copy) |
@@ -53,10 +53,12 @@ |
namespace { |
const EVP_CIPHER* GetAESCipherByKeyLength(unsigned int key_length_bytes) { |
- // OpenSSL supports AES CBC ciphers for only 2 key lengths: 128, 256 bits |
+ // OpenSSL supports AES CBC ciphers for only 3 key lengths: 128, 192, 256 bits |
switch (key_length_bytes) { |
case 16: |
return EVP_aes_128_cbc(); |
+ case 24: |
+ return EVP_aes_192_cbc(); |
case 32: |
return EVP_aes_256_cbc(); |
default: |
@@ -437,8 +439,7 @@ |
crypto::ScopedOpenSSL<EVP_AEAD_CTX, EVP_AEAD_CTX_cleanup>::Type ctx_cleanup( |
&ctx); |
- size_t len; |
- int ok; |
+ ssize_t len; |
if (mode == DECRYPT) { |
if (data.byte_length() < tag_length_bytes) |
@@ -446,34 +447,32 @@ |
buffer->resize(data.byte_length() - tag_length_bytes); |
- ok = EVP_AEAD_CTX_open(&ctx, |
- Uint8VectorStart(buffer), |
- &len, |
- buffer->size(), |
- iv.bytes(), |
- iv.byte_length(), |
- data.bytes(), |
- data.byte_length(), |
- additional_data.bytes(), |
- additional_data.byte_length()); |
+ len = EVP_AEAD_CTX_open(&ctx, |
+ Uint8VectorStart(buffer), |
+ buffer->size(), |
+ iv.bytes(), |
+ iv.byte_length(), |
+ data.bytes(), |
+ data.byte_length(), |
+ additional_data.bytes(), |
+ additional_data.byte_length()); |
} else { |
// No need to check for unsigned integer overflow here (seal fails if |
// the output buffer is too small). |
buffer->resize(data.byte_length() + tag_length_bytes); |
- ok = EVP_AEAD_CTX_seal(&ctx, |
- Uint8VectorStart(buffer), |
- &len, |
- buffer->size(), |
- iv.bytes(), |
- iv.byte_length(), |
- data.bytes(), |
- data.byte_length(), |
- additional_data.bytes(), |
- additional_data.byte_length()); |
+ len = EVP_AEAD_CTX_seal(&ctx, |
+ Uint8VectorStart(buffer), |
+ buffer->size(), |
+ iv.bytes(), |
+ iv.byte_length(), |
+ data.bytes(), |
+ data.byte_length(), |
+ additional_data.bytes(), |
+ additional_data.byte_length()); |
} |
- if (!ok) |
+ if (len < 0) |
return Status::OperationError(); |
buffer->resize(len); |
return Status::Success(); |