diff options
author | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-08 03:32:33 +0000 |
---|---|---|
committer | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-08 03:32:33 +0000 |
commit | a9a20a4f791afdddfd9ad0aa27dab069e823ccdb (patch) | |
tree | 2c98769111bef0ed6ed173198841c9174d1e36d1 /crypto/encryptor_win.cc | |
parent | e62f4ed7131bb9e314aa4cc78f56021de8b5c4db (diff) | |
download | chromium_src-a9a20a4f791afdddfd9ad0aa27dab069e823ccdb.zip chromium_src-a9a20a4f791afdddfd9ad0aa27dab069e823ccdb.tar.gz chromium_src-a9a20a4f791afdddfd9ad0aa27dab069e823ccdb.tar.bz2 |
Eliminate an extra allocation in encryptor_win when en/decrypting.
R=wtc
BUG=none
TEST=crypto_unittests
Review URL: http://codereview.chromium.org/7272022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91803 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'crypto/encryptor_win.cc')
-rw-r--r-- | crypto/encryptor_win.cc | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/crypto/encryptor_win.cc b/crypto/encryptor_win.cc index 088c9e5..fae1f82 100644 --- a/crypto/encryptor_win.cc +++ b/crypto/encryptor_win.cc @@ -4,8 +4,9 @@ #include "crypto/encryptor.h" -#include <vector> +#include <string.h> +#include "base/string_util.h" #include "crypto/symmetric_key.h" namespace crypto { @@ -83,36 +84,42 @@ bool Encryptor::Encrypt(const base::StringPiece& plaintext, std::string* ciphertext) { DWORD data_len = plaintext.size(); DWORD total_len = data_len + block_size_; + CHECK_GT(total_len, data_len); // CryptoAPI encrypts/decrypts in place. - std::vector<BYTE> tmp(total_len); - memcpy(&tmp[0], plaintext.data(), data_len); - - BOOL ok = CryptEncrypt(capi_key_.get(), NULL, TRUE, 0, &tmp[0], - &data_len, total_len); - if (!ok) + char* ciphertext_data = WriteInto(ciphertext, total_len + 1); + memcpy(ciphertext_data, plaintext.data(), data_len); + + BOOL ok = CryptEncrypt(capi_key_.get(), NULL, TRUE, 0, + reinterpret_cast<BYTE*>(ciphertext_data), &data_len, + total_len); + if (!ok) { + ciphertext->clear(); return false; + } - ciphertext->assign(reinterpret_cast<char*>(&tmp[0]), data_len); + ciphertext->resize(data_len); return true; } bool Encryptor::Decrypt(const base::StringPiece& ciphertext, std::string* plaintext) { DWORD data_len = ciphertext.size(); - if (data_len == 0) + if (data_len == 0 || (data_len + 1) < data_len) return false; - std::vector<BYTE> tmp(data_len); - memcpy(&tmp[0], ciphertext.data(), data_len); + // CryptoAPI encrypts/decrypts in place. + char* plaintext_data = WriteInto(plaintext, data_len + 1); + memcpy(plaintext_data, ciphertext.data(), data_len); - BOOL ok = CryptDecrypt(capi_key_.get(), NULL, TRUE, 0, &tmp[0], &data_len); - if (!ok) + BOOL ok = CryptDecrypt(capi_key_.get(), NULL, TRUE, 0, + reinterpret_cast<BYTE*>(plaintext_data), &data_len); + if (!ok) { + plaintext->clear(); return false; + } - DCHECK_GT(tmp.size(), data_len); - - plaintext->assign(reinterpret_cast<char*>(&tmp[0]), data_len); + plaintext->resize(data_len); return true; } |