KEX Cipher Lists

1. Fix using the MAC algorithm list from the WOLFSSH object when matching
   the peer's algorithm.
2. Fix polarity checking WOLFSSH_NO_SHA1_SOFT_DISABLE.
3. Remove some redundant size constants. Use strlen().
4. Rearrange the canned key algorithm names, add the missing items, and
   add guards.
5. Whitespace.
pull/661/head
John Safranek 2024-02-27 17:28:11 -08:00
parent c8e00a409b
commit cfe99cc696
1 changed files with 31 additions and 74 deletions

View File

@ -583,7 +583,7 @@ static const char cannedKexAlgoNames[] =
#if !defined(WOLFSSH_NO_DH_GEX_SHA256) #if !defined(WOLFSSH_NO_DH_GEX_SHA256)
"diffie-hellman-group-exchange-sha256," "diffie-hellman-group-exchange-sha256,"
#endif #endif
#ifndef WOLFSSH_NO_SHA1_SOFT_DISABLE #ifdef WOLFSSH_NO_SHA1_SOFT_DISABLE
#if !defined(WOLFSSH_NO_DH_GROUP14_SHA1) #if !defined(WOLFSSH_NO_DH_GROUP14_SHA1)
"diffie-hellman-group14-sha1," "diffie-hellman-group14-sha1,"
#endif #endif
@ -630,12 +630,19 @@ static const char cannedKexAlgoNames[] =
static const char cannedKeyAlgoRsaSha2_512Names[] = "rsa-sha2-512"; static const char cannedKeyAlgoRsaSha2_512Names[] = "rsa-sha2-512";
#endif #endif
#ifdef WOLFSSH_CERTS
static const char cannedKeyAlgoNames[] = static const char cannedKeyAlgoNames[] =
"rsa-sha2-256,x509v3-ssh-rsa,ecdsa-sha2-nistp256,x509v3-ecdsa-sha2-nistp256"; "rsa-sha2-256,"
#else "ecdsa-sha2-nistp256,"
static const char cannedKeyAlgoNames[] = "rsa-sha2-256,ecdsa-sha2-nistp256"; #ifdef WOLFSSH_CERTS
#endif "x509v3-ecdsa-sha2-nistp256,"
#ifdef WOLFSSH_NO_SHA1_SOFT_DISABLE
"x509v3-ssh-rsa,"
#endif /* WOLFSSH_NO_SHA1_SOFT_DISABLE */
#endif /* WOLFSSH_CERTS */
#ifdef WOLFSSH_NO_SHA1_SOFT_DISABLE
"ssh-rsa,"
#endif /* WOLFSSH_NO_SHA1_SOFT_DISABLE */
"";
static const char cannedEncAlgoNames[] = static const char cannedEncAlgoNames[] =
#if !defined(WOLFSSH_NO_AES_GCM) #if !defined(WOLFSSH_NO_AES_GCM)
@ -710,9 +717,6 @@ WOLFSSH_CTX* CtxInit(WOLFSSH_CTX* ctx, byte side, void* heap)
ctx->maxPacketSz = DEFAULT_MAX_PACKET_SZ; ctx->maxPacketSz = DEFAULT_MAX_PACKET_SZ;
ctx->sshProtoIdStr = sshProtoIdStr; ctx->sshProtoIdStr = sshProtoIdStr;
ctx->algoListKex = cannedKexAlgoNames; ctx->algoListKex = cannedKexAlgoNames;
#if 0
ctx->algoListKey = cannedKeyAlgoNames;
#endif
ctx->algoListCipher = cannedEncAlgoNames; ctx->algoListCipher = cannedEncAlgoNames;
ctx->algoListMac = cannedMacAlgoNames; ctx->algoListMac = cannedMacAlgoNames;
@ -3674,7 +3678,7 @@ static int DoKexInit(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
cannedAlgoNamesSz = AlgoListSz(ssh->algoListMac); cannedAlgoNamesSz = AlgoListSz(ssh->algoListMac);
cannedListSz = (word32)sizeof(cannedList); cannedListSz = (word32)sizeof(cannedList);
ret = GetNameListRaw(cannedList, &cannedListSz, ret = GetNameListRaw(cannedList, &cannedListSz,
(const byte*)cannedMacAlgoNames, cannedAlgoNamesSz); (const byte*)ssh->algoListMac, cannedAlgoNamesSz);
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
algoId = MatchIdLists(side, list, listSz, cannedList, cannedListSz); algoId = MatchIdLists(side, list, listSz, cannedList, cannedListSz);
@ -3802,7 +3806,8 @@ static int DoKexInit(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
ret = HashUpdate(hash, hashId, (const byte*)ssh->ctx->sshProtoIdStr, strSz); ret = HashUpdate(hash, hashId,
(const byte*)ssh->ctx->sshProtoIdStr, strSz);
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
@ -8992,51 +8997,6 @@ static int BuildNameList(char* buf, word32 bufSz,
} }
/* -1 for the null */
#ifndef WOLFSSH_NO_SSH_RSA_SHA1
static const word32 cannedKeyAlgoSshRsaNamesSz =
(word32)sizeof(cannedKeyAlgoSshRsaNames) - 1;
#endif
#ifndef WOLFSSH_NO_RSA_SHA2_256
static const word32 cannedKeyAlgoRsaSha2_256NamesSz =
(word32)sizeof(cannedKeyAlgoRsaSha2_256Names) - 1;
#endif
#ifndef WOLFSSH_NO_RSA_SHA2_512
static const word32 cannedKeyAlgoRsaSha2_512NamesSz =
(word32)sizeof(cannedKeyAlgoRsaSha2_512Names) - 1;
#endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
static const word32 cannedKeyAlgoEcc256NamesSz =
(word32)sizeof(cannedKeyAlgoEcc256Names) - 1;
#endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384
static const word32 cannedKeyAlgoEcc384NamesSz =
(word32)sizeof(cannedKeyAlgoEcc384Names) - 1;
#endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521
static const word32 cannedKeyAlgoEcc521NamesSz =
(word32)sizeof(cannedKeyAlgoEcc521Names) - 1;
#endif
#ifdef WOLFSSH_CERTS
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
static const word32 cannedKeyAlgoX509Ecc256NamesSz =
(word32)sizeof(cannedKeyAlgoX509Ecc256Names) - 1;
#endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384
static const word32 cannedKeyAlgoX509Ecc384NamesSz =
(word32)sizeof(cannedKeyAlgoX509Ecc384Names) - 1;
#endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521
static const word32 cannedKeyAlgoX509Ecc521NamesSz =
(word32)sizeof(cannedKeyAlgoX509Ecc521Names) - 1;
#endif
#endif /* WOLFSSH_CERTS */
static const word32 cannedKeyAlgoNamesSz =
(word32)sizeof(cannedKeyAlgoNames) - 1;
int SendKexInit(WOLFSSH* ssh) int SendKexInit(WOLFSSH* ssh)
{ {
byte* output = NULL; byte* output = NULL;
@ -11250,12 +11210,14 @@ int SendServiceAccept(WOLFSSH* ssh, byte serviceId)
#define WS_EXTINFO_EXTENSION_COUNT 1 #define WS_EXTINFO_EXTENSION_COUNT 1
static const char serverSigAlgsName[] = "server-sig-algs"; static const char serverSigAlgsName[] = "server-sig-algs";
static word32 serverSigAlgsNameSz = (word32)sizeof(serverSigAlgsName) - 1;
int SendExtInfo(WOLFSSH* ssh) int SendExtInfo(WOLFSSH* ssh)
{ {
byte* output; byte* output;
word32 idx; word32 idx;
word32 cannedKeyAlgoNamesSz = 0;
word32 serverSigAlgsNameSz = 0;
int ret = WS_SUCCESS; int ret = WS_SUCCESS;
WLOG(WS_LOG_DEBUG, "Entering SendExtInfo()"); WLOG(WS_LOG_DEBUG, "Entering SendExtInfo()");
@ -11265,6 +11227,8 @@ int SendExtInfo(WOLFSSH* ssh)
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
cannedKeyAlgoNamesSz = AlgoListSz(cannedKeyAlgoNames);
serverSigAlgsNameSz = AlgoListSz(serverSigAlgsName);
ret = PreparePacket(ssh, MSG_ID_SZ + UINT32_SZ + (LENGTH_SZ * 2) ret = PreparePacket(ssh, MSG_ID_SZ + UINT32_SZ + (LENGTH_SZ * 2)
+ serverSigAlgsNameSz + cannedKeyAlgoNamesSz); + serverSigAlgsNameSz + cannedKeyAlgoNamesSz);
} }
@ -11482,19 +11446,16 @@ static int BuildUserAuthRequestRsa(WOLFSSH* ssh,
#ifndef WOLFSSH_NO_SSH_RSA_SHA1 #ifndef WOLFSSH_NO_SSH_RSA_SHA1
case ID_SSH_RSA: case ID_SSH_RSA:
names = cannedKeyAlgoSshRsaNames; names = cannedKeyAlgoSshRsaNames;
namesSz = cannedKeyAlgoSshRsaNamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_RSA_SHA2_256 #ifndef WOLFSSH_NO_RSA_SHA2_256
case ID_RSA_SHA2_256: case ID_RSA_SHA2_256:
names = cannedKeyAlgoRsaSha2_256Names; names = cannedKeyAlgoRsaSha2_256Names;
namesSz = cannedKeyAlgoRsaSha2_256NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_RSA_SHA2_512 #ifndef WOLFSSH_NO_RSA_SHA2_512
case ID_RSA_SHA2_512: case ID_RSA_SHA2_512:
names = cannedKeyAlgoRsaSha2_512Names; names = cannedKeyAlgoRsaSha2_512Names;
namesSz = cannedKeyAlgoRsaSha2_512NamesSz;
break; break;
#endif #endif
default: default:
@ -11503,6 +11464,7 @@ static int BuildUserAuthRequestRsa(WOLFSSH* ssh,
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
namesSz = (word32)WSTRLEN(names);
c32toa(keySig->sigSz + namesSz + LENGTH_SZ * 2, output + begin); c32toa(keySig->sigSz + namesSz + LENGTH_SZ * 2, output + begin);
begin += LENGTH_SZ; begin += LENGTH_SZ;
c32toa(namesSz, output + begin); c32toa(namesSz, output + begin);
@ -11916,19 +11878,16 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
case ID_ECDSA_SHA2_NISTP256: case ID_ECDSA_SHA2_NISTP256:
names = cannedKeyAlgoEcc256Names; names = cannedKeyAlgoEcc256Names;
namesSz = cannedKeyAlgoEcc256NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384
case ID_ECDSA_SHA2_NISTP384: case ID_ECDSA_SHA2_NISTP384:
names = cannedKeyAlgoEcc384Names; names = cannedKeyAlgoEcc384Names;
namesSz = cannedKeyAlgoEcc384NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521
case ID_ECDSA_SHA2_NISTP521: case ID_ECDSA_SHA2_NISTP521:
names = cannedKeyAlgoEcc521Names; names = cannedKeyAlgoEcc521Names;
namesSz = cannedKeyAlgoEcc521NamesSz;
break; break;
#endif #endif
default: default:
@ -11937,6 +11896,8 @@ static int BuildUserAuthRequestEcc(WOLFSSH* ssh,
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
namesSz = (word32)WSTRLEN(names);
c32toa(rSz + rPad + sSz + sPad + namesSz + LENGTH_SZ * 4, c32toa(rSz + rPad + sSz + sPad + namesSz + LENGTH_SZ * 4,
output + begin); output + begin);
begin += LENGTH_SZ; begin += LENGTH_SZ;
@ -12160,37 +12121,31 @@ static int BuildUserAuthRequestEccCert(WOLFSSH* ssh,
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
case ID_ECDSA_SHA2_NISTP256: case ID_ECDSA_SHA2_NISTP256:
names = cannedKeyAlgoEcc256Names; names = cannedKeyAlgoEcc256Names;
namesSz = cannedKeyAlgoEcc256NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384
case ID_ECDSA_SHA2_NISTP384: case ID_ECDSA_SHA2_NISTP384:
names = cannedKeyAlgoEcc384Names; names = cannedKeyAlgoEcc384Names;
namesSz = cannedKeyAlgoEcc384NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521
case ID_ECDSA_SHA2_NISTP521: case ID_ECDSA_SHA2_NISTP521:
names = cannedKeyAlgoEcc521Names; names = cannedKeyAlgoEcc521Names;
namesSz = cannedKeyAlgoEcc521NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP256
case ID_X509V3_ECDSA_SHA2_NISTP256: case ID_X509V3_ECDSA_SHA2_NISTP256:
names = cannedKeyAlgoX509Ecc256Names; names = cannedKeyAlgoX509Ecc256Names;
namesSz = cannedKeyAlgoX509Ecc256NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP384
case ID_X509V3_ECDSA_SHA2_NISTP384: case ID_X509V3_ECDSA_SHA2_NISTP384:
names = cannedKeyAlgoX509Ecc384Names; names = cannedKeyAlgoX509Ecc384Names;
namesSz = cannedKeyAlgoX509Ecc384NamesSz;
break; break;
#endif #endif
#ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521 #ifndef WOLFSSH_NO_ECDSA_SHA2_NISTP521
case ID_X509V3_ECDSA_SHA2_NISTP521: case ID_X509V3_ECDSA_SHA2_NISTP521:
names = cannedKeyAlgoX509Ecc521Names; names = cannedKeyAlgoX509Ecc521Names;
namesSz = cannedKeyAlgoX509Ecc521NamesSz;
break; break;
#endif #endif
default: default:
@ -12199,6 +12154,8 @@ static int BuildUserAuthRequestEccCert(WOLFSSH* ssh,
} }
if (ret == WS_SUCCESS) { if (ret == WS_SUCCESS) {
namesSz = (word32)WSTRLEN(names);
c32toa(rSz + rPad + sSz + sPad + namesSz+ LENGTH_SZ * 4, c32toa(rSz + rPad + sSz + sPad + namesSz+ LENGTH_SZ * 4,
output + begin); output + begin);
begin += LENGTH_SZ; begin += LENGTH_SZ;