Botan 3.10.0
Crypto and TLS for C&
ascon_perm.h
Go to the documentation of this file.
1/*
2* Permutation Ascon_p[rounds] as specified in NIST SP.800-232, Section 3
3* (C) 2025 Jack Lloyd
4* 2025 René Meusel
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_ASCON_PERM_H_
10#define BOTAN_ASCON_PERM_H_
11
12#include <botan/internal/sponge.h>
13#include <optional>
14#include <span>
15#include <string>
16
17namespace Botan {
18
19/**
20 * Ascon_p as specified in NIST SP.800-232, Section 3
21 */
22class Ascon_p final : public Sponge<5, uint64_t> {
23 public:
30
31 public:
32 consteval explicit Ascon_p(Config config) :
33 Sponge({config.bit_rate, config.initial_state}),
34 m_init_final_rounds(config.init_and_final_rounds),
35 m_processing_rounds(config.processing_rounds) {
36 if(m_init_final_rounds > 16) {
37 throw Botan::Invalid_Argument("Invalid Ascon initialization/finalization rounds");
38 }
39
40 if(m_processing_rounds > 16) {
41 throw Botan::Invalid_Argument("Invalid Ascon processing rounds");
42 }
43 }
44
45 std::string provider() const { return "base"; }
46
47 void absorb(std::span<const uint8_t> input, std::optional<uint8_t> permutation_rounds = std::nullopt);
48 void squeeze(std::span<uint8_t> output);
49 void percolate_in(std::span<uint8_t> data);
50 void percolate_out(std::span<uint8_t> data);
51
52 void finish() { finish(m_init_final_rounds); }
53
54 void intermediate_finish() { finish(m_processing_rounds); }
55
56 void permute() { permute(m_processing_rounds); }
57
58 void initial_permute() { permute(m_init_final_rounds); }
59
60 template <size_t offset, size_t count>
61 requires(offset + count <= state_bytes())
62 constexpr auto range_of_state() {
63 return std::span{state()}.template subspan<offset, count>();
64 }
65
66 private:
67 void finish(uint8_t rounds);
68 void permute(uint8_t rounds);
69
70 private:
71 uint8_t m_init_final_rounds;
72 uint8_t m_processing_rounds;
73};
74
75} // namespace Botan
76
77#endif
consteval Ascon_p(Config config)
Definition ascon_perm.h:32
constexpr auto range_of_state()
Definition ascon_perm.h:62
void squeeze(std::span< uint8_t > output)
void absorb(std::span< const uint8_t > input, std::optional< uint8_t > permutation_rounds=std::nullopt)
void percolate_in(std::span< uint8_t > data)
void percolate_out(std::span< uint8_t > data)
void intermediate_finish()
Definition ascon_perm.h:54
void initial_permute()
Definition ascon_perm.h:58
std::string provider() const
Definition ascon_perm.h:45
static constexpr size_t state_bytes()
Definition sponge.h:44
constexpr auto & state()
Definition sponge.h:56
std::array< word, words > state_t
Definition sponge.h:28
constexpr Sponge(Config config)
Definition sponge.h:38
uint8_t init_and_final_rounds
Definition ascon_perm.h:25