8#include <botan/internal/eme_pkcs.h>
10#include <botan/exceptn.h>
12#include <botan/internal/ct_utils.h>
13#include <botan/internal/int_utils.h>
14#include <botan/internal/stl_util.h>
21size_t EME_PKCS1v15::pad(std::span<uint8_t> output,
22 std::span<const uint8_t> input,
27 if(input.size() > maximum_input_size(key_length * 8)) {
28 throw Invalid_Argument(
"PKCS1: Input is too large");
31 BufferStuffer stuffer(output);
33 const size_t padding_bytes = [&]() {
40 for(
size_t i = 0; i != padding_bytes; ++i) {
41 stuffer.append(rng.next_nonzero_byte());
44 stuffer.append(input);
46 return output.size() - stuffer.remaining_capacity();
52CT::Option<size_t> EME_PKCS1v15::unpad(std::span<uint8_t> output, std::span<const uint8_t> input)
const {
61 if(input.size() < 11) {
71 bad_input_m |= ~CT::Mask<uint8_t>::is_equal(input[0], 0);
72 bad_input_m |= ~CT::Mask<uint8_t>::is_equal(input[1], 2);
74 for(
size_t i = 2; i < input.size(); ++i) {
76 delim_idx += seen_zero_m.if_not_set_return(1);
77 seen_zero_m |= is_zero_m;
81 bad_input_m |= ~seen_zero_m;
89 const CT::Choice accept = !(bad_input_m.as_choice());
97size_t EME_PKCS1v15::maximum_input_size(
size_t keybits)
const {
98 if(keybits / 8 > 10) {
99 return ((keybits / 8) - 10);
#define BOTAN_ASSERT_NOMSG(expr)
static constexpr Mask< T > is_lt(T x, T y)
static constexpr Mask< T > is_zero(T x)
static constexpr Mask< T > cleared()
constexpr auto scoped_poison(const Ts &... xs)
BOTAN_TEST_API CT::Option< size_t > copy_output(CT::Choice accept, std::span< uint8_t > output, std::span< const uint8_t > input, size_t offset)
constexpr std::optional< T > checked_sub(T a, T b)