Skip to content

Commit 525c212

Browse files
committed
cmac kdf: add NIST SP 800-108, and NIST SP 800-56C two-step.
1 parent aba9ee4 commit 525c212

11 files changed

Lines changed: 790 additions & 41 deletions

File tree

.wolfssl_known_macro_extras

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,6 @@ WC_DISABLE_RADIX_ZERO_PAD
606606
WC_ECC_NONBLOCK_ONLY
607607
WC_FLAG_DONT_USE_AESNI
608608
WC_FORCE_LINUXKM_FORTIFY_SOURCE
609-
WC_KDF_NIST_SP_800_56C
610609
WC_LMS_FULL_HASH
611610
WC_NO_RNG_SIMPLE
612611
WC_NO_STATIC_ASSERT

configure.ac

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,7 @@ then
13341334
test "$enable_eccencrypt" = "" && test "$enable_ecc" != "no" && enable_eccencrypt=yes
13351335
test "$enable_psk" = "" && enable_psk=yes
13361336
test "$enable_cmac" = "" && enable_cmac=yes
1337+
test "$enable_cmac_kdf" = "" && enable_cmac_kdf=yes
13371338
test "$enable_siphash" = "" && enable_siphash=yes
13381339
test "$enable_ocsp" = "" && enable_ocsp=yes
13391340
test "$enable_ocspstapling" = "" && test "$enable_ocsp" != "no" && enable_ocspstapling=yes
@@ -1441,6 +1442,9 @@ then
14411442

14421443
# Store issuer name components when parsing certificates.
14431444
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_ISSUER_NAMES"
1445+
1446+
# Enable onestep KDF from NIST SP 800 56c option 1.
1447+
AM_CFLAGS="$AM_CFLAGS -DWC_KDF_NIST_SP_800_56C"
14441448
fi
14451449

