9#include <botan/mode_pad.h>
10#include <botan/exceptn.h>
11#include <botan/internal/ct_utils.h>
20 if(algo_spec ==
"NoPadding")
23 if(algo_spec ==
"PKCS7")
26 if(algo_spec ==
"OneAndZeros")
29 if(algo_spec ==
"X9.23")
32 if(algo_spec ==
"ESP")
54 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
56 buffer.resize(buffer.size() + padding_len);
64 const size_t start_of_last_block = buffer.size() - BS;
65 const size_t end_of_last_block = buffer.size();
66 const size_t start_of_padding = buffer.size() - padding_len;
68 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
71 buffer[i] = needs_padding.select(padding_len, buffer[i]);
88 const uint8_t last_byte = input[input_length-1];
96 const size_t pad_pos = input_length - last_byte;
98 for(
size_t i = 0; i != input_length - 1; ++i)
105 bad_input |= in_range & (~pad_eq);
110 return bad_input.select_and_unpoison(input_length, pad_pos);
117 size_t last_byte_pos,
129 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
131 buffer.resize(buffer.size() + padding_len);
139 const size_t start_of_last_block = buffer.size() - BS;
140 const size_t end_of_zero_padding = buffer.size() - 1;
141 const size_t start_of_padding = buffer.size() - padding_len;
143 for(
size_t i = start_of_last_block; i != end_of_zero_padding; ++i)
146 buffer[i] = needs_padding.select(0, buffer[i]);
149 buffer[buffer.size()-1] = padding_len;
164 const size_t last_byte = input[input_length-1];
168 const size_t pad_pos = input_length - last_byte;
170 for(
size_t i = 0; i != input_length - 1; ++i)
175 bad_input |= pad_is_nonzero & in_range;
180 return bad_input.select_and_unpoison(input_length, pad_pos);
187 size_t last_byte_pos,
200 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
202 buffer.resize(buffer.size() + padding_len);
210 const size_t start_of_last_block = buffer.size() - BS;
211 const size_t end_of_last_block = buffer.size();
212 const size_t start_of_padding = buffer.size() - padding_len;
214 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
218 buffer[i] = needs_00.select(0x00, needs_80.select(0x80, buffer[i]));
238 size_t pad_pos = input_length - 1;
239 size_t i = input_length;
246 seen_0x80 |= is_0x80;
247 pad_pos -= seen_0x80.if_not_set_return(1);
248 bad_input |= ~seen_0x80 & ~is_zero;
251 bad_input |= ~seen_0x80;
262 size_t last_byte_pos,
274 const uint8_t padding_len =
static_cast<uint8_t
>(BS - last_byte_pos);
276 buffer.resize(buffer.size() + padding_len);
284 const size_t start_of_last_block = buffer.size() - BS;
285 const size_t end_of_last_block = buffer.size();
286 const size_t start_of_padding = buffer.size() - padding_len;
288 uint8_t pad_ctr = 0x01;
290 for(
size_t i = start_of_last_block; i != end_of_last_block; ++i)
293 buffer[i] = needs_padding.select(pad_ctr, buffer[i]);
294 pad_ctr = needs_padding.select(pad_ctr + 1, pad_ctr);
311 const uint8_t input_length_8 =
static_cast<uint8_t
>(input_length);
312 const uint8_t last_byte = input[input_length-1];
317 const uint8_t pad_pos = input_length_8 - last_byte;
318 size_t i = input_length_8 - 1;
329 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 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)
BlockCipherModePaddingMethod * get_bc_pad(const std::string &algo_spec)
std::vector< T, secure_allocator< T > > secure_vector