1 /* 2 This file is for loading/storing data in a little-endian fashion 3 */ 4 5 #include "util.h" 6 7 #include "vec128.h" 8 9 #include <stdint.h> 10 11 void PQCLEAN_MCELIECE6688128F_AVX_store_i(unsigned char *out, uint64_t in, int i) { 12 int j; 13 14 for (j = 0; j < i; j++) { 15 out[j] = (in >> (j * 8)) & 0xFF; 16 } 17 } 18 19 void PQCLEAN_MCELIECE6688128F_AVX_store2(unsigned char *dest, uint16_t a) { 20 dest[0] = a & 0xFF; 21 dest[1] = a >> 8; 22 } 23 24 uint16_t PQCLEAN_MCELIECE6688128F_AVX_load2(const unsigned char *src) { 25 uint16_t a; 26 27 a = src[1]; 28 a <<= 8; 29 a |= src[0]; 30 31 return a & GFMASK; 32 } 33 34 uint32_t PQCLEAN_MCELIECE6688128F_AVX_load4(const unsigned char *src) { 35 uint32_t a; 36 37 a = src[3]; 38 a <<= 8; 39 a |= src[2]; 40 a <<= 8; 41 a |= src[1]; 42 a <<= 8; 43 a |= src[0]; 44 45 return a; 46 } 47 48 void PQCLEAN_MCELIECE6688128F_AVX_irr_load(vec128 *out, const unsigned char *in) { 49 int i, j; 50 uint64_t v[2]; 51 uint16_t irr[ SYS_T + 1 ]; 52 53 for (i = 0; i < SYS_T; i++) { 54 irr[i] = PQCLEAN_MCELIECE6688128F_AVX_load2(in + i * 2); 55 irr[i] &= GFMASK; 56 } 57 58 irr[ SYS_T ] = 1; 59 60 for (i = 0; i < GFBITS; i++) { 61 v[0] = v[1] = 0; 62 63 for (j = 63; j >= 0; j--) { 64 v[0] <<= 1; 65 v[0] |= (irr[j] >> i) & 1; 66 } 67 for (j = SYS_T; j >= 64; j--) { 68 v[1] <<= 1; 69 v[1] |= (irr[j] >> i) & 1; 70 } 71 72 out[i] = PQCLEAN_MCELIECE6688128F_AVX_vec128_set2x(v[0], v[1]); 73 } 74 } 75 76 void PQCLEAN_MCELIECE6688128F_AVX_store8(unsigned char *out, uint64_t in) { 77 out[0] = (in >> 0x00) & 0xFF; 78 out[1] = (in >> 0x08) & 0xFF; 79 out[2] = (in >> 0x10) & 0xFF; 80 out[3] = (in >> 0x18) & 0xFF; 81 out[4] = (in >> 0x20) & 0xFF; 82 out[5] = (in >> 0x28) & 0xFF; 83 out[6] = (in >> 0x30) & 0xFF; 84 out[7] = (in >> 0x38) & 0xFF; 85 } 86 87 uint64_t PQCLEAN_MCELIECE6688128F_AVX_load8(const unsigned char *in) { 88 int i; 89 uint64_t ret = in[7]; 90 91 for (i = 6; i >= 0; i--) { 92 ret <<= 8; 93 ret |= in[i]; 94 } 95 96 return ret; 97 } 98 99 vec128 PQCLEAN_MCELIECE6688128F_AVX_load16(const unsigned char *in) { 100 return PQCLEAN_MCELIECE6688128F_AVX_vec128_set2x( PQCLEAN_MCELIECE6688128F_AVX_load8(in), PQCLEAN_MCELIECE6688128F_AVX_load8(in + 8) ); 101 } 102 103 void PQCLEAN_MCELIECE6688128F_AVX_store16(unsigned char *out, vec128 in) { 104 PQCLEAN_MCELIECE6688128F_AVX_store8(out + 0, PQCLEAN_MCELIECE6688128F_AVX_vec128_extract(in, 0)); 105 PQCLEAN_MCELIECE6688128F_AVX_store8(out + 8, PQCLEAN_MCELIECE6688128F_AVX_vec128_extract(in, 1)); 106 } 107