14461450
# wolfGuard
@@ -5600,6 +5604,20 @@ AC_ARG_ENABLE([siphash],
56005604
AS_IF([test "x$ENABLED_SIPHASH" = "xyes"],
56015605
[AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SIPHASH"])
56025606

5607+
AC_ARG_ENABLE([cmac-kdf],
5608+
[AS_HELP_STRING([--enable-cmac-kdf],[Enables cmac-kdf support (default: disabled)])],
5609+
[ ENABLED_CMAC_KDF=$enableval ],
5610+
[ ENABLED_CMAC_KDF=no ]
5611+
)
5612+
5613+
if test "$ENABLED_CMAC_KDF" = "yes"
5614+
then
5615+
if test "$ENABLED_KDF" != "yes"
5616+
then
5617+
AC_MSG_ERROR([enable-cmac-kdf requires --enable-kdf])
5618+
fi
5619+
AM_CFLAGS="$AM_CFLAGS -DHAVE_CMAC_KDF"
5620+
fi
56035621

56045622
# CMAC
56055623
AC_ARG_ENABLE([cmac],
@@ -5608,7 +5626,7 @@ AC_ARG_ENABLE([cmac],
56085626
[ ENABLED_CMAC=no ]
56095627
)
56105628

5611-
if test "$ENABLED_WPAS" != "no" || test "$ENABLED_NTP" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" || test "$ENABLED_AESEAX" = "yes"
5629+
if test "$ENABLED_WPAS" != "no" || test "$ENABLED_NTP" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" || test "$ENABLED_AESEAX" = "yes" || test "$ENABLED_CMAC_KDF" = "yes"
56125630
then
56135631
ENABLED_CMAC=yes
56145632
fi

tests/api/test_aes.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2753,8 +2753,11 @@ int test_wc_AesEaxEncryptAuth(void)
27532753
/* Test bad key lengths */
27542754
for (i = 0; i <= 32; i++) {
27552755
int exp_ret;
2756-
if (i == AES_128_KEY_SIZE || i == AES_192_KEY_SIZE
2757-
|| i == AES_256_KEY_SIZE) {
2756+
if (i == AES_128_KEY_SIZE
2757+
#if defined(WOLFSSL_AES_192)
2758+
|| i == AES_192_KEY_SIZE
2759+
#endif /* WOLFSSL_AES_192 */
2760+
|| i == AES_256_KEY_SIZE) {
27582761
exp_ret = 0;
27592762
}
27602763
else {
@@ -2865,8 +2868,11 @@ int test_wc_AesEaxDecryptAuth(void)
28652868
/* Test bad key lengths */
28662869
for (i = 0; i <= 32; i++) {
28672870
int exp_ret;
2868-
if (i == AES_128_KEY_SIZE || i == AES_192_KEY_SIZE
2869-
|| i == AES_256_KEY_SIZE) {
2871+
if (i == AES_128_KEY_SIZE
2872+
#if defined(WOLFSSL_AES_192)
2873+
|| i == AES_192_KEY_SIZE
2874+
#endif /* WOLFSSL_AES_192 */
2875+
|| i == AES_256_KEY_SIZE) {
28702876
exp_ret = WC_NO_ERR_TRACE(AES_EAX_AUTH_E);
28712877
}
28722878
else {
@@ -2896,7 +2902,7 @@ int test_wc_AesEaxDecryptAuth(void)
28962902
return EXPECT_RESULT();
28972903
} /* END test_wc_AesEaxDecryptAuth() */
28982904

2899-
#endif /* WOLFSSL_AES_EAX &&
2905+
#endif /* WOLFSSL_AES_EAX && WOLFSSL_AES_256
29002906
* (!HAVE_FIPS || FIPS_VERSION_GE(5, 3)) && !HAVE_SELFTEST
29012907
*/
29022908

tests/api/test_aes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ int test_wc_AesCcmEncryptDecrypt(void);
4040
int test_wc_AesEaxVectors(void);
4141
int test_wc_AesEaxEncryptAuth(void);
4242
int test_wc_AesEaxDecryptAuth(void);
43-
#endif /* WOLFSSL_AES_EAX */
43+
#endif /* WOLFSSL_AES_EAX && WOLFSSL_AES_256*/
4444

4545
int test_wc_GmacSetKey(void);
4646
int test_wc_GmacUpdate(void);

wolfcrypt/src/cryptocb.c

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,14 @@ static const char* GetCryptoCbCmdTypeStr(int type)
174174
}
175175
#endif
176176

177-
#if defined(HAVE_HKDF) && !defined(NO_HMAC)
177+
#if (defined(HAVE_HKDF) && !defined(NO_HMAC)) || defined(HAVE_CMAC_KDF)
178178
static const char* GetKdfTypeStr(int type)
179179
{
180180
switch (type) {
181181
case WC_KDF_TYPE_HKDF:
182182
return "HKDF";
183+
case WC_KDF_TYPE_TWOSTEP_CMAC:
184+
return "TWOSTEP_CMAC";
183185
}
184186
return NULL;
185187
}
@@ -251,7 +253,8 @@ void wc_CryptoCb_InfoString(wc_CryptoInfo* info)
251253
GetCryptoCbCmdTypeStr(info->cmd.type), info->cmd.type);
252254
}
253255
#endif
254-
#if defined(HAVE_HKDF) && !defined(NO_HMAC)
256+
#if (defined(HAVE_HKDF) && !defined(NO_HMAC)) || \
257+
defined(HAVE_CMAC_KDF)
255258
else if (info->algo_type == WC_ALGO_TYPE_KDF) {
256259
printf("Crypto CB: %s %s (%d)\n", GetAlgoTypeStr(info->algo_type),
257260
GetKdfTypeStr(info->kdf.type), info->kdf.type);
@@ -2025,4 +2028,42 @@ int wc_CryptoCb_Hkdf(int hashType, const byte* inKey, word32 inKeySz,
20252028
}
20262029
#endif /* HAVE_HKDF && !NO_HMAC */
20272030

2031+
2032+
#if defined(HAVE_CMAC_KDF)
2033+
/* Crypto callback for NIST SP 800 56C two-step CMAC KDF. See software
2034+
* implementation in wc_KDA_KDF_twostep_cmac for more comments.
2035+
* */
2036+
int wc_CryptoCb_Kdf_TwostepCmac(const byte * salt, word32 saltSz,
2037+
const byte* z, word32 zSz,
2038+
const byte* fixedInfo, word32 fixedInfoSz,
2039+
byte* output, word32 outputSz, int devId)
2040+
{
2041+
int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE);
2042+
CryptoCb* dev;
2043+
2044+
/* Find registered callback device */
2045+
dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_KDF);
2046+
2047+
if (dev && dev->cb) {
2048+
wc_CryptoInfo cryptoInfo;
2049+
XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo));
2050+
2051+
cryptoInfo.algo_type = WC_ALGO_TYPE_KDF;
2052+
cryptoInfo.kdf.type = WC_KDF_TYPE_TWOSTEP_CMAC;
2053+
cryptoInfo.kdf.twostep_cmac.salt = salt;
2054+
cryptoInfo.kdf.twostep_cmac.saltSz = saltSz;
2055+
cryptoInfo.kdf.twostep_cmac.z = z;
2056+
cryptoInfo.kdf.twostep_cmac.zSz = zSz;
2057+
cryptoInfo.kdf.twostep_cmac.fixedInfo = fixedInfo;
2058+
cryptoInfo.kdf.twostep_cmac.fixedInfoSz = fixedInfoSz;
2059+
cryptoInfo.kdf.twostep_cmac.out = output;
2060+
cryptoInfo.kdf.twostep_cmac.outSz = outputSz;
2061+
2062+
ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx);
2063+
}
2064+
2065+
return wc_CryptoCb_TranslateErrorCode(ret);
2066+
}
2067+
#endif /* HAVE_CMAC_KDF */
2068+
20282069
#endif /* WOLF_CRYPTO_CB */

0 commit comments

Comments
 (0)