20 #ifndef CS_CRYPTO_SYM_INIT_VECTOR_H
21 #define CS_CRYPTO_SYM_INIT_VECTOR_H
23 #include <util/conversions/byte.h>
24 #include <util/tools/crypto_traits.h>
30 #include <type_traits>
32 namespace cs_crypto::cipher {
34 template <std::size_t SIZE>
39 constexpr explicit init_vector(
const T (&iv)[SIZE])
41 if constexpr (cs_crypto::traits::is_uniquely_represented_byte_v<T>) {
42 std::copy_n(util::to_byte_ptr(iv), SIZE, m_data.begin());
44 static_assert(cs_crypto::traits::always_false<T>{},
"Unable to construct init_vector object from array of type T");
48 ~init_vector() =
default;
50 constexpr init_vector(
const init_vector &other) =
delete;
51 constexpr init_vector &operator=(
const init_vector &other) & =
delete;
53 constexpr init_vector(init_vector &&other) =
default;
54 constexpr init_vector &operator=(init_vector &&other) & =
default;
56 constexpr static std::optional<init_vector> from_string(
const std::string &str)
58 if (str.size() != SIZE) {
62 std::optional<init_vector> retval = init_vector{};
63 std::copy_n(util::to_byte_ptr(str.data()), SIZE, retval.value().m_data.data());
68 constexpr std::size_t size()
const
73 constexpr auto data()
const &
79 std::array<std::byte, SIZE> m_data = {};
81 constexpr init_vector()