10#ifndef BOTAN_KYBER_90S_H_
11#define BOTAN_KYBER_90S_H_
13#include <botan/hash.h>
14#include <botan/internal/aes_crystals_xof.h>
16#include <botan/internal/kyber_symmetric_primitives.h>
34 std::unique_ptr<HashFunction>
create_J()
const override {
35 throw Invalid_State(
"Kyber-R3 in 90s mode does not support J()");
40 std::unique_ptr<Botan::XOF>
create_PRF(std::span<const uint8_t> seed,
const uint8_t nonce)
const override {
41 auto xof = std::make_unique<AES_256_CTR_XOF>();
46 void init_PRF(
Botan::XOF& xof, std::span<const uint8_t> seed,
const uint8_t nonce)
const override {
48 dynamic_cast<AES_256_CTR_XOF&
>(xof).start(std::array<uint8_t, 12>{nonce, 0}, seed);
51 std::unique_ptr<Botan::XOF>
create_XOF(std::span<const uint8_t> seed,
52 std::tuple<uint8_t, uint8_t> mpos)
const override {
53 auto xof = std::make_unique<AES_256_CTR_XOF>();
58 void init_XOF(
Botan::XOF& xof, std::span<const uint8_t> seed, std::tuple<uint8_t, uint8_t> mpos)
const override {
60 dynamic_cast<AES_256_CTR_XOF&
>(xof).start(std::array<uint8_t, 12>{std::get<0>(mpos), std::get<1>(mpos), 0},
static std::unique_ptr< HashFunction > create_or_throw(std::string_view algo_spec, std::string_view provider="")
std::optional< std::array< uint8_t, 1 > > seed_expansion_domain_separator(const KyberConstants &) const override
void init_PRF(Botan::XOF &xof, std::span< const uint8_t > seed, const uint8_t nonce) const override
void init_XOF(Botan::XOF &xof, std::span< const uint8_t > seed, std::tuple< uint8_t, uint8_t > mpos) const override
std::unique_ptr< Botan::XOF > create_XOF(std::span< const uint8_t > seed, std::tuple< uint8_t, uint8_t > mpos) const override
std::unique_ptr< HashFunction > create_G() const override
std::unique_ptr< Botan::XOF > create_PRF(std::span< const uint8_t > seed, const uint8_t nonce) const override
std::unique_ptr< HashFunction > create_H() const override
std::unique_ptr< HashFunction > create_KDF() const override
std::unique_ptr< HashFunction > create_J() const override