1 // SPDX-License-Identifier: MIT
2
3 #include <oqs/sig.h>
4
5 #if defined(OQS_SIG_alg_picnic_L1_UR) || defined(OQS_SIG_alg_picnic_L1_FS) || defined(OQS_SIG_alg_picnic_L1_full) || defined(OQS_SIG_alg_picnic_L3_UR) || defined(OQS_SIG_alg_picnic_L3_FS) || defined(OQS_SIG_alg_picnic_L3_full) || defined(OQS_SIG_alg_picnic_L5_UR) || defined(OQS_SIG_alg_picnic_L5_FS) || defined(OQS_SIG_alg_picnic_L5_full) || defined(OQS_SIG_alg_picnic3_L1) || defined(OQS_SIG_alg_picnic3_L3) || defined(OQS_SIG_alg_picnic3_L5)
6
7 #include <string.h>
8 #include <oqs/common.h>
9 #include "sig_picnic.h"
10 #include "oqs_picnic_macros.h"
11 #include "external/picnic.h"
12
13 static size_t PRIV_KEY_LEN[] = {
14 0,
15 PICNIC_PRIVATE_KEY_SIZE(Picnic_L1_FS),
16 PICNIC_PRIVATE_KEY_SIZE(Picnic_L1_UR),
17 PICNIC_PRIVATE_KEY_SIZE(Picnic_L3_FS),
18 PICNIC_PRIVATE_KEY_SIZE(Picnic_L3_UR),
19 PICNIC_PRIVATE_KEY_SIZE(Picnic_L5_FS),
20 PICNIC_PRIVATE_KEY_SIZE(Picnic_L5_UR),
21 PICNIC_PRIVATE_KEY_SIZE(Picnic3_L1),
22 PICNIC_PRIVATE_KEY_SIZE(Picnic3_L3),
23 PICNIC_PRIVATE_KEY_SIZE(Picnic3_L5),
24 PICNIC_PRIVATE_KEY_SIZE(Picnic_L1_full),
25 PICNIC_PRIVATE_KEY_SIZE(Picnic_L3_full),
26 PICNIC_PRIVATE_KEY_SIZE(Picnic_L5_full),
27 };
28 static size_t PUB_KEY_LEN[] = {
29 0,
30 PICNIC_PUBLIC_KEY_SIZE(Picnic_L1_FS),
31 PICNIC_PUBLIC_KEY_SIZE(Picnic_L1_UR),
32 PICNIC_PUBLIC_KEY_SIZE(Picnic_L3_FS),
33 PICNIC_PUBLIC_KEY_SIZE(Picnic_L3_UR),
34 PICNIC_PUBLIC_KEY_SIZE(Picnic_L5_FS),
35 PICNIC_PUBLIC_KEY_SIZE(Picnic_L5_UR),
36 PICNIC_PUBLIC_KEY_SIZE(Picnic3_L1),
37 PICNIC_PUBLIC_KEY_SIZE(Picnic3_L3),
38 PICNIC_PUBLIC_KEY_SIZE(Picnic3_L5),
39 PICNIC_PUBLIC_KEY_SIZE(Picnic_L1_full),
40 PICNIC_PUBLIC_KEY_SIZE(Picnic_L3_full),
41 PICNIC_PUBLIC_KEY_SIZE(Picnic_L5_full),
42 };
43 static size_t SIG_LEN[] = {
44 0,
45 PICNIC_SIGNATURE_SIZE(Picnic_L1_FS),
46 PICNIC_SIGNATURE_SIZE(Picnic_L1_UR),
47 PICNIC_SIGNATURE_SIZE(Picnic_L3_FS),
48 PICNIC_SIGNATURE_SIZE(Picnic_L3_UR),
49 PICNIC_SIGNATURE_SIZE(Picnic_L5_FS),
50 PICNIC_SIGNATURE_SIZE(Picnic_L5_UR),
51 PICNIC_SIGNATURE_SIZE(Picnic3_L1),
52 PICNIC_SIGNATURE_SIZE(Picnic3_L3),
53 PICNIC_SIGNATURE_SIZE(Picnic3_L5),
54 PICNIC_SIGNATURE_SIZE(Picnic_L1_full),
55 PICNIC_SIGNATURE_SIZE(Picnic_L3_full),
56 PICNIC_SIGNATURE_SIZE(Picnic_L5_full),
57 };
58
common_picnic_keypair(picnic_params_t parameters,uint8_t * priv,uint8_t * pub)59 static OQS_STATUS common_picnic_keypair(picnic_params_t parameters, uint8_t *priv, uint8_t *pub) {
60 if (priv == NULL || pub == NULL) {
61 return OQS_ERROR;
62 }
63 picnic_publickey_t pk;
64 picnic_privatekey_t sk;
65 int ret = picnic_keygen(parameters, &pk, &sk);
66 if (ret != 0) { // DO NOT modify this return code to OQS_SUCCESS/OQS_ERROR
67 return OQS_ERROR;
68 }
69 // serialize the public key
70 int pk_len = picnic_write_public_key(&pk, pub, PUB_KEY_LEN[parameters]);
71 if ((size_t) pk_len != PUB_KEY_LEN[parameters]) {
72 return OQS_ERROR;
73 }
74
75 // serialize the private key
76 int sk_len = picnic_write_private_key(&sk, priv, PRIV_KEY_LEN[parameters]);
77 if ((size_t) sk_len != PRIV_KEY_LEN[parameters]) {
78 return OQS_ERROR;
79 }
80 // wipe the private key
81 OQS_MEM_cleanse(&sk, sizeof(picnic_privatekey_t));
82 return OQS_SUCCESS;
83 }
84
common_picnic_sign(picnic_params_t parameters,const uint8_t * priv,const uint8_t * msg,const size_t msg_len,uint8_t * sig,size_t * sig_len)85 static OQS_STATUS common_picnic_sign(picnic_params_t parameters, const uint8_t *priv, const uint8_t *msg, const size_t msg_len, uint8_t *sig, size_t *sig_len) {
86 if (priv == NULL || msg == NULL || sig == NULL || sig_len == NULL) {
87 return OQS_ERROR;
88 }
89 picnic_privatekey_t sk;
90 // picnic3's signature code checks that the sig_len value is large enough, but the OQS
91 // API treats this as an output parameters, so we set it here
92 *sig_len = SIG_LEN[parameters];
93 // deserialize the private key
94 if (picnic_read_private_key(&sk, priv, PRIV_KEY_LEN[parameters]) != 0) {
95 return OQS_ERROR;
96 }
97 if (picnic_sign(&sk, msg, msg_len, sig, sig_len) != 0) {
98 return OQS_ERROR;
99 }
100 return OQS_SUCCESS;
101 }
102
common_picnic_verify(picnic_params_t parameters,const uint8_t * pub,const uint8_t * msg,const size_t msg_len,const uint8_t * sig,const size_t sig_len)103 static OQS_STATUS common_picnic_verify(picnic_params_t parameters, const uint8_t *pub, const uint8_t *msg, const size_t msg_len, const uint8_t *sig, const size_t sig_len) {
104 if (pub == NULL || msg == NULL || sig == NULL) {
105 return OQS_ERROR;
106 }
107 picnic_publickey_t pk;
108 // deserialize the public key
109 if (picnic_read_public_key(&pk, pub, PUB_KEY_LEN[parameters]) != 0) {
110 return OQS_ERROR;
111 }
112 if (picnic_verify(&pk, msg, msg_len, sig, sig_len) != 0) {
113 return OQS_ERROR;
114 }
115 return OQS_SUCCESS;
116 }
117 #endif
118
119 #ifdef OQS_ENABLE_SIG_picnic_L1_FS
120
OQS_SIG_picnic_L1_FS_new()121 OQS_SIG *OQS_SIG_picnic_L1_FS_new() {
122
123 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
124 if (sig == NULL) {
125 return NULL;
126 }
127 sig->method_name = OQS_SIG_alg_picnic_L1_FS;
128 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
129
130 sig->claimed_nist_level = 1;
131 sig->euf_cma = true;
132
133 sig->length_public_key = OQS_SIG_picnic_L1_FS_length_public_key;
134 sig->length_secret_key = OQS_SIG_picnic_L1_FS_length_secret_key;
135 sig->length_signature = OQS_SIG_picnic_L1_FS_length_signature;
136
137 sig->keypair = OQS_SIG_picnic_L1_FS_keypair;
138 sig->sign = OQS_SIG_picnic_L1_FS_sign;
139 sig->verify = OQS_SIG_picnic_L1_FS_verify;
140
141 return sig;
142 }
143
OQS_SIG_picnic_L1_FS_keypair(uint8_t * public_key,uint8_t * secret_key)144 OQS_API OQS_STATUS OQS_SIG_picnic_L1_FS_keypair(uint8_t *public_key, uint8_t *secret_key) {
145 return common_picnic_keypair(Picnic_L1_FS, secret_key, public_key);
146 }
147
OQS_SIG_picnic_L1_FS_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)148 OQS_API OQS_STATUS OQS_SIG_picnic_L1_FS_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
149 return common_picnic_sign(Picnic_L1_FS, secret_key, message, message_len, signature, signature_len);
150 }
151
OQS_SIG_picnic_L1_FS_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)152 OQS_API OQS_STATUS OQS_SIG_picnic_L1_FS_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
153 return common_picnic_verify(Picnic_L1_FS, public_key, message, message_len, signature, signature_len);
154 }
155
156 #endif
157
158 #ifdef OQS_ENABLE_SIG_picnic_L1_UR
159
OQS_SIG_picnic_L1_UR_new()160 OQS_SIG *OQS_SIG_picnic_L1_UR_new() {
161
162 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
163 if (sig == NULL) {
164 return NULL;
165 }
166 sig->method_name = OQS_SIG_alg_picnic_L1_UR;
167 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
168
169 sig->claimed_nist_level = 1;
170 sig->euf_cma = true;
171
172 sig->length_public_key = OQS_SIG_picnic_L1_UR_length_public_key;
173 sig->length_secret_key = OQS_SIG_picnic_L1_UR_length_secret_key;
174 sig->length_signature = OQS_SIG_picnic_L1_UR_length_signature;
175
176 sig->keypair = OQS_SIG_picnic_L1_UR_keypair;
177 sig->sign = OQS_SIG_picnic_L1_UR_sign;
178 sig->verify = OQS_SIG_picnic_L1_UR_verify;
179
180 return sig;
181 }
182
OQS_SIG_picnic_L1_UR_keypair(uint8_t * public_key,uint8_t * secret_key)183 OQS_API OQS_STATUS OQS_SIG_picnic_L1_UR_keypair(uint8_t *public_key, uint8_t *secret_key) {
184 return common_picnic_keypair(Picnic_L1_UR, secret_key, public_key);
185 }
186
OQS_SIG_picnic_L1_UR_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)187 OQS_API OQS_STATUS OQS_SIG_picnic_L1_UR_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
188 return common_picnic_sign(Picnic_L1_UR, secret_key, message, message_len, signature, signature_len);
189 }
190
OQS_SIG_picnic_L1_UR_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)191 OQS_API OQS_STATUS OQS_SIG_picnic_L1_UR_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
192 return common_picnic_verify(Picnic_L1_UR, public_key, message, message_len, signature, signature_len);
193 }
194
195 #endif
196
197 #ifdef OQS_ENABLE_SIG_picnic_L1_full
198
OQS_SIG_picnic_L1_full_new()199 OQS_SIG *OQS_SIG_picnic_L1_full_new() {
200
201 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
202 if (sig == NULL) {
203 return NULL;
204 }
205 sig->method_name = OQS_SIG_alg_picnic_L1_full;
206 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
207
208 sig->claimed_nist_level = 1;
209 sig->euf_cma = true;
210
211 sig->length_public_key = OQS_SIG_picnic_L1_full_length_public_key;
212 sig->length_secret_key = OQS_SIG_picnic_L1_full_length_secret_key;
213 sig->length_signature = OQS_SIG_picnic_L1_full_length_signature;
214
215 sig->keypair = OQS_SIG_picnic_L1_full_keypair;
216 sig->sign = OQS_SIG_picnic_L1_full_sign;
217 sig->verify = OQS_SIG_picnic_L1_full_verify;
218
219 return sig;
220 }
221
OQS_SIG_picnic_L1_full_keypair(uint8_t * public_key,uint8_t * secret_key)222 OQS_API OQS_STATUS OQS_SIG_picnic_L1_full_keypair(uint8_t *public_key, uint8_t *secret_key) {
223 return common_picnic_keypair(Picnic_L1_full, secret_key, public_key);
224 }
225
OQS_SIG_picnic_L1_full_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)226 OQS_API OQS_STATUS OQS_SIG_picnic_L1_full_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
227 return common_picnic_sign(Picnic_L1_full, secret_key, message, message_len, signature, signature_len);
228 }
229
OQS_SIG_picnic_L1_full_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)230 OQS_API OQS_STATUS OQS_SIG_picnic_L1_full_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
231 return common_picnic_verify(Picnic_L1_full, public_key, message, message_len, signature, signature_len);
232 }
233
234 #endif
235
236 #ifdef OQS_ENABLE_SIG_picnic_L3_FS
237
OQS_SIG_picnic_L3_FS_new()238 OQS_SIG *OQS_SIG_picnic_L3_FS_new() {
239
240 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
241 if (sig == NULL) {
242 return NULL;
243 }
244 sig->method_name = OQS_SIG_alg_picnic_L3_FS;
245 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
246
247 sig->claimed_nist_level = 3;
248 sig->euf_cma = true;
249
250 sig->length_public_key = OQS_SIG_picnic_L3_FS_length_public_key;
251 sig->length_secret_key = OQS_SIG_picnic_L3_FS_length_secret_key;
252 sig->length_signature = OQS_SIG_picnic_L3_FS_length_signature;
253
254 sig->keypair = OQS_SIG_picnic_L3_FS_keypair;
255 sig->sign = OQS_SIG_picnic_L3_FS_sign;
256 sig->verify = OQS_SIG_picnic_L3_FS_verify;
257
258 return sig;
259 }
260
OQS_SIG_picnic_L3_FS_keypair(uint8_t * public_key,uint8_t * secret_key)261 OQS_API OQS_STATUS OQS_SIG_picnic_L3_FS_keypair(uint8_t *public_key, uint8_t *secret_key) {
262 return common_picnic_keypair(Picnic_L3_FS, secret_key, public_key);
263 }
264
OQS_SIG_picnic_L3_FS_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)265 OQS_API OQS_STATUS OQS_SIG_picnic_L3_FS_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
266 return common_picnic_sign(Picnic_L3_FS, secret_key, message, message_len, signature, signature_len);
267 }
268
OQS_SIG_picnic_L3_FS_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)269 OQS_API OQS_STATUS OQS_SIG_picnic_L3_FS_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
270 return common_picnic_verify(Picnic_L3_FS, public_key, message, message_len, signature, signature_len);
271 }
272
273 #endif
274
275 #ifdef OQS_ENABLE_SIG_picnic_L3_UR
276
OQS_SIG_picnic_L3_UR_new()277 OQS_SIG *OQS_SIG_picnic_L3_UR_new() {
278
279 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
280 if (sig == NULL) {
281 return NULL;
282 }
283 sig->method_name = OQS_SIG_alg_picnic_L3_UR;
284 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
285
286 sig->claimed_nist_level = 3;
287 sig->euf_cma = true;
288
289 sig->length_public_key = OQS_SIG_picnic_L3_UR_length_public_key;
290 sig->length_secret_key = OQS_SIG_picnic_L3_UR_length_secret_key;
291 sig->length_signature = OQS_SIG_picnic_L3_UR_length_signature;
292
293 sig->keypair = OQS_SIG_picnic_L3_UR_keypair;
294 sig->sign = OQS_SIG_picnic_L3_UR_sign;
295 sig->verify = OQS_SIG_picnic_L3_UR_verify;
296
297 return sig;
298 }
299
OQS_SIG_picnic_L3_UR_keypair(uint8_t * public_key,uint8_t * secret_key)300 OQS_API OQS_STATUS OQS_SIG_picnic_L3_UR_keypair(uint8_t *public_key, uint8_t *secret_key) {
301 return common_picnic_keypair(Picnic_L3_UR, secret_key, public_key);
302 }
303
OQS_SIG_picnic_L3_UR_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)304 OQS_API OQS_STATUS OQS_SIG_picnic_L3_UR_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
305 return common_picnic_sign(Picnic_L3_UR, secret_key, message, message_len, signature, signature_len);
306 }
307
OQS_SIG_picnic_L3_UR_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)308 OQS_API OQS_STATUS OQS_SIG_picnic_L3_UR_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
309 return common_picnic_verify(Picnic_L3_UR, public_key, message, message_len, signature, signature_len);
310 }
311
312 #endif
313
314 #ifdef OQS_ENABLE_SIG_picnic_L3_full
315
OQS_SIG_picnic_L3_full_new()316 OQS_SIG *OQS_SIG_picnic_L3_full_new() {
317
318 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
319 if (sig == NULL) {
320 return NULL;
321 }
322 sig->method_name = OQS_SIG_alg_picnic_L3_full;
323 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
324
325 sig->claimed_nist_level = 3;
326 sig->euf_cma = true;
327
328 sig->length_public_key = OQS_SIG_picnic_L3_full_length_public_key;
329 sig->length_secret_key = OQS_SIG_picnic_L3_full_length_secret_key;
330 sig->length_signature = OQS_SIG_picnic_L3_full_length_signature;
331
332 sig->keypair = OQS_SIG_picnic_L3_full_keypair;
333 sig->sign = OQS_SIG_picnic_L3_full_sign;
334 sig->verify = OQS_SIG_picnic_L3_full_verify;
335
336 return sig;
337 }
338
OQS_SIG_picnic_L3_full_keypair(uint8_t * public_key,uint8_t * secret_key)339 OQS_API OQS_STATUS OQS_SIG_picnic_L3_full_keypair(uint8_t *public_key, uint8_t *secret_key) {
340 return common_picnic_keypair(Picnic_L3_full, secret_key, public_key);
341 }
342
OQS_SIG_picnic_L3_full_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)343 OQS_API OQS_STATUS OQS_SIG_picnic_L3_full_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
344 return common_picnic_sign(Picnic_L3_full, secret_key, message, message_len, signature, signature_len);
345 }
346
OQS_SIG_picnic_L3_full_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)347 OQS_API OQS_STATUS OQS_SIG_picnic_L3_full_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
348 return common_picnic_verify(Picnic_L3_full, public_key, message, message_len, signature, signature_len);
349 }
350
351 #endif
352
353 #ifdef OQS_ENABLE_SIG_picnic_L5_FS
354
OQS_SIG_picnic_L5_FS_new()355 OQS_SIG *OQS_SIG_picnic_L5_FS_new() {
356
357 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
358 if (sig == NULL) {
359 return NULL;
360 }
361 sig->method_name = OQS_SIG_alg_picnic_L5_FS;
362 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
363
364 sig->claimed_nist_level = 5;
365 sig->euf_cma = true;
366
367 sig->length_public_key = OQS_SIG_picnic_L5_FS_length_public_key;
368 sig->length_secret_key = OQS_SIG_picnic_L5_FS_length_secret_key;
369 sig->length_signature = OQS_SIG_picnic_L5_FS_length_signature;
370
371 sig->keypair = OQS_SIG_picnic_L5_FS_keypair;
372 sig->sign = OQS_SIG_picnic_L5_FS_sign;
373 sig->verify = OQS_SIG_picnic_L5_FS_verify;
374
375 return sig;
376 }
377
OQS_SIG_picnic_L5_FS_keypair(uint8_t * public_key,uint8_t * secret_key)378 OQS_API OQS_STATUS OQS_SIG_picnic_L5_FS_keypair(uint8_t *public_key, uint8_t *secret_key) {
379 return common_picnic_keypair(Picnic_L5_FS, secret_key, public_key);
380 }
381
OQS_SIG_picnic_L5_FS_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)382 OQS_API OQS_STATUS OQS_SIG_picnic_L5_FS_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
383 return common_picnic_sign(Picnic_L5_FS, secret_key, message, message_len, signature, signature_len);
384 }
385
OQS_SIG_picnic_L5_FS_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)386 OQS_API OQS_STATUS OQS_SIG_picnic_L5_FS_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
387 return common_picnic_verify(Picnic_L5_FS, public_key, message, message_len, signature, signature_len);
388 }
389
390 #endif
391
392 #ifdef OQS_ENABLE_SIG_picnic_L5_UR
393
OQS_SIG_picnic_L5_UR_new()394 OQS_SIG *OQS_SIG_picnic_L5_UR_new() {
395
396 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
397 if (sig == NULL) {
398 return NULL;
399 }
400
401 sig->method_name = OQS_SIG_alg_picnic_L5_UR;
402 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
403
404 sig->claimed_nist_level = 5;
405 sig->euf_cma = true;
406
407 sig->length_public_key = OQS_SIG_picnic_L5_UR_length_public_key;
408 sig->length_secret_key = OQS_SIG_picnic_L5_UR_length_secret_key;
409 sig->length_signature = OQS_SIG_picnic_L5_UR_length_signature;
410
411 sig->keypair = OQS_SIG_picnic_L5_UR_keypair;
412 sig->sign = OQS_SIG_picnic_L5_UR_sign;
413 sig->verify = OQS_SIG_picnic_L5_UR_verify;
414
415 return sig;
416 }
417
OQS_SIG_picnic_L5_UR_keypair(uint8_t * public_key,uint8_t * secret_key)418 OQS_API OQS_STATUS OQS_SIG_picnic_L5_UR_keypair(uint8_t *public_key, uint8_t *secret_key) {
419 return common_picnic_keypair(Picnic_L5_UR, secret_key, public_key);
420 }
421
OQS_SIG_picnic_L5_UR_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)422 OQS_API OQS_STATUS OQS_SIG_picnic_L5_UR_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
423 return common_picnic_sign(Picnic_L5_UR, secret_key, message, message_len, signature, signature_len);
424 }
425
OQS_SIG_picnic_L5_UR_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)426 OQS_API OQS_STATUS OQS_SIG_picnic_L5_UR_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
427 return common_picnic_verify(Picnic_L5_UR, public_key, message, message_len, signature, signature_len);
428 }
429
430 #endif
431
432 #ifdef OQS_ENABLE_SIG_picnic_L5_full
433
OQS_SIG_picnic_L5_full_new()434 OQS_SIG *OQS_SIG_picnic_L5_full_new() {
435
436 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
437 if (sig == NULL) {
438 return NULL;
439 }
440 sig->method_name = OQS_SIG_alg_picnic_L5_full;
441 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
442
443 sig->claimed_nist_level = 5;
444 sig->euf_cma = true;
445
446 sig->length_public_key = OQS_SIG_picnic_L5_full_length_public_key;
447 sig->length_secret_key = OQS_SIG_picnic_L5_full_length_secret_key;
448 sig->length_signature = OQS_SIG_picnic_L5_full_length_signature;
449
450 sig->keypair = OQS_SIG_picnic_L5_full_keypair;
451 sig->sign = OQS_SIG_picnic_L5_full_sign;
452 sig->verify = OQS_SIG_picnic_L5_full_verify;
453
454 return sig;
455 }
456
OQS_SIG_picnic_L5_full_keypair(uint8_t * public_key,uint8_t * secret_key)457 OQS_API OQS_STATUS OQS_SIG_picnic_L5_full_keypair(uint8_t *public_key, uint8_t *secret_key) {
458 return common_picnic_keypair(Picnic_L5_full, secret_key, public_key);
459 }
460
OQS_SIG_picnic_L5_full_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)461 OQS_API OQS_STATUS OQS_SIG_picnic_L5_full_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
462 return common_picnic_sign(Picnic_L5_full, secret_key, message, message_len, signature, signature_len);
463 }
464
OQS_SIG_picnic_L5_full_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)465 OQS_API OQS_STATUS OQS_SIG_picnic_L5_full_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
466 return common_picnic_verify(Picnic_L5_full, public_key, message, message_len, signature, signature_len);
467 }
468
469 #endif
470
471 #ifdef OQS_ENABLE_SIG_picnic3_L1
OQS_SIG_picnic3_L1_new()472 OQS_SIG *OQS_SIG_picnic3_L1_new() {
473 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
474 if (sig == NULL) {
475 return NULL;
476 }
477 sig->method_name = OQS_SIG_alg_picnic3_L1;
478 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
479
480 sig->claimed_nist_level = 1;
481 sig->euf_cma = true;
482
483 sig->length_public_key = OQS_SIG_picnic3_L1_length_public_key;
484 sig->length_secret_key = OQS_SIG_picnic3_L1_length_secret_key;
485 sig->length_signature = OQS_SIG_picnic3_L1_length_signature;
486
487 sig->keypair = OQS_SIG_picnic3_L1_keypair;
488 sig->sign = OQS_SIG_picnic3_L1_sign;
489 sig->verify = OQS_SIG_picnic3_L1_verify;
490
491 return sig;
492 }
493
OQS_SIG_picnic3_L1_keypair(uint8_t * public_key,uint8_t * secret_key)494 OQS_API OQS_STATUS OQS_SIG_picnic3_L1_keypair(uint8_t *public_key, uint8_t *secret_key) {
495 return common_picnic_keypair(Picnic3_L1, secret_key, public_key);
496 }
497
OQS_SIG_picnic3_L1_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)498 OQS_API OQS_STATUS OQS_SIG_picnic3_L1_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
499 return common_picnic_sign(Picnic3_L1, secret_key, message, message_len, signature, signature_len);
500 }
501
OQS_SIG_picnic3_L1_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)502 OQS_API OQS_STATUS OQS_SIG_picnic3_L1_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
503 return common_picnic_verify(Picnic3_L1, public_key, message, message_len, signature, signature_len);
504 }
505
506 #endif
507
508 #ifdef OQS_ENABLE_SIG_picnic3_L3
509
OQS_SIG_picnic3_L3_new()510 OQS_SIG *OQS_SIG_picnic3_L3_new() {
511 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
512 if (sig == NULL) {
513 return NULL;
514 }
515 sig->method_name = OQS_SIG_alg_picnic3_L3;
516 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
517
518 sig->claimed_nist_level = 3;
519 sig->euf_cma = true;
520
521 sig->length_public_key = OQS_SIG_picnic3_L3_length_public_key;
522 sig->length_secret_key = OQS_SIG_picnic3_L3_length_secret_key;
523 sig->length_signature = OQS_SIG_picnic3_L3_length_signature;
524
525 sig->keypair = OQS_SIG_picnic3_L3_keypair;
526 sig->sign = OQS_SIG_picnic3_L3_sign;
527 sig->verify = OQS_SIG_picnic3_L3_verify;
528
529 return sig;
530 }
531
OQS_SIG_picnic3_L3_keypair(uint8_t * public_key,uint8_t * secret_key)532 OQS_API OQS_STATUS OQS_SIG_picnic3_L3_keypair(uint8_t *public_key, uint8_t *secret_key) {
533 return common_picnic_keypair(Picnic3_L3, secret_key, public_key);
534 }
535
OQS_SIG_picnic3_L3_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)536 OQS_API OQS_STATUS OQS_SIG_picnic3_L3_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
537 return common_picnic_sign(Picnic3_L3, secret_key, message, message_len, signature, signature_len);
538 }
539
OQS_SIG_picnic3_L3_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)540 OQS_API OQS_STATUS OQS_SIG_picnic3_L3_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
541 return common_picnic_verify(Picnic3_L3, public_key, message, message_len, signature, signature_len);
542 }
543
544 #endif
545
546 #ifdef OQS_ENABLE_SIG_picnic3_L5
547
OQS_SIG_picnic3_L5_new()548 OQS_SIG *OQS_SIG_picnic3_L5_new() {
549 OQS_SIG *sig = malloc(sizeof(OQS_SIG));
550 if (sig == NULL) {
551 return NULL;
552 }
553 sig->method_name = OQS_SIG_alg_picnic3_L5;
554 sig->alg_version = "https://github.com/IAIK/Picnic/tree/v3.0.4";
555
556 sig->claimed_nist_level = 5;
557 sig->euf_cma = true;
558
559 sig->length_public_key = OQS_SIG_picnic3_L5_length_public_key;
560 sig->length_secret_key = OQS_SIG_picnic3_L5_length_secret_key;
561 sig->length_signature = OQS_SIG_picnic3_L5_length_signature;
562
563 sig->keypair = OQS_SIG_picnic3_L5_keypair;
564 sig->sign = OQS_SIG_picnic3_L5_sign;
565 sig->verify = OQS_SIG_picnic3_L5_verify;
566
567 return sig;
568 }
569
OQS_SIG_picnic3_L5_keypair(uint8_t * public_key,uint8_t * secret_key)570 OQS_API OQS_STATUS OQS_SIG_picnic3_L5_keypair(uint8_t *public_key, uint8_t *secret_key) {
571 return common_picnic_keypair(Picnic3_L5, secret_key, public_key);
572 }
573
OQS_SIG_picnic3_L5_sign(uint8_t * signature,size_t * signature_len,const uint8_t * message,size_t message_len,const uint8_t * secret_key)574 OQS_API OQS_STATUS OQS_SIG_picnic3_L5_sign(uint8_t *signature, size_t *signature_len, const uint8_t *message, size_t message_len, const uint8_t *secret_key) {
575 return common_picnic_sign(Picnic3_L5, secret_key, message, message_len, signature, signature_len);
576 }
577
OQS_SIG_picnic3_L5_verify(const uint8_t * message,size_t message_len,const uint8_t * signature,size_t signature_len,const uint8_t * public_key)578 OQS_API OQS_STATUS OQS_SIG_picnic3_L5_verify(const uint8_t *message, size_t message_len, const uint8_t *signature, size_t signature_len, const uint8_t *public_key) {
579 return common_picnic_verify(Picnic3_L5, public_key, message, message_len, signature, signature_len);
580 }
581
582 #endif
583