Skip to content

Commit 92e8f69

Browse files
committed
Add DH Group 16 and HMAC-SHA2-512
This adds the `diffie-hellman-group16-sha512` key exchange and `hmac-sha2-512` mac support. Echoserver can now take `-x` for key exchange and `-m` for mac setting, so that this can be used in the test suite.
1 parent 759bcbd commit 92e8f69

File tree

10 files changed

+586
-6
lines changed

10 files changed

+586
-6
lines changed

examples/echoserver/echoserver.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,7 +2315,10 @@ static void ShowUsage(void)
23152315
#ifdef WOLFSSH_CERTS
23162316
printf(" -a <file> load in a root CA certificate file\n");
23172317
#endif
2318-
printf(" -k set the list of key algos to use\n");
2318+
printf(" -k <list> set the comma separated list of key algos to use\n");
2319+
printf(" -x <list> set the comma separated list of key exchange algos "
2320+
"to use\n");
2321+
printf(" -m <list> set the comma separated list of mac algos to use\n");
23192322
printf(" -b <num> test user auth would block\n");
23202323
}
23212324

@@ -2356,6 +2359,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
23562359
word32 defaultHighwater = EXAMPLE_HIGHWATER_MARK;
23572360
word32 threadCount = 0;
23582361
const char* keyList = NULL;
2362+
const char* kexList = NULL;
2363+
const char* macList = NULL;
23592364
ES_HEAP_HINT* heap = NULL;
23602365
int multipleConnections = 1;
23612366
int userEcc = 0;
@@ -2378,7 +2383,7 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
23782383
serverArgs->return_code = EXIT_SUCCESS;
23792384

