Skip to content

Commit 1fef94d

Browse files
committed
CVPN-1554 Add patch to use WolfSSL Kyber and ML-KEM
We would use a patch to use WolfSSL's implementation of both Kyber and ML-KEM so that we can remove liboqs while maintaining support for Kyber at the moment. This patch uses commits and code changes from the following PR in WolfSSL: - wolfSSL/wolfssl#8143 - wolfSSL/wolfssl#8172 - wolfSSL/wolfssl#8183 - wolfSSL/wolfssl#8185
1 parent 1c3fa12 commit 1fef94d

File tree

5 files changed

+3562
-1
lines changed

5 files changed

+3562
-1
lines changed

wolfssl-sys/build.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ fn copy_wolfssl(dest: &Path) -> std::io::Result<PathBuf> {
4343
}
4444

4545
const PATCH_DIR: &str = "patches";
46-
const PATCHES: &[&str] = &["disable-falcon-dilithium.patch"];
46+
const PATCHES: &[&str] = &[
47+
"disable-falcon-dilithium.patch",
48+
"make-kyber-mlkem-available.patch",
49+
"fix-kyber-mlkem-benchmark.patch",
50+
"fix-mlkem-get-curve-name.patch",
51+
"fix-kyber-get-curve-name.patch",
52+
];
4753

