#ifndef SA_CRYPTO_CIPHER_COMMON_H
#define SA_CRYPTO_CIPHER_COMMON_H
#include "sa_types.h"
#include "gtest/gtest.h"
#include <memory>
#include <openssl/ec.h>
#include <vector>
typedef struct { sa_cipher_algorithm cipher_algorithm;
std::shared_ptr<sa_key> key;
std::vector<uint8_t> clear_key;
std::vector<uint8_t> iv;
std::vector<uint8_t> aad;
std::vector<uint8_t> tag;
std::shared_ptr<void> parameters;
std::shared_ptr<void> end_parameters;
sa_elliptic_curve curve;
sa_digest_algorithm oaep_digest_algorithm;
sa_digest_algorithm oaep_mgf1_digest_algorithm;
size_t oaep_label_length;
bool svp_required;
} cipher_parameters;
class SaCipherCryptoBase {
protected:
static bool import_key(
cipher_parameters& parameters,
sa_key_type key_type,
size_t key_size);
static void get_cipher_parameters(cipher_parameters& parameters);
static std::shared_ptr<sa_crypto_cipher_context> initialize_cipher(
sa_cipher_mode cipher_mode,
sa_key_type key_type,
size_t key_size,
cipher_parameters& parameters);
static bool verify_encrypt(
sa_buffer* encrypted,
std::vector<uint8_t>& clear,
cipher_parameters& parameters,
bool padded);
static bool verify_decrypt(
sa_buffer* decrypted,
std::vector<uint8_t>& clear);
static std::vector<uint8_t> encrypt_openssl(
std::vector<uint8_t>& clear,
cipher_parameters& parameters);
static std::vector<uint8_t> decrypt_openssl(
std::vector<uint8_t>& encrypted_data,
cipher_parameters& parameters);
static size_t get_required_length(
sa_cipher_algorithm cipher_algorithm,
size_t key_length,
size_t bytes_to_process,
bool apply_pad);
static bool ec_is_valid_x_coordinate(
std::shared_ptr<EC_GROUP>& ec_group,
const std::vector<uint8_t>& coordinate);
};
using SaCryptoCipherDecryptTestType = std::tuple<sa_cipher_algorithm, sa_key_type, size_t, sa_buffer_type,
sa_digest_algorithm, sa_digest_algorithm, size_t>;
class SaCryptoCipherDecryptTest : public ::testing::TestWithParam<SaCryptoCipherDecryptTestType>,
public SaCipherCryptoBase {
protected:
void SetUp() override;
};
typedef std::tuple<sa_cipher_algorithm, sa_key_type, size_t, sa_buffer_type> SaCryptoCipherTestType;
class SaCryptoCipherEncryptTest : public ::testing::TestWithParam<SaCryptoCipherTestType>, public SaCipherCryptoBase {
protected:
void SetUp() override;
};
class SaCryptoCipherProcessLastTest : public ::testing::TestWithParam<SaCryptoCipherTestType>,
public SaCipherCryptoBase {
protected:
void SetUp() override;
};
typedef std::tuple<sa_buffer_type, sa_cipher_mode> SaCryptoCipherWithSvpTestType;
class SaCryptoCipherWithSvpTest : public ::testing::TestWithParam<SaCryptoCipherWithSvpTestType>,
public SaCipherCryptoBase {
protected:
void SetUp() override;
};
typedef std::tuple<sa_cipher_mode> SaCryptoCipherWithoutSvpTestType;
class SaCryptoCipherWithoutSvpTest : public ::testing::TestWithParam<SaCryptoCipherWithoutSvpTestType>,
public SaCipherCryptoBase {};
class SaCryptoCipherSvpOnlyTest : public ::testing::Test, public SaCipherCryptoBase {
protected:
void SetUp() override;
};
typedef std::tuple<sa_elliptic_curve> SaCryptoCipherElGamalTestType;
class SaCryptoCipherElGamalTest : public ::testing::TestWithParam<SaCryptoCipherElGamalTestType>,
public SaCipherCryptoBase {};
class SaCryptoCipherElGamalFailTest : public ::testing::TestWithParam<SaCryptoCipherElGamalTestType>,
public SaCipherCryptoBase {};
class SaCryptoCipherMultipleThread : public ::testing::Test, public SaCipherCryptoBase {
public:
static sa_status process_multiple_threads(size_t id);
};
#endif