9#ifndef BOTAN_KYBER_MODERN_H_
10#define BOTAN_KYBER_MODERN_H_
12#include <botan/hash.h>
13#include <botan/stream_cipher.h>
15#include <botan/internal/kyber_symmetric_primitives.h>
16#include <botan/internal/shake.h>
17#include <botan/internal/shake_cipher.h>
30 m_shake256_256(
HashFunction::create_or_throw(
"SHAKE-256(256)"))
33 std::unique_ptr<HashFunction>
G()
const override
35 return m_sha3_512->new_object();
38 std::unique_ptr<HashFunction>
H()
const override
40 return m_sha3_256->new_object();
43 std::unique_ptr<HashFunction>
KDF()
const override
45 return m_shake256_256->new_object();
48 std::unique_ptr<Kyber_XOF>
XOF(std::span<const uint8_t> seed)
const override
53 Kyber_Modern_XOF(std::span<const uint8_t> seed) :
54 m_cipher(std::make_unique<SHAKE_128_Cipher>())
56 m_key.reserve(seed.size() + 2);
57 m_key.insert(m_key.end(), seed.begin(), seed.end());
62 void set_position(
const std::tuple<uint8_t, uint8_t>& matrix_position)
override
64 m_key[m_key.size() - 2] = std::get<0>(matrix_position);
65 m_key[m_key.size() - 1] = std::get<1>(matrix_position);
66 m_cipher->set_key(m_key);
69 void write_output(std::span<uint8_t> out)
override
71 m_cipher->write_keystream(out.data(), out.size());
75 std::unique_ptr<StreamCipher> m_cipher;
79 return std::make_unique<Kyber_Modern_XOF>(seed);
84 const size_t outlen)
const override
87 kdf.
update(seed.data(), seed.size());
93 std::unique_ptr<HashFunction> m_sha3_512;
94 std::unique_ptr<HashFunction> m_sha3_256;
95 std::unique_ptr<HashFunction> m_shake256_256;
void update(const uint8_t in[], size_t length)
void final(uint8_t out[])
std::unique_ptr< HashFunction > H() const override
std::unique_ptr< HashFunction > KDF() const override
std::unique_ptr< Kyber_XOF > XOF(std::span< const uint8_t > seed) const override
Kyber_Modern_Symmetric_Primitives()
std::unique_ptr< HashFunction > G() const override
secure_vector< uint8_t > PRF(std::span< const uint8_t > seed, const uint8_t nonce, const size_t outlen) const override
int(* final)(unsigned char *, CTX *)
std::vector< T, secure_allocator< T > > secure_vector