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
PQCLEAN_MCELIECE6960119F_AVX_store_i(unsigned char * out,uint64_t in,int i)11 void PQCLEAN_MCELIECE6960119F_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
PQCLEAN_MCELIECE6960119F_AVX_store2(unsigned char * dest,uint16_t a)19 void PQCLEAN_MCELIECE6960119F_AVX_store2(unsigned char *dest, uint16_t a) {
20 dest[0] = a & 0xFF;
21 dest[1] = a >> 8;
22 }
23
PQCLEAN_MCELIECE6960119F_AVX_load2(const unsigned char * src)24 uint16_t PQCLEAN_MCELIECE6960119F_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
PQCLEAN_MCELIECE6960119F_AVX_load4(const unsigned char * src)34 uint32_t PQCLEAN_MCELIECE6960119F_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
PQCLEAN_MCELIECE6960119F_AVX_irr_load(vec128 * out,const unsigned char * in)48 void PQCLEAN_MCELIECE6960119F_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_MCELIECE6960119F_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_MCELIECE6960119F_AVX_vec128_set2x(v[0], v[1]);
73 }
74 }
75
PQCLEAN_MCELIECE6960119F_AVX_store8(unsigned char * out,uint64_t in)76 void PQCLEAN_MCELIECE6960119F_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
PQCLEAN_MCELIECE6960119F_AVX_load8(const unsigned char * in)87 uint64_t PQCLEAN_MCELIECE6960119F_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
PQCLEAN_MCELIECE6960119F_AVX_load16(const unsigned char * in)99 vec128 PQCLEAN_MCELIECE6960119F_AVX_load16(const unsigned char *in) {
100 return PQCLEAN_MCELIECE6960119F_AVX_vec128_set2x( PQCLEAN_MCELIECE6960119F_AVX_load8(in), PQCLEAN_MCELIECE6960119F_AVX_load8(in + 8) );
101 }
102
PQCLEAN_MCELIECE6960119F_AVX_store16(unsigned char * out,vec128 in)103 void PQCLEAN_MCELIECE6960119F_AVX_store16(unsigned char *out, vec128 in) {
104 PQCLEAN_MCELIECE6960119F_AVX_store8(out + 0, PQCLEAN_MCELIECE6960119F_AVX_vec128_extract(in, 0));
105 PQCLEAN_MCELIECE6960119F_AVX_store8(out + 8, PQCLEAN_MCELIECE6960119F_AVX_vec128_extract(in, 1));
106 }
107