Leancrypto 0.12.0
Post-Quantum Cryptographic Library
Loading...
Searching...
No Matches
lc_dilithium.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 - 2024, Stephan Mueller <smueller@chronox.de>
3 *
4 * License: see LICENSE file in root directory
5 *
6 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
7 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
9 * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
10 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
11 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
12 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
13 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
14 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
15 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
16 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
17 * DAMAGE.
18 */
19/*
20 * This code is derived in parts from the code distribution provided with
21 * https://github.com/pq-crystals/dilithium
22 *
23 * That code is released under Public Domain
24 * (https://creativecommons.org/share-your-work/public-domain/cc0/);
25 * or Apache 2.0 License (https://www.apache.org/licenses/LICENSE-2.0.html).
26 */
27
28#ifndef LC_DILITHIUM_H
29#define LC_DILITHIUM_H
30
31#include "ext_headers.h"
32
33#if defined __has_include
34#if __has_include("lc_dilithium_87.h")
35#include "lc_dilithium_87.h"
36#define LC_DILITHIUM_87_ENABLED
37#endif
38#if __has_include("lc_dilithium_65.h")
39#include "lc_dilithium_65.h"
40#define LC_DILITHIUM_65_ENABLED
41#endif
42#if __has_include("lc_dilithium_44.h")
43#include "lc_dilithium_44.h"
44#define LC_DILITHIUM_44_ENABLED
45#endif
46#else
47#error "Compiler misses __has_include"
48#endif
49
50#ifdef __cplusplus
51extern "C" {
52#endif
53
64
101 union {
102#ifdef LC_DILITHIUM_87_ENABLED
103 struct lc_dilithium_87_sk sk_87;
104#endif
105#ifdef LC_DILITHIUM_65_ENABLED
106 struct lc_dilithium_65_sk sk_65;
107#endif
108#ifdef LC_DILITHIUM_44_ENABLED
109 struct lc_dilithium_44_sk sk_44;
110#endif
112};
113
119 union {
120#ifdef LC_DILITHIUM_87_ENABLED
121 struct lc_dilithium_87_pk pk_87;
122#endif
123#ifdef LC_DILITHIUM_65_ENABLED
124 struct lc_dilithium_65_pk pk_65;
125#endif
126#ifdef LC_DILITHIUM_44_ENABLED
127 struct lc_dilithium_44_pk pk_44;
128#endif
130};
131
137 union {
138#ifdef LC_DILITHIUM_87_ENABLED
139 struct lc_dilithium_87_sig sig_87;
140#endif
141#ifdef LC_DILITHIUM_65_ENABLED
142 struct lc_dilithium_65_sig sig_65;
143#endif
144#ifdef LC_DILITHIUM_44_ENABLED
145 struct lc_dilithium_44_sig sig_44;
146#endif
148};
149
158static inline int lc_dilithium_ctx_alloc(struct lc_dilithium_ctx **ctx)
159{
160 if (!ctx)
161 return -EINVAL;
162
163#ifdef LC_DILITHIUM_87_ENABLED
164 return lc_dilithium_87_ctx_alloc(ctx);
165#elif defined(LC_DILITHIUM_65_ENABLED)
166 return lc_dilithium_65_ctx_alloc(ctx);
167#elif defined(LC_DILITHIUM_44_ENABLED)
168 return lc_dilithium_44_ctx_alloc(ctx);
169#else
170 return -EOPNOTSUPP;
171#endif
172}
173
180static inline void lc_dilithium_ctx_zero_free(struct lc_dilithium_ctx *ctx)
181{
182 if (!ctx)
183 return;
184
185#ifdef LC_DILITHIUM_87_ENABLED
187#elif defined(LC_DILITHIUM_65_ENABLED)
189#elif defined(LC_DILITHIUM_44_ENABLED)
191#endif
192}
193
200static inline void lc_dilithium_ctx_zero(struct lc_dilithium_ctx *ctx)
201{
202 if (!ctx)
203 return;
204
205#ifdef LC_DILITHIUM_87_ENABLED
207#elif defined(LC_DILITHIUM_65_ENABLED)
209#elif defined(LC_DILITHIUM_44_ENABLED)
211#endif
212}
213
222static inline enum lc_dilithium_type
224{
225 if (!sk)
227 return sk->dilithium_type;
228}
229
238static inline enum lc_dilithium_type
240{
241 if (!pk)
243 return pk->dilithium_type;
244}
245
254static inline enum lc_dilithium_type
256{
257 if (!sig)
259 return sig->dilithium_type;
260}
261
270LC_PURE
271static inline unsigned int
273{
274 switch (dilithium_type) {
275 case LC_DILITHIUM_87:
276#ifdef LC_DILITHIUM_87_ENABLED
277 return lc_member_size(struct lc_dilithium_sk, key.sk_87);
278#else
279 return 0;
280#endif
281 case LC_DILITHIUM_65:
282#ifdef LC_DILITHIUM_65_ENABLED
283 return lc_member_size(struct lc_dilithium_sk, key.sk_65);
284#else
285 return 0;
286#endif
287 case LC_DILITHIUM_44:
288#ifdef LC_DILITHIUM_44_ENABLED
289 return lc_member_size(struct lc_dilithium_sk, key.sk_44);
290#else
291 return 0;
292#endif
294 default:
295 return 0;
296 }
297}
298
307LC_PURE
308static inline unsigned int
310{
311 switch (dilithium_type) {
312 case LC_DILITHIUM_87:
313#ifdef LC_DILITHIUM_87_ENABLED
314 return lc_member_size(struct lc_dilithium_pk, key.pk_87);
315#else
316 return 0;
317#endif
318 case LC_DILITHIUM_65:
319#ifdef LC_DILITHIUM_65_ENABLED
320 return lc_member_size(struct lc_dilithium_pk, key.pk_65);
321#else
322 return 0;
323#endif
324 case LC_DILITHIUM_44:
325#ifdef LC_DILITHIUM_44_ENABLED
326 return lc_member_size(struct lc_dilithium_pk, key.pk_44);
327#else
328 return 0;
329#endif
331 default:
332 return 0;
333 }
334}
335
344LC_PURE
345static inline unsigned int
347{
348 switch (dilithium_type) {
349 case LC_DILITHIUM_87:
350#ifdef LC_DILITHIUM_87_ENABLED
351 return lc_member_size(struct lc_dilithium_sig, sig.sig_87);
352#else
353 return 0;
354#endif
355 case LC_DILITHIUM_65:
356#ifdef LC_DILITHIUM_65_ENABLED
357 return lc_member_size(struct lc_dilithium_sig, sig.sig_65);
358#else
359 return 0;
360#endif
361 case LC_DILITHIUM_44:
362#ifdef LC_DILITHIUM_44_ENABLED
363 return lc_member_size(struct lc_dilithium_sig, sig.sig_44);
364#else
365 return 0;
366#endif
368 default:
369 return 0;
370 }
371}
372
384static inline int lc_dilithium_sk_load(struct lc_dilithium_sk *sk,
385 const uint8_t *src_key,
386 size_t src_key_len)
387{
388 if (!sk || !src_key || src_key_len == 0) {
389 return -EINVAL;
390#ifdef LC_DILITHIUM_87_ENABLED
391 } else if (src_key_len == lc_dilithium_sk_size(LC_DILITHIUM_87)) {
392 struct lc_dilithium_87_sk *_sk = &sk->key.sk_87;
393
394 memcpy(_sk->sk, src_key, src_key_len);
395 sk->dilithium_type = LC_DILITHIUM_87;
396 return 0;
397#endif
398#ifdef LC_DILITHIUM_65_ENABLED
399 } else if (src_key_len == lc_dilithium_sk_size(LC_DILITHIUM_65)) {
400 struct lc_dilithium_65_sk *_sk = &sk->key.sk_65;
401
402 memcpy(_sk->sk, src_key, src_key_len);
403 sk->dilithium_type = LC_DILITHIUM_65;
404 return 0;
405#endif
406#ifdef LC_DILITHIUM_44_ENABLED
407 } else if (src_key_len == lc_dilithium_sk_size(LC_DILITHIUM_44)) {
408 struct lc_dilithium_44_sk *_sk = &sk->key.sk_44;
409
410 memcpy(_sk->sk, src_key, src_key_len);
411 sk->dilithium_type = LC_DILITHIUM_44;
412 return 0;
413#endif
414 } else {
415 return -EINVAL;
416 }
417}
418
430static inline int lc_dilithium_pk_load(struct lc_dilithium_pk *pk,
431 const uint8_t *src_key,
432 size_t src_key_len)
433{
434 if (!pk || !src_key || src_key_len == 0) {
435 return -EINVAL;
436#ifdef LC_DILITHIUM_87_ENABLED
437 } else if (src_key_len == lc_dilithium_pk_size(LC_DILITHIUM_87)) {
438 struct lc_dilithium_87_pk *_pk = &pk->key.pk_87;
439
440 memcpy(_pk->pk, src_key, src_key_len);
441 pk->dilithium_type = LC_DILITHIUM_87;
442 return 0;
443#endif
444#ifdef LC_DILITHIUM_65_ENABLED
445 } else if (src_key_len == lc_dilithium_pk_size(LC_DILITHIUM_65)) {
446 struct lc_dilithium_65_pk *_pk = &pk->key.pk_65;
447
448 memcpy(_pk->pk, src_key, src_key_len);
449 pk->dilithium_type = LC_DILITHIUM_65;
450 return 0;
451#endif
452#ifdef LC_DILITHIUM_44_ENABLED
453 } else if (src_key_len == lc_dilithium_pk_size(LC_DILITHIUM_44)) {
454 struct lc_dilithium_44_pk *_pk = &pk->key.pk_44;
455
456 memcpy(_pk->pk, src_key, src_key_len);
457 pk->dilithium_type = LC_DILITHIUM_44;
458 return 0;
459#endif
460 } else {
461 return -EINVAL;
462 }
463}
464
476static inline int lc_dilithium_sig_load(struct lc_dilithium_sig *sig,
477 const uint8_t *src_sig,
478 size_t src_sig_len)
479{
480 if (!sig || !src_sig || src_sig_len == 0) {
481 return -EINVAL;
482#ifdef LC_DILITHIUM_87_ENABLED
483 } else if (src_sig_len == lc_dilithium_sig_size(LC_DILITHIUM_87)) {
484 struct lc_dilithium_87_sig *_sig = &sig->sig.sig_87;
485
486 memcpy(_sig->sig, src_sig, src_sig_len);
487 sig->dilithium_type = LC_DILITHIUM_87;
488 return 0;
489#endif
490#ifdef LC_DILITHIUM_65_ENABLED
491 } else if (src_sig_len == lc_dilithium_sig_size(LC_DILITHIUM_65)) {
492 struct lc_dilithium_65_sig *_sig = &sig->sig.sig_65;
493
494 memcpy(_sig->sig, src_sig, src_sig_len);
495 sig->dilithium_type = LC_DILITHIUM_65;
496 return 0;
497#endif
498#ifdef LC_DILITHIUM_44_ENABLED
499 } else if (src_sig_len == lc_dilithium_sig_size(LC_DILITHIUM_44)) {
500 struct lc_dilithium_44_sig *_sig = &sig->sig.sig_44;
501
502 memcpy(_sig->sig, src_sig, src_sig_len);
503 sig->dilithium_type = LC_DILITHIUM_44;
504 return 0;
505#endif
506 } else {
507 return -EINVAL;
508 }
509}
510
524static inline int lc_dilithium_sk_ptr(uint8_t **dilithium_key,
525 size_t *dilithium_key_len,
526 struct lc_dilithium_sk *sk)
527{
528 if (!sk || !dilithium_key || !dilithium_key_len) {
529 return -EINVAL;
530#ifdef LC_DILITHIUM_87_ENABLED
531 } else if (sk->dilithium_type == LC_DILITHIUM_87) {
532 struct lc_dilithium_87_sk *_sk = &sk->key.sk_87;
533
534 *dilithium_key = _sk->sk;
535 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
536 return 0;
537#endif
538#ifdef LC_DILITHIUM_65_ENABLED
539 } else if (sk->dilithium_type == LC_DILITHIUM_65) {
540 struct lc_dilithium_65_sk *_sk = &sk->key.sk_65;
541
542 *dilithium_key = _sk->sk;
543 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
544 return 0;
545#endif
546#ifdef LC_DILITHIUM_44_ENABLED
547 } else if (sk->dilithium_type == LC_DILITHIUM_44) {
548 struct lc_dilithium_44_sk *_sk = &sk->key.sk_44;
549
550 *dilithium_key = _sk->sk;
551 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
552 return 0;
553#endif
554 } else {
555 return -EINVAL;
556 }
557}
558
572static inline int lc_dilithium_pk_ptr(uint8_t **dilithium_key,
573 size_t *dilithium_key_len,
574 struct lc_dilithium_pk *pk)
575{
576 if (!pk || !dilithium_key || !dilithium_key_len) {
577 return -EINVAL;
578#ifdef LC_DILITHIUM_87_ENABLED
579 } else if (pk->dilithium_type == LC_DILITHIUM_87) {
580 struct lc_dilithium_87_pk *_pk = &pk->key.pk_87;
581
582 *dilithium_key = _pk->pk;
583 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
584 return 0;
585#endif
586#ifdef LC_DILITHIUM_65_ENABLED
587 } else if (pk->dilithium_type == LC_DILITHIUM_65) {
588 struct lc_dilithium_65_pk *_pk = &pk->key.pk_65;
589
590 *dilithium_key = _pk->pk;
591 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
592 return 0;
593#endif
594#ifdef LC_DILITHIUM_44_ENABLED
595 } else if (pk->dilithium_type == LC_DILITHIUM_44) {
596 struct lc_dilithium_44_pk *_pk = &pk->key.pk_44;
597
598 *dilithium_key = _pk->pk;
599 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
600 return 0;
601#endif
602 } else {
603 return -EINVAL;
604 }
605}
606
621static inline int lc_dilithium_sig_ptr(uint8_t **dilithium_sig,
622 size_t *dilithium_sig_len,
623 struct lc_dilithium_sig *sig)
624{
625 if (!sig || !dilithium_sig || !dilithium_sig_len) {
626 return -EINVAL;
627#ifdef LC_DILITHIUM_87_ENABLED
628 } else if (sig->dilithium_type == LC_DILITHIUM_87) {
629 struct lc_dilithium_87_sig *_sig = &sig->sig.sig_87;
630
631 *dilithium_sig = _sig->sig;
632 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
633 return 0;
634#endif
635#ifdef LC_DILITHIUM_65_ENABLED
636 } else if (sig->dilithium_type == LC_DILITHIUM_65) {
637 struct lc_dilithium_65_sig *_sig = &sig->sig.sig_65;
638
639 *dilithium_sig = _sig->sig;
640 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
641 return 0;
642#endif
643#ifdef LC_DILITHIUM_44_ENABLED
644 } else if (sig->dilithium_type == LC_DILITHIUM_44) {
645 struct lc_dilithium_44_sig *_sig = &sig->sig.sig_44;
646
647 *dilithium_sig = _sig->sig;
648 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
649 return 0;
650#endif
651 } else {
652 return -EINVAL;
653 }
654}
655
667static inline int lc_dilithium_keypair(struct lc_dilithium_pk *pk,
668 struct lc_dilithium_sk *sk,
669 struct lc_rng_ctx *rng_ctx,
670 enum lc_dilithium_type dilithium_type)
671{
672 if (!pk || !sk)
673 return -EINVAL;
674
675 switch (dilithium_type) {
676 case LC_DILITHIUM_87:
677#ifdef LC_DILITHIUM_87_ENABLED
678 pk->dilithium_type = dilithium_type;
679 sk->dilithium_type = dilithium_type;
680 return lc_dilithium_87_keypair(&pk->key.pk_87, &sk->key.sk_87,
681 rng_ctx);
682#else
683 return -EOPNOTSUPP;
684#endif
685 case LC_DILITHIUM_65:
686#ifdef LC_DILITHIUM_65_ENABLED
687 pk->dilithium_type = dilithium_type;
688 sk->dilithium_type = dilithium_type;
689 return lc_dilithium_65_keypair(&pk->key.pk_65, &sk->key.sk_65,
690 rng_ctx);
691#else
692 return -EOPNOTSUPP;
693#endif
694 case LC_DILITHIUM_44:
695#ifdef LC_DILITHIUM_44_ENABLED
696 pk->dilithium_type = dilithium_type;
697 sk->dilithium_type = dilithium_type;
698 return lc_dilithium_44_keypair(&pk->key.pk_44, &sk->key.sk_44,
699 rng_ctx);
700#else
701 return -EOPNOTSUPP;
702#endif
704 default:
705 return -EOPNOTSUPP;
706 }
707}
708
730static inline int
732 struct lc_dilithium_sk *sk, const uint8_t *seed,
733 size_t seedlen,
734 enum lc_dilithium_type dilithium_type)
735{
736 if (!pk || !sk)
737 return -EINVAL;
738
739 switch (dilithium_type) {
740 case LC_DILITHIUM_87:
741#ifdef LC_DILITHIUM_87_ENABLED
742 pk->dilithium_type = dilithium_type;
743 sk->dilithium_type = dilithium_type;
745 &pk->key.pk_87, &sk->key.sk_87, seed, seedlen);
746#else
747 return -EOPNOTSUPP;
748#endif
749 case LC_DILITHIUM_65:
750#ifdef LC_DILITHIUM_65_ENABLED
751 pk->dilithium_type = dilithium_type;
752 sk->dilithium_type = dilithium_type;
754 &pk->key.pk_65, &sk->key.sk_65, seed, seedlen);
755#else
756 return -EOPNOTSUPP;
757#endif
758 case LC_DILITHIUM_44:
759#ifdef LC_DILITHIUM_44_ENABLED
760 pk->dilithium_type = dilithium_type;
761 sk->dilithium_type = dilithium_type;
763 &pk->key.pk_44, &sk->key.sk_44, seed, seedlen);
764#else
765 return -EOPNOTSUPP;
766#endif
768 default:
769 return -EOPNOTSUPP;
770 }
771}
772
787static inline int lc_dilithium_sign(struct lc_dilithium_sig *sig,
788 const uint8_t *m, size_t mlen,
789 const struct lc_dilithium_sk *sk,
790 struct lc_rng_ctx *rng_ctx)
791{
792 if (!sk || !sig)
793 return -EINVAL;
794
795 switch (sk->dilithium_type) {
796 case LC_DILITHIUM_87:
797#ifdef LC_DILITHIUM_87_ENABLED
798 sig->dilithium_type = LC_DILITHIUM_87;
799 return lc_dilithium_87_sign(&sig->sig.sig_87, m, mlen,
800 &sk->key.sk_87, rng_ctx);
801#else
802 return -EOPNOTSUPP;
803#endif
804 case LC_DILITHIUM_65:
805#ifdef LC_DILITHIUM_65_ENABLED
806 sig->dilithium_type = LC_DILITHIUM_65;
807 return lc_dilithium_65_sign(&sig->sig.sig_65, m, mlen,
808 &sk->key.sk_65, rng_ctx);
809#else
810 return -EOPNOTSUPP;
811#endif
812 case LC_DILITHIUM_44:
813#ifdef LC_DILITHIUM_44_ENABLED
814 sig->dilithium_type = LC_DILITHIUM_44;
815 return lc_dilithium_44_sign(&sig->sig.sig_44, m, mlen,
816 &sk->key.sk_44, rng_ctx);
817#else
818 return -EOPNOTSUPP;
819#endif
821 default:
822 return -EOPNOTSUPP;
823 }
824}
825
846static inline int lc_dilithium_sign_init(struct lc_dilithium_ctx *ctx,
847 const struct lc_dilithium_sk *sk)
848{
849 if (!sk)
850 return -EINVAL;
851
852 switch (sk->dilithium_type) {
853 case LC_DILITHIUM_87:
854#ifdef LC_DILITHIUM_87_ENABLED
855 return lc_dilithium_87_sign_init(ctx, &sk->key.sk_87);
856#else
857 return -EOPNOTSUPP;
858#endif
859 case LC_DILITHIUM_65:
860#ifdef LC_DILITHIUM_65_ENABLED
861 return lc_dilithium_65_sign_init(ctx, &sk->key.sk_65);
862#else
863 return -EOPNOTSUPP;
864#endif
865 case LC_DILITHIUM_44:
866#ifdef LC_DILITHIUM_44_ENABLED
867 return lc_dilithium_44_sign_init(ctx, &sk->key.sk_44);
868#else
869 return -EOPNOTSUPP;
870#endif
872 default:
873 return -EOPNOTSUPP;
874 }
875}
876
892static inline int lc_dilithium_sign_update(struct lc_dilithium_ctx *ctx,
893 const uint8_t *m, size_t mlen)
894{
895#ifdef LC_DILITHIUM_87_ENABLED
896 return lc_dilithium_87_sign_update(ctx, m, mlen);
897#elif defined(LC_DILITHIUM_65_ENABLED)
898 return lc_dilithium_65_sign_update(ctx, m, mlen);
899#elif defined(LC_DILITHIUM_44_ENABLED)
900 return lc_dilithium_44_sign_update(ctx, m, mlen);
901#else
902 return -EOPNOTSUPP;
903#endif
904}
905
922 struct lc_dilithium_ctx *ctx,
923 const struct lc_dilithium_sk *sk,
924 struct lc_rng_ctx *rng_ctx)
925{
926 if (!sk || !sig)
927 return -EINVAL;
928
929 switch (sk->dilithium_type) {
930 case LC_DILITHIUM_87:
931#ifdef LC_DILITHIUM_87_ENABLED
932 sig->dilithium_type = LC_DILITHIUM_87;
933 return lc_dilithium_87_sign_final(&sig->sig.sig_87, ctx,
934 &sk->key.sk_87, rng_ctx);
935#else
936 return -EOPNOTSUPP;
937#endif
938 case LC_DILITHIUM_65:
939#ifdef LC_DILITHIUM_65_ENABLED
940 sig->dilithium_type = LC_DILITHIUM_65;
941 return lc_dilithium_65_sign_final(&sig->sig.sig_65, ctx,
942 &sk->key.sk_65, rng_ctx);
943#else
944 return -EOPNOTSUPP;
945#endif
946 case LC_DILITHIUM_44:
947#ifdef LC_DILITHIUM_44_ENABLED
948 sig->dilithium_type = LC_DILITHIUM_44;
949 return lc_dilithium_44_sign_final(&sig->sig.sig_44, ctx,
950 &sk->key.sk_44, rng_ctx);
951#else
952 return -EOPNOTSUPP;
953#endif
955 default:
956 return -EOPNOTSUPP;
957 }
958}
959
972static inline int lc_dilithium_verify(const struct lc_dilithium_sig *sig,
973 const uint8_t *m, size_t mlen,
974 const struct lc_dilithium_pk *pk)
975{
976 if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
977 return -EINVAL;
978
979 switch (pk->dilithium_type) {
980 case LC_DILITHIUM_87:
981#ifdef LC_DILITHIUM_87_ENABLED
982 return lc_dilithium_87_verify(&sig->sig.sig_87, m, mlen,
983 &pk->key.pk_87);
984#else
985 return -EOPNOTSUPP;
986#endif
987 case LC_DILITHIUM_65:
988#ifdef LC_DILITHIUM_65_ENABLED
989 return lc_dilithium_65_verify(&sig->sig.sig_65, m, mlen,
990 &pk->key.pk_65);
991#else
992 return -EOPNOTSUPP;
993#endif
994 case LC_DILITHIUM_44:
995#ifdef LC_DILITHIUM_44_ENABLED
996 return lc_dilithium_44_verify(&sig->sig.sig_44, m, mlen,
997 &pk->key.pk_44);
998#else
999 return -EOPNOTSUPP;
1000#endif
1002 default:
1003 return -EOPNOTSUPP;
1004 }
1005}
1006
1028static inline int lc_dilithium_verify_init(struct lc_dilithium_ctx *ctx,
1029 const struct lc_dilithium_pk *pk)
1030{
1031 if (!pk)
1032 return -EINVAL;
1033
1034 switch (pk->dilithium_type) {
1035 case LC_DILITHIUM_87:
1036#ifdef LC_DILITHIUM_87_ENABLED
1037 return lc_dilithium_87_verify_init(ctx, &pk->key.pk_87);
1038#else
1039 return -EOPNOTSUPP;
1040#endif
1041 case LC_DILITHIUM_65:
1042#ifdef LC_DILITHIUM_65_ENABLED
1043 return lc_dilithium_65_verify_init(ctx, &pk->key.pk_65);
1044#else
1045 return -EOPNOTSUPP;
1046#endif
1047 case LC_DILITHIUM_44:
1048#ifdef LC_DILITHIUM_44_ENABLED
1049 return lc_dilithium_44_verify_init(ctx, &pk->key.pk_44);
1050#else
1051 return -EOPNOTSUPP;
1052#endif
1054 default:
1055 return -EOPNOTSUPP;
1056 }
1057}
1058
1075static inline int lc_dilithium_verify_update(struct lc_dilithium_ctx *ctx,
1076 const uint8_t *m, size_t mlen)
1077{
1078#ifdef LC_DILITHIUM_87_ENABLED
1079 return lc_dilithium_87_verify_update(ctx, m, mlen);
1080#elif defined(LC_DILITHIUM_65_ENABLED)
1081 return lc_dilithium_65_verify_update(ctx, m, mlen);
1082#elif defined(LC_DILITHIUM_44_ENABLED)
1083 return lc_dilithium_44_verify_update(ctx, m, mlen);
1084#else
1085 return -EOPNOTSUPP;
1086#endif
1087}
1088
1102static inline int lc_dilithium_verify_final(const struct lc_dilithium_sig *sig,
1103 struct lc_dilithium_ctx *ctx,
1104 const struct lc_dilithium_pk *pk)
1105{
1106 if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
1107 return -EINVAL;
1108
1109 switch (pk->dilithium_type) {
1110 case LC_DILITHIUM_87:
1111#ifdef LC_DILITHIUM_87_ENABLED
1112 return lc_dilithium_87_verify_final(&sig->sig.sig_87, ctx,
1113 &pk->key.pk_87);
1114#else
1115 return -EOPNOTSUPP;
1116#endif
1117 case LC_DILITHIUM_65:
1118#ifdef LC_DILITHIUM_65_ENABLED
1119 return lc_dilithium_65_verify_final(&sig->sig.sig_65, ctx,
1120 &pk->key.pk_65);
1121#else
1122 return -EOPNOTSUPP;
1123#endif
1124 case LC_DILITHIUM_44:
1125#ifdef LC_DILITHIUM_44_ENABLED
1126 return lc_dilithium_44_verify_final(&sig->sig.sig_44, ctx,
1127 &pk->key.pk_44);
1128#else
1129 return -EOPNOTSUPP;
1130#endif
1132 default:
1133 return -EOPNOTSUPP;
1134 }
1135}
1136
1137/****************************** Dilithium ED25510 *****************************/
1138
1139#ifdef LC_DILITHIUM_ED25519_SIG
1140
1164 union {
1165#ifdef LC_DILITHIUM_87_ENABLED
1166 struct lc_dilithium_87_ed25519_sk sk_87;
1167#endif
1168#ifdef LC_DILITHIUM_65_ENABLED
1169 struct lc_dilithium_65_ed25519_sk sk_65;
1170#endif
1171#ifdef LC_DILITHIUM_44_ENABLED
1172 struct lc_dilithium_44_ed25519_sk sk_44;
1173#endif
1175};
1176
1182 union {
1183#ifdef LC_DILITHIUM_87_ENABLED
1184 struct lc_dilithium_87_ed25519_pk pk_87;
1185#endif
1186#ifdef LC_DILITHIUM_65_ENABLED
1187 struct lc_dilithium_65_ed25519_pk pk_65;
1188#endif
1189#ifdef LC_DILITHIUM_44_ENABLED
1190 struct lc_dilithium_44_ed25519_pk pk_44;
1191#endif
1193};
1194
1200 union {
1201#ifdef LC_DILITHIUM_87_ENABLED
1202 struct lc_dilithium_87_ed25519_sig sig_87;
1203#endif
1204#ifdef LC_DILITHIUM_65_ENABLED
1205 struct lc_dilithium_65_ed25519_sig sig_65;
1206#endif
1207#ifdef LC_DILITHIUM_44_ENABLED
1208 struct lc_dilithium_44_ed25519_sig sig_44;
1209#endif
1211};
1212
1222 struct lc_dilithium_ed25519_ctx **ctx)
1223{
1224 if (!ctx)
1225 return -EINVAL;
1226
1227#ifdef LC_DILITHIUM_87_ENABLED
1229#elif defined(LC_DILITHIUM_65_ENABLED)
1231#elif defined(LC_DILITHIUM_44_ENABLED)
1233#else
1234 return -EOPNOTSUPP;
1235#endif
1236}
1237
1245 struct lc_dilithium_ed25519_ctx *ctx)
1246{
1247 if (!ctx)
1248 return;
1249
1250#ifdef LC_DILITHIUM_87_ENABLED
1252#elif defined(LC_DILITHIUM_65_ENABLED)
1254#elif defined(LC_DILITHIUM_44_ENABLED)
1256#endif
1257}
1258
1266 struct lc_dilithium_ed25519_ctx *ctx)
1267{
1268 if (!ctx)
1269 return;
1270
1271#ifdef LC_DILITHIUM_87_ENABLED
1273#elif defined(LC_DILITHIUM_65_ENABLED)
1275#elif defined(LC_DILITHIUM_44_ENABLED)
1277#endif
1278}
1279
1288static inline enum lc_dilithium_type
1290{
1291 if (!sk)
1292 return LC_DILITHIUM_UNKNOWN;
1293 return sk->dilithium_type;
1294}
1295
1304static inline enum lc_dilithium_type
1306{
1307 if (!pk)
1308 return LC_DILITHIUM_UNKNOWN;
1309 return pk->dilithium_type;
1310}
1311
1320static inline enum lc_dilithium_type
1322{
1323 if (!sig)
1324 return LC_DILITHIUM_UNKNOWN;
1325 return sig->dilithium_type;
1326}
1327
1336LC_PURE
1337static inline unsigned int
1339{
1340 switch (dilithium_type) {
1341 case LC_DILITHIUM_87:
1342#ifdef LC_DILITHIUM_87_ENABLED
1343 return lc_member_size(struct lc_dilithium_ed25519_sk,
1344 key.sk_87);
1345#else
1346 return 0;
1347#endif
1348 case LC_DILITHIUM_65:
1349#ifdef LC_DILITHIUM_65_ENABLED
1350 return lc_member_size(struct lc_dilithium_ed25519_sk,
1351 key.sk_65);
1352#else
1353 return 0;
1354#endif
1355 case LC_DILITHIUM_44:
1356#ifdef LC_DILITHIUM_44_ENABLED
1357 return lc_member_size(struct lc_dilithium_ed25519_sk,
1358 key.sk_44);
1359#else
1360 return 0;
1361#endif
1363 default:
1364 return 0;
1365 }
1366}
1367
1376LC_PURE
1377static inline unsigned int
1379{
1380 switch (dilithium_type) {
1381 case LC_DILITHIUM_87:
1382#ifdef LC_DILITHIUM_87_ENABLED
1383 return lc_member_size(struct lc_dilithium_ed25519_pk,
1384 key.pk_87);
1385#else
1386 return 0;
1387#endif
1388 case LC_DILITHIUM_65:
1389#ifdef LC_DILITHIUM_65_ENABLED
1390 return lc_member_size(struct lc_dilithium_ed25519_pk,
1391 key.pk_65);
1392#else
1393 return 0;
1394#endif
1395 case LC_DILITHIUM_44:
1396#ifdef LC_DILITHIUM_44_ENABLED
1397 return lc_member_size(struct lc_dilithium_ed25519_pk,
1398 key.pk_44);
1399#else
1400 return 0;
1401#endif
1403 default:
1404 return 0;
1405 }
1406}
1407
1416LC_PURE
1417static inline unsigned int
1419{
1420 switch (dilithium_type) {
1421 case LC_DILITHIUM_87:
1422#ifdef LC_DILITHIUM_87_ENABLED
1423 return lc_member_size(struct lc_dilithium_ed25519_sig,
1424 sig.sig_87);
1425#else
1426 return 0;
1427#endif
1428 case LC_DILITHIUM_65:
1429#ifdef LC_DILITHIUM_65_ENABLED
1430 return lc_member_size(struct lc_dilithium_ed25519_sig,
1431 sig.sig_65);
1432#else
1433 return 0;
1434#endif
1435 case LC_DILITHIUM_44:
1436#ifdef LC_DILITHIUM_44_ENABLED
1437 return lc_member_size(struct lc_dilithium_ed25519_sig,
1438 sig.sig_44);
1439#else
1440 return 0;
1441#endif
1443 default:
1444 return 0;
1445 }
1446}
1447
1465 struct lc_dilithium_ed25519_sk *sk, const uint8_t *dilithium_src_key,
1466 size_t dilithium_src_key_len, const uint8_t *ed25519_src_key,
1467 size_t ed25519_src_key_len)
1468{
1469 if (!sk || !dilithium_src_key || !ed25519_src_key ||
1470 ed25519_src_key_len != LC_ED25519_SECRETKEYBYTES) {
1471 return -EINVAL;
1472#ifdef LC_DILITHIUM_87_ENABLED
1473 } else if (dilithium_src_key_len ==
1475 struct lc_dilithium_87_ed25519_sk *_sk = &sk->key.sk_87;
1476
1477 memcpy(_sk->sk.sk, dilithium_src_key, dilithium_src_key_len);
1478 memcpy(_sk->sk_ed25519.sk, ed25519_src_key,
1479 ed25519_src_key_len);
1480 sk->dilithium_type = LC_DILITHIUM_87;
1481 return 0;
1482#endif
1483#ifdef LC_DILITHIUM_65_ENABLED
1484 } else if (dilithium_src_key_len ==
1486 struct lc_dilithium_65_ed25519_sk *_sk = &sk->key.sk_65;
1487
1488 memcpy(_sk->sk.sk, dilithium_src_key, dilithium_src_key_len);
1489 memcpy(_sk->sk_ed25519.sk, ed25519_src_key,
1490 ed25519_src_key_len);
1491 sk->dilithium_type = LC_DILITHIUM_65;
1492 return 0;
1493#endif
1494#ifdef LC_DILITHIUM_44_ENABLED
1495 } else if (dilithium_src_key_len ==
1497 struct lc_dilithium_44_ed25519_sk *_sk = &sk->key.sk_44;
1498
1499 memcpy(_sk->sk.sk, dilithium_src_key, dilithium_src_key_len);
1500 memcpy(_sk->sk_ed25519.sk, ed25519_src_key,
1501 ed25519_src_key_len);
1502 sk->dilithium_type = LC_DILITHIUM_44;
1503 return 0;
1504#endif
1505 } else {
1506 return -EINVAL;
1507 }
1508}
1509
1527 struct lc_dilithium_ed25519_pk *pk, const uint8_t *dilithium_src_key,
1528 size_t dilithium_src_key_len, const uint8_t *ed25519_src_key,
1529 size_t ed25519_src_key_len)
1530{
1531 if (!pk || !dilithium_src_key || !ed25519_src_key ||
1532 ed25519_src_key_len != LC_ED25519_PUBLICKEYBYTES) {
1533 return -EINVAL;
1534#ifdef LC_DILITHIUM_87_ENABLED
1535 } else if (dilithium_src_key_len ==
1537 struct lc_dilithium_87_ed25519_pk *_pk = &pk->key.pk_87;
1538
1539 memcpy(_pk->pk.pk, dilithium_src_key, dilithium_src_key_len);
1540 memcpy(_pk->pk_ed25519.pk, ed25519_src_key,
1541 ed25519_src_key_len);
1542 pk->dilithium_type = LC_DILITHIUM_87;
1543 return 0;
1544#endif
1545#ifdef LC_DILITHIUM_65_ENABLED
1546 } else if (dilithium_src_key_len ==
1548 struct lc_dilithium_65_ed25519_pk *_pk = &pk->key.pk_65;
1549
1550 memcpy(_pk->pk.pk, dilithium_src_key, dilithium_src_key_len);
1551 memcpy(_pk->pk_ed25519.pk, ed25519_src_key,
1552 ed25519_src_key_len);
1553 pk->dilithium_type = LC_DILITHIUM_65;
1554 return 0;
1555#endif
1556#ifdef LC_DILITHIUM_44_ENABLED
1557 } else if (dilithium_src_key_len ==
1559 struct lc_dilithium_44_ed25519_pk *_pk = &pk->key.pk_44;
1560
1561 memcpy(_pk->pk.pk, dilithium_src_key, dilithium_src_key_len);
1562 memcpy(_pk->pk_ed25519.pk, ed25519_src_key,
1563 ed25519_src_key_len);
1564 pk->dilithium_type = LC_DILITHIUM_44;
1565 return 0;
1566#endif
1567 } else {
1568 return -EINVAL;
1569 }
1570}
1571
1590 struct lc_dilithium_ed25519_sig *sig, const uint8_t *dilithium_src_sig,
1591 size_t dilithium_src_sig_len, const uint8_t *ed25519_src_sig,
1592 size_t ed25519_src_sig_len)
1593{
1594 if (!sig || !dilithium_src_sig || !ed25519_src_sig ||
1595 ed25519_src_sig_len != LC_ED25519_SIGBYTES) {
1596 return -EINVAL;
1597#ifdef LC_DILITHIUM_87_ENABLED
1598 } else if (dilithium_src_sig_len ==
1600 struct lc_dilithium_87_ed25519_sig *_sig = &sig->sig.sig_87;
1601
1602 memcpy(_sig->sig.sig, dilithium_src_sig, dilithium_src_sig_len);
1603 memcpy(_sig->sig_ed25519.sig, ed25519_src_sig,
1604 ed25519_src_sig_len);
1605 sig->dilithium_type = LC_DILITHIUM_87;
1606 return 0;
1607#endif
1608#ifdef LC_DILITHIUM_65_ENABLED
1609 } else if (dilithium_src_sig_len ==
1611 struct lc_dilithium_65_ed25519_sig *_sig = &sig->sig.sig_65;
1612
1613 memcpy(_sig->sig.sig, dilithium_src_sig, dilithium_src_sig_len);
1614 memcpy(_sig->sig_ed25519.sig, ed25519_src_sig,
1615 ed25519_src_sig_len);
1616 sig->dilithium_type = LC_DILITHIUM_65;
1617 return 0;
1618#endif
1619#ifdef LC_DILITHIUM_44_ENABLED
1620 } else if (dilithium_src_sig_len ==
1622 struct lc_dilithium_44_ed25519_sig *_sig = &sig->sig.sig_44;
1623
1624 memcpy(_sig->sig.sig, dilithium_src_sig, dilithium_src_sig_len);
1625 memcpy(_sig->sig_ed25519.sig, ed25519_src_sig,
1626 ed25519_src_sig_len);
1627 sig->dilithium_type = LC_DILITHIUM_44;
1628 return 0;
1629#endif
1630 } else {
1631 return -EINVAL;
1632 }
1633}
1634
1650static inline int
1651lc_dilithium_ed25519_sk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len,
1652 uint8_t **ed25519_key, size_t *ed25519_key_len,
1653 struct lc_dilithium_ed25519_sk *sk)
1654{
1655 if (!sk || !dilithium_key || !dilithium_key_len || !ed25519_key ||
1656 !ed25519_key_len) {
1657 return -EINVAL;
1658#ifdef LC_DILITHIUM_87_ENABLED
1659 } else if (sk->dilithium_type == LC_DILITHIUM_87) {
1660 struct lc_dilithium_87_ed25519_sk *_sk = &sk->key.sk_87;
1661
1662 *dilithium_key = _sk->sk.sk;
1663 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
1664 *ed25519_key = _sk->sk_ed25519.sk;
1665 *ed25519_key_len = LC_ED25519_SECRETKEYBYTES;
1666 return 0;
1667#endif
1668#ifdef LC_DILITHIUM_65_ENABLED
1669 } else if (sk->dilithium_type == LC_DILITHIUM_65) {
1670 struct lc_dilithium_65_ed25519_sk *_sk = &sk->key.sk_65;
1671
1672 *dilithium_key = _sk->sk.sk;
1673 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
1674 *ed25519_key = _sk->sk_ed25519.sk;
1675 *ed25519_key_len = LC_ED25519_SECRETKEYBYTES;
1676 return 0;
1677#endif
1678#ifdef LC_DILITHIUM_44_ENABLED
1679 } else if (sk->dilithium_type == LC_DILITHIUM_44) {
1680 struct lc_dilithium_44_ed25519_sk *_sk = &sk->key.sk_44;
1681
1682 *dilithium_key = _sk->sk.sk;
1683 *dilithium_key_len = lc_dilithium_sk_size(sk->dilithium_type);
1684 *ed25519_key = _sk->sk_ed25519.sk;
1685 *ed25519_key_len = LC_ED25519_SECRETKEYBYTES;
1686 return 0;
1687#endif
1688 } else {
1689 return -EINVAL;
1690 }
1691}
1692
1708static inline int
1709lc_dilithium_ed25519_pk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len,
1710 uint8_t **ed25519_key, size_t *ed25519_key_len,
1711 struct lc_dilithium_ed25519_pk *pk)
1712{
1713 if (!pk || !dilithium_key || !dilithium_key_len || !ed25519_key ||
1714 !ed25519_key_len) {
1715 return -EINVAL;
1716#ifdef LC_DILITHIUM_87_ENABLED
1717 } else if (pk->dilithium_type == LC_DILITHIUM_87) {
1718 struct lc_dilithium_87_ed25519_pk *_pk = &pk->key.pk_87;
1719
1720 *dilithium_key = _pk->pk.pk;
1721 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
1722 *ed25519_key = _pk->pk_ed25519.pk;
1723 *ed25519_key_len = LC_ED25519_PUBLICKEYBYTES;
1724 return 0;
1725#endif
1726#ifdef LC_DILITHIUM_65_ENABLED
1727 } else if (pk->dilithium_type == LC_DILITHIUM_65) {
1728 struct lc_dilithium_65_ed25519_pk *_pk = &pk->key.pk_65;
1729
1730 *dilithium_key = _pk->pk.pk;
1731 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
1732 *ed25519_key = _pk->pk_ed25519.pk;
1733 *ed25519_key_len = LC_ED25519_PUBLICKEYBYTES;
1734 return 0;
1735#endif
1736#ifdef LC_DILITHIUM_44_ENABLED
1737 } else if (pk->dilithium_type == LC_DILITHIUM_44) {
1738 struct lc_dilithium_44_ed25519_pk *_pk = &pk->key.pk_44;
1739
1740 *dilithium_key = _pk->pk.pk;
1741 *dilithium_key_len = lc_dilithium_pk_size(pk->dilithium_type);
1742 *ed25519_key = _pk->pk_ed25519.pk;
1743 *ed25519_key_len = LC_ED25519_PUBLICKEYBYTES;
1744 return 0;
1745#endif
1746 } else {
1747 return -EINVAL;
1748 }
1749}
1750
1767static inline int
1768lc_dilithium_ed25519_sig_ptr(uint8_t **dilithium_sig, size_t *dilithium_sig_len,
1769 uint8_t **ed25519_sig, size_t *ed25519_sig_len,
1770 struct lc_dilithium_ed25519_sig *sig)
1771{
1772 if (!sig || !dilithium_sig || !dilithium_sig_len || !ed25519_sig ||
1773 !ed25519_sig_len) {
1774 return -EINVAL;
1775#ifdef LC_DILITHIUM_87_ENABLED
1776 } else if (sig->dilithium_type == LC_DILITHIUM_87) {
1777 struct lc_dilithium_87_ed25519_sig *_sig = &sig->sig.sig_87;
1778
1779 *dilithium_sig = _sig->sig.sig;
1780 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
1781 *ed25519_sig = _sig->sig_ed25519.sig;
1782 *ed25519_sig_len = LC_ED25519_SIGBYTES;
1783 return 0;
1784#endif
1785#ifdef LC_DILITHIUM_65_ENABLED
1786 } else if (sig->dilithium_type == LC_DILITHIUM_65) {
1787 struct lc_dilithium_65_ed25519_sig *_sig = &sig->sig.sig_65;
1788
1789 *dilithium_sig = _sig->sig.sig;
1790 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
1791 *ed25519_sig = _sig->sig_ed25519.sig;
1792 *ed25519_sig_len = LC_ED25519_SIGBYTES;
1793 return 0;
1794#endif
1795#ifdef LC_DILITHIUM_44_ENABLED
1796 } else if (sig->dilithium_type == LC_DILITHIUM_44) {
1797 struct lc_dilithium_44_ed25519_sig *_sig = &sig->sig.sig_44;
1798
1799 *dilithium_sig = _sig->sig.sig;
1800 *dilithium_sig_len = lc_dilithium_sig_size(sig->dilithium_type);
1801 *ed25519_sig = _sig->sig_ed25519.sig;
1802 *ed25519_sig_len = LC_ED25519_SIGBYTES;
1803 return 0;
1804#endif
1805 } else {
1806 return -EINVAL;
1807 }
1808}
1809
1822 struct lc_dilithium_ed25519_pk *pk, struct lc_dilithium_ed25519_sk *sk,
1823 struct lc_rng_ctx *rng_ctx, enum lc_dilithium_type dilithium_type)
1824{
1825 if (!pk || !sk)
1826 return -EINVAL;
1827
1828 switch (dilithium_type) {
1829 case LC_DILITHIUM_87:
1830#ifdef LC_DILITHIUM_87_ENABLED
1831 pk->dilithium_type = dilithium_type;
1832 sk->dilithium_type = dilithium_type;
1833 return lc_dilithium_87_ed25519_keypair(&pk->key.pk_87,
1834 &sk->key.sk_87, rng_ctx);
1835#else
1836 return -EOPNOTSUPP;
1837#endif
1838 case LC_DILITHIUM_65:
1839#ifdef LC_DILITHIUM_65_ENABLED
1840 pk->dilithium_type = dilithium_type;
1841 sk->dilithium_type = dilithium_type;
1842 return lc_dilithium_65_ed25519_keypair(&pk->key.pk_65,
1843 &sk->key.sk_65, rng_ctx);
1844#else
1845 return -EOPNOTSUPP;
1846#endif
1847 case LC_DILITHIUM_44:
1848#ifdef LC_DILITHIUM_44_ENABLED
1849 pk->dilithium_type = dilithium_type;
1850 sk->dilithium_type = dilithium_type;
1851 return lc_dilithium_44_ed25519_keypair(&pk->key.pk_44,
1852 &sk->key.sk_44, rng_ctx);
1853#else
1854 return -EOPNOTSUPP;
1855#endif
1857 default:
1858 return -EOPNOTSUPP;
1859 }
1860}
1861
1877 struct lc_dilithium_ed25519_sig *sig, const uint8_t *m, size_t mlen,
1878 const struct lc_dilithium_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
1879{
1880 if (!sk || !sig)
1881 return -EINVAL;
1882
1883 switch (sk->dilithium_type) {
1884 case LC_DILITHIUM_87:
1885#ifdef LC_DILITHIUM_87_ENABLED
1886 sig->dilithium_type = LC_DILITHIUM_87;
1887 return lc_dilithium_87_ed25519_sign(&sig->sig.sig_87, m, mlen,
1888 &sk->key.sk_87, rng_ctx);
1889#else
1890 return -EOPNOTSUPP;
1891#endif
1892 case LC_DILITHIUM_65:
1893#ifdef LC_DILITHIUM_65_ENABLED
1894 sig->dilithium_type = LC_DILITHIUM_65;
1895 return lc_dilithium_65_ed25519_sign(&sig->sig.sig_65, m, mlen,
1896 &sk->key.sk_65, rng_ctx);
1897#else
1898 return -EOPNOTSUPP;
1899#endif
1900 case LC_DILITHIUM_44:
1901#ifdef LC_DILITHIUM_44_ENABLED
1902 sig->dilithium_type = LC_DILITHIUM_44;
1903 return lc_dilithium_44_ed25519_sign(&sig->sig.sig_44, m, mlen,
1904 &sk->key.sk_44, rng_ctx);
1905#else
1906 return -EOPNOTSUPP;
1907#endif
1909 default:
1910 return -EOPNOTSUPP;
1911 }
1912}
1913
1924 struct lc_dilithium_ed25519_ctx *ctx,
1925 const struct lc_dilithium_ed25519_sk *sk)
1926{
1927 if (!ctx || !sk)
1928 return -EINVAL;
1929
1930 switch (sk->dilithium_type) {
1931 case LC_DILITHIUM_87:
1932#ifdef LC_DILITHIUM_87_ENABLED
1933 return lc_dilithium_87_ed25519_sign_init(ctx, &sk->key.sk_87);
1934#else
1935 return -EOPNOTSUPP;
1936#endif
1937 case LC_DILITHIUM_65:
1938#ifdef LC_DILITHIUM_65_ENABLED
1939 return lc_dilithium_65_ed25519_sign_init(ctx, &sk->key.sk_65);
1940#else
1941 return -EOPNOTSUPP;
1942#endif
1943 case LC_DILITHIUM_44:
1944#ifdef LC_DILITHIUM_44_ENABLED
1945 return lc_dilithium_44_ed25519_sign_init(ctx, &sk->key.sk_44);
1946#else
1947 return -EOPNOTSUPP;
1948#endif
1950 default:
1951 return -EOPNOTSUPP;
1952 }
1953}
1954
1966 struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
1967{
1968 if (!ctx)
1969 return -EINVAL;
1970
1971#ifdef LC_DILITHIUM_87_ENABLED
1972 return lc_dilithium_87_ed25519_sign_update(ctx, m, mlen);
1973#elif defined(LC_DILITHIUM_65_ENABLED)
1974 return lc_dilithium_65_ed25519_sign_update(ctx, m, mlen);
1975#elif defined(LC_DILITHIUM_44_ENABLED)
1976 return lc_dilithium_44_ed25519_sign_update(ctx, m, mlen);
1977#else
1978 return -EOPNOTSUPP;
1979#endif
1980}
1981
1997 struct lc_dilithium_ed25519_ctx *ctx,
1998 const struct lc_dilithium_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
1999{
2000 if (!sk || !sig || !ctx)
2001 return -EINVAL;
2002
2003 switch (sk->dilithium_type) {
2004 case LC_DILITHIUM_87:
2005#ifdef LC_DILITHIUM_87_ENABLED
2006 sig->dilithium_type = LC_DILITHIUM_87;
2007 return lc_dilithium_87_ed25519_sign_final(&sig->sig.sig_87, ctx,
2008 &sk->key.sk_87,
2009 rng_ctx);
2010#else
2011 return -EOPNOTSUPP;
2012#endif
2013 case LC_DILITHIUM_65:
2014#ifdef LC_DILITHIUM_65_ENABLED
2015 sig->dilithium_type = LC_DILITHIUM_65;
2016 return lc_dilithium_65_ed25519_sign_final(&sig->sig.sig_65, ctx,
2017 &sk->key.sk_65,
2018 rng_ctx);
2019#else
2020 return -EOPNOTSUPP;
2021#endif
2022 case LC_DILITHIUM_44:
2023#ifdef LC_DILITHIUM_44_ENABLED
2024 sig->dilithium_type = LC_DILITHIUM_44;
2025 return lc_dilithium_44_ed25519_sign_final(&sig->sig.sig_44, ctx,
2026 &sk->key.sk_44,
2027 rng_ctx);
2028#else
2029 return -EOPNOTSUPP;
2030#endif
2032 default:
2033 return -EOPNOTSUPP;
2034 }
2035}
2036
2049static inline int
2051 const uint8_t *m, size_t mlen,
2052 const struct lc_dilithium_ed25519_pk *pk)
2053{
2054 if (!pk || !sig || sig->dilithium_type != pk->dilithium_type)
2055 return -EINVAL;
2056
2057 switch (pk->dilithium_type) {
2058 case LC_DILITHIUM_87:
2059#ifdef LC_DILITHIUM_87_ENABLED
2060 return lc_dilithium_87_ed25519_verify(&sig->sig.sig_87, m, mlen,
2061 &pk->key.pk_87);
2062#else
2063 return -EOPNOTSUPP;
2064#endif
2065 case LC_DILITHIUM_65:
2066#ifdef LC_DILITHIUM_65_ENABLED
2067 return lc_dilithium_65_ed25519_verify(&sig->sig.sig_65, m, mlen,
2068 &pk->key.pk_65);
2069#else
2070 return -EOPNOTSUPP;
2071#endif
2072 case LC_DILITHIUM_44:
2073#ifdef LC_DILITHIUM_44_ENABLED
2074 return lc_dilithium_44_ed25519_verify(&sig->sig.sig_44, m, mlen,
2075 &pk->key.pk_44);
2076#else
2077 return -EOPNOTSUPP;
2078#endif
2080 default:
2081 return -EOPNOTSUPP;
2082 }
2083}
2084
2095 struct lc_dilithium_ed25519_ctx *ctx,
2096 const struct lc_dilithium_ed25519_pk *pk)
2097{
2098 if (!pk || !ctx)
2099 return -EINVAL;
2100
2101 switch (pk->dilithium_type) {
2102 case LC_DILITHIUM_87:
2103#ifdef LC_DILITHIUM_87_ENABLED
2104 return lc_dilithium_87_ed25519_verify_init(ctx, &pk->key.pk_87);
2105#else
2106 return -EOPNOTSUPP;
2107#endif
2108 case LC_DILITHIUM_65:
2109#ifdef LC_DILITHIUM_65_ENABLED
2110 return lc_dilithium_65_ed25519_verify_init(ctx, &pk->key.pk_65);
2111#else
2112 return -EOPNOTSUPP;
2113#endif
2114 case LC_DILITHIUM_44:
2115#ifdef LC_DILITHIUM_44_ENABLED
2116 return lc_dilithium_44_ed25519_verify_init(ctx, &pk->key.pk_44);
2117#else
2118 return -EOPNOTSUPP;
2119#endif
2121 default:
2122 return -EOPNOTSUPP;
2123 }
2124}
2125
2137 struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
2138{
2139 if (!ctx)
2140 return -EINVAL;
2141
2142#ifdef LC_DILITHIUM_87_ENABLED
2143 return lc_dilithium_87_ed25519_verify_update(ctx, m, mlen);
2144#elif defined(LC_DILITHIUM_65_ENABLED)
2145 return lc_dilithium_65_ed25519_verify_update(ctx, m, mlen);
2146#elif defined(LC_DILITHIUM_44_ENABLED)
2147 return lc_dilithium_44_ed25519_verify_update(ctx, m, mlen);
2148#else
2149 return -EOPNOTSUPP;
2150#endif
2151}
2152
2165 const struct lc_dilithium_ed25519_sig *sig,
2166 struct lc_dilithium_ed25519_ctx *ctx,
2167 const struct lc_dilithium_ed25519_pk *pk)
2168{
2169 if (!ctx || !pk || !sig || sig->dilithium_type != pk->dilithium_type)
2170 return -EINVAL;
2171
2172 switch (pk->dilithium_type) {
2173 case LC_DILITHIUM_87:
2174#ifdef LC_DILITHIUM_87_ENABLED
2176 ctx,
2177 &pk->key.pk_87);
2178#else
2179 return -EOPNOTSUPP;
2180#endif
2181 case LC_DILITHIUM_65:
2182#ifdef LC_DILITHIUM_65_ENABLED
2184 ctx,
2185 &pk->key.pk_65);
2186#else
2187 return -EOPNOTSUPP;
2188#endif
2189 case LC_DILITHIUM_44:
2190#ifdef LC_DILITHIUM_44_ENABLED
2192 ctx,
2193 &pk->key.pk_44);
2194#else
2195 return -EOPNOTSUPP;
2196#endif
2198 default:
2199 return -EOPNOTSUPP;
2200 }
2201}
2202
2203#endif /* LC_DILITHIUM_ED25519_SIG */
2204
2205#ifdef __cplusplus
2206}
2207#endif
2208
2209#endif /* LC_DILITHIUM_H */
static int lc_dilithium_sk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len, struct lc_dilithium_sk *sk)
Obtain the reference to the Dilithium key and its length.
static int lc_dilithium_sign_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_sk *sk)
Initializes a signature operation.
static LC_PURE unsigned int lc_dilithium_pk_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium public key.
static LC_PURE unsigned int lc_dilithium_sk_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium secret key.
static LC_PURE unsigned int lc_dilithium_sig_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium signature.
static int lc_dilithium_pk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len, struct lc_dilithium_pk *pk)
Obtain the reference to the Dilithium key and its length.
static int lc_dilithium_verify_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_pk *pk)
Initializes a signature verification operation.
static int lc_dilithium_sign_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
static enum lc_dilithium_type lc_dilithium_sig_type(const struct lc_dilithium_sig *sig)
Obtain Dilithium type from signature.
static int lc_dilithium_pk_load(struct lc_dilithium_pk *pk, const uint8_t *src_key, size_t src_key_len)
Load a Dilithium public key provided with a buffer into the leancrypto data structure.
static void lc_dilithium_ctx_zero(struct lc_dilithium_ctx *ctx)
Zeroizes Dilithium context either on heap or on stack.
static int lc_dilithium_verify_final(const struct lc_dilithium_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_pk *pk)
Verifies signature.
static int lc_dilithium_ctx_alloc(struct lc_dilithium_ctx **ctx)
Allocates Dilithium context on heap.
static enum lc_dilithium_type lc_dilithium_pk_type(const struct lc_dilithium_pk *pk)
Obtain Dilithium type from public key.
static int lc_dilithium_verify(const struct lc_dilithium_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_pk *pk)
Verifies signature in one shot.
static int lc_dilithium_keypair(struct lc_dilithium_pk *pk, struct lc_dilithium_sk *sk, struct lc_rng_ctx *rng_ctx, enum lc_dilithium_type dilithium_type)
Generates Dilithium public and private key.
static int lc_dilithium_sk_load(struct lc_dilithium_sk *sk, const uint8_t *src_key, size_t src_key_len)
Load a Dilithium secret key provided with a buffer into the leancrypto data structure.
static int lc_dilithium_verify_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
static void lc_dilithium_ctx_zero_free(struct lc_dilithium_ctx *ctx)
Zeroizes and frees Dilithium context on heap.
static enum lc_dilithium_type lc_dilithium_sk_type(const struct lc_dilithium_sk *sk)
Obtain Dilithium type from secret key.
static int lc_dilithium_keypair_from_seed(struct lc_dilithium_pk *pk, struct lc_dilithium_sk *sk, const uint8_t *seed, size_t seedlen, enum lc_dilithium_type dilithium_type)
Generates Dilithium public and private key from a given seed.
static int lc_dilithium_sign_final(struct lc_dilithium_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature.
static int lc_dilithium_sig_ptr(uint8_t **dilithium_sig, size_t *dilithium_sig_len, struct lc_dilithium_sig *sig)
Obtain the reference to the Dilithium signature and its length.
static int lc_dilithium_sign(struct lc_dilithium_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
static int lc_dilithium_sig_load(struct lc_dilithium_sig *sig, const uint8_t *src_sig, size_t src_sig_len)
Load a Dilithium signature provided with a buffer into the leancrypto data structure.
static int lc_dilithium_ed25519_sk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len, uint8_t **ed25519_key, size_t *ed25519_key_len, struct lc_dilithium_ed25519_sk *sk)
Obtain the reference to the Dilithium key and its length.
static int lc_dilithium_ed25519_sign_final(struct lc_dilithium_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in stream mode.
static LC_PURE unsigned int lc_dilithium_ed25519_sk_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium secret key.
static int lc_dilithium_ed25519_ctx_alloc(struct lc_dilithium_ed25519_ctx **ctx)
Allocates Dilithium-ED25519 context on heap.
static LC_PURE unsigned int lc_dilithium_ed25519_pk_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium public key.
static int lc_dilithium_ed25519_sig_ptr(uint8_t **dilithium_sig, size_t *dilithium_sig_len, uint8_t **ed25519_sig, size_t *ed25519_sig_len, struct lc_dilithium_ed25519_sig *sig)
Obtain the reference to the Dilithium signature and its length.
static int lc_dilithium_ed25519_pk_load(struct lc_dilithium_ed25519_pk *pk, const uint8_t *dilithium_src_key, size_t dilithium_src_key_len, const uint8_t *ed25519_src_key, size_t ed25519_src_key_len)
Load a Dilithium public key provided with a buffer into the leancrypto data structure.
static enum lc_dilithium_type lc_dilithium_ed25519_sig_type(const struct lc_dilithium_ed25519_sig *sig)
Obtain Dilithium type from signature.
static int lc_dilithium_ed25519_keypair(struct lc_dilithium_ed25519_pk *pk, struct lc_dilithium_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx, enum lc_dilithium_type dilithium_type)
Generates Dilithium public and private key.
static int lc_dilithium_ed25519_pk_ptr(uint8_t **dilithium_key, size_t *dilithium_key_len, uint8_t **ed25519_key, size_t *ed25519_key_len, struct lc_dilithium_ed25519_pk *pk)
Obtain the reference to the Dilithium key and its length.
static LC_PURE unsigned int lc_dilithium_ed25519_sig_size(enum lc_dilithium_type dilithium_type)
Return the size of the Dilithium signature.
static int lc_dilithium_ed25519_verify(const struct lc_dilithium_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_ed25519_pk *pk)
Verifies signature in one shot.
static int lc_dilithium_ed25519_sig_load(struct lc_dilithium_ed25519_sig *sig, const uint8_t *dilithium_src_sig, size_t dilithium_src_sig_len, const uint8_t *ed25519_src_sig, size_t ed25519_src_sig_len)
Load a Dilithium signature provided with a buffer into the leancrypto data structure.
static enum lc_dilithium_type lc_dilithium_ed25519_sk_type(const struct lc_dilithium_ed25519_sk *sk)
Obtain Dilithium type from secret key.
static int lc_dilithium_ed25519_sign_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_ed25519_sk *sk)
Initializes signature operation in stream mode.
static void lc_dilithium_ed25519_ctx_zero(struct lc_dilithium_ed25519_ctx *ctx)
Zeroizes Dilithium-ED25519 context either on heap or on stack.
static void lc_dilithium_ed25519_ctx_zero_free(struct lc_dilithium_ed25519_ctx *ctx)
Zeroizes and frees Dilithium-ED25519 context on heap.
static int lc_dilithium_ed25519_sign(struct lc_dilithium_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
static int lc_dilithium_ed25519_verify_final(const struct lc_dilithium_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_ed25519_pk *pk)
Verifies signature in stream mode.
static enum lc_dilithium_type lc_dilithium_ed25519_pk_type(const struct lc_dilithium_ed25519_pk *pk)
Obtain Dilithium type from public key.
static int lc_dilithium_ed25519_sign_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
Updates signature in stream mode.
static int lc_dilithium_ed25519_verify_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
Updates signature verification in stream mode.
static int lc_dilithium_ed25519_sk_load(struct lc_dilithium_ed25519_sk *sk, const uint8_t *dilithium_src_key, size_t dilithium_src_key_len, const uint8_t *ed25519_src_key, size_t ed25519_src_key_len)
Load a Dilithium secret key provided with a buffer into the leancrypto data structure.
static int lc_dilithium_ed25519_verify_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_ed25519_pk *pk)
Initializes signature verification operation in stream mode.
lc_dilithium_type
@ LC_DILITHIUM_65
@ LC_DILITHIUM_UNKNOWN
@ LC_DILITHIUM_44
@ LC_DILITHIUM_87
enum lc_dilithium_type dilithium_type
union lc_dilithium_sig::@10 sig
union lc_dilithium_ed25519_pk::@12 key
enum lc_dilithium_type dilithium_type
enum lc_dilithium_type dilithium_type
enum lc_dilithium_type dilithium_type
enum lc_dilithium_type dilithium_type
union lc_dilithium_ed25519_sk::@11 key
union lc_dilithium_pk::@9 key
enum lc_dilithium_type dilithium_type
union lc_dilithium_sk::@8 key
union lc_dilithium_ed25519_sig::@13 sig
Dilithium public key.
Dilithium signature.
Dilithium secret key.
Dilithium public key.
Dilithium signature.
Dilithium secret key.
struct lc_ed25519_pk pk_ed25519
int lc_dilithium_44_ed25519_sign_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
int lc_dilithium_44_verify(const struct lc_dilithium_44_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_44_pk *pk)
Verifies signature in one shot.
struct lc_dilithium_44_sig sig
void lc_dilithium_44_ed25519_ctx_zero_free(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize and free Dilithium-ED25519 stream context.
int lc_dilithium_44_keypair_from_seed(struct lc_dilithium_44_pk *pk, struct lc_dilithium_44_sk *sk, const uint8_t *seed, size_t seedlen)
Generates Dilithium public and private key from a given seed.
int lc_dilithium_44_keypair(struct lc_dilithium_44_pk *pk, struct lc_dilithium_44_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
int lc_dilithium_44_ed25519_sign_final(struct lc_dilithium_44_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_44_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
int lc_dilithium_44_ctx_alloc(struct lc_dilithium_ctx **ctx)
Allocate Dilithium stream context on heap.
int lc_dilithium_44_sign_final(struct lc_dilithium_44_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_44_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature.
int lc_dilithium_44_sign(struct lc_dilithium_44_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_44_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
struct lc_ed25519_sk sk_ed25519
int lc_dilithium_44_ed25519_verify_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_44_ed25519_pk *pk)
int lc_dilithium_44_ed25519_verify_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
int lc_dilithium_44_verify_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
static void lc_dilithium_44_ed25519_ctx_zero(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize Dilithium-ED25519 context allocated with LC_DILITHIUM_ED25519_CTX_ON_STACK lc_dilithium_ed255...
int lc_dilithium_44_ed25519_sign_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_44_ed25519_sk *sk)
int lc_dilithium_44_sign_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
uint8_t sk[LC_DILITHIUM_SECRETKEYBYTES]
int lc_dilithium_44_ed25519_ctx_alloc(struct lc_dilithium_ed25519_ctx **ctx)
Allocate Dilithium-ED25519 stream context on heap.
struct lc_dilithium_44_pk pk
uint8_t sig[LC_DILITHIUM_CRYPTO_BYTES]
int lc_dilithium_44_ed25519_verify(const struct lc_dilithium_44_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_44_ed25519_pk *pk)
Verifies signature in one shot.
struct lc_dilithium_44_sk sk
int lc_dilithium_44_ed25519_sign(struct lc_dilithium_44_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_44_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
int lc_dilithium_44_verify_final(const struct lc_dilithium_44_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_44_pk *pk)
Verifies signature.
int lc_dilithium_44_verify_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_44_pk *pk)
Initializes a signature verification operation.
int lc_dilithium_44_ed25519_keypair(struct lc_dilithium_44_ed25519_pk *pk, struct lc_dilithium_44_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
static void lc_dilithium_44_ctx_zero(struct lc_dilithium_ctx *ctx)
Zeroize Dilithium context allocated with LC_DILITHIUM_CTX_ON_STACK lc_dilithium_ed25519_alloc.
int lc_dilithium_44_sign_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_44_sk *sk)
Initializes a signature operation.
void lc_dilithium_44_ctx_zero_free(struct lc_dilithium_ctx *ctx)
Zeroize and free Dilithium stream context.
struct lc_ed25519_sig sig_ed25519
int lc_dilithium_44_ed25519_verify_final(const struct lc_dilithium_44_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_44_ed25519_pk *pk)
uint8_t pk[LC_DILITHIUM_PUBLICKEYBYTES]
Dilithium public key.
Dilithium secret key.
Dilithium public key.
Dilithium signature.
Dilithium secret key.
int lc_dilithium_65_ed25519_sign_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_65_ed25519_sk *sk)
int lc_dilithium_65_sign_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_65_sk *sk)
Initializes a signature operation.
int lc_dilithium_65_ed25519_sign_final(struct lc_dilithium_65_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_65_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
int lc_dilithium_65_sign_final(struct lc_dilithium_65_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_65_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature.
int lc_dilithium_65_sign(struct lc_dilithium_65_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_65_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
uint8_t sig[LC_DILITHIUM_CRYPTO_BYTES]
struct lc_ed25519_sk sk_ed25519
int lc_dilithium_65_ed25519_ctx_alloc(struct lc_dilithium_ed25519_ctx **ctx)
Allocate Dilithium-ED25519 stream context on heap.
int lc_dilithium_65_verify(const struct lc_dilithium_65_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_65_pk *pk)
Verifies signature in one shot.
struct lc_dilithium_65_sig sig
struct lc_ed25519_sig sig_ed25519
int lc_dilithium_65_verify_final(const struct lc_dilithium_65_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_65_pk *pk)
Verifies signature.
uint8_t sk[LC_DILITHIUM_SECRETKEYBYTES]
struct lc_ed25519_pk pk_ed25519
struct lc_dilithium_65_pk pk
uint8_t pk[LC_DILITHIUM_PUBLICKEYBYTES]
int lc_dilithium_65_ctx_alloc(struct lc_dilithium_ctx **ctx)
Allocate Dilithium stream context on heap.
int lc_dilithium_65_ed25519_verify_final(const struct lc_dilithium_65_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_65_ed25519_pk *pk)
int lc_dilithium_65_ed25519_sign(struct lc_dilithium_65_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_65_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
static void lc_dilithium_65_ctx_zero(struct lc_dilithium_ctx *ctx)
Zeroize Dilithium context allocated with LC_DILITHIUM_CTX_ON_STACK lc_dilithium_ed25519_alloc.
int lc_dilithium_65_ed25519_keypair(struct lc_dilithium_65_ed25519_pk *pk, struct lc_dilithium_65_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
int lc_dilithium_65_ed25519_verify(const struct lc_dilithium_65_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_65_ed25519_pk *pk)
Verifies signature in one shot.
struct lc_dilithium_65_sk sk
int lc_dilithium_65_ed25519_sign_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
void lc_dilithium_65_ctx_zero_free(struct lc_dilithium_ctx *ctx)
Zeroize and free Dilithium stream context.
int lc_dilithium_65_keypair(struct lc_dilithium_65_pk *pk, struct lc_dilithium_65_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
int lc_dilithium_65_sign_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
void lc_dilithium_65_ed25519_ctx_zero_free(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize and free Dilithium-ED25519 stream context.
int lc_dilithium_65_verify_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
int lc_dilithium_65_ed25519_verify_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
int lc_dilithium_65_ed25519_verify_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_65_ed25519_pk *pk)
int lc_dilithium_65_keypair_from_seed(struct lc_dilithium_65_pk *pk, struct lc_dilithium_65_sk *sk, const uint8_t *seed, size_t seedlen)
Generates Dilithium public and private key from a given seed.
int lc_dilithium_65_verify_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_65_pk *pk)
Initializes a signature verification operation.
static void lc_dilithium_65_ed25519_ctx_zero(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize Dilithium-ED25519 context allocated with LC_DILITHIUM_ED25519_CTX_ON_STACK lc_dilithium_ed255...
Dilithium public key.
Dilithium secret key.
Dilithium public key.
Dilithium signature.
Dilithium secret key.
void lc_dilithium_87_ctx_zero_free(struct lc_dilithium_ctx *ctx)
Zeroize and free Dilithium stream context.
int lc_dilithium_87_verify(const struct lc_dilithium_87_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_87_pk *pk)
Verifies signature in one shot.
int lc_dilithium_87_ctx_alloc(struct lc_dilithium_ctx **ctx)
Allocate Dilithium stream context on heap.
int lc_dilithium_87_ed25519_sign(struct lc_dilithium_87_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_87_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
int lc_dilithium_87_keypair(struct lc_dilithium_87_pk *pk, struct lc_dilithium_87_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
void lc_dilithium_87_ed25519_ctx_zero_free(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize and free Dilithium-ED25519 stream context.
struct lc_dilithium_87_pk pk
int lc_dilithium_87_ed25519_sign_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
struct lc_ed25519_sig sig_ed25519
int lc_dilithium_87_sign_final(struct lc_dilithium_87_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_87_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature.
static void lc_dilithium_87_ctx_zero(struct lc_dilithium_ctx *ctx)
Zeroize Dilithium context allocated with LC_DILITHIUM_CTX_ON_STACK lc_dilithium_ed25519_alloc.
static void lc_dilithium_87_ed25519_ctx_zero(struct lc_dilithium_ed25519_ctx *ctx)
Zeroize Dilithium-ED25519 context allocated with LC_DILITHIUM_ED25519_CTX_ON_STACK lc_dilithium_ed255...
int lc_dilithium_87_sign_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_87_sk *sk)
Initializes a signature operation.
int lc_dilithium_87_ed25519_sign_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_87_ed25519_sk *sk)
int lc_dilithium_87_ed25519_verify(const struct lc_dilithium_87_ed25519_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_87_ed25519_pk *pk)
Verifies signature in one shot.
struct lc_ed25519_pk pk_ed25519
int lc_dilithium_87_verify_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
struct lc_dilithium_87_sk sk
int lc_dilithium_87_sign_update(struct lc_dilithium_ctx *ctx, const uint8_t *m, size_t mlen)
Add more data to an already initialized signature state.
int lc_dilithium_87_ed25519_verify_init(struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_87_ed25519_pk *pk)
int lc_dilithium_87_keypair_from_seed(struct lc_dilithium_87_pk *pk, struct lc_dilithium_87_sk *sk, const uint8_t *seed, size_t seedlen)
Generates Dilithium public and private key from a given seed.
uint8_t sig[LC_DILITHIUM_CRYPTO_BYTES]
struct lc_ed25519_sk sk_ed25519
int lc_dilithium_87_ed25519_verify_final(const struct lc_dilithium_87_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_87_ed25519_pk *pk)
int lc_dilithium_87_ed25519_keypair(struct lc_dilithium_87_ed25519_pk *pk, struct lc_dilithium_87_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
Generates Dilithium public and private key.
int lc_dilithium_87_sign(struct lc_dilithium_87_sig *sig, const uint8_t *m, size_t mlen, const struct lc_dilithium_87_sk *sk, struct lc_rng_ctx *rng_ctx)
Computes signature in one shot.
int lc_dilithium_87_ed25519_sign_final(struct lc_dilithium_87_ed25519_sig *sig, struct lc_dilithium_ed25519_ctx *ctx, const struct lc_dilithium_87_ed25519_sk *sk, struct lc_rng_ctx *rng_ctx)
struct lc_dilithium_87_sig sig
int lc_dilithium_87_ed25519_ctx_alloc(struct lc_dilithium_ed25519_ctx **ctx)
Allocate Dilithium-ED25519 stream context on heap.
int lc_dilithium_87_verify_init(struct lc_dilithium_ctx *ctx, const struct lc_dilithium_87_pk *pk)
Initializes a signature verification operation.
uint8_t pk[LC_DILITHIUM_PUBLICKEYBYTES]
int lc_dilithium_87_verify_final(const struct lc_dilithium_87_sig *sig, struct lc_dilithium_ctx *ctx, const struct lc_dilithium_87_pk *pk)
Verifies signature.
uint8_t sk[LC_DILITHIUM_SECRETKEYBYTES]
int lc_dilithium_87_ed25519_verify_update(struct lc_dilithium_ed25519_ctx *ctx, const uint8_t *m, size_t mlen)
Dilithium public key.
Dilithium secret key.
Dilithium public key.
Dilithium signature.
Dilithium secret key.
Dilithium stream context.
Dilithium stream context.