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