Index: net/quic/crypto/aead_base_encrypter_openssl.cc |
diff --git a/net/quic/crypto/aead_base_encrypter_openssl.cc b/net/quic/crypto/aead_base_encrypter_openssl.cc |
index 25d996799cca56c10eac412fa2a6a9b5bb534621..be4b1e8d9d4e7065f51ba9fc6f767dadf48ef36f 100644 |
--- a/net/quic/crypto/aead_base_encrypter_openssl.cc |
+++ b/net/quic/crypto/aead_base_encrypter_openssl.cc |
@@ -81,16 +81,12 @@ bool AeadBaseEncrypter::Encrypt(StringPiece nonce, |
return false; |
} |
- size_t len; |
+ size_t ciphertext_len; |
if (!EVP_AEAD_CTX_seal( |
- ctx_.get(), |
- output, |
- &len, |
+ ctx_.get(), output, &ciphertext_len, |
plaintext.size() + auth_tag_size_, |
- reinterpret_cast<const uint8_t*>(nonce.data()), |
- nonce.size(), |
- reinterpret_cast<const uint8_t*>(plaintext.data()), |
- plaintext.size(), |
+ reinterpret_cast<const uint8_t*>(nonce.data()), nonce.size(), |
+ reinterpret_cast<const uint8_t*>(plaintext.data()), plaintext.size(), |
reinterpret_cast<const uint8_t*>(associated_data.data()), |
associated_data.size())) { |
DLogOpenSslErrors(); |
@@ -100,27 +96,28 @@ bool AeadBaseEncrypter::Encrypt(StringPiece nonce, |
return true; |
} |
-QuicData* AeadBaseEncrypter::EncryptPacket( |
- QuicPacketSequenceNumber sequence_number, |
- StringPiece associated_data, |
- StringPiece plaintext) { |
+bool AeadBaseEncrypter::EncryptPacket(QuicPacketSequenceNumber sequence_number, |
+ StringPiece associated_data, |
+ StringPiece plaintext, |
+ char* output, |
+ size_t* output_length, |
+ size_t max_output_length) { |
size_t ciphertext_size = GetCiphertextSize(plaintext.length()); |
- scoped_ptr<char[]> ciphertext(new char[ciphertext_size]); |
- |
+ if (max_output_length < ciphertext_size) { |
+ return false; |
+ } |
// TODO(ianswett): Introduce a check to ensure that we don't encrypt with the |
// same sequence number twice. |
- uint8 nonce[sizeof(nonce_prefix_) + sizeof(sequence_number)]; |
const size_t nonce_size = nonce_prefix_size_ + sizeof(sequence_number); |
- DCHECK_LE(nonce_size, sizeof(nonce)); |
- memcpy(nonce, nonce_prefix_, nonce_prefix_size_); |
- memcpy(nonce + nonce_prefix_size_, &sequence_number, sizeof(sequence_number)); |
- if (!Encrypt(StringPiece(reinterpret_cast<char*>(nonce), nonce_size), |
- associated_data, plaintext, |
- reinterpret_cast<unsigned char*>(ciphertext.get()))) { |
- return nullptr; |
+ memcpy(output, nonce_prefix_, nonce_prefix_size_); |
+ memcpy(output + nonce_prefix_size_, &sequence_number, |
+ sizeof(sequence_number)); |
+ if (!Encrypt(StringPiece(output, nonce_size), associated_data, plaintext, |
+ reinterpret_cast<unsigned char*>(output))) { |
+ return false; |
} |
- |
- return new QuicData(ciphertext.release(), ciphertext_size, true); |
+ *output_length = ciphertext_size; |
+ return true; |
} |
size_t AeadBaseEncrypter::GetKeySize() const { return key_size_; } |