diff options
Diffstat (limited to 'content/child/webcrypto/platform_crypto_openssl.cc')
-rw-r--r-- | content/child/webcrypto/platform_crypto_openssl.cc | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/content/child/webcrypto/platform_crypto_openssl.cc b/content/child/webcrypto/platform_crypto_openssl.cc index 8314053..89212ea 100644 --- a/content/child/webcrypto/platform_crypto_openssl.cc +++ b/content/child/webcrypto/platform_crypto_openssl.cc @@ -53,10 +53,12 @@ class SymKey : public Key { 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 @@ Status EncryptDecryptAesGcm(EncryptOrDecrypt mode, 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 @@ Status EncryptDecryptAesGcm(EncryptOrDecrypt mode, 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(); |