10#include <botan/internal/mode_pad.h>
12#include <botan/internal/ct_utils.h>
20 if(algo_spec ==
"NoPadding") {
21 return std::make_unique<Null_Padding>();
24 if(algo_spec ==
"PKCS7") {
25 return std::make_unique<PKCS7_Padding>();
28 if(algo_spec ==
"OneAndZeros") {
29 return std::make_unique<OneAndZeros_Padding>();
32 if(algo_spec ==
"X9.23") {
33 return std::make_unique<ANSI_X923_Padding>();
36 if(algo_spec ==
"ESP") {
37 return std::make_unique<ESP_Padding>();
55 return last_block.size();
73 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
74 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
75 const uint8_t padding_len = BS - start_pos;
76 for(uint8_t i = 0; i < BS; ++i) {
78 last_block[i] = needs_padding.select(padding_len, last_block[i]);
86 const size_t BS = input.size();
87 const uint8_t last_byte = input.back();
95 const size_t pad_pos = BS - last_byte;
97 for(
size_t i = 0; i != BS - 1; ++i) {
103 bad_input |= in_range & (~pad_eq);
106 return bad_input.select(BS, pad_pos);
120 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
121 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
122 const uint8_t padding_len = BS - start_pos;
123 for(uint8_t i = 0; i != BS - 1; ++i) {
125 last_block[i] = needs_padding.select(0, last_block[i]);
128 last_block.back() = padding_len;
135 const size_t BS = input.size();
136 const size_t last_byte = input.back();
140 const size_t pad_pos = BS - last_byte;
142 for(
size_t i = 0; i != BS - 1; ++i) {
146 bad_input |= pad_is_nonzero & in_range;
149 return bad_input.select(BS, pad_pos);
163 for(
size_t i = 0; i != last_block.size(); ++i) {
166 last_block[i] = needs_00.select(0x00, needs_80.select(0x80, last_block[i]));
174 const size_t BS = input.size();
178 size_t pad_pos = BS - 1;
180 for(
size_t i = BS; i != 0; --i) {
184 seen_0x80 |= is_0x80;
185 pad_pos -= seen_0x80.if_not_set_return(1);
186 bad_input |= ~seen_0x80 & ~is_zero;
188 bad_input |= ~seen_0x80;
204 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
205 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
207 uint8_t pad_ctr = 0x01;
208 for(uint8_t i = 0; i != BS; ++i) {
210 last_block[i] = needs_padding.select(pad_ctr, last_block[i]);
211 pad_ctr = needs_padding.select(pad_ctr + 1, pad_ctr);
219 const size_t BS = input.size();
220 const uint8_t last_byte = input.back();
224 const size_t pad_pos = BS - last_byte;
225 for(
size_t i = BS - 1; i != 0; --i) {
232 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)