Add integration tests

This commit is contained in:
Michele Rodolfi 2020-12-12 15:36:38 +01:00
parent bb9c27aba3
commit 1fb526e711
10 changed files with 143 additions and 59 deletions

View File

@ -12,6 +12,8 @@
#include "crypto.h" #include "crypto.h"
#include "utils.h" #include "utils.h"
namespace horcrux {
class EvpCipherCtx { class EvpCipherCtx {
EVP_CIPHER_CTX *ptr; EVP_CIPHER_CTX *ptr;
@ -193,3 +195,4 @@ std::vector<unsigned char> AES256_CBC::decrypt(
process_all(Cipher::Mode::kDecrypt, ctx, begin, end, output, 0); process_all(Cipher::Mode::kDecrypt, ctx, begin, end, output, 0);
return output; return output;
} }
}; //namespace

View File

@ -1,7 +1,10 @@
#ifndef HORCRUX_SRC_CRYPTO_H
#define HORCRUX_SRC_CRYPTO_H
#include <vector> #include <vector>
#include <string> #include <string>
#include <cstddef> #include <cstddef>
namespace horcrux {
enum class CipherType {AES256_CBC}; enum class CipherType {AES256_CBC};
class Cipher { class Cipher {
@ -108,3 +111,5 @@ static std::unique_ptr<Cipher> createCipher(CipherType type){
} }
} }
};
#endif //HORCRUX_SRC_CRYPTO_H

View File

@ -64,8 +64,8 @@ size_t FsPlainOutput::write(const std::vector<unsigned char>& to_write){
return to_write.size(); return to_write.size();
} }
FsCryptoOutput::FsCryptoOutput(const std::string& folder, const int horcrux_num, const size_t horcrux_size = 0, FsCryptoOutput::FsCryptoOutput(const std::string& folder, const int horcrux_num,
const std::string& filename = "horcrux") const std::string& filename, const size_t horcrux_size)
: folder_path(folder), base_name(filename), : folder_path(folder), base_name(filename),
num(horcrux_num), size(horcrux_size) num(horcrux_num), size(horcrux_size)
{ {

View File

@ -1,3 +1,5 @@
#ifndef HORCRUX_SRC_IO_H
#define HORCRUX_SRC_IO_H
#include <string> #include <string>
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
@ -5,43 +7,62 @@
namespace horcrux { namespace horcrux {
class FsPlainInput { class Input {
public:
virtual std::vector<unsigned char> read() = 0;
};
class Output {
public:
virtual size_t write(const std::vector<unsigned char>& data) = 0;
};
class PlainInput : public Input {};
class CryptoInput : public Input {};
class PlainOutput : public Output {};
class CryptoOutput : public Output {};
class FsPlainInput : public Input {
std::filesystem::path file_path; std::filesystem::path file_path;
size_t file_size; size_t file_size;
std::ifstream file_stream; std::ifstream file_stream;
FsPlainInput() = delete;
public: public:
FsPlainInput(const std::string& path); FsPlainInput(const std::string& path);
std::vector<unsigned char> read(); std::vector<unsigned char> read() override;
}; };
class FsCryptoInput { class FsCryptoInput : public Input{
std::vector<std::pair<std::filesystem::path, size_t>> file_paths; std::vector<std::pair<std::filesystem::path, size_t>> file_paths;
size_t total_size{0}; size_t total_size{0};
FsCryptoInput() = delete;
public: public:
FsCryptoInput(const std::vector<std::string>& filenames); FsCryptoInput(const std::vector<std::string>& filenames);
std::vector<unsigned char> read(); std::vector<unsigned char> read() override;
}; };
class FsPlainOutput { class FsPlainOutput : public Output {
std::filesystem::path file_path; std::filesystem::path file_path;
FsPlainOutput() = delete;
public: public:
FsPlainOutput(const std::string& filename); FsPlainOutput(const std::string& filename);
size_t write(const std::vector<unsigned char>& to_write); size_t write(const std::vector<unsigned char>& to_write) override;
}; };
class FsCryptoOutput { class FsCryptoOutput : public Output {
std::filesystem::path folder_path; std::filesystem::path folder_path;
std::string base_name; std::string base_name;
int num; int num;
size_t size; size_t size;
FsCryptoOutput() = delete;
public: public:
std::vector<std::filesystem::path> created_files; std::vector<std::filesystem::path> created_files;
FsCryptoOutput(const std::string& folder, const int horcrux_num, const size_t horcrux_size, const std::string& filename); FsCryptoOutput(const std::string& folder, const int horcrux_num,
size_t write(const std::vector<unsigned char>& to_write); const std::string& filename = "horcrux", const size_t horcrux_size = 0);
size_t write(const std::vector<unsigned char>& to_write) override;
}; };
}; };
#endif //HORCRUX_SRC_IO_H

View File

@ -1,3 +1,5 @@
#ifndef HORCRUX_SRC_UTILS_H
#define HORCRUX_SRC_UTILS_H
#include <string> #include <string>
#include <vector> #include <vector>
@ -8,3 +10,4 @@ std::vector<unsigned char> from_base64(const std::string& base64);
std::vector<unsigned char> generate_random(const size_t buf_len); std::vector<unsigned char> generate_random(const size_t buf_len);
} }
#endif //HORCRUX_SRC_UTILS_H

