Botan 3.0.0
Crypto and TLS for C&
cipher_filter.cpp
Go to the documentation of this file.
1/*
2* Filter interface for Cipher_Modes
3* (C) 2013,2014,2017 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/filters.h>
9#include <botan/internal/rounding.h>
10
11namespace Botan {
12
13namespace {
14
15size_t choose_update_size(size_t update_granularity)
16 {
17 const size_t target_size = 1024;
18
19 if(update_granularity >= target_size)
20 return update_granularity;
21
22 return round_up(target_size, update_granularity);
23 }
24
25}
26
28 Buffered_Filter(choose_update_size(mode->ideal_granularity()),
29 mode->minimum_final_size()),
30 m_mode(mode),
31 m_nonce(mode->default_nonce_length()),
32 m_buffer(m_mode->ideal_granularity())
33 {
34 }
35
36std::string Cipher_Mode_Filter::name() const
37 {
38 return m_mode->name();
39 }
40
42 {
43 m_nonce = unlock(iv.bits_of());
44 }
45
47 {
48 m_mode->set_key(key);
49 }
50
52 {
53 return m_mode->key_spec();
54 }
55
56bool Cipher_Mode_Filter::valid_iv_length(size_t length) const
57 {
58 return m_mode->valid_nonce_length(length);
59 }
60
61void Cipher_Mode_Filter::write(const uint8_t input[], size_t input_length)
62 {
63 Buffered_Filter::write(input, input_length);
64 }
65
66void Cipher_Mode_Filter::end_msg()
67 {
69 }
70
71void Cipher_Mode_Filter::start_msg()
72 {
73 if(m_nonce.empty() && !m_mode->valid_nonce_length(0))
74 throw Invalid_State("Cipher " + m_mode->name() + " requires a fresh nonce for each message");
75
76 m_mode->start(m_nonce);
77 m_nonce.clear();
78 }
79
80void Cipher_Mode_Filter::buffered_block(const uint8_t input[], size_t input_length)
81 {
82 while(input_length)
83 {
84 const size_t take = std::min(m_mode->ideal_granularity(), input_length);
85
86 m_buffer.assign(input, input + take);
87 m_mode->update(m_buffer);
88
89 send(m_buffer);
90
91 input += take;
92 input_length -= take;
93 }
94 }
95
96void Cipher_Mode_Filter::buffered_final(const uint8_t input[], size_t input_length)
97 {
98 secure_vector<uint8_t> buf(input, input + input_length);
99 m_mode->finish(buf);
100 send(buf);
101 }
102
103}
void write(const uint8_t in[], size_t length)
Definition: buf_filt.cpp:34
Key_Length_Specification key_spec() const override
void set_iv(const InitializationVector &iv) override
bool valid_iv_length(size_t length) const override
void set_key(const SymmetricKey &key) override
std::string name() const override
Cipher_Mode_Filter(Cipher_Mode *t)
virtual void send(const uint8_t in[], size_t length)
Definition: filter.cpp:27
secure_vector< uint8_t > bits_of() const
Definition: symkey.h:35
Definition: alg_id.cpp:12
std::vector< T > unlock(const secure_vector< T > &in)
Definition: secmem.h:77
size_t round_up(size_t n, size_t align_to)
Definition: rounding.h:21