summaryrefslogtreecommitdiffstats
path: root/crypto/encryptor_win.cc
diff options
context:
space:
mode:
authorrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-08 03:32:33 +0000
committerrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-08 03:32:33 +0000
commita9a20a4f791afdddfd9ad0aa27dab069e823ccdb (patch)
tree2c98769111bef0ed6ed173198841c9174d1e36d1 /crypto/encryptor_win.cc
parente62f4ed7131bb9e314aa4cc78f56021de8b5c4db (diff)
downloadchromium_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.cc39
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;
}