Go to the documentation of this file.
32 #define TRACE_LEVEL SSH_TRACE_LEVEL
43 #if (SSH_SUPPORT == ENABLED)
50 static const char_t *
const sshSupportedKexAlgos[] =
52 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_SNTRUP761_SUPPORT == ENABLED && \
53 SSH_CURVE25519_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
54 "sntrup761x25519-sha512",
55 "sntrup761x25519-sha512@openssh.com",
57 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_MLKEM768_SUPPORT == ENABLED && \
58 SSH_CURVE25519_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
59 "mlkem768x25519-sha256",
61 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_MLKEM768_SUPPORT == ENABLED && \
62 SSH_NISTP256_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
63 "mlkem768nistp256-sha256",
65 #if (SSH_HYBRID_KEX_SUPPORT == ENABLED && SSH_MLKEM1024_SUPPORT == ENABLED && \
66 SSH_NISTP384_SUPPORT == ENABLED && SSH_SHA384_SUPPORT == ENABLED)
67 "mlkem1024nistp384-sha384",
69 #if (SSH_KEM_KEX_SUPPORT == ENABLED && SSH_MLKEM512_SUPPORT == ENABLED && \
70 SSH_SHA256_SUPPORT == ENABLED)
73 #if (SSH_KEM_KEX_SUPPORT == ENABLED && SSH_MLKEM768_SUPPORT == ENABLED && \
74 SSH_SHA256_SUPPORT == ENABLED)
77 #if (SSH_KEM_KEX_SUPPORT == ENABLED && SSH_MLKEM1024_SUPPORT == ENABLED && \
78 SSH_SHA384_SUPPORT == ENABLED)
81 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_CURVE25519_SUPPORT == ENABLED && \
82 SSH_SHA256_SUPPORT == ENABLED)
84 "curve25519-sha256@libssh.org",
86 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_CURVE448_SUPPORT == ENABLED && \
87 SSH_SHA512_SUPPORT == ENABLED)
90 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
91 SSH_SHA256_SUPPORT == ENABLED)
94 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
95 SSH_SHA384_SUPPORT == ENABLED)
98 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
99 SSH_SHA512_SUPPORT == ENABLED)
100 "ecdh-sha2-nistp521",
102 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
103 "diffie-hellman-group-exchange-sha256",
105 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA384_SUPPORT == ENABLED)
106 "diffie-hellman-group-exchange-sha384@ssh.com",
108 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
109 "diffie-hellman-group-exchange-sha512@ssh.com",
111 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
112 SSH_MAX_DH_MODULUS_SIZE >= 2048 && SSH_MIN_DH_MODULUS_SIZE <= 2048)
113 "diffie-hellman-group14-sha256",
115 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
116 SSH_MAX_DH_MODULUS_SIZE >= 3072 && SSH_MIN_DH_MODULUS_SIZE <= 3072)
117 "diffie-hellman-group15-sha512",
119 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
120 SSH_MAX_DH_MODULUS_SIZE >= 4096 && SSH_MIN_DH_MODULUS_SIZE <= 4096)
121 "diffie-hellman-group16-sha512",
123 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
124 SSH_MAX_DH_MODULUS_SIZE >= 6144 && SSH_MIN_DH_MODULUS_SIZE <= 6144)
125 "diffie-hellman-group17-sha512",
127 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
128 SSH_MAX_DH_MODULUS_SIZE >= 8192 && SSH_MIN_DH_MODULUS_SIZE <= 8192)
129 "diffie-hellman-group18-sha512",
131 #if (SSH_RSA_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
132 SSH_MAX_RSA_MODULUS_SIZE >= 2048)
135 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA224_SUPPORT == ENABLED)
136 "diffie-hellman-group-exchange-sha224@ssh.com",
138 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
139 "diffie-hellman-group-exchange-sha1",
141 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
142 SSH_MAX_DH_MODULUS_SIZE >= 2048 && SSH_MIN_DH_MODULUS_SIZE <= 2048)
143 "diffie-hellman-group14-sha1",
145 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
146 SSH_MAX_DH_MODULUS_SIZE >= 1024 && SSH_MIN_DH_MODULUS_SIZE <= 1024)
147 "diffie-hellman-group1-sha1",
149 #if (SSH_RSA_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
150 SSH_MAX_RSA_MODULUS_SIZE >= 1024)
162 #if (SSH_ED25519_SIGN_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
169 "ssh-ed25519-cert-v01@openssh.com",
170 "ssh-ed25519-cert-v01@openssh.com",
174 #if (SSH_ED25519_SIGN_SUPPORT == ENABLED)
181 #if (SSH_ED448_SIGN_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
188 #if (SSH_ED448_SIGN_SUPPORT == ENABLED)
195 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
196 SSH_SHA256_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
198 "ecdsa-sha2-nistp256-cert",
199 "ecdsa-sha2-nistp256-cert",
200 "ecdsa-sha2-nistp256"
203 "ecdsa-sha2-nistp256-cert-v01@openssh.com",
204 "ecdsa-sha2-nistp256-cert-v01@openssh.com",
205 "ecdsa-sha2-nistp256"
208 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
209 SSH_SHA256_SUPPORT == ENABLED)
211 "ecdsa-sha2-nistp256",
212 "ecdsa-sha2-nistp256",
213 "ecdsa-sha2-nistp256"
216 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
217 SSH_SHA384_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
219 "ecdsa-sha2-nistp384-cert",
220 "ecdsa-sha2-nistp384-cert",
221 "ecdsa-sha2-nistp384"
224 "ecdsa-sha2-nistp384-cert-v01@openssh.com",
225 "ecdsa-sha2-nistp384-cert-v01@openssh.com",
226 "ecdsa-sha2-nistp384"
229 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
230 SSH_SHA384_SUPPORT == ENABLED)
232 "ecdsa-sha2-nistp384",
233 "ecdsa-sha2-nistp384",
234 "ecdsa-sha2-nistp384"
237 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
238 SSH_SHA512_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
240 "ecdsa-sha2-nistp521-cert",
241 "ecdsa-sha2-nistp521-cert",
242 "ecdsa-sha2-nistp521"
245 "ecdsa-sha2-nistp521-cert-v01@openssh.com",
246 "ecdsa-sha2-nistp521-cert-v01@openssh.com",
247 "ecdsa-sha2-nistp521"
250 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
251 SSH_SHA512_SUPPORT == ENABLED)
253 "ecdsa-sha2-nistp521",
254 "ecdsa-sha2-nistp521",
255 "ecdsa-sha2-nistp521"
258 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
259 SSH_CERT_SUPPORT == ENABLED)
266 "rsa-sha2-256-cert-v01@openssh.com",
267 "ssh-rsa-cert-v01@openssh.com",
271 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
278 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
279 SSH_CERT_SUPPORT == ENABLED)
286 "rsa-sha2-512-cert-v01@openssh.com",
287 "ssh-rsa-cert-v01@openssh.com",
291 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
298 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
299 SSH_CERT_SUPPORT == ENABLED)
306 "ssh-rsa-cert-v01@openssh.com",
307 "ssh-rsa-cert-v01@openssh.com",
311 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
318 #if (SSH_DSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
319 SSH_CERT_SUPPORT == ENABLED)
326 "ssh-dss-cert-v01@openssh.com",
327 "ssh-dss-cert-v01@openssh.com",
331 #if (SSH_DSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
345 static const char_t *
const sshSupportedEncAlgos[] =
347 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
349 "chacha20-poly1305@openssh.com",
351 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED)
353 "aes128-gcm@openssh.com",
355 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED)
357 "aes256-gcm@openssh.com",
359 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
362 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
365 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
366 "AEAD_CAMELLIA_128_GCM",
368 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
369 "AEAD_CAMELLIA_256_GCM",
371 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
374 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
377 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
380 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
383 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
386 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
389 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
392 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
395 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
398 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
401 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
404 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
407 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
410 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
413 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
416 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
419 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
422 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
426 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
429 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
432 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
435 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
438 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
441 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
444 #if (SSH_SEED_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
447 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
450 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
453 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
456 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
459 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
462 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
465 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
468 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
471 #if (SSH_RC4_256_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
474 #if (SSH_RC4_128_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
477 #if (SSH_RC4_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
487 static const char_t *
const sshSupportedMacAlgos[] =
489 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
490 SSH_ETM_SUPPORT == ENABLED)
491 "hmac-sha2-256-etm@openssh.com",
493 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
496 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
497 SSH_ETM_SUPPORT == ENABLED)
498 "hmac-sha2-512-etm@openssh.com",
500 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
503 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
504 SSH_ETM_SUPPORT == ENABLED)
505 "hmac-sha1-etm@openssh.com",
507 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
510 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED && \
511 SSH_ETM_SUPPORT == ENABLED)
512 "hmac-ripemd160-etm@openssh.com",
514 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED)
516 "hmac-ripemd160@openssh.com",
518 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED && \
519 SSH_ETM_SUPPORT == ENABLED)
520 "hmac-md5-etm@openssh.com",
522 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED)
525 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED && \
526 SSH_ETM_SUPPORT == ENABLED)
527 "hmac-sha1-96-etm@openssh.com",
529 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED)
532 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED && \
533 SSH_ETM_SUPPORT == ENABLED)
534 "hmac-md5-96-etm@openssh.com",
536 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED)
539 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
542 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
545 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
546 "AEAD_CAMELLIA_128_GCM",
548 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
549 "AEAD_CAMELLIA_256_GCM",
559 static const char_t *
const sshSupportedCompressionAlgos[] =
582 n =
sizeof(uint32_t);
585 for(i = 0; i <
arraysize(sshSupportedKexAlgos); i++)
590 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
598 sshSupportedKexAlgos[i]) >= 0)
605 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED)
630 if(
n !=
sizeof(uint32_t))
643 #if (SSH_EXT_INFO_SUPPORT == ENABLED)
648 if(!connection->newKeysSent)
650 const char_t *indicatorName;
653 if(
n !=
sizeof(uint32_t))
663 indicatorName =
"ext-info-c";
667 indicatorName =
"ext-info-s";
678 #if (SSH_KEX_STRICT_SUPPORT == ENABLED)
681 if(!connection->newKeysSent)
683 const char_t *indicatorName;
686 if(
n !=
sizeof(uint32_t))
696 indicatorName =
"kex-strict-c-v00@openssh.com";
700 indicatorName =
"kex-strict-s-v00@openssh.com";
739 n =
sizeof(uint32_t);
742 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos); i++)
745 entry = &sshSupportedHostKeyAlgos[i];
754 if(
n !=
sizeof(uint32_t))
808 arraysize(sshSupportedMacAlgos) - 1,
p, written);
826 arraysize(sshSupportedCompressionAlgos),
p, written);
847 n =
sizeof(uint32_t);
850 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos); i++)
853 entry = &sshSupportedHostKeyAlgos[i];
856 if(
n !=
sizeof(uint32_t))
889 const char_t *
const *supportedAlgoList,
uint_t supportedAlgoListLen)
894 const char_t *selectedAlgo;
903 for(i = 0; i < supportedAlgoListLen && selectedAlgo == NULL; i++)
906 for(j = 0; selectedAlgo == NULL; j++)
916 selectedAlgo = supportedAlgoList[i];
930 for(j = 0; selectedAlgo == NULL; j++)
936 for(i = 0; i < supportedAlgoListLen && selectedAlgo == NULL; i++)
943 selectedAlgo = supportedAlgoList[i];
973 const char_t *selectedAlgo;
982 for(i = 0; i <
arraysize(sshSupportedKexAlgos) &&
983 selectedAlgo == NULL; i++)
986 for(j = 0; selectedAlgo == NULL; j++)
996 selectedAlgo = sshSupportedKexAlgos[i];
1010 for(j = 0; selectedAlgo == NULL; j++)
1016 for(i = 0; i <
arraysize(sshSupportedKexAlgos) &&
1017 selectedAlgo == NULL; i++)
1022 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
1029 sshSupportedKexAlgos[i]) >= 0)
1031 selectedAlgo = sshSupportedKexAlgos[i];
1036 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED)
1047 selectedAlgo = sshSupportedKexAlgos[i];
1055 selectedAlgo = sshSupportedKexAlgos[i];
1068 #if (SSH_EXT_INFO_SUPPORT == ENABLED)
1073 if(!connection->newKeysSent)
1075 const char_t *indicatorName;
1082 indicatorName =
"ext-info-s";
1086 indicatorName =
"ext-info-c";
1092 connection->extInfoReceived =
TRUE;
1096 connection->extInfoReceived =
FALSE;
1101 #if (SSH_KEX_STRICT_SUPPORT == ENABLED)
1104 if(!connection->newKeysSent)
1106 const char_t *indicatorName;
1113 indicatorName =
"kex-strict-s-v00@openssh.com";
1117 indicatorName =
"kex-strict-c-v00@openssh.com";
1123 connection->kexStrictReceived =
TRUE;
1127 connection->kexStrictReceived =
FALSE;
1133 return selectedAlgo;
1150 const char_t *selectedAlgo;
1154 selectedAlgo = NULL;
1160 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1161 selectedAlgo == NULL; i++)
1164 entry = &sshSupportedHostKeyAlgos[i];
1167 for(j = 0; selectedAlgo == NULL; j++)
1191 for(j = 0; selectedAlgo == NULL; j++)
1197 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1198 selectedAlgo == NULL; i++)
1201 entry = &sshSupportedHostKeyAlgos[i];
1225 return selectedAlgo;
1241 return sshSelectAlgo(context, peerAlgoList, sshSupportedEncAlgos,
1257 const char_t *selectedAlgo;
1259 #if (SSH_GCM_CIPHER_SUPPORT == ENABLED || SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
1269 selectedAlgo = sshSupportedMacAlgos[
arraysize(sshSupportedMacAlgos) - 1];
1273 #if (SSH_RFC5647_SUPPORT == ENABLED)
1282 selectedAlgo = encAlgo;
1290 selectedAlgo =
sshSelectAlgo(context, peerAlgoList, sshSupportedMacAlgos,
1295 return selectedAlgo;
1311 return sshSelectAlgo(context, peerAlgoList, sshSupportedCompressionAlgos,
1312 arraysize(sshSupportedCompressionAlgos));
1331 const char_t *selectedAlgo;
1335 selectedAlgo = NULL;
1338 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1339 selectedAlgo == NULL; i++)
1342 entry = &sshSupportedHostKeyAlgos[i];
1348 if(peerAlgoList != NULL)
1351 for(j = 0; selectedAlgo == NULL; j++)
1379 return selectedAlgo;
1392 const char_t *keyFormatId;
1399 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1400 keyFormatId == NULL; i++)
1403 entry = &sshSupportedHostKeyAlgos[i];
1426 const char_t *signFormatId;
1430 signFormatId = NULL;
1433 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1434 signFormatId == NULL; i++)
1437 entry = &sshSupportedHostKeyAlgos[i];
1447 return signFormatId;
1469 correct =
sshGetName(kexAlgoList, 0, &preferredKexAlgo);
1475 correct =
sshGetName(hostKeyAlgoList, 0, &preferredHostKeyAlgo);
1485 !
sshCompareString(&preferredHostKeyAlgo, sshSupportedHostKeyAlgos[0].publicKeyAlgo))
1552 if(
sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha1") ||
1553 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha256") ||
1554 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha224@ssh.com") ||
1555 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha384@ssh.com") ||
1556 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha512@ssh.com"))
1656 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp256-cert-v01@openssh.com") ||
1658 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp384-cert-v01@openssh.com") ||
1660 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp521-cert-v01@openssh.com") ||
const char_t * sshSelectEncAlgo(SshContext *context, const SshNameList *peerAlgoList)
Encryption algorithm negotiation.
bool_t sshIsKemKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is an ML-KEM key exchange algorithm.
const char_t * publicKeyAlgo
Public key algorithm.
error_t sshFormatKexAlgoList(SshConnection *connection, uint8_t *p, size_t *written)
Format the list of key exchange algorithms.
bool_t sshGetName(const SshNameList *nameList, uint_t index, SshString *name)
Get the element at specified index.
error_t sshFormatNameList(const char_t *const nameList[], uint_t nameListLen, uint8_t *p, size_t *written)
Format a comma-separated list of names.
int_t sshSelectDhGexGroup(SshContext *context, uint32_t minDhModulusSize, uint32_t preferredDhModulusSize, uint32_t maxDhModulusSize)
Select a Diffie-Hellman group that best matches client's request.
bool_t sshIsDhKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is a Diffie-Hellman key exchange algorithm.
error_t sshFormatMacAlgoList(SshContext *context, uint8_t *p, size_t *written)
Format the list of integrity algorithms.
bool_t sshCompareString(const SshString *string, const char_t *value)
Compare a binary string against the supplied value.
const char_t * sshSelectPublicKeyAlgo(SshContext *context, const char_t *keyFormatId, const SshNameList *peerAlgoList)
Public key algorithm selection.
bool_t sshIsCertPublicKeyAlgo(const SshString *publicKeyAlgo)
Test if the specified public key algorithm is using certificates.
error_t sshFormatPublicKeyAlgoList(SshContext *context, uint8_t *p, size_t *written)
Format the list of public key algorithms.
const char_t * sshGetKeyFormatId(const SshString *publicKeyAlgo)
Get the key format identifier used by a given public key algorithm.
DH GEX (Diffie-Hellman Group Exchange) key exchange.
bool_t sshIsHybridKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is a PQ-hybrid key exchange algorithm.
bool_t sshIsDhGexKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is a DH GEX key exchange algorithm.
bool_t sshCompareAlgo(const char_t *name1, const char_t *name2)
Compare algorithm names.
String containing a comma-separated list of names.
@ SSH_OPERATION_MODE_SERVER
@ SSH_OPERATION_MODE_CLIENT
bool_t sshIsRsaKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is an RSA key exchange algorithm.
error_t sshFormatHostKeyAlgoList(SshContext *context, uint8_t *p, size_t *written)
Format the list of host key algorithms.
const char_t * sshSelectCompressionAlgo(SshContext *context, const SshNameList *peerAlgoList)
Compression algorithm negotiation.
const char_t * sshSelectKexAlgo(SshConnection *connection, const SshNameList *peerAlgoList)
Key exchange algorithm negotiation.
const char_t * keyFormatId
Key format identifier.
const char_t * sshSelectAlgo(SshContext *context, const SshNameList *peerAlgoList, const char_t *const *supportedAlgoList, uint_t supportedAlgoListLen)
Generic algorithm negotiation.
error_t sshFormatEncAlgoList(SshContext *context, uint8_t *p, size_t *written)
Format the list of encryption algorithms.
#define SSH_MAX_DH_MODULUS_SIZE
const char_t * sshSelectHostKeyAlgo(SshContext *context, const SshNameList *peerAlgoList)
Host key algorithm negotiation.
#define SSH_MIN_DH_MODULUS_SIZE
bool_t sshIsX509CertPublicKeyAlgo(const SshString *publicKeyAlgo)
Test if the specified public key algorithm is using X.509 certificates.
int_t sshSelectHostKey(SshContext *context, const char_t *hostKeyAlgo)
Select a host key that matches then specified algorithm.
int_t sshSelectTransientRsaKey(SshContext *context, const char_t *kexAlgo)
Select a transient RSA key.
bool_t sshIsEcdhKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is an ECDH key exchange algorithm.
int_t sshFindName(const SshNameList *nameList, const char_t *name)
Search a name list for a given name.
SSH algorithm negotiation.
bool_t sshIsGuessCorrect(SshContext *context, const SshNameList *kexAlgoList, const SshNameList *hostKeyAlgoList)
Check whether the other party's guess is correct.
const char_t * sshSelectMacAlgo(SshContext *context, const char_t *encAlgo, const SshNameList *peerAlgoList)
Integrity algorithm negotiation.
error_t sshFormatCompressionAlgoList(SshContext *context, uint8_t *p, size_t *written)
Format the list of compression algorithms.
const char_t * signFormatId
Signature format identifier.
#define SSH_PREFERRED_DH_MODULUS_SIZE
const char_t * sshGetSignFormatId(const SshString *publicKeyAlgo)
Get the signature format identifier used by a given public key algorithm.