Add some crypto tests

This commit is contained in:
Michele Rodolfi 2020-12-12 14:12:42 +01:00
parent da85377dba
commit f7801f40ef
3 changed files with 41 additions and 24 deletions

View File

@ -129,10 +129,10 @@ size_t AES256_CBC::process_all(Cipher::Mode mode, EvpCipherCtx& ctx,
} }
std::vector<unsigned char> AES256_CBC::encrypt(std::vector<unsigned char>& plaintext) { std::vector<unsigned char> AES256_CBC::encrypt(const std::vector<unsigned char>& plaintext) {
return encrypt(encryption_key, utils::generate_random(kIvSize), plaintext); return encrypt(encryption_key, utils::generate_random(kIvSize), plaintext);
} }
std::vector<unsigned char> AES256_CBC::decrypt(std::vector<unsigned char>& ciphertext) { std::vector<unsigned char> AES256_CBC::decrypt(const std::vector<unsigned char>& ciphertext) {
return decrypt(encryption_key, ciphertext); return decrypt(encryption_key, ciphertext);
} }

View File

@ -14,8 +14,8 @@ public:
kDecrypt kDecrypt
}; };
virtual std::vector<unsigned char> encrypt(std::vector<unsigned char>& plaintext) = 0; virtual std::vector<unsigned char> encrypt(const std::vector<unsigned char>& plaintext) = 0;
virtual std::vector<unsigned char> decrypt(std::vector<unsigned char>& ciphertext) = 0; virtual std::vector<unsigned char> decrypt(const std::vector<unsigned char>& ciphertext) = 0;
/* /*
virtual std::pair<std::vector<unsigned char>, std::vector<unsigned char>> virtual std::pair<std::vector<unsigned char>, std::vector<unsigned char>>
encrypt_all(std::vector<unsigned char>& plaintext) = 0; encrypt_all(std::vector<unsigned char>& plaintext) = 0;
@ -52,8 +52,8 @@ public:
AES256_CBC(const std::vector<unsigned char>& key); AES256_CBC(const std::vector<unsigned char>& key);
AES256_CBC(std::vector<unsigned char>&& key); AES256_CBC(std::vector<unsigned char>&& key);
std::vector<unsigned char> encrypt(std::vector<unsigned char>& plaintext) override; std::vector<unsigned char> encrypt(const std::vector<unsigned char>& plaintext) override;
std::vector<unsigned char> decrypt(std::vector<unsigned char>& ciphertext) override; std::vector<unsigned char> decrypt(const std::vector<unsigned char>& ciphertext) override;
std::vector<unsigned char> encrypt(const std::vector<unsigned char>& key, const std::vector<unsigned char>& iv, std::vector<unsigned char> encrypt(const std::vector<unsigned char>& key, const std::vector<unsigned char>& iv,
const std::vector<unsigned char>& input); const std::vector<unsigned char>& input);
@ -71,10 +71,6 @@ public:
int decrypt(const std::vector<unsigned char>& key, const std::vector<unsigned char>& iv, int decrypt(const std::vector<unsigned char>& key, const std::vector<unsigned char>& iv,
const std::vector<unsigned char>& input, std::vector<unsigned char>& output); const std::vector<unsigned char>& input, std::vector<unsigned char>& output);
std::pair<std::vector<unsigned char>, std::vector<unsigned char>>
encrypt(std::vector<unsigned char> plaintext);
std::vector<unsigned char> decrypt(const std::vector<unsigned char>& key, std::vector<unsigned char> decrypt(const std::vector<unsigned char>& key,
const std::vector<unsigned char>& ciphertext); const std::vector<unsigned char>& ciphertext);

View File

@ -3,16 +3,6 @@
#include "utils.h" #include "utils.h"
#include "crypto.h" #include "crypto.h"
typedef std::basic_string<unsigned char> ustring;
std::vector<std::byte> string_to_bytes(const std::string& str){
std::vector<std::byte> out;
transform(str.begin(), str.end(), std::back_inserter(out), [](auto c){return static_cast<std::byte>(c);});
return out;
}
/* test command: /* test command:
echo "ditemi perche' se la mucca fa mu il merlo non fa me" | echo "ditemi perche' se la mucca fa mu il merlo non fa me" |
scripts/aes256.sh -k 0123456789ABCDEF0123456789ABCDEF -i 0123456789ABCDEF | scripts/aes256.sh -k 0123456789ABCDEF0123456789ABCDEF -i 0123456789ABCDEF |
@ -55,11 +45,24 @@ TEST(CryptoTest, encrypt2){
temp.insert(temp.end(), test1_enc.begin(), test1_enc.end()); temp.insert(temp.end(), test1_enc.begin(), test1_enc.end());
EXPECT_EQ(temp.size(), output.size()); EXPECT_EQ(temp.size(), output.size());
EXPECT_EQ(std::vector<unsigned char>(temp.begin() + 50, temp.end()),
std::vector<unsigned char>(output.begin() + 50, output.end()));
EXPECT_EQ(temp, output); EXPECT_EQ(temp, output);
} }
TEST(CryptoTest, encrypt3){
const std::vector<unsigned char> plaintext(test1_str.begin(), test1_str.end());
//size_t output_len = plaintext.size() + 16;
//std::vector<unsigned char> output(output_len);
const std::vector<unsigned char> key(test1_key.begin(), test1_key.end());
const std::vector<unsigned char> iv(test1_iv.begin(), test1_iv.end());
AES256_CBC a(key);
auto output = a.encrypt(plaintext);
auto temp = iv;
temp.insert(temp.end(), test1_enc.begin(), test1_enc.end());
EXPECT_EQ(temp.size(), output.size());
}
TEST(CryptoTest, decrypt1){ TEST(CryptoTest, decrypt1){
const std::vector<unsigned char> plaintext(test1_str.begin(), test1_str.end()); const std::vector<unsigned char> plaintext(test1_str.begin(), test1_str.end());
size_t output_len = test1_enc.size(); size_t output_len = test1_enc.size();
@ -85,8 +88,26 @@ TEST(CryptoTest, decrypt2){
auto output = a.decrypt(key, input); auto output = a.decrypt(key, input);
EXPECT_EQ(plaintext, output); EXPECT_EQ(plaintext, output);
}
TEST(CryptoTest, decrypt3){
const std::vector<unsigned char> plaintext(test1_str.begin(), test1_str.end());
size_t output_len = test1_enc.size();
const std::vector<unsigned char> key(test1_key.begin(), test1_key.end());
const std::vector<unsigned char> iv(test1_iv.begin(), test1_iv.end());
// constructs encrypted input (iv + encrypted_data)
auto input = std::vector<unsigned char>(iv);
input.insert(input.end(),test1_enc.begin(), test1_enc.end());
AES256_CBC a(key);
auto output = a.decrypt(input);
AES256_CBC b(key);
output = b.decrypt(input);
EXPECT_EQ(plaintext, output); EXPECT_EQ(plaintext, output);
} }
TEST(CryptoTest, endToEnd){
const std::vector<unsigned char> plaintext(test1_str.begin(), test1_str.end());
AES256_CBC a;
auto crypto = a.encrypt(plaintext);
EXPECT_GT(crypto.size(), plaintext.size());
auto decrypted = a.decrypt(crypto);
EXPECT_EQ(plaintext, decrypted);
}