Skip to content

Commit c11b87c

Browse files
authored
Merge pull request #216 from ejohnstown/release-fix-kex
KEX fixes
2 parents f256aed + a4a7860 commit c11b87c

2 files changed

Lines changed: 27 additions & 18 deletions

File tree

src/internal.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5483,30 +5483,30 @@ static const char cannedKexAlgoNames[] =
54835483
#if !defined(WOLFSSH_NO_ECDH_SHA2_NISTP256)
54845484
"ecdh-sha2-nistp256"
54855485
#endif
5486-
#if !defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) && !defined(WOLFSSH_NO_ECDH_GEX_SHA256)
5486+
#if !defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) && !defined(WOLFSSH_NO_DH_GEX_SHA256)
54875487
","
54885488
#endif
5489-
#if !defined(WOLFSSH_NO_ECDH_GEX_SHA256)
5489+
#if !defined(WOLFSSH_NO_DH_GEX_SHA256)
54905490
"diffie-hellman-group-exchange-sha256"
54915491
#endif
5492-
#if (!defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) || !defined(WOLFSSH_NO_ECDH_GEX_SHA256))\
5493-
&& !defined(WOLFSSH_NO_ECDH_GROUP14_SHA1)
5492+
#if (!defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) || !defined(WOLFSSH_NO_DH_GEX_SHA256))\
5493+
&& !defined(WOLFSSH_NO_DH_GROUP14_SHA1)
54945494
","
54955495
#endif
5496-
#if !defined(WOLFSSH_NO_ECDH_GROUP14_SHA1)
5496+
#if !defined(WOLFSSH_NO_DH_GROUP14_SHA1)
54975497
"diffie-hellman-group14-sha1"
54985498
#endif
5499-
#if (!defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) || !defined(WOLFSSH_NO_ECDH_GEX_SHA256) \
5500-
|| !defined(WOLFSSH_NO_ECDH_GROUP14_SHA1)) && !defined(WOLFSSH_NO_ECDH_GROUP1_SHA1)
5499+
#if (!defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) || !defined(WOLFSSH_NO_DH_GEX_SHA256) \
5500+
|| !defined(WOLFSSH_NO_DH_GROUP14_SHA1)) && !defined(WOLFSSH_NO_DH_GROUP1_SHA1)
55015501
","
55025502
#endif
5503-
#if !defined(WOLFSSH_NO_ECDH_GROUP1_SHA1)
5503+
#if !defined(WOLFSSH_NO_DH_GROUP1_SHA1)
55045504
"diffie-hellman-group1-sha1";
55055505
#endif
5506-
#if defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) && defined(WOLFSSH_NO_ECDH_GEX_SHA256)\
5507-
&& defined(WOLFSSH_NO_ECDH_GROUP14_SHA1) && defined(WOLFSSH_NO_ECDH_GROUP1_SHA1)
5508-
#warning "You need at least one of ECDH-SHA2-NISTP256, ECDH-GEX-SHA256, "
5509-
"ECDH_GROUP14-SHA1 or ECDH-GROUP1-SHA1"
5506+
#if defined(WOLFSSH_NO_ECDH_SHA2_NISTP256) && defined(WOLFSSH_NO_DH_GEX_SHA256)\
5507+
&& defined(WOLFSSH_NO_DH_GROUP14_SHA1) && defined(WOLFSSH_NO_DH_GROUP1_SHA1)
5508+
#warning "You need at least one of ECDH-SHA2-NISTP256, DH-GEX-SHA256, "
5509+
"DH-GROUP14-SHA1 or DH-GROUP1-SHA1"
55105510
#endif
55115511

55125512
static const char cannedNoneNames[] = "none";
@@ -5993,7 +5993,7 @@ int SendKexDhReply(WOLFSSH* ssh)
59935993
if (ret == 0) {
59945994
if (!useEcc) {
59955995
DhKey privKey;
5996-
byte y[256];
5996+
byte y[MAX_KEX_KEY_SZ];
59975997
word32 ySz = sizeof(y);
59985998

59995999
ret = wc_InitDhKey(&privKey);
@@ -6364,6 +6364,10 @@ int SendKexDhGexRequest(WOLFSSH* ssh)
63646364

63656365
output[idx++] = MSGID_KEXDH_GEX_REQUEST;
63666366

6367+
WLOG(WS_LOG_INFO, " min = %u, preferred = %u, max = %u",
6368+
ssh->handshake->dhGexMinSz,
6369+
ssh->handshake->dhGexPreferredSz,
6370+
ssh->handshake->dhGexMaxSz);
63676371
c32toa(ssh->handshake->dhGexMinSz, output + idx);
63686372
idx += UINT32_SZ;
63696373
c32toa(ssh->handshake->dhGexPreferredSz, output + idx);
@@ -6466,7 +6470,7 @@ int SendKexDhInit(WOLFSSH* ssh)
64666470
word32 generatorSz = dhGeneratorSz;
64676471
int ret = WS_SUCCESS;
64686472
byte msgId = MSGID_KEXDH_INIT;
6469-
byte e[256];
6473+
byte e[MAX_KEX_KEY_SZ+1]; /* plus 1 in case of padding. */
64706474
word32 eSz = sizeof(e);
64716475
byte ePad = 0;
64726476

@@ -6563,7 +6567,7 @@ int SendKexDhInit(WOLFSSH* ssh)
65636567

65646568
if (ePad) {
65656569
output[idx] = 0;
6566-
idx += 1;
6570+
idx++;
65676571
}
65686572

65696573
WMEMCPY(output + idx, e, eSz);

wolfssh/internal.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ enum {
143143
/* This is from RFC 4253 section 6.1. */
144144
#define MAX_PACKET_SZ 35000
145145
#endif
146+
#ifndef MAX_KEX_KEY_SZ
147+
/* This is based on the 3072-bit DH key that is the preferred size. */
148+
#define MAX_KEX_KEY_SZ (3072 / 8)
149+
#endif
146150

147151
WOLFSSH_LOCAL byte NameToId(const char*, word32);
148152
WOLFSSH_LOCAL const char* IdToName(byte);
@@ -231,9 +235,10 @@ typedef struct HandshakeInfo {
231235
Keys keys;
232236
Keys peerKeys;
233237
wc_HashAlg hash;
234-
byte e[257]; /* May have a leading zero for unsigned or is a Q_S value. */
238+
byte e[MAX_KEX_KEY_SZ+1]; /* May have a leading zero for unsigned
239+
or is a Q_S value. */
235240
word32 eSz;
236-
byte x[257]; /* May have a leading zero, for unsigned. */
241+
byte x[MAX_KEX_KEY_SZ+1]; /* May have a leading zero, for unsigned. */
237242
word32 xSz;
238243
byte* kexInit;
239244
word32 kexInitSz;
@@ -387,7 +392,7 @@ struct WOLFSSH {
387392

388393
byte h[WC_MAX_DIGEST_SIZE];
389394
word32 hSz;
390-
byte k[257]; /* May have a leading zero, for unsigned. */
395+
byte k[MAX_KEX_KEY_SZ+1]; /* May have a leading zero, for unsigned. */
391396
word32 kSz;
392397
byte sessionId[WC_MAX_DIGEST_SIZE];
393398
word32 sessionIdSz;

0 commit comments

Comments
 (0)