Botan  2.7.0
Crypto and TLS for C++11
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/cipher_filter.h>
9 #include <botan/internal/rounding.h>
10 
11 namespace Botan {
12 
13 namespace {
14 
15 size_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->update_granularity()),
29  mode->minimum_final_size()),
30  m_mode(mode),
31  m_nonce(mode->default_nonce_length()),
32  m_buffer(m_mode->update_granularity())
33  {
34  }
35 
36 std::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 
56 bool Cipher_Mode_Filter::valid_iv_length(size_t length) const
57  {
58  return m_mode->valid_nonce_length(length);
59  }
60 
61 void Cipher_Mode_Filter::write(const uint8_t input[], size_t input_length)
62  {
63  Buffered_Filter::write(input, input_length);
64  }
65 
66 void Cipher_Mode_Filter::end_msg()
67  {
69  }
70 
71 void 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 
80 void 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->update_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 
96 void 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 set_iv(const InitializationVector &iv) override
bool valid_iv_length(size_t length) const override
virtual void send(const uint8_t in[], size_t length)
Definition: filter.cpp:27
Cipher_Mode_Filter(Cipher_Mode *t)
void write(const uint8_t in[], size_t length)
Definition: buf_filt.cpp:34
void set_key(const SymmetricKey &key) override
std::string name() const override
Definition: alg_id.cpp:13
Key_Length_Specification key_spec() const override
std::vector< T > unlock(const secure_vector< T > &in)
Definition: secmem.h:95
secure_vector< uint8_t > bits_of() const
Definition: symkey.h:31
size_t round_up(size_t n, size_t align_to)
Definition: rounding.h:21