Skip to content

Commit 136e8da

Browse files
committed
KMAC and cSHAKE: Add new algorithms
Add KMAC and cSHAKE as defined in SP 800-185. Fixed the SHA-3 assembly usage on AMD chips to use the faster BMI version.
1 parent 69bf010 commit 136e8da

17 files changed

Lines changed: 3680 additions & 29 deletions

File tree

.github/workflows/cmake.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ jobs:
6464
-DWOLFSSL_RNG:BOOL=yes -DWOLFSSL_RSA:BOOL=yes -DWOLFSSL_RSA_PSS:BOOL=yes \
6565
-DWOLFSSL_SESSION_TICKET:BOOL=ON -DWOLFSSL_SHA:BOOL=yes -DWOLFSSL_SHA224:BOOL=yes \
6666
-DWOLFSSL_SHA3:STRING=yes -DWOLFSSL_SHA384:BOOL=yes -DWOLFSSL_SHA512:BOOL=yes \
67-
-DWOLFSSL_SHAKE128:STRING=yes -DWOLFSSL_SHAKE256:STRING=yes -DWOLFSSL_SINGLE_THREADED:BOOL=no \
67+
-DWOLFSSL_SHAKE128:STRING=yes -DWOLFSSL_SHAKE256:STRING=yes \
68+
-DWOLFSSL_CSHAKE:BOOL=yes -DWOLFSSL_KMAC:BOOL=yes \
69+
-DWOLFSSL_SINGLE_THREADED:BOOL=no \
6870
-DWOLFSSL_SNI:BOOL=yes -DWOLFSSL_SP_MATH_ALL:BOOL=yes -DWOLFSSL_SRTP:BOOL=yes \
6971
-DWOLFSSL_STUNNEL:BOOL=yes -DWOLFSSL_SUPPORTED_CURVES:BOOL=yes -DWOLFSSL_SYS_CA_CERTS:BOOL=yes \
7072
-DWOLFSSL_TICKET_NONCE_MALLOC:BOOL=yes -DWOLFSSL_TLS13:BOOL=yes -DWOLFSSL_TLSV12:BOOL=yes \

.wolfssl_known_macro_extras

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -732,9 +732,7 @@ WOLFSSL_ARMASM_NEON_NO_TABLE_LOOKUP
732732
WOLFSSL_ARM_ARCH_NEON_64BIT
733733
WOLFSSL_ASCON_UNROLL
734734
WOLFSSL_ASN_EXTRA
735-
WOLFSSL_ASN_TEMPLATE_NEED_SET_INT32
736735
WOLFSSL_ASN_TEMPLATE_TYPE_CHECK
737-
WOLFSSL_ASYNC_CERT_YIELD
738736
WOLFSSL_ATECC508
739737
WOLFSSL_ATECC508A_NOSOFTECC
740738
WOLFSSL_ATECC508A_TLS
@@ -828,7 +826,6 @@ WOLFSSL_MANUALLY_SELECT_DEVICE_CONFIG
828826
WOLFSSL_MDK5
829827
WOLFSSL_MEM_FAIL_COUNT
830828
WOLFSSL_MICROCHIP_AESGCM
831-
WOLFSSL_MLKEM_DYNAMIC_KEYS
832829
WOLFSSL_MLKEM_INVNTT_UNROLL
833830
WOLFSSL_MLKEM_NO_MALLOC
834831
WOLFSSL_MLKEM_NTT_UNROLL
@@ -936,6 +933,8 @@ WOLFSSL_SERVER_EXAMPLE
936933
WOLFSSL_SETTINGS_FILE
937934
WOLFSSL_SGX_CPUID_AVX512_VAES
938935
WOLFSSL_SHA256_ALT_CH_MAJ
936+
WOLFSSL_SHA3_AVX2
937+
WOLFSSL_SHA3_NO_AVX2
939938
WOLFSSL_SHA3_PPC64_BLOCKS_N
940939
WOLFSSL_SHA512_HASHTYPE
941940
WOLFSSL_SHUTDOWNONCE

CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,28 @@ add_option("WOLFSSL_SHAKE128"
13411341
"Enable wolfSSL SHAKE128 support (default: enabled on x86_64/aarch64)"
13421342
"no" "yes;no;small")
13431343

1344+
# cSHAKE and KMAC (NIST SP 800-185), both built on SHAKE. KMAC is built on
1345+
# cSHAKE, so enabling KMAC also enables cSHAKE; cSHAKE can be enabled on its own.
1346+
add_option("WOLFSSL_CSHAKE"
1347+
"Enable wolfSSL cSHAKE support (default: disabled)"
1348+
"no" "yes;no")
1349+
1350+
add_option("WOLFSSL_KMAC"
1351+
"Enable wolfSSL KMAC support (default: disabled)"
1352+
"no" "yes;no")
1353+
1354+
# KMAC is built on cSHAKE - enabling KMAC enables cSHAKE.
1355+
if(WOLFSSL_KMAC)
1356+
override_cache(WOLFSSL_CSHAKE "yes")
1357+
endif()
1358+
1359+
# cSHAKE (and thus KMAC) require SHA-3 and SHAKE. Force-enable them.
1360+
if(WOLFSSL_CSHAKE)
1361+
override_cache(WOLFSSL_SHA3 "yes")
1362+
override_cache(WOLFSSL_SHAKE128 "yes")
1363+
override_cache(WOLFSSL_SHAKE256 "yes")
1364+
endif()
1365+
13441366
# SHA512
13451367
add_option("WOLFSSL_SHA512"
13461368
"Enable wolfSSL SHA-512 support (default: enabled)"
@@ -2053,6 +2075,21 @@ else()
20532075
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_NO_SHAKE128")
20542076
endif()
20552077

2078+
# cSHAKE / KMAC
2079+
if(WOLFSSL_CSHAKE)
2080+
if(NOT WOLFSSL_SHA3)
2081+
message(FATAL_ERROR "Must have SHA-3 enabled: --enable-sha3")
2082+
endif()
2083+
# SHA-3 (and hence SHAKE/cSHAKE/KMAC) is only emitted for non-32-bit builds;
2084+
# keep these in step so they are never defined without SHAKE.
2085+
if(NOT WOLFSSL_32BIT)
2086+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_CSHAKE")
2087+
if(WOLFSSL_KMAC)
2088+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_KMAC")
2089+
endif()
2090+
endif()
2091+
endif()
2092+
20562093
# POLY1305
20572094
set(POLY1305_DEFAULT "yes")
20582095
if(WOLFSSL_FIPS)

cmake/options.h.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ extern "C" {
359359
#cmakedefine WOLFSSL_SHAKE128
360360
#undef WOLFSSL_SHAKE256
361361
#cmakedefine WOLFSSL_SHAKE256
362+
#undef WOLFSSL_CSHAKE
363+
#cmakedefine WOLFSSL_CSHAKE
364+
#undef WOLFSSL_KMAC
365+
#cmakedefine WOLFSSL_KMAC
362366
#undef WOLFSSL_SRTP
363367
#cmakedefine WOLFSSL_SRTP
364368
#undef WOLFSSL_SYS_CA_CERTS

configure.ac

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,6 +1681,8 @@ then
16811681
test "$enable_aesxts_stream" = "" && test "$enable_aesxts" = "yes" && enable_aesxts_stream=yes
16821682
test "$enable_shake128" = "" && enable_shake128=yes
16831683
test "$enable_shake256" = "" && enable_shake256=yes
1684+
test "$enable_cshake" = "" && enable_cshake=yes
1685+
test "$enable_kmac" = "" && enable_kmac=yes
16841686
test "$enable_compkey" = "" && enable_compkey=yes
16851687
# AFALG lacks AES-ECB
16861688
test "$enable_srtp_kdf" = "" && test "$enable_afalg" != "yes" && enable_srtp_kdf=yes
@@ -4874,6 +4876,49 @@ then
48744876
fi
48754877
fi
48764878

4879+
# cSHAKE and KMAC (NIST SP 800-185), both built on SHAKE. KMAC is built on
4880+
# cSHAKE, so enabling KMAC also enables cSHAKE; cSHAKE can be enabled on its own.
4881+
AC_ARG_ENABLE([cshake],
4882+
[AS_HELP_STRING([--enable-cshake],[Enable wolfSSL cSHAKE support (default: disabled)])],
4883+
[ ENABLED_CSHAKE=$enableval ],
4884+
[ ENABLED_CSHAKE=no ]
4885+
)
4886+
4887+
AC_ARG_ENABLE([kmac],
4888+
[AS_HELP_STRING([--enable-kmac],[Enable wolfSSL KMAC support (default: disabled)])],
4889+
[ ENABLED_KMAC=$enableval ],
4890+
[ ENABLED_KMAC=no ]
4891+
)
4892+
4893+
# KMAC is built on cSHAKE - enabling KMAC enables cSHAKE.
4894+
if test "$ENABLED_KMAC" != "no"
4895+
then
4896+
ENABLED_CSHAKE=yes
4897+
fi
4898+
4899+
# cSHAKE (and thus KMAC) require SHA-3 and SHAKE. Force-enable them (unless
4900+
# explicitly disabled).
4901+
if test "$ENABLED_CSHAKE" != "no"
4902+
then
4903+
if test "$ENABLED_SHA3" = "no"
4904+
then
4905+
AC_MSG_ERROR([cshake requires SHA-3: --enable-sha3])
4906+
fi
4907+
ENABLED_SHA3=yes
4908+
if test "$ENABLED_SHAKE128" != "no"
4909+
then
4910+
ENABLED_SHAKE128=yes
4911+
fi
4912+
if test "$ENABLED_SHAKE256" != "no"
4913+
then
4914+
ENABLED_SHAKE256=yes
4915+
fi
4916+
if test "$ENABLED_SHAKE128" = "no" && test "$ENABLED_SHAKE256" = "no"
4917+
then
4918+
AC_MSG_ERROR([cshake requires SHAKE128 and/or SHAKE256])
4919+
fi
4920+
fi
4921+
48774922
# SHA512
48784923
AC_ARG_ENABLE([sha512],
48794924
[AS_HELP_STRING([--enable-sha512],[Enable wolfSSL SHA-512 support (default: enabled)])],
@@ -7683,6 +7728,24 @@ else
76837728
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE256"
76847729
fi
76857730
7731+
# Set cSHAKE / KMAC flags. Both are built on SHAKE, so re-check here (after any
7732+
# later logic - e.g. FIPS < 6 - may have force-disabled SHAKE) and fail with a
7733+
# clear configure error rather than a confusing compile-time #error. KMAC
7734+
# implies cSHAKE (ENABLED_CSHAKE was set above), so the SHAKE check on the
7735+
# cSHAKE branch also covers KMAC.
7736+
if test "$ENABLED_CSHAKE" != "no"
7737+
then
7738+
if test "$ENABLED_SHAKE128" = "no" && test "$ENABLED_SHAKE256" = "no"
7739+
then
7740+
AC_MSG_ERROR([cshake requires SHAKE128 and/or SHAKE256, disabled in this configuration (for example by FIPS < 6)])
7741+
fi
7742+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CSHAKE"
7743+
fi
7744+
if test "$ENABLED_KMAC" != "no"
7745+
then
7746+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KMAC"
7747+
fi
7748+
76867749
# MLKEM CFLAG processing (after FIPS section for sandwich pattern)
76877750
if test "$ENABLED_MLKEM" != "no"
76887751
then
@@ -13099,6 +13162,8 @@ echo " * SHA-512: $ENABLED_SHA512"
1309913162
echo " * SHA3: $ENABLED_SHA3"
1310013163
echo " * SHAKE128: $ENABLED_SHAKE128"
1310113164
echo " * SHAKE256: $ENABLED_SHAKE256"
13165+
echo " * cSHAKE: $ENABLED_CSHAKE"
13166+
echo " * KMAC: $ENABLED_KMAC"
1310213167
echo " * SM3: $ENABLED_SM3"
1310313168
echo " * BLAKE2B: $ENABLED_BLAKE2B"
1310413169
echo " * BLAKE2S: $ENABLED_BLAKE2S"

0 commit comments

Comments
 (0)