#ifndef SA_CRYPTO_MAC_COMMON_H
#define SA_CRYPTO_MAC_COMMON_H
#include "sa.h"
#include "gtest/gtest.h"
class SaCryptoMacBase {
public:
static bool hmac_sha1_openssl(
std::vector<uint8_t>& out,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& in);
static bool hmac_sha256_openssl(
std::vector<uint8_t>& out,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& in);
static bool hmac_sha384_openssl(
std::vector<uint8_t>& out,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& in);
static bool hmac_sha512_openssl(
std::vector<uint8_t>& out,
const std::vector<uint8_t>& key,
const std::vector<uint8_t>& in);
};
typedef std::tuple<sa_mac_algorithm, void*, int> SaCryptoMacType;
class SaCryptoMacInit : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacInitArgChecks : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacInitKeyRights : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacInitInvalidKeyLengths : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacInitHmacDigests : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacCompute : public ::testing::TestWithParam<SaCryptoMacType> {};
class SaCryptoMacComputeOutLength
: public ::testing::TestWithParam<std::tuple<sa_mac_algorithm, void*, int, size_t>> {};
using MacFunctionType = bool (*)(std::vector<uint8_t>&, const std::vector<uint8_t>&, const std::vector<uint8_t>&);
class SaCryptoMacComputeMatchesOpenssl
: public ::testing::TestWithParam<std::tuple<sa_mac_algorithm, void*, int, int, MacFunctionType>> {};
class SaCryptoMacComputeArgChecks : public ::testing::TestWithParam<std::tuple<sa_mac_algorithm, void*, int>> {};
class SaCryptoMacProcess : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacProcessKey : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacProcessArgChecks : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacProcessKeyArgChecks : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacRelease : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
class SaCryptoMacReleaseArgChecks : public ::testing::TestWithParam<SaCryptoMacType>, public SaCryptoMacBase {};
#endif