@@ -1037,6 +1037,56 @@ add_option(WOLFSSL_EXTRA_PQC_HYBRIDS
10371037 "Enable extra PQ/T hybrid combinations (default: disabled)"
10381038 "no" "yes;no" )
10391039
1040+ # FrodoKEM reference implementation (experimental)
1041+ add_option (WOLFSSL_FRODOKEM
1042+ "Enable the wolfSSL FrodoKEM reference implementation (requires WOLFSSL_EXPERIMENTAL) (default: disabled)"
1043+ "no" "yes;no" )
1044+ # FrodoKEM matrix A generation with SHAKE-128 (default: enabled when FrodoKEM on)
1045+ add_option (WOLFSSL_FRODOKEM_SHAKE
1046+ "Enable FrodoKEM SHAKE-128 matrix A generation (default: enabled)"
1047+ "yes" "yes;no" )
1048+ # FrodoKEM matrix A generation with AES-128 (default: disabled)
1049+ add_option (WOLFSSL_FRODOKEM_AES
1050+ "Enable FrodoKEM AES-128 matrix A generation (default: disabled)"
1051+ "no" "yes;no" )
1052+ # eFrodoKEM (ephemeral, salt-less) variants (default: disabled)
1053+ add_option (WOLFSSL_FRODOKEM_EPHEMERAL
1054+ "Enable eFrodoKEM (ephemeral) variants (default: disabled)"
1055+ "no" "yes;no" )
1056+ # FrodoKEM parameter sets (each default: enabled)
1057+ add_option (WOLFSSL_FRODOKEM_640
1058+ "Enable the FrodoKEM-640 parameter set (default: enabled)"
1059+ "yes" "yes;no" )
1060+ add_option (WOLFSSL_FRODOKEM_976
1061+ "Enable the FrodoKEM-976 parameter set (default: enabled)"
1062+ "yes" "yes;no" )
1063+ add_option (WOLFSSL_FRODOKEM_1344
1064+ "Enable the FrodoKEM-1344 parameter set (default: enabled)"
1065+ "yes" "yes;no" )
1066+ # FrodoKEM operations (each default: enabled)
1067+ add_option (WOLFSSL_FRODOKEM_MAKE_KEY
1068+ "Enable FrodoKEM key generation (default: enabled)"
1069+ "yes" "yes;no" )
1070+ add_option (WOLFSSL_FRODOKEM_ENCAPSULATE
1071+ "Enable FrodoKEM encapsulation (default: enabled)"
1072+ "yes" "yes;no" )
1073+ add_option (WOLFSSL_FRODOKEM_DECAPSULATE
1074+ "Enable FrodoKEM decapsulation (default: enabled)"
1075+ "yes" "yes;no" )
1076+ # Small-footprint FrodoKEM: looped (not unrolled) matrix arithmetic
1077+ # (default: disabled)
1078+ add_option (WOLFSSL_FRODOKEM_SMALL
1079+ "Enable small-footprint FrodoKEM (default: disabled)"
1080+ "no" "yes;no" )
1081+
1082+ # FrodoKEM AArch64 SVE / SME acceleration (default: disabled; AArch64 asm only)
1083+ add_option (WOLFSSL_FRODOKEM_SVE
1084+ "Enable FrodoKEM AArch64 SVE acceleration (default: disabled)"
1085+ "no" "yes;no" )
1086+ add_option (WOLFSSL_FRODOKEM_SME
1087+ "Enable FrodoKEM AArch64 SME acceleration (default: disabled)"
1088+ "no" "yes;no" )
1089+
10401090message (STATUS "Looking for WOLFSSL_EXPERIMENTAL" )
10411091if (WOLFSSL_EXPERIMENTAL)
10421092 message (STATUS "Looking for WOLFSSL_EXPERIMENTAL - found" )
@@ -1092,6 +1142,98 @@ if (WOLFSSL_EXPERIMENTAL)
10921142 message (STATUS "Looking for WOLFSSL_EXTRA_PQC_HYBRIDS - not found" )
10931143 endif ()
10941144
1145+ # Checking for experimental feature: FrodoKEM
1146+ message (STATUS "Looking for WOLFSSL_FRODOKEM" )
1147+ if (WOLFSSL_FRODOKEM)
1148+ set (WOLFSSL_FOUND_EXPERIMENTAL_FEATURE 1)
1149+ message (STATUS "Looking for WOLFSSL_FRODOKEM - found" )
1150+
1151+ # At least one matrix A generation method must be enabled.
1152+ if (NOT WOLFSSL_FRODOKEM_SHAKE AND NOT WOLFSSL_FRODOKEM_AES)
1153+ message (FATAL_ERROR
1154+ "WOLFSSL_FRODOKEM requires WOLFSSL_FRODOKEM_SHAKE and/or WOLFSSL_FRODOKEM_AES." )
1155+ endif ()
1156+ # At least one parameter set must be enabled.
1157+ if (NOT WOLFSSL_FRODOKEM_640 AND NOT WOLFSSL_FRODOKEM_976 AND
1158+ NOT WOLFSSL_FRODOKEM_1344)
1159+ message (FATAL_ERROR
1160+ "WOLFSSL_FRODOKEM requires at least one of WOLFSSL_FRODOKEM_640, WOLFSSL_FRODOKEM_976 or WOLFSSL_FRODOKEM_1344." )
1161+ endif ()
1162+ # At least one operation must be enabled.
1163+ if (NOT WOLFSSL_FRODOKEM_MAKE_KEY AND NOT WOLFSSL_FRODOKEM_ENCAPSULATE
1164+ AND NOT WOLFSSL_FRODOKEM_DECAPSULATE)
1165+ message (FATAL_ERROR
1166+ "WOLFSSL_FRODOKEM requires at least one of WOLFSSL_FRODOKEM_MAKE_KEY, WOLFSSL_FRODOKEM_ENCAPSULATE or WOLFSSL_FRODOKEM_DECAPSULATE." )
1167+ endif ()
1168+
1169+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_HAVE_FRODOKEM" )
1170+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHA3" )
1171+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE128" )
1172+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_SHAKE256" )
1173+
1174+ set_wolfssl_definitions ("WOLFSSL_HAVE_FRODOKEM" RESULT )
1175+ set_wolfssl_definitions ("WOLFSSL_SHA3" RESULT )
1176+ set_wolfssl_definitions ("WOLFSSL_SHAKE128" RESULT )
1177+ set_wolfssl_definitions ("WOLFSSL_SHAKE256" RESULT )
1178+
1179+ if (WOLFSSL_FRODOKEM_SHAKE)
1180+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_SHAKE" )
1181+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_SHAKE" RESULT )
1182+ endif ()
1183+ if (WOLFSSL_FRODOKEM_AES)
1184+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_AES" )
1185+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_AES_DIRECT" )
1186+ list (APPEND WOLFSSL_DEFINITIONS "-DHAVE_AES_ECB" )
1187+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_AES" RESULT )
1188+ set_wolfssl_definitions ("WOLFSSL_AES_DIRECT" RESULT )
1189+ set_wolfssl_definitions ("HAVE_AES_ECB" RESULT )
1190+ endif ()
1191+ if (WOLFSSL_FRODOKEM_EPHEMERAL)
1192+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_EPHEMERAL" )
1193+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_EPHEMERAL" RESULT )
1194+ endif ()
1195+ if (WOLFSSL_FRODOKEM_SMALL)
1196+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_SMALL" )
1197+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_SMALL" RESULT )
1198+ endif ()
1199+ if (WOLFSSL_FRODOKEM_SVE)
1200+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_SVE" )
1201+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_SVE" RESULT )
1202+ endif ()
1203+ if (WOLFSSL_FRODOKEM_SME)
1204+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_SME" )
1205+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_SME" RESULT )
1206+ endif ()
1207+ # Excluded parameter sets.
1208+ if (NOT WOLFSSL_FRODOKEM_640)
1209+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_NO_FRODOKEM_640" )
1210+ set_wolfssl_definitions ("WOLFSSL_NO_FRODOKEM_640" RESULT )
1211+ endif ()
1212+ if (NOT WOLFSSL_FRODOKEM_976)
1213+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_NO_FRODOKEM_976" )
1214+ set_wolfssl_definitions ("WOLFSSL_NO_FRODOKEM_976" RESULT )
1215+ endif ()
1216+ if (NOT WOLFSSL_FRODOKEM_1344)
1217+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_NO_FRODOKEM_1344" )
1218+ set_wolfssl_definitions ("WOLFSSL_NO_FRODOKEM_1344" RESULT )
1219+ endif ()
1220+ # Excluded operations.
1221+ if (NOT WOLFSSL_FRODOKEM_MAKE_KEY)
1222+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_NO_MAKE_KEY" )
1223+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_NO_MAKE_KEY" RESULT )
1224+ endif ()
1225+ if (NOT WOLFSSL_FRODOKEM_ENCAPSULATE)
1226+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_NO_ENCAPSULATE" )
1227+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_NO_ENCAPSULATE" RESULT )
1228+ endif ()
1229+ if (NOT WOLFSSL_FRODOKEM_DECAPSULATE)
1230+ list (APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_FRODOKEM_NO_DECAPSULATE" )
1231+ set_wolfssl_definitions ("WOLFSSL_FRODOKEM_NO_DECAPSULATE" RESULT )
1232+ endif ()
1233+ else ()
1234+ message (STATUS "Looking for WOLFSSL_FRODOKEM - not found" )
1235+ endif ()
1236+
10951237 # Other experimental feature detection can be added here...
10961238
10971239 # Were any experimental features found? Display a message.
@@ -1110,6 +1252,9 @@ else()
11101252 if (WOLFSSL_FALCON)
11111253 message (FATAL_ERROR "Error: WOLFSSL_FALCON requires WOLFSSL_EXPERIMENTAL at this time." )
11121254 endif ()
1255+ if (WOLFSSL_FRODOKEM)
1256+ message (FATAL_ERROR "Error: WOLFSSL_FRODOKEM requires WOLFSSL_EXPERIMENTAL at this time." )
1257+ endif ()
11131258endif ()
11141259
11151260# LMS
@@ -4184,6 +4329,7 @@ if(WOLFSSL_EXAMPLES)
41844329 tests/api/test_ed25519.c
41854330 tests/api/test_curve448.c
41864331 tests/api/test_ed448.c
4332+ tests/api/test_frodokem.c
41874333 tests/api/test_mlkem.c
41884334 tests/api/test_mldsa.c
41894335 tests/api/test_mldsa_legacy.c
0 commit comments