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);
58 const uint8_t last_byte = block[size-1];
62 size_t pad_pos = size - last_byte;
81 size_t block_size)
const
83 const uint8_t pad_value =
static_cast<uint8_t
>(block_size - last_byte_pos);
85 for(
size_t i = last_byte_pos; i < block_size-1; ++i)
89 buffer.push_back(pad_value);
99 const size_t last_byte = block[size-1];
103 size_t pad_pos = size - last_byte;
120 size_t last_byte_pos,
121 size_t block_size)
const
123 buffer.push_back(0x80);
125 for(
size_t i = last_byte_pos + 1; i % block_size; ++i)
126 buffer.push_back(0x00);
135 uint8_t bad_input = 0;
136 uint8_t seen_one = 0;
137 size_t pad_pos = size - 1;
142 seen_one |= CT::is_equal<uint8_t>(block[i-1],0x80);
143 pad_pos -= CT::select<uint8_t>(~seen_one, 1, 0);
144 bad_input |= ~CT::is_zero<uint8_t>(block[i-1]) & ~seen_one;
147 bad_input |= ~seen_one;
160 size_t last_byte_pos,
161 size_t block_size)
const
163 uint8_t pad_value = 0x01;
165 for(
size_t i = last_byte_pos; i < block_size; ++i)
167 buffer.push_back(pad_value++);
178 const size_t last_byte = block[size-1];
179 size_t bad_input = 0;
182 size_t pad_pos = size - last_byte;
186 bad_input |= ~CT::is_equal<size_t>(size_t(block[i-1]),size_t(block[i])-1) &
CT::expand_mask(i > pad_pos);
size_t unpad(const uint8_t[], size_t) const override
size_t unpad(const uint8_t[], size_t) const override
void conditional_copy_mem(T value, T *to, const T *from0, const T *from1, size_t elems)
BlockCipherModePaddingMethod * get_bc_pad(const std::string &algo_spec)
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
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
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
void add_padding(secure_vector< uint8_t > &buffer, size_t final_block_bytes, size_t block_size) const override
void unpoison(const T *p, size_t n)
size_t unpad(const uint8_t[], size_t) const override