Botan 3.10.0
Crypto and TLS for C&
ascon_aead128.h
Go to the documentation of this file.
1/*
2* Ascon-AEAD128 AEAD
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_AEAD128_H_
10#define BOTAN_ASCON_AEAD128_H_
11
12#include <botan/aead.h>
13
14#include <botan/assert.h>
15#include <botan/internal/ascon_perm.h>
16
17#include <optional>
18
19namespace Botan {
20
22 public:
23 void set_associated_data_n(size_t idx, std::span<const uint8_t> ad) final;
24
25 bool associated_data_requires_key() const final { return false; }
26
27 std::string name() const final { return "Ascon-AEAD128"; }
28
29 size_t update_granularity() const final { return 1; }
30
31 size_t ideal_granularity() const final { return 32; }
32
34
35 bool valid_nonce_length(size_t n) const final { return n == 16; }
36
37 size_t default_nonce_length() const final { return 16; }
38
39 size_t tag_size() const final { return 16; }
40
41 void clear() final;
42
43 void reset() final;
44
45 bool has_keying_material() const final { return m_key.has_value(); }
46
47 protected:
49
50 void start_msg(const uint8_t nonce[], size_t nonce_len) final;
51 void key_schedule(std::span<const uint8_t> key) final;
52
54 std::array<uint8_t, 16> calculate_tag_and_finish();
55
56 protected:
57 std::optional<std::array<uint64_t, 2>> m_key; // NOLINT(*-non-private-member-*)
58 Ascon_p m_ascon_p; // NOLINT(*-non-private-member-*)
59 bool m_has_nonce = false; // NOLINT(*-non-private-member-*)
60
61 private:
62 std::vector<uint8_t> m_ad;
63 bool m_started = false;
64};
65
66/**
67* Ascon-AEAD128 Encryption
68*/
70 public:
71 size_t output_length(size_t input_length) const override { return input_length + tag_size(); }
72
73 size_t minimum_final_size() const override { return 0; }
74
75 private:
76 size_t process_msg(uint8_t buf[], size_t size) final;
77 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
78};
79
80/**
81* Ascon-AEAD128 Decryption
82*/
84 public:
85 size_t output_length(size_t input_length) const override {
86 BOTAN_ARG_CHECK(input_length >= tag_size(), "Sufficient input");
87 return input_length - tag_size();
88 }
89
90 size_t minimum_final_size() const override { return tag_size(); }
91
92 private:
93 size_t process_msg(uint8_t buf[], size_t size) final;
94 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
95};
96
97} // namespace Botan
98
99#endif
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
size_t output_length(size_t input_length) const override
size_t minimum_final_size() const override
size_t minimum_final_size() const override
size_t output_length(size_t input_length) const override
bool has_keying_material() const final
Key_Length_Specification key_spec() const final
size_t default_nonce_length() const final
size_t update_granularity() const final
void key_schedule(std::span< const uint8_t > key) final
size_t ideal_granularity() const final
bool associated_data_requires_key() const final
std::string name() const final
std::optional< std::array< uint64_t, 2 > > m_key
void set_associated_data_n(size_t idx, std::span< const uint8_t > ad) final
size_t tag_size() const final
bool valid_nonce_length(size_t n) const final
std::array< uint8_t, 16 > calculate_tag_and_finish()
void start_msg(const uint8_t nonce[], size_t nonce_len) final
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:69