9 #ifndef BOTAN_LOAD_STORE_H_ 10 #define BOTAN_LOAD_STORE_H_ 12 #include <botan/types.h> 13 #include <botan/bswap.h> 14 #include <botan/mem_ops.h> 17 #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) 18 #define BOTAN_ENDIAN_N2L(x) reverse_bytes(x) 19 #define BOTAN_ENDIAN_L2N(x) reverse_bytes(x) 20 #define BOTAN_ENDIAN_N2B(x) (x) 21 #define BOTAN_ENDIAN_B2N(x) (x) 23 #elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) 24 #define BOTAN_ENDIAN_N2L(x) (x) 25 #define BOTAN_ENDIAN_L2N(x) (x) 26 #define BOTAN_ENDIAN_N2B(x) reverse_bytes(x) 27 #define BOTAN_ENDIAN_B2N(x) reverse_bytes(x) 39 template<
typename T>
inline constexpr uint8_t
get_byte(
size_t byte_num,
T input)
41 return static_cast<uint8_t
>(
42 input >> (((~byte_num)&(
sizeof(
T)-1)) << 3)
54 return static_cast<uint16_t
>((
static_cast<uint16_t
>(i0) << 8) | i1);
65 inline constexpr uint32_t
make_uint32(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3)
67 return ((static_cast<uint32_t>(i0) << 24) |
68 (static_cast<uint32_t>(i1) << 16) |
69 (static_cast<uint32_t>(i2) << 8) |
70 (static_cast<uint32_t>(i3)));
85 inline constexpr uint64_t
make_uint64(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3,
86 uint8_t i4, uint8_t i5, uint8_t i6, uint8_t i7)
88 return ((static_cast<uint64_t>(i0) << 56) |
89 (static_cast<uint64_t>(i1) << 48) |
90 (static_cast<uint64_t>(i2) << 40) |
91 (static_cast<uint64_t>(i3) << 32) |
92 (static_cast<uint64_t>(i4) << 24) |
93 (static_cast<uint64_t>(i5) << 16) |
94 (static_cast<uint64_t>(i6) << 8) |
95 (static_cast<uint64_t>(i7)));
107 in += off *
sizeof(
T);
109 for(
size_t i = 0; i !=
sizeof(
T); ++i)
110 out = static_cast<T>((out << 8) | in[i]);
123 in += off *
sizeof(
T);
125 for(
size_t i = 0; i !=
sizeof(
T); ++i)
126 out = (out << 8) | in[
sizeof(
T)-1-i];
139 in += off *
sizeof(uint16_t);
141 #if defined(BOTAN_ENDIAN_N2B) 144 return BOTAN_ENDIAN_N2B(x);
159 in += off *
sizeof(uint16_t);
161 #if defined(BOTAN_ENDIAN_N2L) 164 return BOTAN_ENDIAN_N2L(x);
179 in += off *
sizeof(uint32_t);
180 #if defined(BOTAN_ENDIAN_N2B) 183 return BOTAN_ENDIAN_N2B(x);
198 in += off *
sizeof(uint32_t);
199 #if defined(BOTAN_ENDIAN_N2L) 202 return BOTAN_ENDIAN_N2L(x);
217 in += off *
sizeof(uint64_t);
218 #if defined(BOTAN_ENDIAN_N2B) 221 return BOTAN_ENDIAN_N2B(x);
224 in[4], in[5], in[6], in[7]);
237 in += off *
sizeof(uint64_t);
238 #if defined(BOTAN_ENDIAN_N2L) 241 return BOTAN_ENDIAN_N2L(x);
244 in[3], in[2], in[1], in[0]);
257 x0 = load_le<T>(in, 0);
258 x1 = load_le<T>(in, 1);
271 T& x0,
T& x1,
T& x2,
T& x3)
273 x0 = load_le<T>(in, 0);
274 x1 = load_le<T>(in, 1);
275 x2 = load_le<T>(in, 2);
276 x3 = load_le<T>(in, 3);
293 T& x0,
T& x1,
T& x2,
T& x3,
294 T& x4,
T& x5,
T& x6,
T& x7)
296 x0 = load_le<T>(in, 0);
297 x1 = load_le<T>(in, 1);
298 x2 = load_le<T>(in, 2);
299 x3 = load_le<T>(in, 3);
300 x4 = load_le<T>(in, 4);
301 x5 = load_le<T>(in, 5);
302 x6 = load_le<T>(in, 6);
303 x7 = load_le<T>(in, 7);
319 #if defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) 322 #elif defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) 325 const size_t blocks = count - (count % 4);
326 const size_t left = count - blocks;
328 for(
size_t i = 0; i != blocks; i += 4)
331 for(
size_t i = 0; i != left; ++i)
334 for(
size_t i = 0; i != count; ++i)
335 out[i] = load_le<T>(in, i);
349 x0 = load_be<T>(in, 0);
350 x1 = load_be<T>(in, 1);
363 T& x0,
T& x1,
T& x2,
T& x3)
365 x0 = load_be<T>(in, 0);
366 x1 = load_be<T>(in, 1);
367 x2 = load_be<T>(in, 2);
368 x3 = load_be<T>(in, 3);
385 T& x0,
T& x1,
T& x2,
T& x3,
386 T& x4,
T& x5,
T& x6,
T& x7)
388 x0 = load_be<T>(in, 0);
389 x1 = load_be<T>(in, 1);
390 x2 = load_be<T>(in, 2);
391 x3 = load_be<T>(in, 3);
392 x4 = load_be<T>(in, 4);
393 x5 = load_be<T>(in, 5);
394 x6 = load_be<T>(in, 6);
395 x7 = load_be<T>(in, 7);
411 #if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) 414 #elif defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) 416 const size_t blocks = count - (count % 4);
417 const size_t left = count - blocks;
419 for(
size_t i = 0; i != blocks; i += 4)
422 for(
size_t i = 0; i != left; ++i)
425 for(
size_t i = 0; i != count; ++i)
426 out[i] = load_be<T>(in, i);
438 #if defined(BOTAN_ENDIAN_N2B) 439 uint16_t o = BOTAN_ENDIAN_N2B(in);
454 #if defined(BOTAN_ENDIAN_N2L) 455 uint16_t o = BOTAN_ENDIAN_N2L(in);
470 #if defined(BOTAN_ENDIAN_B2N) 471 uint32_t o = BOTAN_ENDIAN_B2N(in);
488 #if defined(BOTAN_ENDIAN_L2N) 489 uint32_t o = BOTAN_ENDIAN_L2N(in);
506 #if defined(BOTAN_ENDIAN_B2N) 507 uint64_t o = BOTAN_ENDIAN_B2N(in);
528 #if defined(BOTAN_ENDIAN_L2N) 529 uint64_t o = BOTAN_ENDIAN_L2N(in);
617 T x4,
T x5,
T x6,
T x7)
643 T x4,
T x5,
T x6,
T x7)
658 while(out_bytes >=
sizeof(
T))
662 out_bytes -=
sizeof(
T);
666 for(
size_t i = 0; i != out_bytes; ++i)
670 template<
typename T,
typename Alloc>
671 void copy_out_vec_be(uint8_t out[],
size_t out_bytes,
const std::vector<T, Alloc>& in)
679 while(out_bytes >=
sizeof(
T))
683 out_bytes -=
sizeof(
T);
687 for(
size_t i = 0; i != out_bytes; ++i)
688 out[i] =
get_byte(
sizeof(
T) - 1 - (i % 8), in[0]);
691 template<
typename T,
typename Alloc>
692 void copy_out_vec_le(uint8_t out[],
size_t out_bytes,
const std::vector<T, Alloc>& in)
void copy_out_vec_be(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)
uint16_t load_le< uint16_t >(const uint8_t in[], size_t off)
void store_be(uint16_t in, uint8_t out[2])
void copy_out_le(uint8_t out[], size_t out_bytes, const T in[])
uint16_t load_be< uint16_t >(const uint8_t in[], size_t off)
uint32_t load_be< uint32_t >(const uint8_t in[], size_t off)
void typecast_copy(uint8_t out[], T in)
constexpr uint8_t get_byte(size_t byte_num, T input)
constexpr uint64_t make_uint64(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3, uint8_t i4, uint8_t i5, uint8_t i6, uint8_t i7)
uint32_t load_le< uint32_t >(const uint8_t in[], size_t off)
constexpr uint32_t make_uint32(uint8_t i0, uint8_t i1, uint8_t i2, uint8_t i3)
uint64_t load_be< uint64_t >(const uint8_t in[], size_t off)
T load_be(const uint8_t in[], size_t off)
uint64_t load_le< uint64_t >(const uint8_t in[], size_t off)
T load_le(const uint8_t in[], size_t off)
uint16_t reverse_bytes(uint16_t val)
constexpr uint16_t make_uint16(uint8_t i0, uint8_t i1)
void copy_out_be(uint8_t out[], size_t out_bytes, const T in[])
void store_le(uint16_t in, uint8_t out[2])
void copy_out_vec_le(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)