Skip to content

Commit

Permalink
Use wolfCrypt SSHv2 KDF
Browse files Browse the repository at this point in the history
1. Switching to use the new SSH-KDF function in wolfCrypt when the
   correct version of wolfSSL (v5.0.0 at a minimum) is used, when
   certified version of wolfCrypt is used or Kyber is disabled.
2. Add WOLFSSL_WOLFSSH to the wolfSSL user_settings files for the Zephyr
   testing.
  • Loading branch information
ejohnstown committed Jul 30, 2024
1 parent 06dc40d commit 40c419e
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 2 deletions.
34 changes: 33 additions & 1 deletion src/internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include <wolfssl/wolfcrypt/ecc.h>
#include <wolfssl/wolfcrypt/hmac.h>
#include <wolfssl/wolfcrypt/signature.h>
#include <wolfssl/wolfcrypt/kdf.h>

#ifdef WOLFSSH_HAVE_LIBOQS
#include <oqs/kem.h>
Expand Down Expand Up @@ -456,6 +457,9 @@ const char* GetErrorString(int err)
case WS_AUTH_PENDING:
return "userauth is still pending (callback would block)";

case WS_KDF_E:
return "KDF error";

default:
return "Unknown error code";
}
Expand Down Expand Up @@ -2164,6 +2168,32 @@ int GenerateKey(byte hashId, byte keyId,
const byte* h, word32 hSz,
const byte* sessionId, word32 sessionIdSz,
byte doKeyPad)
#if (LIBWOLFSSL_VERSION_HEX >= WOLFSSL_V5_0_0) \
&& ((defined(HAVE_FIPS) && FIPS_VERSION_GE(5,2)) \
|| defined(WOLFSSH_NO_ECDH_NISTP256_KYBER_LEVEL1_SHA256))
/* Cannot use the SSH KDF with Kyber. With Kyber, doKeyPad must be false,
* and the FIPS SSH KDF doesn't handle no-padding. Also, the Kyber algorithm
* isn't in our FIPS boundary. */
{
int ret = WS_SUCCESS;

if (!doKeyPad) {
WLOG(WS_LOG_ERROR, "cannot use FIPS KDF with Kyber");
ret = WS_INVALID_ALGO_ID;
}
else {
PRIVATE_KEY_UNLOCK();
ret = wc_SSH_KDF(hashId, keyId, key, keySz,
k, kSz, h, hSz, sessionId, sessionIdSz);
PRIVATE_KEY_LOCK();
if (ret != 0) {
WLOG(WS_LOG_ERROR, "SSH KDF failed (%d)", ret);
ret = WS_KDF_E;
}
}
return ret;
}
#else
{
word32 blocks, remainder;
wc_HashAlg hash;
Expand All @@ -2174,12 +2204,13 @@ int GenerateKey(byte hashId, byte keyId,
int digestSz;
int ret;

WLOG(WS_LOG_DEBUG, "Entering GenerateKey()");

if (key == NULL || keySz == 0 ||
k == NULL || kSz == 0 ||
h == NULL || hSz == 0 ||
sessionId == NULL || sessionIdSz == 0) {

WLOG(WS_LOG_DEBUG, "GK: bad argument");
return WS_BAD_ARGUMENT;
}

Expand Down Expand Up @@ -2274,6 +2305,7 @@ int GenerateKey(byte hashId, byte keyId,

return ret;
}
#endif /* HAVE_FIPS && LIBWOLFSSL_VERSION_HEX >= WOLFSSL_V5_7_2 */


static int GenerateKeys(WOLFSSH* ssh, byte hashId, byte doKeyPad)
Expand Down
3 changes: 2 additions & 1 deletion wolfssh/error.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,9 @@ enum WS_ErrorCodes {
WS_MSGID_NOT_ALLOWED_E = -1094, /* Message not allowed before userauth */
WS_ED25519_E = -1095, /* Ed25519 failure */
WS_AUTH_PENDING = -1096, /* User authentication still pending */
WS_KDF_E = -1097, /* KDF error*/

WS_LAST_E = -1096 /* Update this to indicate last error */
WS_LAST_E = -1097 /* Update this to indicate last error */
};


Expand Down
2 changes: 2 additions & 0 deletions wolfssh/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -1352,7 +1352,9 @@ enum TerminalModes {
#endif /* WOLFSSH_TERM */


#define WOLFSSL_V5_0_0 0x05000000
#define WOLFSSL_V5_7_0 0x05007000
#define WOLFSSL_V5_7_2 0x05007002


#ifdef __cplusplus
Expand Down
3 changes: 3 additions & 0 deletions zephyr/samples/tests/wolfssl_user_settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ extern "C" {
#undef WOLFSSL_ZEPHYR
#define WOLFSSL_ZEPHYR

#undef WOLFSSL_WOLFSSH
#define WOLFSSL_WOLFSSH

#undef TFM_TIMING_RESISTANT
#define TFM_TIMING_RESISTANT

Expand Down
3 changes: 3 additions & 0 deletions zephyr/samples/tests/wolfssl_user_settings_nofs.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ extern "C" {
#undef WOLFSSL_ZEPHYR
#define WOLFSSL_ZEPHYR

#undef WOLFSSL_WOLFSSH
#define WOLFSSL_WOLFSSH

#undef TFM_TIMING_RESISTANT
#define TFM_TIMING_RESISTANT

Expand Down

0 comments on commit 40c419e

Please sign in to comment.