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