12 #include <botan/internal/mce_internal.h>
13 #include <botan/mceliece.h>
14 #include <botan/internal/code_based_util.h>
15 #include <botan/internal/bit_ops.h>
22 secure_vector<uint8_t> concat_vectors(
const secure_vector<uint8_t>& a,
const secure_vector<uint8_t>& b,
23 uint32_t dimension, uint32_t codimension)
27 const size_t final_bits = dimension % 8;
32 copy_mem(&x[0], a.data(), dim_bytes);
37 copy_mem(&x[0], a.data(), (dimension / 8));
38 uint32_t l = dimension / 8;
39 x[l] =
static_cast<uint8_t
>(a[l] & ((1 << final_bits) - 1));
41 for(uint32_t k = 0; k < codimension / 8; ++k)
43 x[l] ^=
static_cast<uint8_t
>(b[k] << final_bits);
45 x[l] =
static_cast<uint8_t
>(b[k] >> (8 - final_bits));
47 x[l] ^=
static_cast<uint8_t
>(b[codimension/8] << final_bits);
53 secure_vector<uint8_t> mult_by_pubkey(
const secure_vector<uint8_t>& cleartext,
54 std::vector<uint8_t>
const& public_matrix,
57 const uint32_t ext_deg =
ceil_log2(code_length);
58 const uint32_t codimension = ext_deg * t;
59 const uint32_t dimension = code_length - codimension;
62 const uint8_t* pt = public_matrix.data();
64 for(
size_t i = 0; i < dimension / 8; ++i)
66 for(
size_t j = 0; j < 8; ++j)
68 if(cleartext[i] & (1 << j))
70 xor_buf(cR.data(), pt, cR.size());
76 for(
size_t i = 0; i < dimension % 8 ; ++i)
78 if(cleartext[dimension/8] & (1 << i))
80 xor_buf(cR.data(), pt, cR.size());
85 secure_vector<uint8_t> ciphertext = concat_vectors(cleartext, cR, dimension, codimension);
86 ciphertext.resize((code_length+7)/8);
90 secure_vector<uint8_t> create_random_error_vector(
unsigned code_length,
91 unsigned error_weight,
92 RandomNumberGenerator& rng)
94 secure_vector<uint8_t> result((code_length+7)/8);
98 while(bits_set < error_weight)
102 const size_t byte_pos = x / 8, bit_pos = x % 8;
104 const uint8_t mask = (1 << bit_pos);
106 if(result[byte_pos] & mask)
109 result[byte_pos] |= mask;
129 ciphertext ^= error_mask;
131 ciphertext_out.swap(ciphertext);
132 error_mask_out.swap(error_mask);
void xor_buf(T out[], const T in[], size_t length)
void mceliece_encrypt(secure_vector< uint8_t > &ciphertext_out, secure_vector< uint8_t > &error_mask_out, const secure_vector< uint8_t > &plaintext, const McEliece_PublicKey &key, RandomNumberGenerator &rng)
uint32_t bit_size_to_32bit_size(uint32_t bit_size)
uint32_t bit_size_to_byte_size(uint32_t bit_size)
uint32_t get_code_length() const
std::vector< T, secure_allocator< T >> secure_vector
const std::vector< uint8_t > & get_public_matrix() const
void copy_mem(T *out, const T *in, size_t n)
gf2m random_code_element(unsigned code_length, RandomNumberGenerator &rng)