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")
43 size_t block_size)
const
45 const uint8_t pad_value =
static_cast<uint8_t
>(block_size - last_byte_pos);
47 for(
size_t i = 0; i != pad_value; ++i)
48 buffer.push_back(pad_value);
61 const uint8_t last_byte = input[input_length-1];
69 const size_t pad_pos = input_length - last_byte;
71 for(
size_t i = 0; i != input_length - 1; ++i)
78 bad_input |= in_range & (~pad_eq);
83 return bad_input.select_and_unpoison(input_length, pad_pos);
91 size_t block_size)
const
93 const uint8_t pad_value =
static_cast<uint8_t
>(block_size - last_byte_pos);
95 for(
size_t i = last_byte_pos; i < block_size-1; ++i)
99 buffer.push_back(pad_value);
112 const size_t last_byte = input[input_length-1];
116 const size_t pad_pos = input_length - last_byte;
118 for(
size_t i = 0; i != input_length - 1; ++i)
123 bad_input |= pad_is_nonzero & in_range;
128 return bad_input.select_and_unpoison(input_length, pad_pos);
135 size_t last_byte_pos,
136 size_t block_size)
const
138 buffer.push_back(0x80);
140 for(
size_t i = last_byte_pos + 1; i % block_size; ++i)
141 buffer.push_back(0x00);
157 size_t pad_pos = input_length - 1;
158 size_t i = input_length;
165 seen_0x80 |= is_0x80;
166 pad_pos -= seen_0x80.if_not_set_return(1);
167 bad_input |= ~seen_0x80 & ~is_zero;
170 bad_input |= ~seen_0x80;
181 size_t last_byte_pos,
182 size_t block_size)
const
184 uint8_t pad_value = 0x01;
186 for(
size_t i = last_byte_pos; i < block_size; ++i)
188 buffer.push_back(pad_value++);
202 const uint8_t input_length_8 =
static_cast<uint8_t
>(input_length);
203 const uint8_t last_byte = input[input_length-1];
208 const uint8_t pad_pos = input_length_8 - last_byte;
209 size_t i = input_length_8 - 1;
220 return bad_input.select_and_unpoison(input_length_8, pad_pos);
size_t unpad(const uint8_t[], size_t) const override
static Mask< T > cleared()
bool valid_blocksize(size_t bs) const override
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
static Mask< T > is_gte(T x, T y)
void poison(const T *p, size_t n)
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
static Mask< T > expand(T v)
std::vector< T, secure_allocator< T >> secure_vector
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
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 unpoison(const T *p, size_t n)
size_t unpad(const uint8_t[], size_t) const override
static Mask< T > is_zero(T x)
static Mask< T > is_equal(T x, T y)
static Mask< T > is_gt(T x, T y)
BlockCipherModePaddingMethod * get_bc_pad(const std::string &algo_spec)