From e8f39da1fa0612459dd82ff841b598d4fd98caf9 Mon Sep 17 00:00:00 2001
From: Alexander Holodov <holodov.alexander@vereign.com>
Date: Sun, 17 Mar 2019 15:41:29 +0300
Subject: [PATCH] 18 prevent useless allocates

---
 cpp/secret_store.hpp | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/cpp/secret_store.hpp b/cpp/secret_store.hpp
index c7c66c1..405fc5e 100644
--- a/cpp/secret_store.hpp
+++ b/cpp/secret_store.hpp
@@ -103,17 +103,17 @@ std::vector<unsigned char> generateRandomBytes(int size) {
 }
 
 std::string toHex(const std::vector<unsigned char> &data) {
-    std::unique_ptr<unsigned char[]> hex(new unsigned char[((data.size() + 2)/3) * 4 + 1]);
-    int len = EVP_EncodeBlock(hex.get(), data.data(), data.size());
+    std::string hex(((data.size() + 2)/3) * 4 + 1, 0);
+    int len = EVP_EncodeBlock((unsigned char*)&hex[0], data.data(), data.size());
     if (len < 0) {
         throw std::runtime_error("can't encode salt");
     }
-    return std::string((const char*)hex.get());
+    return hex;
 }
 
 std::vector<unsigned char> toBin(const std::string &data) {
-    std::unique_ptr<unsigned char[]> bin(new unsigned char[data.length()]);
-    auto len = EVP_DecodeBlock((unsigned char*)bin.get(), (const unsigned char*)data.c_str(), data.length());
+    std::vector<unsigned char> bin(data.length());
+    auto len = EVP_DecodeBlock(&bin[0], (const unsigned char*)data.c_str(), data.length());
     for (auto rit=data.rbegin(); rit!=data.rend(); ++rit) {
         if (*rit != '=') {
             break;
@@ -125,7 +125,8 @@ std::vector<unsigned char> toBin(const std::string &data) {
         throw std::runtime_error("can't decode base64");
     }
 
-    return std::vector<unsigned char>((unsigned char*)bin.get(), (unsigned char*)bin.get() + len);
+    bin.resize(len);
+    return bin;
 }
 
 std::string SecretStore::encrypt(const std::vector<unsigned char> &value, const std::string &pass) {
@@ -182,10 +183,9 @@ std::vector<unsigned char> SecretStore::crypt(AES_KEY *aes_key, const std::vecto
     memset(ecount_buf, 0, sizeof(ecount_buf));
     unsigned int num = 0;
 
-    std::unique_ptr<unsigned char[]> output(new unsigned char[input.size()]);
-    AES_ctr128_encrypt(input.data(), output.get(), input.size(), aes_key, ivec, ecount_buf, &num);
-
-    return std::vector<unsigned char>((unsigned char*)output.get(), (unsigned char*)output.get() + input.size());
+    std::vector<unsigned char> output(input.size());
+    AES_ctr128_encrypt(input.data(), &output[0], input.size(), aes_key, ivec, ecount_buf, &num);
+    return output;
 }
 
 
-- 
GitLab