10#include <botan/internal/mode_pad.h>
12#include <botan/internal/ct_utils.h>
13#include <botan/internal/int_utils.h>
19 const size_t full_blocks = input_length - (input_length % block_size);
20 return add_or_throw(full_blocks, block_size,
"Input too large to pad");
27 if(algo_spec ==
"NoPadding") {
28 return std::make_unique<Null_Padding>();
31 if(algo_spec ==
"PKCS7") {
32 return std::make_unique<PKCS7_Padding>();
35 if(algo_spec ==
"OneAndZeros") {
36 return std::make_unique<OneAndZeros_Padding>();
39 if(algo_spec ==
"X9.23") {
40 return std::make_unique<ANSI_X923_Padding>();
43 if(algo_spec ==
"ESP") {
44 return std::make_unique<ESP_Padding>();
62 return last_block.size();
80 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
81 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
82 const uint8_t padding_len = BS - start_pos;
83 for(uint8_t i = 0; i < BS; ++i) {
85 last_block[i] = needs_padding.select(padding_len, last_block[i]);
93 const size_t BS = input.size();
94 const uint8_t last_byte = input.back();
102 const size_t pad_pos = BS - last_byte;
104 for(
size_t i = 0; i != BS - 1; ++i) {
110 bad_input |= in_range & (~pad_eq);
113 return bad_input.select(BS, pad_pos);
127 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
128 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
129 const uint8_t padding_len = BS - start_pos;
130 for(uint8_t i = 0; i != BS - 1; ++i) {
132 last_block[i] = needs_padding.select(0, last_block[i]);
135 last_block.back() = padding_len;
142 const size_t BS = input.size();
143 const size_t last_byte = input.back();
147 const size_t pad_pos = BS - last_byte;
149 for(
size_t i = 0; i != BS - 1; ++i) {
153 bad_input |= pad_is_nonzero & in_range;
156 return bad_input.select(BS, pad_pos);
170 for(
size_t i = 0; i != last_block.size(); ++i) {
173 last_block[i] = needs_00.select(0x00, needs_80.select(0x80, last_block[i]));
181 const size_t BS = input.size();
185 size_t pad_pos = BS - 1;
187 for(
size_t i = BS; i != 0; --i) {
191 seen_0x80 |= is_0x80;
192 pad_pos -= seen_0x80.if_not_set_return(1);
193 bad_input |= ~seen_0x80 & ~is_zero;
195 bad_input |= ~seen_0x80;
211 const uint8_t BS =
static_cast<uint8_t
>(last_block.size());
212 const uint8_t start_pos =
static_cast<uint8_t
>(padding_start_pos);
214 uint8_t pad_ctr = 0x01;
215 for(uint8_t i = 0; i != BS; ++i) {
217 last_block[i] = needs_padding.select(pad_ctr, last_block[i]);
218 pad_ctr = needs_padding.select(pad_ctr + 1, pad_ctr);
226 const size_t BS = input.size();
227 const uint8_t last_byte = input.back();
231 const size_t pad_pos = BS - last_byte;
232 for(
size_t i = BS - 1; i != 0; --i) {
239 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
virtual size_t output_length(size_t input_length, size_t block_size) const
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)
constexpr T add_or_throw(T a, T b, std::string_view msg)