Skip to content

Commit c1ee61c

Browse files
Merge pull request #10888 from SparkiDev/kmac_cshake
KMAC and cSHAKE: Add new algorithms
2 parents 25b5636 + 136e8da commit c1ee61c

17 files changed

Lines changed: 3680 additions & 26 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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,8 @@ WOLFSSL_SERVER_EXAMPLE
990990
WOLFSSL_SETTINGS_FILE
991991
WOLFSSL_SGX_CPUID_AVX512_VAES
992992
WOLFSSL_SHA256_ALT_CH_MAJ
993+
WOLFSSL_SHA3_AVX2
994+
WOLFSSL_SHA3_NO_AVX2
993995
WOLFSSL_SHA3_PPC64_BLOCKS_N
994996
WOLFSSL_SHA512_HASHTYPE
995997
WOLFSSL_SHUTDOWNONCE

CMakeLists.txt

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

1545+
# cSHAKE and KMAC (NIST SP 800-185), both built on SHAKE. KMAC is built on
1546+
# cSHAKE, so enabling KMAC also enables cSHAKE; cSHAKE can be enabled on its own.
1547+
add_option("WOLFSSL_CSHAKE"
1548+
"Enable wolfSSL cSHAKE support (default: disabled)"
1549+
"no" "yes;no")
1550+
1551+
add_option("WOLFSSL_KMAC"
1552+
"Enable wolfSSL KMAC support (default: disabled)"
1553+
"no" "yes;no")
1554+
1555+
# KMAC is built on cSHAKE - enabling KMAC enables cSHAKE.
1556+
if(WOLFSSL_KMAC)
1557+
override_cache(WOLFSSL_CSHAKE "yes")
1558+
endif()
1559+
1560+
# cSHAKE (and thus KMAC) require SHA-3 and SHAKE. Force-enable them.
1561+
if(WOLFSSL_CSHAKE)
1562+
override_cache(WOLFSSL_SHA3 "yes")
1563+
override_cache(WOLFSSL_SHAKE128 "yes")
1564+
override_cache(WOLFSSL_SHAKE256 "yes")
1565+
endif()
1566+
15451567
# SHA512
15461568
add_option("WOLFSSL_SHA512"
15471569
"Enable wolfSSL SHA-512 support (default: enabled)"
@@ -2254,6 +2276,21 @@ else()
22542276
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_NO_SHAKE128")
22552277
endif()
22562278

2279+
# cSHAKE / KMAC
2280+
if(WOLFSSL_CSHAKE)
2281+
if(NOT WOLFSSL_SHA3)
2282+
message(FATAL_ERROR "Must have SHA-3 enabled: --enable-sha3")
2283+
endif()
2284+
# SHA-3 (and hence SHAKE/cSHAKE/KMAC) is only emitted for non-32-bit builds;
2285+
# keep these in step so they are never defined without SHAKE.
2286+
if(NOT WOLFSSL_32BIT)
2287+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_CSHAKE")
2288+
if(WOLFSSL_KMAC)
2289+
list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_KMAC")
2290+
endif()
2291+
endif()
2292+
endif()
2293+
22572294
# POLY1305
22582295
set(POLY1305_DEFAULT "yes")
22592296
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
@@ -1674,6 +1674,8 @@ then
16741674
test "$enable_aesxts_stream" = "" && test "$enable_aesxts" = "yes" && enable_aesxts_stream=yes
16751675
test "$enable_shake128" = "" && enable_shake128=yes
16761676
test "$enable_shake256" = "" && enable_shake256=yes
1677+
test "$enable_cshake" = "" && enable_cshake=yes
1678+
test "$enable_kmac" = "" && enable_kmac=yes
16771679
test "$enable_compkey" = "" && enable_compkey=yes
16781680
# AFALG lacks AES-ECB
16791681
test "$enable_srtp_kdf" = "" && test "$enable_afalg" != "yes" && enable_srtp_kdf=yes
@@ -5042,6 +5044,49 @@ then
50425044
fi
50435045
fi
50445046

5047+
# cSHAKE and KMAC (NIST SP 800-185), both built on SHAKE. KMAC is built on
5048+
# cSHAKE, so enabling KMAC also enables cSHAKE; cSHAKE can be enabled on its own.
5049+
AC_ARG_ENABLE([cshake],
5050+
[AS_HELP_STRING([--enable-cshake],[Enable wolfSSL cSHAKE support (default: disabled)])],
5051+
[ ENABLED_CSHAKE=$enableval ],
5052+
[ ENABLED_CSHAKE=no ]
5053+
)
5054+
5055+
AC_ARG_ENABLE([kmac],
5056+
[AS_HELP_STRING([--enable-kmac],[Enable wolfSSL KMAC support (default: disabled)])],
5057+
[ ENABLED_KMAC=$enableval ],
5058+
[ ENABLED_KMAC=no ]
5059+
)
5060+
5061+
# KMAC is built on cSHAKE - enabling KMAC enables cSHAKE.
5062+
if test "$ENABLED_KMAC" != "no"
5063+
then
5064+
ENABLED_CSHAKE=yes
5065+
fi
5066+
5067+
# cSHAKE (and thus KMAC) require SHA-3 and SHAKE. Force-enable them (unless
5068+
# explicitly disabled).
5069+
if test "$ENABLED_CSHAKE" != "no"
5070+
then
5071+
if test "$ENABLED_SHA3" = "no"
5072+
then
5073+
AC_MSG_ERROR([cshake requires SHA-3: --enable-sha3])
5074+
fi
5075+
ENABLED_SHA3=yes
5076+
if test "$ENABLED_SHAKE128" != "no"
5077+
then
5078+
ENABLED_SHAKE128=yes
5079+
fi
5080+
if test "$ENABLED_SHAKE256" != "no"
5081+
then
5082+
ENABLED_SHAKE256=yes
5083+
fi
5084+
if test "$ENABLED_SHAKE128" = "no" && test "$ENABLED_SHAKE256" = "no"
5085+
then
5086+
AC_MSG_ERROR([cshake requires SHAKE128 and/or SHAKE256])
5087+
fi
5088+
fi
5089+
50455090
# SHA512
50465091
AC_ARG_ENABLE([sha512],
50475092
[AS_HELP_STRING([--enable-sha512],[Enable wolfSSL SHA-512 support (default: enabled)])],
@@ -7857,6 +7902,24 @@ else
78577902
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE256"
78587903
fi
78597904
7905+
# Set cSHAKE / KMAC flags. Both are built on SHAKE, so re-check here (after any
7906+
# later logic - e.g. FIPS < 6 - may have force-disabled SHAKE) and fail with a
7907+
# clear configure error rather than a confusing compile-time #error. KMAC
7908+
# implies cSHAKE (ENABLED_CSHAKE was set above), so the SHAKE check on the
7909+
# cSHAKE branch also covers KMAC.
7910+
if test "$ENABLED_CSHAKE" != "no"
7911+
then
7912+
if test "$ENABLED_SHAKE128" = "no" && test "$ENABLED_SHAKE256" = "no"
7913+
then
7914+
AC_MSG_ERROR([cshake requires SHAKE128 and/or SHAKE256, disabled in this configuration (for example by FIPS < 6)])
7915+
fi
7916+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CSHAKE"
7917+
fi
7918+
if test "$ENABLED_KMAC" != "no"
7919+
then
7920+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KMAC"
7921+
fi
7922+
78607923
# MLKEM CFLAG processing (after FIPS section for sandwich pattern)
78617924
if test "$ENABLED_MLKEM" != "no"
78627925
then
@@ -13304,6 +13367,8 @@ echo " * SHA-512: $ENABLED_SHA512"
1330413367
echo " * SHA3: $ENABLED_SHA3"
1330513368
echo " * SHAKE128: $ENABLED_SHAKE128"
1330613369
echo " * SHAKE256: $ENABLED_SHAKE256"
13370+
echo " * cSHAKE: $ENABLED_CSHAKE"
13371+
echo " * KMAC: $ENABLED_KMAC"
1330713372
echo " * SM3: $ENABLED_SM3"
1330813373
echo " * BLAKE2B: $ENABLED_BLAKE2B"
1330913374
echo " * BLAKE2S: $ENABLED_BLAKE2S"

0 commit comments

Comments
 (0)