1 /*
2   This file is for Niederreiter encryption
3 */
4 
5 #include "encrypt.h"
6 
7 #include "int32_sort.h"
8 #include "params.h"
9 #include "randombytes.h"
10 #include "util.h"
11 
12 #include <stdint.h>
13 
14 /* input: public key pk, error vector e */
15 /* output: syndrome s */
16 extern void PQCLEAN_MCELIECE8192128_AVX_syndrome_asm(unsigned char *s, const unsigned char *pk, unsigned char *e);
17 
18 /* output: e, an error vector of weight t */
gen_e(unsigned char * e)19 static void gen_e(unsigned char *e) {
20     int i, j, eq;
21 
22     uint16_t ind[ SYS_T ];
23     int32_t ind32[ SYS_T ];
24     uint64_t e_int[ SYS_N / 64 ];
25     uint64_t one = 1;
26     uint64_t mask;
27     uint64_t val[ SYS_T ];
28 
29     while (1) {
30         randombytes((unsigned char *) ind, sizeof(ind));
31 
32         for (i = 0; i < SYS_T; i++) {
33             ind32[i] = ind[i] &= GFMASK;
34         }
35 
36         // check for repetition
37 
38         PQCLEAN_MCELIECE8192128_AVX_int32_sort(ind32, SYS_T);
39 
40         eq = 0;
41         for (i = 1; i < SYS_T; i++) {
42             if (ind32[i - 1] == ind32[i]) {
43                 eq = 1;
44             }
45         }
46 
47         if (eq == 0) {
48             break;
49         }
50     }
51 
52     for (j = 0; j < SYS_T; j++) {
53         val[j] = one << (ind[j] & 63);
54     }
55 
56     for (i = 0; i < SYS_N / 64; i++) {
57         e_int[i] = 0;
58 
59         for (j = 0; j < SYS_T; j++) {
60             mask = i ^ (ind[j] >> 6);
61             mask -= 1;
62             mask >>= 63;
63             mask = -mask;
64 
65             e_int[i] |= val[j] & mask;
66         }
67     }
68 
69     for (i = 0; i < SYS_N / 64; i++) {
70         PQCLEAN_MCELIECE8192128_AVX_store8(e + i * 8, e_int[i]);
71     }
72 }
73 
74 /* input: public key pk */
75 /* output: error vector e, syndrome s */
PQCLEAN_MCELIECE8192128_AVX_encrypt(unsigned char * s,unsigned char * e,const unsigned char * pk)76 void PQCLEAN_MCELIECE8192128_AVX_encrypt(unsigned char *s, unsigned char *e, const unsigned char *pk) {
77     gen_e(e);
78     PQCLEAN_MCELIECE8192128_AVX_syndrome_asm(s, pk, e);
79 }
80 
81