9#include <botan/internal/mode_pad.h>
10#include <botan/exceptn.h>
11#include <botan/internal/ct_utils.h>
18std::unique_ptr<BlockCipherModePaddingMethod>
21 if(algo_spec ==
"NoPadding")
22 return std::make_unique<Null_Padding>();
24 if(algo_spec ==
"PKCS7")
25 return std::make_unique<PKCS7_Padding>();
27 if(algo_spec ==
"OneAndZeros")
28 return std::make_unique<OneAndZeros_Padding>();
30 if(algo_spec ==
"X9.23")
31 return std::make_unique<ANSI_X923_Padding>();
33 if(algo_spec ==
"ESP")
34 return std::make_unique<ESP_Padding>();
55 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
57 buffer.resize(buffer.size() + padding_len);
65 const size_t start_of_last_block = buffer.size() - BS;
66 const size_t end_of_last_block = buffer.size();
67 const size_t start_of_padding = buffer.size() - padding_len;
69 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
72 buffer[i] = needs_padding.select(padding_len, buffer[i]);
89 const uint8_t last_byte = input[input_length-1];
97 const size_t pad_pos = input_length - last_byte;
99 for(
size_t i = 0; i != input_length - 1; ++i)
106 bad_input |= in_range & (~pad_eq);
111 return bad_input.select_and_unpoison(input_length, pad_pos);
118 size_t last_byte_pos,
130 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
132 buffer.resize(buffer.size() + padding_len);
140 const size_t start_of_last_block = buffer.size() - BS;
141 const size_t end_of_zero_padding = buffer.size() - 1;
142 const size_t start_of_padding = buffer.size() - padding_len;
144 for(
size_t i = start_of_last_block; i != end_of_zero_padding; ++i)
147 buffer[i] = needs_padding.select(0, buffer[i]);
150 buffer[buffer.size()-1] = padding_len;
165 const size_t last_byte = input[input_length-1];
169 const size_t pad_pos = input_length - last_byte;
171 for(
size_t i = 0; i != input_length - 1; ++i)
176 bad_input |= pad_is_nonzero & in_range;
181 return bad_input.select_and_unpoison(input_length, pad_pos);
188 size_t last_byte_pos,
201 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
203 buffer.resize(buffer.size() + padding_len);
211 const size_t start_of_last_block = buffer.size() - BS;
212 const size_t end_of_last_block = buffer.size();
213 const size_t start_of_padding = buffer.size() - padding_len;
215 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
219 buffer[i] = needs_00.select(0x00, needs_80.select(0x80, buffer[i]));
239 size_t pad_pos = input_length - 1;
240 size_t i = input_length;
247 seen_0x80 |= is_0x80;
248 pad_pos -= seen_0x80.if_not_set_return(1);
249 bad_input |= ~seen_0x80 & ~is_zero;
252 bad_input |= ~seen_0x80;
263 size_t last_byte_pos,
275 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
277 buffer.resize(buffer.size() + padding_len);
285 const size_t start_of_last_block = buffer.size() - BS;
286 const size_t end_of_last_block = buffer.size();
287 const size_t start_of_padding = buffer.size() - padding_len;
289 uint8_t pad_ctr = 0x01;
291 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
294 buffer[i] = needs_padding.select(pad_ctr, buffer[i]);
295 pad_ctr = needs_padding.select(pad_ctr + 1, pad_ctr);
312 const uint8_t input_length_8 =
static_cast<uint8_t
>(input_length);
313 const uint8_t last_byte = input[input_length-1];
318 const uint8_t pad_pos = input_length_8 - last_byte;
319 size_t i = input_length_8 - 1;
330 return bad_input.select_and_unpoison(input_length_8, pad_pos);
#define BOTAN_DEBUG_ASSERT(expr)
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
size_t unpad(const uint8_t[], size_t) const override
bool valid_blocksize(size_t bs) const override
static std::unique_ptr< BlockCipherModePaddingMethod > create(const std::string &algo_spec)
static Mask< T > is_gt(T x, T y)
static Mask< T > is_equal(T x, T y)
static Mask< T > is_zero(T x)
static Mask< T > expand(T v)
static Mask< T > is_gte(T x, T y)
static Mask< T > cleared()
bool valid_blocksize(size_t bs) const override
size_t unpad(const uint8_t[], size_t) const override
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
size_t unpad(const uint8_t[], size_t) const override
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
bool valid_blocksize(size_t bs) const override
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
bool valid_blocksize(size_t bs) const override
size_t unpad(const uint8_t[], size_t) const override
void poison(const T *p, size_t n)
void unpoison(const T *p, size_t n)
std::vector< T, secure_allocator< T > > secure_vector