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.
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[] = {
43494379static 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
43534453static 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 ;
0 commit comments