10#include <botan/internal/mode_pad.h>
12#include <botan/exceptn.h>
13#include <botan/internal/ct_utils.h>
21 if(algo_spec ==
"NoPadding") {
22 return std::make_unique<Null_Padding>();
25 if(algo_spec ==
"PKCS7") {
26 return std::make_unique<PKCS7_Padding>();
29 if(algo_spec ==
"OneAndZeros") {
30 return std::make_unique<OneAndZeros_Padding>();
33 if(algo_spec ==
"X9.23") {
34 return std::make_unique<ANSI_X923_Padding>();
37 if(algo_spec ==
"ESP") {
38 return std::make_unique<ESP_Padding>();
56 return last_block.size();
74 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
75 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
76 const uint8_t padding_len = BS - start_pos;
77 for(uint8_t i = 0; i < BS; ++i) {
79 last_block[i] = needs_padding.select(padding_len, last_block[i]);
87 const size_t BS = input.size();
88 const uint8_t last_byte = input.back();
96 const size_t pad_pos = BS - last_byte;
98 for(
size_t i = 0; i != BS - 1; ++i) {
104 bad_input |= in_range & (~pad_eq);
107 return bad_input.select(BS, pad_pos);
121 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
122 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
123 const uint8_t padding_len = BS - start_pos;
124 for(uint8_t i = 0; i != BS - 1; ++i) {
126 last_block[i] = needs_padding.select(0, last_block[i]);
129 last_block.back() = padding_len;
136 const size_t BS = input.size();
137 const size_t last_byte = input.back();
141 const size_t pad_pos = BS - last_byte;
143 for(
size_t i = 0; i != BS - 1; ++i) {
147 bad_input |= pad_is_nonzero & in_range;
150 return bad_input.select(BS, pad_pos);
164 for(
size_t i = 0; i != last_block.size(); ++i) {
167 last_block[i] = needs_00.select(0x00, needs_80.select(0x80, last_block[i]));
175 const size_t BS = input.size();
179 size_t pad_pos = BS - 1;
181 for(
size_t i = BS; i != 0; --i) {
185 seen_0x80 |= is_0x80;
186 pad_pos -= seen_0x80.if_not_set_return(1);
187 bad_input |= ~seen_0x80 & ~is_zero;
189 bad_input |= ~seen_0x80;
205 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
206 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
208 uint8_t pad_ctr = 0x01;
209 for(uint8_t i = 0; i != BS; ++i) {
211 last_block[i] = needs_padding.select(pad_ctr, last_block[i]);
212 pad_ctr = needs_padding.select(pad_ctr + 1, pad_ctr);
220 const size_t BS = input.size();
221 const uint8_t last_byte = input.back();
225 const size_t pad_pos = BS - last_byte;
226 for(
size_t i = BS - 1; i != 0; --i) {
233 return bad_input.select(BS, pad_pos);
#define BOTAN_ASSERT_NOMSG(expr)
size_t remove_padding(std::span< const uint8_t > last_block) const override
void apply_padding(std::span< uint8_t > last_block, size_t final_block_bytes) const override
static std::unique_ptr< BlockCipherModePaddingMethod > create(std::string_view algo_spec)
virtual size_t remove_padding(std::span< const uint8_t > last_block) const =0
virtual bool valid_blocksize(size_t block_size) const =0
size_t unpad(std::span< const uint8_t > last_block) const
virtual void apply_padding(std::span< uint8_t > last_block, size_t padding_start_pos) const =0
virtual void add_padding(std::span< uint8_t > buffer, size_t final_block_bytes, size_t block_size) const
static constexpr Mask< T > is_gte(T x, T y)
static constexpr Mask< T > expand(T v)
static constexpr Mask< T > is_equal(T x, T y)
static constexpr Mask< T > is_gt(T x, T y)
static constexpr Mask< T > is_zero(T x)
static constexpr Mask< T > cleared()
size_t remove_padding(std::span< const uint8_t > last_block) const override
void apply_padding(std::span< uint8_t > last_block, size_t final_block_bytes) const override
size_t remove_padding(std::span< const uint8_t > last_block) const override
void apply_padding(std::span< uint8_t > last_block, size_t final_block_bytes) const override
size_t remove_padding(std::span< const uint8_t > last_block) const override
void apply_padding(std::span< uint8_t > last_block, size_t final_block_bytes) const override
decltype(auto) driveby_unpoison(T &&v)
constexpr auto scoped_poison(const Ts &... xs)