Botan 3.9.0
Crypto and TLS for C&
eax.h
Go to the documentation of this file.
1/*
2* EAX Mode
3* (C) 1999-2007,2013 Jack Lloyd
4* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_AEAD_EAX_H_
10#define BOTAN_AEAD_EAX_H_
11
12#include <botan/aead.h>
13
14#include <botan/assert.h>
15#include <botan/block_cipher.h>
16#include <botan/mac.h>
17#include <botan/stream_cipher.h>
18
19namespace Botan {
20
21/**
22* EAX base class
23*/
24class EAX_Mode : public AEAD_Mode {
25 public:
26 void set_associated_data_n(size_t idx, std::span<const uint8_t> ad) final;
27
28 std::string name() const final;
29
30 size_t update_granularity() const final;
31
32 size_t ideal_granularity() const final;
33
35
36 // EAX supports arbitrary nonce lengths
37 bool valid_nonce_length(size_t /*length*/) const final { return true; }
38
39 size_t tag_size() const final { return m_tag_size; }
40
41 void clear() final;
42
43 void reset() final;
44
45 bool has_keying_material() const final;
46
47 protected:
48 /**
49 * @param cipher the cipher to use
50 * @param tag_size is how big the auth tag will be
51 */
52 EAX_Mode(std::unique_ptr<BlockCipher> cipher, size_t tag_size);
53
54 size_t block_size() const { return m_cipher->block_size(); }
55
56 size_t m_tag_size; // NOLINT(*non-private-member-variable*)
57
58 std::unique_ptr<BlockCipher> m_cipher; // NOLINT(*non-private-member-variable*)
59 std::unique_ptr<StreamCipher> m_ctr; // NOLINT(*non-private-member-variable*)
60 std::unique_ptr<MessageAuthenticationCode> m_cmac; // NOLINT(*non-private-member-variable*)
61
62 secure_vector<uint8_t> m_ad_mac; // NOLINT(*non-private-member-variable*)
63
64 secure_vector<uint8_t> m_nonce_mac; // NOLINT(*non-private-member-variable*)
65
66 private:
67 void start_msg(const uint8_t nonce[], size_t nonce_len) final;
68
69 void key_schedule(std::span<const uint8_t> key) final;
70};
71
72/**
73* EAX Encryption
74*/
75class EAX_Encryption final : public EAX_Mode {
76 public:
77 /**
78 * @param cipher a 128-bit block cipher
79 * @param tag_size is how big the auth tag will be
80 */
81 explicit EAX_Encryption(std::unique_ptr<BlockCipher> cipher, size_t tag_size = 0) :
82 EAX_Mode(std::move(cipher), tag_size) {}
83
84 size_t output_length(size_t input_length) const override { return input_length + tag_size(); }
85
86 size_t minimum_final_size() const override { return 0; }
87
88 private:
89 size_t process_msg(uint8_t buf[], size_t size) override;
90 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
91};
92
93/**
94* EAX Decryption
95*/
96class EAX_Decryption final : public EAX_Mode {
97 public:
98 /**
99 * @param cipher a 128-bit block cipher
100 * @param tag_size is how big the auth tag will be
101 */
102 explicit EAX_Decryption(std::unique_ptr<BlockCipher> cipher, size_t tag_size = 0) :
103 EAX_Mode(std::move(cipher), tag_size) {}
104
105 size_t output_length(size_t input_length) const override {
106 BOTAN_ARG_CHECK(input_length >= tag_size(), "Sufficient input");
107 return input_length - tag_size();
108 }
109
110 size_t minimum_final_size() const override { return tag_size(); }
111
112 private:
113 size_t process_msg(uint8_t buf[], size_t size) override;
114 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
115};
116
117} // namespace Botan
118
119#endif
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
size_t output_length(size_t input_length) const override
Definition eax.h:105
size_t minimum_final_size() const override
Definition eax.h:110
EAX_Decryption(std::unique_ptr< BlockCipher > cipher, size_t tag_size=0)
Definition eax.h:102
EAX_Encryption(std::unique_ptr< BlockCipher > cipher, size_t tag_size=0)
Definition eax.h:81
size_t output_length(size_t input_length) const override
Definition eax.h:84
size_t minimum_final_size() const override
Definition eax.h:86
size_t tag_size() const final
Definition eax.h:39
size_t update_granularity() const final
Definition eax.cpp:70
void set_associated_data_n(size_t idx, std::span< const uint8_t > ad) final
Definition eax.cpp:101
size_t block_size() const
Definition eax.h:54
size_t ideal_granularity() const final
Definition eax.cpp:74
void clear() final
Definition eax.cpp:49
bool valid_nonce_length(size_t) const final
Definition eax.h:37
std::unique_ptr< BlockCipher > m_cipher
Definition eax.h:58
bool has_keying_material() const final
Definition eax.cpp:82
EAX_Mode(std::unique_ptr< BlockCipher > cipher, size_t tag_size)
Definition eax.cpp:39
std::unique_ptr< StreamCipher > m_ctr
Definition eax.h:59
std::unique_ptr< MessageAuthenticationCode > m_cmac
Definition eax.h:60
Key_Length_Specification key_spec() const final
Definition eax.cpp:78
secure_vector< uint8_t > m_nonce_mac
Definition eax.h:64
size_t m_tag_size
Definition eax.h:56
void reset() final
Definition eax.cpp:56
std::string name() const final
Definition eax.cpp:66
secure_vector< uint8_t > m_ad_mac
Definition eax.h:62
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:69