11#ifndef BOTAN_DILITHIUM_ASYM_PRIMITIVES_H_
12#define BOTAN_DILITHIUM_ASYM_PRIMITIVES_H_
14#include <botan/dilithium.h>
16#include <botan/internal/dilithium_types.h>
34 std::string
name()
const;
38 return user_context.empty();
41 virtual void start(std::span<const uint8_t> user_context) {
48 void update(std::span<const uint8_t> data) {
50 m_shake->update(data);
62 m_was_started =
false;
65 void ensure_started() {
74 bool m_was_started =
false;
75 std::unique_ptr<XOF> m_shake;
88 virtual std::unique_ptr<XOF>
XOF128(std::span<const uint8_t> seed, uint16_t nonce)
const = 0;
89 virtual std::unique_ptr<XOF>
XOF256(std::span<const uint8_t> seed, uint16_t nonce)
const = 0;
110 return std::make_unique<DilithiumMessageHash>(std::move(tr));
118 std::optional<std::reference_wrapper<RandomNumberGenerator>> rng)
const = 0;
124 std::tuple<DilithiumSeedRho, DilithiumSeedRhoPrime, DilithiumSigningSeedK>
H(
129 xof->update(domsep.value());
139 return {std::move(
rho), std::move(rhoprime), std::move(k)};
154 return m_xof_adapter->XOF128(seed, nonce);
158 return m_xof_adapter->XOF256(seed, nonce);
178 OutT
H_256(
size_t outbytes,
const InTs&... ins)
const {
180 (xof->update(ins), ...);
181 return xof->output<OutT>(outbytes);
185 size_t m_commitment_hash_length_bytes;
186 size_t m_public_key_hash_bytes;
189 std::unique_ptr<DilithiumXOF> m_xof_adapter;
#define BOTAN_STATE_CHECK(expr)
#define BOTAN_ARG_CHECK(expr, msg)
static constexpr size_t MESSAGE_HASH_BYTES
static constexpr size_t SEED_SIGNING_KEY_BYTES
static constexpr size_t SEED_RHOPRIME_BYTES
static constexpr size_t SEED_RHO_BYTES
virtual void start(std::span< const uint8_t > user_context)
DilithiumMessageHash(DilithiumHashedPublicKey tr)
void update(std::span< const uint8_t > data)
virtual bool is_valid_user_context(std::span< const uint8_t > user_context) const
virtual ~DilithiumMessageHash()
virtual ~DilithiumXOF()=default
virtual std::unique_ptr< XOF > XOF256(std::span< const uint8_t > seed, uint16_t nonce) const =0
virtual std::unique_ptr< XOF > XOF128(std::span< const uint8_t > seed, uint16_t nonce) const =0
Dilithium_Symmetric_Primitives_Base(Dilithium_Symmetric_Primitives_Base &&)=delete
std::unique_ptr< XOF > H(StrongSpan< const DilithiumSeedRhoPrime > seed, uint16_t nonce) const
Dilithium_Symmetric_Primitives_Base & operator=(const Dilithium_Symmetric_Primitives_Base &)=delete
static std::unique_ptr< Dilithium_Symmetric_Primitives_Base > create(const DilithiumConstants &mode)
Dilithium_Symmetric_Primitives_Base(const Dilithium_Symmetric_Primitives_Base &)=delete
std::unique_ptr< XOF > H(StrongSpan< const DilithiumCommitmentHash > seed) const
std::unique_ptr< XOF > H(StrongSpan< const DilithiumSeedRho > seed, uint16_t nonce) const
OutT H_256(size_t outbytes, const InTs &... ins) const
DilithiumHashedPublicKey H(StrongSpan< const DilithiumSerializedPublicKey > pk) const
virtual ~Dilithium_Symmetric_Primitives_Base()=default
virtual std::optional< std::array< uint8_t, 2 > > seed_expansion_domain_separator() const =0
std::tuple< DilithiumSeedRho, DilithiumSeedRhoPrime, DilithiumSigningSeedK > H(StrongSpan< const DilithiumSeedRandomness > seed) const
virtual DilithiumSeedRhoPrime H_maybe_randomized(StrongSpan< const DilithiumSigningSeedK > k, StrongSpan< const DilithiumMessageRepresentative > mu, std::optional< std::reference_wrapper< RandomNumberGenerator > > rng) const =0
Dilithium_Symmetric_Primitives_Base(const DilithiumConstants &mode, std::unique_ptr< DilithiumXOF > xof_adapter)
virtual StrongSpan< const DilithiumCommitmentHash > truncate_commitment_hash(StrongSpan< const DilithiumCommitmentHash > seed) const =0
DilithiumCommitmentHash H(StrongSpan< const DilithiumMessageRepresentative > mu, StrongSpan< const DilithiumSerializedCommitment > w1) const
virtual std::unique_ptr< DilithiumMessageHash > get_message_hash(DilithiumHashedPublicKey tr) const
Dilithium_Symmetric_Primitives_Base & operator=(Dilithium_Symmetric_Primitives_Base &&)=delete
static std::unique_ptr< XOF > create_or_throw(std::string_view algo_spec, std::string_view provider="")
Helper class to create a RAII-style cleanup callback.
Strong< secure_vector< uint8_t >, struct DilithiumSeedRhoPrime_ > DilithiumSeedRhoPrime
Private seed to sample the polynomial vectors s1 and s2 from.
Strong< std::vector< uint8_t >, struct DilithiumMessageRepresentative_ > DilithiumMessageRepresentative
Representation of the message to be signed.
Strong< secure_vector< uint8_t >, struct DilithiumSeedK_ > DilithiumSigningSeedK
Private seed K used during signing.
Strong< std::vector< uint8_t >, struct DilithiumPublicSeed_ > DilithiumSeedRho
Public seed to sample the polynomial matrix A from.
Strong< std::vector< uint8_t >, struct DilithiumCommitmentHash_ > DilithiumCommitmentHash
Hash of the message representative and the signer's commitment.
BOTAN_FORCE_INLINE constexpr T rho(T x)
Strong< std::vector< uint8_t >, struct DilithiumHashedPublicKey_ > DilithiumHashedPublicKey