4854
/**
4955
* Apply patch to wolfssl-src
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
From a8f88e38e24f7f3f0b5d2a552a59954594b79c08 Mon Sep 17 00:00:00 2001
2+
From: David Garske <[email protected]>
3+
Date: Thu, 14 Nov 2024 17:57:24 -0800
4+
Subject: [PATCH 4/4] Merge pull request #8185 from SparkiDev/kyber_fixes_4
5+
6+
Kyber: Fix wolfSSL_get_curve_name()
7+
---
8+
src/ssl.c | 6 +++---
9+
1 file changed, 3 insertions(+), 3 deletions(-)
10+
11+
diff --git a/src/ssl.c b/src/ssl.c
12+
index edcd5d9df1..559c977c61 100644
13+
--- a/src/ssl.c
14+
+++ b/src/ssl.c
15+
@@ -14602,19 +14602,19 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
16+
case WOLFSSL_P521_KYBER_LEVEL5:
17+
return "P521_KYBER_LEVEL5";
18+
#elif defined(WOLFSSL_WC_KYBER)
19+
- #ifdef WOLFSSL_KYBER512
20+
+ #ifndef WOLFSSL_NO_KYBER512
21+
case WOLFSSL_KYBER_LEVEL1:
22+
return "KYBER_LEVEL1";
23+
case WOLFSSL_P256_KYBER_LEVEL1:
24+
return "P256_KYBER_LEVEL1";
25+
#endif
26+
- #ifdef WOLFSSL_KYBER768
27+
+ #ifndef WOLFSSL_NO_KYBER768
28+
case WOLFSSL_KYBER_LEVEL3:
29+
return "KYBER_LEVEL3";
30+
case WOLFSSL_P384_KYBER_LEVEL3:
31+
return "P384_KYBER_LEVEL3";
32+
#endif
33+
- #ifdef WOLFSSL_KYBER1024
34+
+ #ifndef WOLFSSL_NO_KYBER1024
35+
case WOLFSSL_KYBER_LEVEL5:
36+
return "KYBER_LEVEL5";
37+
case WOLFSSL_P521_KYBER_LEVEL5:
38+
--
39+
2.43.0
40+
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
From 4d81279e8982840d47e1719a5a5ba827c930b5a2 Mon Sep 17 00:00:00 2001
2+
From: Daniel Pouzzner <[email protected]>
3+
Date: Mon, 11 Nov 2024 23:00:51 -0600
4+
Subject: [PATCH 2/4] Merge pull request #8172 from SparkiDev/kyber_bench_fix
5+
6+
Kyber benchmark: allow ML-KEM and Kyber
7+
---
8+
wolfcrypt/benchmark/benchmark.c | 41 +++++++++++++++++++++++++++++++++
9+
1 file changed, 41 insertions(+)
10+
11+
diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c
12+
index a242ad9f2b..2a8a511643 100644
13+
--- a/wolfcrypt/benchmark/benchmark.c
14+
+++ b/wolfcrypt/benchmark/benchmark.c
15+
@@ -3652,6 +3652,24 @@ static void* benchmarks_do(void* args)
16+
17+
#ifdef WOLFSSL_HAVE_KYBER
18+
if (bench_all || (bench_pq_asym_algs & BENCH_KYBER)) {
19+
+#ifndef WOLFSSL_NO_ML_KEM
20+
+ #ifdef WOLFSSL_KYBER512
21+
+ if (bench_all || (bench_pq_asym_algs & BENCH_KYBER512)) {
22+
+ bench_kyber(WC_ML_KEM_512);
23+
+ }
24+
+ #endif
25+
+ #ifdef WOLFSSL_KYBER768
26+
+ if (bench_all || (bench_pq_asym_algs & BENCH_KYBER768)) {
27+
+ bench_kyber(WC_ML_KEM_768);
28+
+ }
29+
+ #endif
30+
+ #ifdef WOLFSSL_KYBER1024
31+
+ if (bench_all || (bench_pq_asym_algs & BENCH_KYBER1024)) {
32+
+ bench_kyber(WC_ML_KEM_1024);
33+
+ }
34+
+ #endif
35+
+#endif
36+
+#ifdef WOLFSSL_KYBER_ORIGINAL
37+
#ifdef WOLFSSL_KYBER512
38+
if (bench_all || (bench_pq_asym_algs & BENCH_KYBER512)) {
39+
bench_kyber(KYBER512);
40+
@@ -3667,6 +3685,7 @@ static void* benchmarks_do(void* args)
41+
bench_kyber(KYBER1024);
42+
}
43+
#endif
44+
+#endif
45+
}
46+
#endif
47+
48+
@@ -9471,6 +9490,27 @@ void bench_kyber(int type)
49+
int keySize = 0;
50+
51+
switch (type) {
52+
+#ifndef WOLFSSL_NO_ML_KEM
53+
+#ifdef WOLFSSL_WC_ML_KEM_512
54+
+ case WC_ML_KEM_512:
55+
+ name = "ML-KEM 512 ";
56+
+ keySize = 128;
57+
+ break;
58+
+#endif
59+
+#ifdef WOLFSSL_WC_ML_KEM_768
60+
+ case WC_ML_KEM_768:
61+
+ name = "ML-KEM 768 ";
62+
+ keySize = 192;
63+
+ break;
64+
+#endif
65+
+#ifdef WOLFSSL_WC_ML_KEM_1024
66+
+ case WC_ML_KEM_1024:
67+
+ name = "ML-KEM 1024 ";
68+
+ keySize = 256;
69+
+ break;
70+
+#endif
71+
+#endif
72+
+#ifdef WOLFSSL_KYBER_ORIGINAL
73+
#ifdef WOLFSSL_KYBER512
74+
case KYBER512:
75+
name = "KYBER512 ";
76+
@@ -9488,6 +9528,7 @@ void bench_kyber(int type)
77+
name = "KYBER1024";
78+
keySize = 256;
79+
break;
80+
+#endif
81+
#endif
82+
}
83+
84+
--
85+
2.43.0
86+
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
From bb3822635b481f00099374d4cc7358b8c90a01fd Mon Sep 17 00:00:00 2001
2+
From: Daniel Pouzzner <[email protected]>
3+
Date: Thu, 14 Nov 2024 12:47:09 -0600
4+
Subject: [PATCH 3/4] Merge pull request #8183 from SparkiDev/kyber_fixes_3
5+
6+
Kyber: fixes to configure and wolfSSL_get_curve_name
7+
---
8+
configure.ac | 13 +++++++++----
9+
src/ssl.c | 6 +++---
10+
src/tls.c | 24 ++++++++++++------------
11+
tests/api.c | 9 +++++++++
12+
4 files changed, 33 insertions(+), 19 deletions(-)
13+
14+
diff --git a/configure.ac b/configure.ac
15+
index 94a1d33e02..56aa878fd9 100644
16+
--- a/configure.ac
17+
+++ b/configure.ac
18+
@@ -1276,7 +1276,7 @@ AC_ARG_ENABLE([kyber],
19+
)
20+
21+
ENABLED_WC_KYBER=no
22+
-ENABLED_ML_KEM=yes
23+
+ENABLED_ML_KEM=unset
24+
for v in `echo $ENABLED_KYBER | tr "," " "`
25+
do
26+
case $v in
27+
@@ -1302,9 +1302,8 @@ do
28+
original)
29+
ENABLED_ORIGINAL=yes
30+
;;
31+
- original-only)
32+
- ENABLED_ORIGINAL=yes
33+
- ENABLED_ML_KEM=no
34+
+ ml-kem)
35+
+ ENABLED_ML_KEM=yes
36+
;;
37+
*)
38+
AC_MSG_ERROR([Invalid choice for KYBER []: $ENABLED_KYBER.])
39+
@@ -1333,6 +1332,12 @@ then
40+
if test "$ENABLED_KYBER1024" = ""; then
41+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_KYBER1024"
42+
fi
43+
+ if test "$ENABLED_ML_KEM" = "unset"; then
44+
+ ENABLED_ML_KEM=no
45+
+ fi
46+
+ fi
47+
+ if test "$ENABLED_ML_KEM" = "unset"; then
48+
+ ENABLED_ML_KEM=yes
49+
fi
50+
if test "$ENABLED_ML_KEM" = "yes"; then
51+
if test "$ENABLED_KYBER512" = ""; then
52+
diff --git a/src/ssl.c b/src/ssl.c
53+
index d9a53dfd53..edcd5d9df1 100644
54+
--- a/src/ssl.c
55+
+++ b/src/ssl.c
56+
@@ -14567,19 +14567,19 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
57+
case WOLFSSL_P521_ML_KEM_1024:
58+
return "P521_ML_KEM_1024";
59+
#elif defined(WOLFSSL_WC_KYBER)
60+
- #ifdef WOLFSSL_WC_ML_KEM_512
61+
+ #ifndef WOLFSSL_NO_ML_KEM_512
62+
case WOLFSSL_ML_KEM_512:
63+
return "ML_KEM_512";
64+
case WOLFSSL_P256_ML_KEM_512:
65+
return "P256_ML_KEM_512";
66+
#endif
67+
- #ifdef WOLFSSL_WC_ML_KEM_768
68+
+ #ifndef WOLFSSL_NO_ML_KEM_768
69+
case WOLFSSL_ML_KEM_768:
70+
return "ML_KEM_768";
71+
case WOLFSSL_P384_ML_KEM_768:
72+
return "P384_ML_KEM_768";
73+
#endif
74+
- #ifdef WOLFSSL_WC_ML_KEM_1024
75+
+ #ifndef WOLFSSL_NO_ML_KEM_1024
76+
case WOLFSSL_ML_KEM_1024:
77+
return "ML_KEM_1024";
78+
case WOLFSSL_P521_ML_KEM_1024:
79+
diff --git a/src/tls.c b/src/tls.c
80+
index 0c69c079e3..25b7f03dfc 100644
81+
--- a/src/tls.c
82+
+++ b/src/tls.c
83+
@@ -7983,17 +7983,17 @@ static int kyber_id2type(int id, int *type)
84+
85+
switch (id) {
86+
#ifndef WOLFSSL_NO_ML_KEM
87+
- #ifdef WOLFSSL_WC_ML_KEM_512
88+
+ #ifndef WOLFSSL_NO_ML_KEM_512
89+
case WOLFSSL_ML_KEM_512:
90+
*type = WC_ML_KEM_512;
91+
break;
92+
#endif
93+
- #ifdef WOLFSSL_WC_ML_KEM_768
94+
+ #ifndef WOLFSSL_NO_ML_KEM_768
95+
case WOLFSSL_ML_KEM_768:
96+
*type = WC_ML_KEM_768;
97+
break;
98+
#endif
99+
- #ifdef WOLFSSL_WC_ML_KEM_1024
100+
+ #ifndef WOLFSSL_NO_ML_KEM_1024
101+
case WOLFSSL_ML_KEM_1024:
102+
*type = WC_ML_KEM_1024;
103+
break;
104+
@@ -9693,15 +9693,15 @@ static int TLSX_KeyShare_IsSupported(int namedGroup)
105+
#ifdef WOLFSSL_HAVE_KYBER
106+
#ifndef WOLFSSL_NO_ML_KEM
107+
#ifdef WOLFSSL_WC_KYBER
108+
- #ifdef WOLFSSL_WC_ML_KEM_512
109+
+ #ifndef WOLFSSL_NO_ML_KEM_512
110+
case WOLFSSL_ML_KEM_512:
111+
case WOLFSSL_P256_ML_KEM_512:
112+
#endif
113+
- #ifdef WOLFSSL_WC_ML_KEM_768
114+
+ #ifndef WOLFSSL_NO_ML_KEM_768
115+
case WOLFSSL_ML_KEM_768:
116+
case WOLFSSL_P384_ML_KEM_768:
117+
#endif
118+
- #ifdef WOLFSSL_WC_ML_KEM_1024
119+
+ #ifndef WOLFSSL_NO_ML_KEM_1024
120+
case WOLFSSL_ML_KEM_1024:
121+
case WOLFSSL_P521_ML_KEM_1024:
122+
#endif
123+
@@ -9815,15 +9815,15 @@ static const word16 preferredGroup[] = {
124+
#endif
125+
#ifndef WOLFSSL_NO_ML_KEM
126+
#ifdef WOLFSSL_WC_KYBER
127+
- #ifdef WOLFSSL_WC_ML_KEM_512
128+
+ #ifndef WOLFSSL_NO_ML_KEM_512
129+
WOLFSSL_ML_KEM_512,
130+
WOLFSSL_P256_ML_KEM_512,
131+
#endif
132+
- #ifdef WOLFSSL_WC_ML_KEM_768
133+
+ #ifndef WOLFSSL_NO_ML_KEM_768
134+
WOLFSSL_ML_KEM_768,
135+
WOLFSSL_P384_ML_KEM_768,
136+
#endif
137+
- #ifdef WOLFSSL_WC_ML_KEM_1024
138+
+ #ifndef WOLFSSL_NO_ML_KEM_1024
139+
WOLFSSL_ML_KEM_1024,
140+
WOLFSSL_P521_ML_KEM_1024,
141+
#endif
142+
@@ -13473,7 +13473,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
143+
#ifdef WOLFSSL_HAVE_KYBER
144+
#ifndef WOLFSSL_NO_ML_KEM
145+
#ifdef WOLFSSL_WC_KYBER
146+
-#ifdef WOLFSSL_WC_ML_KEM_512
147+
+#ifndef WOLFSSL_NO_ML_KEM_512
148+
if (ret == WOLFSSL_SUCCESS)
149+
ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
150+
ssl->heap);
151+
@@ -13481,7 +13481,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
152+
ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_512,
153+
ssl->heap);
154+
#endif
155+
-#ifdef WOLFSSL_WC_ML_KEM_768
156+
+#ifndef WOLFSSL_NO_ML_KEM_768
157+
if (ret == WOLFSSL_SUCCESS)
158+
ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
159+
ssl->heap);
160+
@@ -13489,7 +13489,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
161+
ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_768,
162+
ssl->heap);
163+
#endif
164+
-#ifdef WOLFSSL_WC_ML_KEM_1024
165+
+#ifndef WOLFSSL_NO_ML_KEM_1024
166+
if (ret == WOLFSSL_SUCCESS)
167+
ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
168+
ssl->heap);
169+
diff --git a/tests/api.c b/tests/api.c
170+
index 283ff6026e..82129aa561 100644
171+
--- a/tests/api.c
172+
+++ b/tests/api.c
173+
@@ -95513,7 +95513,11 @@ static int test_dtls13_frag_ch_pq(void)
174+
const char *test_str = "test";
175+
int test_str_size;
176+
byte buf[255];
177+
+#ifdef WOLFSSL_KYBER_ORIGINAL
178+
int group = WOLFSSL_KYBER_LEVEL5;
179+
+#else
180+
+ int group = WOLFSSL_ML_KEM_1024;
181+
+#endif
182+
183+
XMEMSET(&test_ctx, 0, sizeof(test_ctx));
184+
ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s,
185+
@@ -95523,8 +95527,13 @@ static int test_dtls13_frag_ch_pq(void)
186+
ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, group), WOLFSSL_SUCCESS);
187+
ExpectIntEQ(wolfSSL_dtls13_allow_ch_frag(ssl_s, 1), WOLFSSL_SUCCESS);
188+
ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0);
189+
+#ifdef WOLFSSL_KYBER_ORIGINAL
190+
ExpectStrEQ(wolfSSL_get_curve_name(ssl_c), "KYBER_LEVEL5");
191+
ExpectStrEQ(wolfSSL_get_curve_name(ssl_s), "KYBER_LEVEL5");
192+
+#else
193+
+ ExpectStrEQ(wolfSSL_get_curve_name(ssl_c), "ML_KEM_1024");
194+
+ ExpectStrEQ(wolfSSL_get_curve_name(ssl_s), "ML_KEM_1024");
195+
+#endif
196+
test_str_size = XSTRLEN("test") + 1;
197+
ExpectIntEQ(wolfSSL_write(ssl_c, test_str, test_str_size), test_str_size);
198+
ExpectIntEQ(wolfSSL_read(ssl_s, buf, sizeof(buf)), test_str_size);
199+
--
200+
2.43.0
201+

0 commit comments

Comments
 (0)