9 #include <botan/package.h> 10 #include <botan/filters.h> 11 #include <botan/ctr.h> 12 #include <botan/loadstor.h> 13 #include <botan/rng.h> 19 const uint8_t input[],
size_t input_len,
23 throw Encoding_Error(
"Package transform cannot encode small inputs");
25 const size_t BLOCK_SIZE = cipher->
block_size();
31 const std::string all_zeros(BLOCK_SIZE*2,
'0');
35 Pipe pipe(
new StreamCipher_Filter(
new CTR_BE(cipher), package_key));
38 const size_t remaining = pipe.
remaining();
47 (input_len + BLOCK_SIZE - 1) / BLOCK_SIZE;
49 uint8_t* final_block = output + input_len;
53 for(
size_t i = 0; i != blocks; ++i)
55 const size_t left = std::min<size_t>(BLOCK_SIZE,
56 input_len - BLOCK_SIZE * i);
59 copy_mem(buf.data(), output + (BLOCK_SIZE * i), left);
61 for(
size_t j = 0; j !=
sizeof(i); ++j)
62 buf[BLOCK_SIZE - 1 - j] ^=
get_byte(
sizeof(i)-1-j, i);
66 xor_buf(final_block, buf.data(), BLOCK_SIZE);
74 const uint8_t input[],
size_t input_len,
77 const size_t BLOCK_SIZE = cipher->
block_size();
82 if(input_len < BLOCK_SIZE)
86 const std::string all_zeros(BLOCK_SIZE*2,
'0');
95 input + (input_len - BLOCK_SIZE),
98 const size_t blocks = ((input_len - 1) / BLOCK_SIZE);
101 for(
size_t i = 0; i != blocks; ++i)
103 const size_t left = std::min<size_t>(BLOCK_SIZE,
104 input_len - BLOCK_SIZE * (i+1));
107 copy_mem(buf.data(), input + (BLOCK_SIZE * i), left);
109 for(
size_t j = 0; j !=
sizeof(i); ++j)
110 buf[BLOCK_SIZE - 1 - j] ^=
get_byte(
sizeof(i)-1-j, i);
114 xor_buf(package_key.data(), buf.data(), BLOCK_SIZE);
117 Pipe pipe(
new StreamCipher_Filter(
new CTR_BE(cipher), package_key));
121 const size_t remaining = pipe.
remaining();
size_t remaining(message_id msg=DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT
void clear_mem(T *ptr, size_t n)
size_t read(uint8_t output[], size_t length) override BOTAN_WARN_UNUSED_RESULT
bool valid_keylength(size_t length) const
void set_key(const SymmetricKey &key)
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
#define BOTAN_ASSERT_EQUAL(expr1, expr2, assertion_made)
void process_msg(const uint8_t in[], size_t length)
void copy_mem(T *out, const T *in, size_t n)
const uint8_t * begin() const
void encrypt(const uint8_t in[], uint8_t out[]) const
void aont_unpackage(BlockCipher *cipher, const uint8_t input[], size_t input_len, uint8_t output[])
uint8_t get_byte(size_t byte_num, T input)
std::vector< T, secure_allocator< T > > secure_vector
void aont_package(RandomNumberGenerator &rng, BlockCipher *cipher, const uint8_t input[], size_t input_len, uint8_t output[])
virtual size_t block_size() const =0
void zeroise(std::vector< T, Alloc > &vec)