23802385
if (argc > 0) {
2381-
const char* optlist = "?1a:d:efEp:R:Ni:j:I:J:K:P:k:b:";
2386+
const char* optlist = "?1a:d:efEp:R:Ni:j:I:J:K:P:k:b:x:m:";
23822387
myoptind = 0;
23832388
while ((ch = mygetopt(argc, argv, optlist)) != -1) {
23842389
switch (ch) {
@@ -2466,6 +2471,14 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
24662471
userAuthWouldBlock = atoi(myoptarg);
24672472
break;
24682473

2474+
case 'x':
2475+
kexList = myoptarg;
2476+
break;
2477+
2478+
case 'm':
2479+
macList = myoptarg;
2480+
break;
2481+
24692482
default:
24702483
ShowUsage();
24712484
serverArgs->return_code = MY_EX_USAGE;
@@ -2524,6 +2537,18 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
25242537
}
25252538
}
25262539

2540+
if (kexList) {
2541+
if (wolfSSH_CTX_SetAlgoListKex(ctx, kexList) != WS_SUCCESS) {
2542+
ES_ERROR("Error setting kex list.\n");
2543+
}
2544+
}
2545+
2546+
if (macList) {
2547+
if (wolfSSH_CTX_SetAlgoListMac(ctx, macList) != WS_SUCCESS) {
2548+
ES_ERROR("Error setting mac list.\n");
2549+
}
2550+
}
2551+
25272552
WMEMSET(&pwMapList, 0, sizeof(pwMapList));
25282553
if (serverArgs->user_auth == NULL)
25292554
wolfSSH_SetUserAuth(ctx, wsUserAuth);

src/internal.c

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@
9393
WOLFSSH_NO_HMAC_SHA2_256
9494
Set when HMAC or SHA2-256 are disabled. Set to disable HMAC-SHA2-256
9595
support.
96+
WOLFSSH_NO_HMAC_SHA2_512
97+
Set when HMAC or SHA2-512 are disabled. Set to disable HMAC-SHA2-512
98+
support.
9699
WOLFSSH_NO_DH_GROUP1_SHA1
97100
Set when DH or SHA1 are disabled. Set to disable use of DH (Oakley 1) and
98101
SHA1 support.
@@ -102,6 +105,9 @@
102105
WOLFSSH_NO_DH_GROUP14_SHA256
103106
Set when DH or SHA256 are disabled. Set to disable use of DH (Oakley 14)
104107
and SHA256 support.
108+
WOLFSSH_NO_DH_GROUP16_SHA512
109+
Set when DH or SHA512 are disabled. Set to disable use of DH (Oakley 16)
110+
and SHA512 support.
105111
WOLFSSH_NO_DH_GEX_SHA256
106112
Set when DH or SHA2-256 are disabled. Set to disable use of DH group
107113
exchange and SHA2-256 support.
@@ -690,6 +696,9 @@ static const char cannedKexAlgoNames[] =
690696
#if !defined(WOLFSSH_NO_DH_GROUP14_SHA256)
691697
"diffie-hellman-group14-sha256,"
692698
#endif
699+
#if !defined(WOLFSSH_NO_DH_GROUP16_SHA512)
700+
"diffie-hellman-group16-sha512,"
701+
#endif
693702
#if !defined(WOLFSSH_NO_DH_GEX_SHA256)
694703
"diffie-hellman-group-exchange-sha256,"
695704
#endif
@@ -797,6 +806,9 @@ static const char cannedMacAlgoNames[] =
797806
#if !defined(WOLFSSH_NO_HMAC_SHA2_256)
798807
"hmac-sha2-256,"
799808
#endif
809+
#if !defined(WOLFSSH_NO_HMAC_SHA2_512)
810+
"hmac-sha2-512,"
811+
#endif
800812
#if defined(WOLFSSH_NO_SHA1_SOFT_DISABLE)
801813
#if !defined(WOLFSSH_NO_HMAC_SHA1_96)
802814
"hmac-sha1-96,"
@@ -2445,6 +2457,9 @@ static const NameIdPair NameIdMap[] = {
24452457
#ifndef WOLFSSH_NO_HMAC_SHA2_256
24462458
{ ID_HMAC_SHA2_256, TYPE_MAC, "hmac-sha2-256" },
24472459
#endif
2460+
#ifndef WOLFSSH_NO_HMAC_SHA2_512
2461+
{ ID_HMAC_SHA2_512, TYPE_MAC, "hmac-sha2-512" },
2462+
#endif
24482463

24492464
/* Key Exchange IDs */
24502465
#ifndef WOLFSSH_NO_DH_GROUP1_SHA1
@@ -2456,6 +2471,9 @@ static const NameIdPair NameIdMap[] = {
24562471
#ifndef WOLFSSH_NO_DH_GROUP14_SHA256
24572472
{ ID_DH_GROUP14_SHA256, TYPE_KEX, "diffie-hellman-group14-sha256" },
24582473
#endif
2474+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
2475+
{ ID_DH_GROUP16_SHA512, TYPE_KEX, "diffie-hellman-group16-sha512" },
2476+
#endif
24592477
#ifndef WOLFSSH_NO_DH_GEX_SHA256
24602478
{ ID_DH_GEX_SHA256, TYPE_KEX, "diffie-hellman-group-exchange-sha256" },
24612479
#endif
@@ -3625,6 +3643,10 @@ static INLINE byte MacSzForId(byte id)
36253643
#ifndef WOLFSSH_NO_HMAC_SHA2_256
36263644
case ID_HMAC_SHA2_256:
36273645
return WC_SHA256_DIGEST_SIZE;
3646+
#endif
3647+
#ifndef WOLFSSH_NO_HMAC_SHA2_512
3648+
case ID_HMAC_SHA2_512:
3649+
return WC_SHA512_DIGEST_SIZE;
36283650
#endif
36293651
default:
36303652
return 0;
@@ -3647,6 +3669,10 @@ static INLINE byte KeySzForId(byte id)
36473669
case ID_HMAC_SHA2_256:
36483670
return WC_SHA256_DIGEST_SIZE;
36493671
#endif
3672+
#ifndef WOLFSSH_NO_HMAC_SHA2_512
3673+
case ID_HMAC_SHA2_512:
3674+
return WC_SHA512_DIGEST_SIZE;
3675+
#endif
36503676
#ifndef WOLFSSH_NO_AES_CBC
36513677
case ID_AES128_CBC:
36523678
return AES_128_KEY_SIZE;
@@ -3759,6 +3785,10 @@ enum wc_HashType HashForId(byte id)
37593785
#endif
37603786
return WC_HASH_TYPE_SHA512;
37613787
#endif
3788+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
3789+
case ID_DH_GROUP16_SHA512:
3790+
return WC_HASH_TYPE_SHA512;
3791+
#endif
37623792
#ifndef WOLFSSH_NO_RSA_SHA2_512
37633793
case ID_RSA_SHA2_512:
37643794
return WC_HASH_TYPE_SHA512;
@@ -4349,6 +4379,76 @@ static const byte dhPrimeGroup14[] = {
43494379
static const word32 dhPrimeGroup14Sz = (word32)sizeof(dhPrimeGroup14);
43504380
#endif
43514381

4382+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
4383+
static const byte dhPrimeGroup16[] = {
4384+
/* SSH DH Group 16 (Oakley Group 16, 4096-bit MODP Group, RFC 3526) */
4385+
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
4386+
0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34,
4387+
0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
4388+
0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74,
4389+
0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22,
4390+
0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
4391+
0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B,
4392+
0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37,
4393+
0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
4394+
0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6,
4395+
0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B,
4396+
0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
4397+
0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5,
4398+
0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6,
4399+
0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,
4400+
0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05,
4401+
0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A,
4402+
0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,
4403+
0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96,
4404+
0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB,
4405+
0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,
4406+
0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04,
4407+
0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C,
4408+
0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,
4409+
0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03,
4410+
0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F,
4411+
0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,
4412+
0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18,
4413+
0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5,
4414+
0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,
4415+
0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D,
4416+
0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33,
4417+
0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,
4418+
0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A,
4419+
0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D,
4420+
0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,
4421+
0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7,
4422+
0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D,
4423+
0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,
4424+
0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64,
4425+
0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64,
4426+
0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,
4427+
0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C,
4428+
0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2,
4429+
0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,
4430+
0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E,
4431+
0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01,
4432+
0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,
4433+
0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26,
4434+
0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C,
4435+
0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,
4436+
0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8,
4437+
0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9,
4438+
0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,
4439+
0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D,
4440+
0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2,
4441+
0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,
4442+
0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF,
4443+
0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C,
4444+
0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,
4445+
0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1,
4446+
0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F,
4447+
0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,
4448+
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
4449+
};
4450+
static const word32 dhPrimeGroup16Sz = (word32)sizeof(dhPrimeGroup16);
4451+
#endif
43524452

43534453
static int DoKexDhInit(WOLFSSH* ssh, byte* buf, word32 len, word32* idx)
43544454
{
@@ -9249,6 +9349,27 @@ static INLINE int CreateMac(WOLFSSH* ssh, const byte* in, word32 inSz,
92499349
}
92509350
break;
92519351

9352+
#ifndef WOLFSSH_NO_HMAC_SHA2_512
9353+
case ID_HMAC_SHA2_512:
9354+
{
9355+
Hmac hmac;
9356+
9357+
ret = wc_HmacInit(&hmac, ssh->ctx->heap, INVALID_DEVID);
9358+
if (ret == WS_SUCCESS)
9359+
ret = wc_HmacSetKey(&hmac, WC_SHA512,
9360+
ssh->keys.macKey,
9361+
ssh->keys.macKeySz);
9362+
if (ret == WS_SUCCESS)
9363+
ret = wc_HmacUpdate(&hmac, flatSeq, sizeof(flatSeq));
9364+
if (ret == WS_SUCCESS)
9365+
ret = wc_HmacUpdate(&hmac, in, inSz);
9366+
if (ret == WS_SUCCESS)
9367+
ret = wc_HmacFinal(&hmac, mac);
9368+
wc_HmacFree(&hmac);
9369+
}
9370+
break;
9371+
#endif
9372+
92529373
default:
92539374
WLOG(WS_LOG_DEBUG, "Invalid Mac ID");
92549375
ret = WS_FATAL_ERROR;
@@ -9311,6 +9432,19 @@ static INLINE int VerifyMac(WOLFSSH* ssh, const byte* in, word32 inSz,
93119432
ret = WS_VERIFY_MAC_E;
93129433
break;
93139434

9435+
case ID_HMAC_SHA2_512:
9436+
ret = wc_HmacSetKey(&hmac, WC_SHA512, ssh->peerKeys.macKey,
9437+
ssh->peerKeys.macKeySz);
9438+
if (ret == WS_SUCCESS)
9439+
ret = wc_HmacUpdate(&hmac, flatSeq, sizeof(flatSeq));
9440+
if (ret == WS_SUCCESS)
9441+
ret = wc_HmacUpdate(&hmac, in, inSz);
9442+
if (ret == WS_SUCCESS)
9443+
ret = wc_HmacFinal(&hmac, checkMac);
9444+
if (ConstantCompare(checkMac, mac, ssh->peerMacSz) != 0)
9445+
ret = WS_VERIFY_MAC_E;
9446+
break;
9447+
93149448
default:
93159449
ret = WS_INVALID_ALGO_ID;
93169450
}
@@ -10077,6 +10211,8 @@ struct wolfSSH_sigKeyBlockFull {
1007710211
/* Size of Kyber public key (bigger than ciphertext) and some extra for the
1007810212
* ECC hybrid component. */
1007910213
#define KEX_F_SIZE 1024
10214+
#elif !defined(WOLFSSH_NO_DH_GROUP16_SHA512)
10215+
#define KEX_F_SIZE (512 + 1)
1008010216
#else
1008110217
#define KEX_F_SIZE (256 + 1)
1008210218
#endif
@@ -10216,6 +10352,14 @@ static int GetDHPrimeGroup(int kexId, const byte** primeGroup,
1021610352
*generatorSz = dhGeneratorSz;
1021710353
break;
1021810354
#endif
10355+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
10356+
case ID_DH_GROUP16_SHA512:
10357+
*primeGroup = dhPrimeGroup16;
10358+
*primeGroupSz = dhPrimeGroup16Sz;
10359+
*generator = dhGenerator;
10360+
*generatorSz = dhGeneratorSz;
10361+
break;
10362+
#endif
1021910363
#ifndef WOLFSSH_NO_DH_GEX_SHA256
1022010364
case ID_DH_GEX_SHA256:
1022110365
*primeGroup = dhPrimeGroup14;
@@ -11500,6 +11644,12 @@ int SendKexDhReply(WOLFSSH* ssh)
1150011644
msgId = MSGID_KEXDH_REPLY;
1150111645
break;
1150211646
#endif
11647+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
11648+
case ID_DH_GROUP16_SHA512:
11649+
useDh = 1;
11650+
msgId = MSGID_KEXDH_REPLY;
11651+
break;
11652+
#endif
1150311653
#ifndef WOLFSSH_NO_DH_GEX_SHA256
1150411654
case ID_DH_GEX_SHA256:
1150511655
useDh = 1;
@@ -12069,6 +12219,15 @@ int SendKexDhInit(WOLFSSH* ssh)
1206912219
generatorSz = dhGeneratorSz;
1207012220
break;
1207112221
#endif
12222+
#ifndef WOLFSSH_NO_DH_GROUP16_SHA512
12223+
case ID_DH_GROUP16_SHA512:
12224+
ssh->handshake->useDh = 1;
12225+
primeGroup = dhPrimeGroup16;
12226+
primeGroupSz = dhPrimeGroup16Sz;
12227+
generator = dhGenerator;
12228+
generatorSz = dhGeneratorSz;
12229+
break;
12230+
#endif
1207212231
#ifndef WOLFSSH_NO_DH_GEX_SHA256
1207312232
case ID_DH_GEX_SHA256:
1207412233
ssh->handshake->useDh = 1;

src/io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ int wsEmbedSend(WOLFSSH* ssh, void* data, word32 sz, void* ctx)
428428
return WS_CBIO_ERR_CONN_CLOSE;
429429
}
430430
else {
431-
WLOG(WS_LOG_DEBUG," General error");
431+
WLOG(WS_LOG_DEBUG," General error %d", err);
432432
return WS_CBIO_ERR_GENERAL;
433433
}
434434
}

src/ssh.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2921,6 +2921,9 @@ static const char* MacNameForId(byte macid, byte cipherid)
29212921

29222922
case ID_HMAC_SHA2_256:
29232923
return "HMAC-SHA-256";
2924+
2925+
case ID_HMAC_SHA2_512:
2926+
return "HMAC-SHA-512";
29242927
}
29252928
}
29262929
else {
@@ -3010,6 +3013,11 @@ size_t wolfSSH_GetText(WOLFSSH *ssh, WS_Text id, char *str, size_t strSz)
30103013
ssh->primeGroupSz*8, 14);
30113014
break;
30123015

3016+
case ID_DH_GROUP16_SHA512:
3017+
ret = WSNPRINTF(str, strSz, standard_dh_format,
3018+
ssh->primeGroupSz*8, 16);
3019+
break;
3020+
30133021
case ID_DH_GEX_SHA256:
30143022
ret = WSNPRINTF(str, strSz,
30153023
"%d-bit Diffie-Hellman with server-supplied group",

0 commit comments

Comments
 (0)