25 #ifndef CRYPTO3_EME_PKCS1_HPP
26 #define CRYPTO3_EME_PKCS1_HPP
37 template<
typename Scheme,
typename Hash>
40 template<
typename UniformRandomBitGenerator,
typename RandomNumberDistribution,
41 typename InputIterator,
typename OutputIterator>
42 OutputIterator
pad(InputIterator first, InputIterator last, OutputIterator out,
43 std::size_t key_length, UniformRandomBitGenerator rand,
44 RandomNumberDistribution dist) {
45 std::ptrdiff_t distance = std::distance(first, last);
48 throw std::invalid_argument(
"PKCS1: Input is too large");
53 secure_vector<uint8_t> out(key_length);
56 rand.randomize(out.data() + 1, (key_length - distance - 2));
58 for (
size_t j = 1; j != key_length - distance - 1; ++j) {
60 out[j] = rand.next_nonzero_byte();
64 buffer_insert(out, key_length - distance, in, distance);
69 template<
typename InputIterator,
typename OutputIterator>
70 OutputIterator
unpad(InputIterator first, InputIterator last, OutputIterator out) {
71 std::ptrdiff_t distance = std::distance(first, last);
74 throw std::invalid_argument(
"");
77 ct::poison(in, distance);
79 uint8_t bad_input_m = 0;
80 uint8_t seen_zero_m = 0;
83 bad_input_m |= ~ct::is_equal<uint8_t>(*first, 0);
84 bad_input_m |= ~ct::is_equal<uint8_t>(*(first + 1), 2);
86 for (
size_t i = 2; i < distance; ++i) {
87 const uint8_t is_zero_m = ct::is_zero<uint8_t>(in[i]);
89 delim_idx += ct::select<uint8_t>(~seen_zero_m, 1, 0);
91 bad_input_m |= is_zero_m & ct::expand_mask<uint8_t>(i < 10);
92 seen_zero_m |= is_zero_m;
95 bad_input_m |= ~seen_zero_m;
96 bad_input_m |= ct::is_less<size_t>(delim_idx, 8);
98 ct::unpoison(in, distance);
99 ct::unpoison(bad_input_m);
100 ct::unpoison(delim_idx);
102 secure_vector<uint8_t> output(&in[delim_idx + 2], &in[distance]);
103 ct::cond_zero_mem(bad_input_m, output.data(), output.size());
109 if (key_bits / 8 > 10) {
110 return ((key_bits / 8) - 10);
EME from PKCS #1 v1.5.
Definition: eme_pkcs.hpp:38
OutputIterator pad(InputIterator first, InputIterator last, OutputIterator out, std::size_t key_length, UniformRandomBitGenerator rand, RandomNumberDistribution dist)
Definition: eme_pkcs.hpp:42
virtual size_t maximum_input_size(std::size_t key_bits) const override
Definition: eme_pkcs.hpp:108
OutputIterator unpad(InputIterator first, InputIterator last, OutputIterator out)
Definition: eme_pkcs.hpp:70
Encoding Method for Encryption.
Definition: eme.hpp:38