19fdc4873412b8adda34bca87b0fd021a1dc936c
[strongswan.git] / src / libstrongswan / plugins / bliss / bliss_param_set.h
1 /*
2 * Copyright (C) 2014 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 /**
17 * @defgroup bliss_param_set bliss_param_set
18 * @{ @ingroup bliss_p
19 */
20
21 #ifndef BLISS_PARAM_SET_H_
22 #define BLISS_PARAM_SET_H_
23
24 typedef enum bliss_param_set_id_t bliss_param_set_id_t;
25 typedef struct bliss_param_set_t bliss_param_set_t;
26
27 #include "ntt_fft_params.h"
28 #include "bliss_huffman_code.h"
29
30 #include <library.h>
31
32 /**
33 * BLISS signature parameter set ID list
34 */
35 enum bliss_param_set_id_t {
36 BLISS_I = 1,
37 BLISS_II = 2,
38 BLISS_III = 3,
39 BLISS_IV = 4,
40 BLISS_B_I = 5,
41 BLISS_B_II = 6,
42 BLISS_B_III = 7,
43 BLISS_B_IV = 8
44 };
45
46 extern enum_name_t *bliss_param_set_id_names;
47
48 /**
49 * BLISS
50 */
51 struct bliss_param_set_t {
52
53 /**
54 * BLISS parameter set ID
55 */
56 bliss_param_set_id_t id;
57
58 /**
59 * BLISS parameter set OID
60 */
61 int oid;
62
63 /**
64 * Security strength in bits
65 */
66 uint16_t strength;
67
68 /**
69 * Prime modulus
70 */
71 uint16_t q;
72
73 /**
74 * Number of bits in q
75 */
76 uint16_t q_bits;
77
78 /**
79 * Inverse of (q + 2) mod 2q
80 */
81 uint16_t q2_inv;
82
83 /**
84 * Ring dimension equal to the number of polynomial coefficients
85 */
86 uint16_t n;
87
88 /**
89 * Number of bits in n
90 */
91 uint16_t n_bits;
92
93 /**
94 * FFT parameters
95 */
96 ntt_fft_params_t *fft_params;
97
98 /**
99 * Number of [-1, +1] secret key coefficients
100 */
101 uint16_t non_zero1;
102
103 /**
104 * Number of [-2, +2] secret key coefficients
105 */
106 uint16_t non_zero2;
107
108 /**
109 * Number of secret key terms that go into Nk(S) norm
110 */
111 uint16_t kappa;
112
113 /**
114 * Maximum Nk(S) tolerable NK(S) norm (BLISS only)
115 */
116 uint32_t nks_max;
117
118 /**
119 * Maximum value Pmax for ||Sc'||^2 norm (BLISS-B only)
120 */
121 uint32_t p_max;
122
123 /**
124 * Standard deviation sigma
125 */
126 uint16_t sigma;
127
128 /**
129 * k_sigma = ceiling[ sqrt(2*ln 2) * sigma ]
130 */
131 uint16_t k_sigma;
132
133 /**
134 * Number of bits in k_sigma
135 */
136 uint16_t k_sigma_bits;
137
138 /**
139 * Coefficients for Bernoulli sampling with exponential biases
140 */
141 uint8_t *c;
142
143 /**
144 * Number of columns in Bernoulli coefficient table
145 */
146 size_t c_cols;
147
148 /**
149 * Number of rows in Bernoulli coefficient table
150 */
151 size_t c_rows;
152
153 /**
154 * Number of bits in z1
155 */
156 uint16_t z1_bits;
157
158 /**
159 * Number of z2 bits to be dropped after rounding
160 */
161 uint16_t d;
162
163 /**
164 * Modulus p = floor(2q / 2^d) applied after bit dropping
165 */
166 uint16_t p;
167
168 /**
169 * M = sigma^2 / alpha_rejection^2
170 */
171 uint32_t M;
172
173 /**
174 * B_infinity bound
175 */
176 uint16_t B_inf;
177
178 /**
179 * B_verify bound
180 */
181 uint32_t B_l2;
182
183 };
184
185 /**
186 * Get BLISS signature parameter set by BLISS parameter set ID
187 *
188 * @param id BLISS parameter set ID
189 * @return BLISS parameter set
190 */
191 bliss_param_set_t* bliss_param_set_get_by_id(bliss_param_set_id_t id);
192
193 /**
194 * Get BLISS signature parameter set by BLISS parameter set OID
195 *
196 * @param oid BLISS parameter set OID
197 * @return BLISS parameter set
198 */
199 bliss_param_set_t* bliss_param_set_get_by_oid(int oid);
200
201 #endif /** BLISS_PARAM_SET_H_ @}*/