#include "client_test_helpers.h"
#include "sa.h"
#include "sa_crypto_cipher_common.h"
#include "gtest/gtest.h"
using namespace client_test_helpers;
namespace {
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsInvalidKeyType) {
auto curve = SA_ELLIPTIC_CURVE_NIST_P256;
auto clear_key = ec_generate_key_bytes(curve);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_ec(&rights, curve, clear_key);
ASSERT_NE(key, nullptr);
if (*key == UNSUPPORTED_KEY)
GTEST_SKIP() << "key type, key size, or curve not supported";
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> counter = {1, 0, 0, 0};
auto nonce = random(CHACHA20_NONCE_LENGTH);
sa_cipher_parameters_chacha20 parameters = {counter.data(), counter.size(), nonce.data(), nonce.size()};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_INVALID_KEY_TYPE);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsNullParameters) {
auto clear_key = random(SYM_256_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, nullptr);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_NULL_PARAMETER);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsInvalidKeySize) {
auto clear_key = random(SYM_128_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> counter = {1, 0, 0, 0};
auto nonce = random(CHACHA20_NONCE_LENGTH);
sa_cipher_parameters_chacha20 parameters = {counter.data(), counter.size(), nonce.data(), nonce.size()};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_INVALID_KEY_TYPE);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsNullNonce) {
auto clear_key = random(SYM_256_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> counter = {1, 0, 0, 0};
sa_cipher_parameters_chacha20 parameters = {counter.data(), counter.size(), nullptr, CHACHA20_NONCE_LENGTH};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_NULL_PARAMETER);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsInvalidNonceLength) {
auto clear_key = random(SYM_256_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> counter = {1, 0, 0, 0};
auto nonce = random(CHACHA20_NONCE_LENGTH + 1);
sa_cipher_parameters_chacha20 parameters = {counter.data(), counter.size(), nonce.data(), nonce.size()};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_INVALID_PARAMETER);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsNullCounter) {
auto clear_key = random(SYM_256_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> const counter = {1, 0, 0, 0};
auto nonce = random(CHACHA20_NONCE_LENGTH);
sa_cipher_parameters_chacha20 parameters = {nullptr, counter.size(), nonce.data(), nonce.size()};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_NULL_PARAMETER);
}
TEST_F(SaCryptoCipherWithoutSvpTest, initChacha20FailsInvalidCounterLength) {
auto clear_key = random(SYM_256_KEY_SIZE);
sa_rights rights;
sa_rights_set_allow_all(&rights);
auto key = create_sa_key_symmetric(&rights, clear_key);
ASSERT_NE(key, nullptr);
auto cipher = create_uninitialized_sa_crypto_cipher_context();
ASSERT_NE(cipher, nullptr);
std::vector<uint8_t> counter = {1, 0, 0, 0, 0};
auto nonce = random(CHACHA20_NONCE_LENGTH + 1);
sa_cipher_parameters_chacha20 parameters = {counter.data(), counter.size(), nonce.data(), nonce.size()};
sa_status const status = sa_crypto_cipher_init(cipher.get(), SA_CIPHER_ALGORITHM_CHACHA20,
SA_CIPHER_MODE_ENCRYPT, *key, ¶meters);
if (status == SA_STATUS_OPERATION_NOT_SUPPORTED)
GTEST_SKIP() << "Cipher algorithm not supported";
ASSERT_EQ(status, SA_STATUS_INVALID_PARAMETER);
}
}