View File

@ -1,6 +1,12 @@
set(BINARY ${CMAKE_PROJECT_NAME}_test) set(BINARY ${CMAKE_PROJECT_NAME}_test)
add_executable(${BINARY} main.cpp crypto-test.cpp io-test.cpp utils-test.cpp) add_executable(${BINARY}
main.cpp
crypto-test.cpp
io-test.cpp
utils-test.cpp
integration-test.cpp
)
add_test(NAME test COMMAND ${BINARY}) add_test(NAME test COMMAND ${BINARY})

View File

@ -2,23 +2,9 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "utils.h" #include "utils.h"
#include "crypto.h" #include "crypto.h"
#include "test.h"
/* test command: using namespace horcrux;
echo "ditemi perche' se la mucca fa mu il merlo non fa me" |
scripts/aes256.sh -k 0123456789ABCDEF0123456789ABCDEF -i 0123456789ABCDEF |
xxd -i
*/
const std::string test1_str = "ditemi perche' se la mucca fa mu il merlo non fa me";
const std::string test1_key = "0123456789ABCDEF0123456789ABCDEF";
const std::string test1_iv = "0123456789ABCDEF";
const std::vector<unsigned char> test1_enc {
0x4c, 0x17, 0x6e, 0x6d, 0xd2, 0x83, 0x51, 0x52, 0xfc, 0x5d, 0xbe, 0x0f,
0x1b, 0xcf, 0x86, 0xef, 0x73, 0x91, 0x58, 0xc4, 0xdd, 0x1b, 0x09, 0x3d,
0x77, 0xe0, 0x78, 0x5d, 0x21, 0xfe, 0x59, 0x9c, 0xb2, 0x12, 0xa6, 0x81,
0x12, 0x96, 0x50, 0xd6, 0x5c, 0xe2, 0xc1, 0x99, 0xe3, 0x38, 0x39, 0x8e,
0x55, 0xd2, 0x04, 0x73, 0x16, 0x39, 0xc7, 0x6a, 0xd3, 0x61, 0x2c, 0x22,
0x59, 0x25, 0xa6, 0x20 };
TEST(CryptoTest, encrypt1){ TEST(CryptoTest, encrypt1){
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 = plaintext.size() + 16; size_t output_len = plaintext.size() + 16;

32
test/integration-test.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "gtest/gtest.h"
#include "test.h"
TEST(IntegrationTest, EndToEndEncryptDecrypt){
auto buf = generic_read_file(image);
//Prepare encrypt operation
auto in = horcrux::FsPlainInput(image);
auto cipher = horcrux::AES256_CBC();
auto out = horcrux::FsCryptoOutput(folder, 3);
// Perform encrypt operation
out.write(cipher.encrypt(in.read()));
//Prepare decrypt operation
auto in2 = horcrux::FsCryptoInput(get_created_filenames(out));
//Perform decrypt operation
auto buf2 = cipher.decrypt(in2.read());
//check outcome
EXPECT_EQ(buf, buf2);
auto out2 = horcrux::FsPlainOutput(noexist);
out2.write(cipher.decrypt(in2.read()));
auto buf3 = generic_read_file(noexist);
EXPECT_EQ(buf, buf3);
delete_created_files(out);
std::filesystem::remove(noexist);
}

View File

@ -1,35 +1,6 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "io.cpp" #include "io.h"
#include "test.h"
#ifndef TEST_WORK_DIR
#error Please define TEST_WORK_DIR
#endif
const std::string folder{TEST_WORK_DIR};
const std::string noexist{TEST_WORK_DIR "/nope"};
const std::string empty{TEST_WORK_DIR "/empty"};
const std::string text{TEST_WORK_DIR "/test.txt"};
const std::string image{TEST_WORK_DIR "/mangoni.jpg"};
static std::vector<unsigned char> generic_read_file(const std::string& filename){
auto ifstream = std::ifstream{filename, std::ios::binary};
auto path = std::filesystem::path{filename};
auto size = std::filesystem::file_size(path);
std::vector<unsigned char> buf(size);
ifstream.read(reinterpret_cast<char*>(buf.data()), size);
return buf;
}
static std::vector<std::string> get_created_filenames(const horcrux::FsCryptoOutput& out){
std::vector<std::string> result(out.created_files.size());
transform(out.created_files.begin(), out.created_files.end(), result.begin(),
[](auto path){return path.string();});
return result;
}
static void delete_created_files(const horcrux::FsCryptoOutput& out){
std::for_each(out.created_files.begin(), out.created_files.end(),
[](auto f){std::filesystem::remove(f);});
}
TEST(IoTests, FsPlainInput) { TEST(IoTests, FsPlainInput) {
EXPECT_THROW(horcrux::FsPlainInput input{noexist}, std::invalid_argument); EXPECT_THROW(horcrux::FsPlainInput input{noexist}, std::invalid_argument);

57
test/test.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef HORCRUX_TEST_TEST_H
#define HORCRUX_TEST_TEST_H
#include <filesystem>
#include "io.h"
#include "crypto.h"
/* IO Test utils */
#ifndef TEST_WORK_DIR
#error Please define TEST_WORK_DIR
#endif
const std::string folder{TEST_WORK_DIR};
const std::string noexist{TEST_WORK_DIR "/nope"};
const std::string empty{TEST_WORK_DIR "/empty"};
const std::string text{TEST_WORK_DIR "/test.txt"};
const std::string image{TEST_WORK_DIR "/mangoni.jpg"};
static std::vector<unsigned char> generic_read_file(const std::string& filename){
auto ifstream = std::ifstream{filename, std::ios::binary};
auto path = std::filesystem::path{filename};
auto size = std::filesystem::file_size(path);
std::vector<unsigned char> buf(size);
ifstream.read(reinterpret_cast<char*>(buf.data()), size);
return buf;
}
static std::vector<std::string> get_created_filenames(const horcrux::FsCryptoOutput& out){
std::vector<std::string> result(out.created_files.size());
transform(out.created_files.begin(), out.created_files.end(), result.begin(),
[](auto path){return path.string();});
return result;
}
static void delete_created_files(const horcrux::FsCryptoOutput& out){
std::for_each(out.created_files.begin(), out.created_files.end(),
[](auto f){std::filesystem::remove(f);});
}
/* Crypto Test utils */
/* test command:
echo "ditemi perche' se la mucca fa mu il merlo non fa me" |
scripts/aes256.sh -k 0123456789ABCDEF0123456789ABCDEF -i 0123456789ABCDEF |
xxd -i
*/
const std::string test1_str = "ditemi perche' se la mucca fa mu il merlo non fa me";
const std::string test1_key = "0123456789ABCDEF0123456789ABCDEF";
const std::string test1_iv = "0123456789ABCDEF";
const std::vector<unsigned char> test1_enc {
0x4c, 0x17, 0x6e, 0x6d, 0xd2, 0x83, 0x51, 0x52, 0xfc, 0x5d, 0xbe, 0x0f,
0x1b, 0xcf, 0x86, 0xef, 0x73, 0x91, 0x58, 0xc4, 0xdd, 0x1b, 0x09, 0x3d,
0x77, 0xe0, 0x78, 0x5d, 0x21, 0xfe, 0x59, 0x9c, 0xb2, 0x12, 0xa6, 0x81,
0x12, 0x96, 0x50, 0xd6, 0x5c, 0xe2, 0xc1, 0x99, 0xe3, 0x38, 0x39, 0x8e,
0x55, 0xd2, 0x04, 0x73, 0x16, 0x39, 0xc7, 0x6a, 0xd3, 0x61, 0x2c, 0x22,
0x59, 0x25, 0xa6, 0x20 };
#endif //HORCRUX_TEST_TEST_H