4848#include <wolfssl/wolfcrypt/hmac.h>
4949#include <wolfssl/wolfcrypt/signature.h>
5050
51+ #if (LIBWOLFSSL_VERSION_HEX >= WOLFSSL_V5_0_0 ) \
52+ && ((defined(HAVE_FIPS ) && FIPS_VERSION_GE (5 ,2 )) \
53+ || defined(WOLFSSH_NO_ECDH_NISTP256_KYBER_LEVEL1_SHA256 ))
54+ #include <wolfssl/wolfcrypt/kdf.h>
55+ #endif
56+
5157#ifdef WOLFSSH_HAVE_LIBOQS
5258#include <oqs/kem.h>
5359#endif
@@ -456,6 +462,9 @@ const char* GetErrorString(int err)
456462 case WS_AUTH_PENDING :
457463 return "userauth is still pending (callback would block)" ;
458464
465+ case WS_KDF_E :
466+ return "KDF error" ;
467+
459468 default :
460469 return "Unknown error code" ;
461470 }
@@ -2164,6 +2173,32 @@ int GenerateKey(byte hashId, byte keyId,
21642173 const byte * h , word32 hSz ,
21652174 const byte * sessionId , word32 sessionIdSz ,
21662175 byte doKeyPad )
2176+ #if (LIBWOLFSSL_VERSION_HEX >= WOLFSSL_V5_0_0 ) \
2177+ && ((defined(HAVE_FIPS ) && FIPS_VERSION_GE (5 ,2 )) \
2178+ || defined(WOLFSSH_NO_ECDH_NISTP256_KYBER_LEVEL1_SHA256 ))
2179+ /* Cannot use the SSH KDF with Kyber. With Kyber, doKeyPad must be false,
2180+ * and the FIPS SSH KDF doesn't handle no-padding. Also, the Kyber algorithm
2181+ * isn't in our FIPS boundary. */
2182+ {
2183+ int ret = WS_SUCCESS ;
2184+
2185+ if (!doKeyPad ) {
2186+ WLOG (WS_LOG_ERROR , "cannot use FIPS KDF with Kyber" );
2187+ ret = WS_INVALID_ALGO_ID ;
2188+ }
2189+ else {
2190+ PRIVATE_KEY_UNLOCK ();
2191+ ret = wc_SSH_KDF (hashId , keyId , key , keySz ,
2192+ k , kSz , h , hSz , sessionId , sessionIdSz );
2193+ PRIVATE_KEY_LOCK ();
2194+ if (ret != 0 ) {
2195+ WLOG (WS_LOG_ERROR , "SSH KDF failed (%d)" , ret );
2196+ ret = WS_KDF_E ;
2197+ }
2198+ }
2199+ return ret ;
2200+ }
2201+ #else
21672202{
21682203 word32 blocks , remainder ;
21692204 wc_HashAlg hash ;
@@ -2174,12 +2209,13 @@ int GenerateKey(byte hashId, byte keyId,
21742209 int digestSz ;
21752210 int ret ;
21762211
2212+ WLOG (WS_LOG_DEBUG , "Entering GenerateKey()" );
2213+
21772214 if (key == NULL || keySz == 0 ||
21782215 k == NULL || kSz == 0 ||
21792216 h == NULL || hSz == 0 ||
21802217 sessionId == NULL || sessionIdSz == 0 ) {
21812218
2182- WLOG (WS_LOG_DEBUG , "GK: bad argument" );
21832219 return WS_BAD_ARGUMENT ;
21842220 }
21852221
@@ -2274,6 +2310,7 @@ int GenerateKey(byte hashId, byte keyId,
22742310
22752311 return ret ;
22762312}
2313+ #endif /* HAVE_FIPS && LIBWOLFSSL_VERSION_HEX >= WOLFSSL_V5_7_2 */
22772314
22782315
22792316static int GenerateKeys (WOLFSSH * ssh , byte hashId , byte doKeyPad )
0 commit comments