diff --git a/cpp/secret_store.hpp b/cpp/secret_store.hpp
index c7c66c1c642d7cb733f9b14aa910b55935c8d06a..405fc5e88bd23d7f1e23c7a62034b776b1fb7a9f 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;
 }