| 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 <vector> | 5 #include <vector> |
| 6 #include <openssl/evp.h> | 6 #include <openssl/evp.h> |
| 7 | 7 |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "content/child/webcrypto/crypto_data.h" | 9 #include "content/child/webcrypto/crypto_data.h" |
| 10 #include "content/child/webcrypto/openssl/aes_key_openssl.h" | 10 #include "content/child/webcrypto/openssl/aes_key_openssl.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 Uint8VectorStart(raw_key), | 64 Uint8VectorStart(raw_key), |
| 65 raw_key.size(), | 65 raw_key.size(), |
| 66 tag_length_bytes, | 66 tag_length_bytes, |
| 67 NULL)) { | 67 NULL)) { |
| 68 return Status::OperationError(); | 68 return Status::OperationError(); |
| 69 } | 69 } |
| 70 | 70 |
| 71 crypto::ScopedOpenSSL<EVP_AEAD_CTX, EVP_AEAD_CTX_cleanup>::Type ctx_cleanup( | 71 crypto::ScopedOpenSSL<EVP_AEAD_CTX, EVP_AEAD_CTX_cleanup>::Type ctx_cleanup( |
| 72 &ctx); | 72 &ctx); |
| 73 | 73 |
| 74 ssize_t len; | 74 size_t len; |
| 75 int ok; |
| 75 | 76 |
| 76 if (mode == DECRYPT) { | 77 if (mode == DECRYPT) { |
| 77 if (data.byte_length() < tag_length_bytes) | 78 if (data.byte_length() < tag_length_bytes) |
| 78 return Status::ErrorDataTooSmall(); | 79 return Status::ErrorDataTooSmall(); |
| 79 | 80 |
| 80 buffer->resize(data.byte_length() - tag_length_bytes); | 81 buffer->resize(data.byte_length() - tag_length_bytes); |
| 81 | 82 |
| 82 len = EVP_AEAD_CTX_open(&ctx, | 83 ok = EVP_AEAD_CTX_open(&ctx, |
| 83 Uint8VectorStart(buffer), | 84 Uint8VectorStart(buffer), |
| 84 buffer->size(), | 85 &len, |
| 85 iv.bytes(), | 86 buffer->size(), |
| 86 iv.byte_length(), | 87 iv.bytes(), |
| 87 data.bytes(), | 88 iv.byte_length(), |
| 88 data.byte_length(), | 89 data.bytes(), |
| 89 additional_data.bytes(), | 90 data.byte_length(), |
| 90 additional_data.byte_length()); | 91 additional_data.bytes(), |
| 92 additional_data.byte_length()); |
| 91 } else { | 93 } else { |
| 92 // No need to check for unsigned integer overflow here (seal fails if | 94 // No need to check for unsigned integer overflow here (seal fails if |
| 93 // the output buffer is too small). | 95 // the output buffer is too small). |
| 94 buffer->resize(data.byte_length() + tag_length_bytes); | 96 buffer->resize(data.byte_length() + tag_length_bytes); |
| 95 | 97 |
| 96 len = EVP_AEAD_CTX_seal(&ctx, | 98 ok = EVP_AEAD_CTX_seal(&ctx, |
| 97 Uint8VectorStart(buffer), | 99 Uint8VectorStart(buffer), |
| 98 buffer->size(), | 100 &len, |
| 99 iv.bytes(), | 101 buffer->size(), |
| 100 iv.byte_length(), | 102 iv.bytes(), |
| 101 data.bytes(), | 103 iv.byte_length(), |
| 102 data.byte_length(), | 104 data.bytes(), |
| 103 additional_data.bytes(), | 105 data.byte_length(), |
| 104 additional_data.byte_length()); | 106 additional_data.bytes(), |
| 107 additional_data.byte_length()); |
| 105 } | 108 } |
| 106 | 109 |
| 107 if (len < 0) | 110 if (!ok) |
| 108 return Status::OperationError(); | 111 return Status::OperationError(); |
| 109 buffer->resize(len); | 112 buffer->resize(len); |
| 110 return Status::Success(); | 113 return Status::Success(); |
| 111 } | 114 } |
| 112 | 115 |
| 113 class AesGcmImplementation : public AesAlgorithm { | 116 class AesGcmImplementation : public AesAlgorithm { |
| 114 public: | 117 public: |
| 115 AesGcmImplementation() : AesAlgorithm("GCM") {} | 118 AesGcmImplementation() : AesAlgorithm("GCM") {} |
| 116 | 119 |
| 117 virtual Status Encrypt(const blink::WebCryptoAlgorithm& algorithm, | 120 virtual Status Encrypt(const blink::WebCryptoAlgorithm& algorithm, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 131 | 134 |
| 132 } // namespace | 135 } // namespace |
| 133 | 136 |
| 134 AlgorithmImplementation* CreatePlatformAesGcmImplementation() { | 137 AlgorithmImplementation* CreatePlatformAesGcmImplementation() { |
| 135 return new AesGcmImplementation; | 138 return new AesGcmImplementation; |
| 136 } | 139 } |
| 137 | 140 |
| 138 } // namespace webcrypto | 141 } // namespace webcrypto |
| 139 | 142 |
| 140 } // namespace content | 143 } // namespace content |
| OLD | NEW |