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_ECDH_KEX_SUPPORT == ENABLED && SSH_CURVE25519_SUPPORT == ENABLED && \
70 SSH_SHA256_SUPPORT == ENABLED)
72 "curve25519-sha256@libssh.org",
74 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_CURVE448_SUPPORT == ENABLED && \
75 SSH_SHA512_SUPPORT == ENABLED)
78 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
79 SSH_SHA256_SUPPORT == ENABLED)
82 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
83 SSH_SHA384_SUPPORT == ENABLED)
86 #if (SSH_ECDH_KEX_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
87 SSH_SHA512_SUPPORT == ENABLED)
90 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
91 "diffie-hellman-group-exchange-sha256",
93 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA384_SUPPORT == ENABLED)
94 "diffie-hellman-group-exchange-sha384@ssh.com",
96 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
97 "diffie-hellman-group-exchange-sha512@ssh.com",
99 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
100 SSH_MAX_DH_MODULUS_SIZE >= 2048 && SSH_MIN_DH_MODULUS_SIZE <= 2048)
101 "diffie-hellman-group14-sha256",
103 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
104 SSH_MAX_DH_MODULUS_SIZE >= 3072 && SSH_MIN_DH_MODULUS_SIZE <= 3072)
105 "diffie-hellman-group15-sha512",
107 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
108 SSH_MAX_DH_MODULUS_SIZE >= 4096 && SSH_MIN_DH_MODULUS_SIZE <= 4096)
109 "diffie-hellman-group16-sha512",
111 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
112 SSH_MAX_DH_MODULUS_SIZE >= 6144 && SSH_MIN_DH_MODULUS_SIZE <= 6144)
113 "diffie-hellman-group17-sha512",
115 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
116 SSH_MAX_DH_MODULUS_SIZE >= 8192 && SSH_MIN_DH_MODULUS_SIZE <= 8192)
117 "diffie-hellman-group18-sha512",
119 #if (SSH_RSA_KEX_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
120 SSH_MAX_RSA_MODULUS_SIZE >= 2048)
123 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA224_SUPPORT == ENABLED)
124 "diffie-hellman-group-exchange-sha224@ssh.com",
126 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
127 "diffie-hellman-group-exchange-sha1",
129 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
130 SSH_MAX_DH_MODULUS_SIZE >= 2048 && SSH_MIN_DH_MODULUS_SIZE <= 2048)
131 "diffie-hellman-group14-sha1",
133 #if (SSH_DH_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
134 SSH_MAX_DH_MODULUS_SIZE >= 1024 && SSH_MIN_DH_MODULUS_SIZE <= 1024)
135 "diffie-hellman-group1-sha1",
137 #if (SSH_RSA_KEX_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
138 SSH_MAX_RSA_MODULUS_SIZE >= 1024)
150 #if (SSH_ED25519_SIGN_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
157 "ssh-ed25519-cert-v01@openssh.com",
158 "ssh-ed25519-cert-v01@openssh.com",
162 #if (SSH_ED25519_SIGN_SUPPORT == ENABLED)
169 #if (SSH_ED448_SIGN_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
176 #if (SSH_ED448_SIGN_SUPPORT == ENABLED)
183 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
184 SSH_SHA256_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
186 "ecdsa-sha2-nistp256-cert",
187 "ecdsa-sha2-nistp256-cert",
188 "ecdsa-sha2-nistp256"
191 "ecdsa-sha2-nistp256-cert-v01@openssh.com",
192 "ecdsa-sha2-nistp256-cert-v01@openssh.com",
193 "ecdsa-sha2-nistp256"
196 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP256_SUPPORT == ENABLED && \
197 SSH_SHA256_SUPPORT == ENABLED)
199 "ecdsa-sha2-nistp256",
200 "ecdsa-sha2-nistp256",
201 "ecdsa-sha2-nistp256"
204 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
205 SSH_SHA384_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
207 "ecdsa-sha2-nistp384-cert",
208 "ecdsa-sha2-nistp384-cert",
209 "ecdsa-sha2-nistp384"
212 "ecdsa-sha2-nistp384-cert-v01@openssh.com",
213 "ecdsa-sha2-nistp384-cert-v01@openssh.com",
214 "ecdsa-sha2-nistp384"
217 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP384_SUPPORT == ENABLED && \
218 SSH_SHA384_SUPPORT == ENABLED)
220 "ecdsa-sha2-nistp384",
221 "ecdsa-sha2-nistp384",
222 "ecdsa-sha2-nistp384"
225 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
226 SSH_SHA512_SUPPORT == ENABLED && SSH_CERT_SUPPORT == ENABLED)
228 "ecdsa-sha2-nistp521-cert",
229 "ecdsa-sha2-nistp521-cert",
230 "ecdsa-sha2-nistp521"
233 "ecdsa-sha2-nistp521-cert-v01@openssh.com",
234 "ecdsa-sha2-nistp521-cert-v01@openssh.com",
235 "ecdsa-sha2-nistp521"
238 #if (SSH_ECDSA_SIGN_SUPPORT == ENABLED && SSH_NISTP521_SUPPORT == ENABLED && \
239 SSH_SHA512_SUPPORT == ENABLED)
241 "ecdsa-sha2-nistp521",
242 "ecdsa-sha2-nistp521",
243 "ecdsa-sha2-nistp521"
246 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
247 SSH_CERT_SUPPORT == ENABLED)
249 "rsa-sha2-256-cert-v01@openssh.com",
250 "ssh-rsa-cert-v01@openssh.com",
254 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
261 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
262 SSH_CERT_SUPPORT == ENABLED)
264 "rsa-sha2-512-cert-v01@openssh.com",
265 "ssh-rsa-cert-v01@openssh.com",
269 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
276 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
277 SSH_CERT_SUPPORT == ENABLED)
284 "ssh-rsa-cert-v01@openssh.com",
285 "ssh-rsa-cert-v01@openssh.com",
289 #if (SSH_RSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
296 #if (SSH_DSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
297 SSH_CERT_SUPPORT == ENABLED)
304 "ssh-dss-cert-v01@openssh.com",
305 "ssh-dss-cert-v01@openssh.com",
309 #if (SSH_DSA_SIGN_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
323 static const char_t *
const sshSupportedEncAlgos[] =
325 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
327 "chacha20-poly1305@openssh.com",
329 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED)
331 "aes128-gcm@openssh.com",
333 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED)
335 "aes256-gcm@openssh.com",
337 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
340 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
343 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
344 "AEAD_CAMELLIA_128_GCM",
346 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
347 "AEAD_CAMELLIA_256_GCM",
349 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
352 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
355 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
358 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
361 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
364 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
367 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
370 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
373 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
376 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
379 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
382 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
385 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
388 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
391 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
394 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
397 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
400 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
404 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
407 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
410 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
413 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
416 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
419 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
422 #if (SSH_SEED_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
425 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
428 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
431 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
434 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
437 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
440 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
443 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED)
446 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED)
449 #if (SSH_RC4_256_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
452 #if (SSH_RC4_128_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
455 #if (SSH_RC4_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED)
465 static const char_t *
const sshSupportedMacAlgos[] =
467 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \
468 SSH_ETM_SUPPORT == ENABLED)
469 "hmac-sha2-256-etm@openssh.com",
471 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED)
474 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \
475 SSH_ETM_SUPPORT == ENABLED)
476 "hmac-sha2-512-etm@openssh.com",
478 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED)
481 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \
482 SSH_ETM_SUPPORT == ENABLED)
483 "hmac-sha1-etm@openssh.com",
485 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED)
488 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED && \
489 SSH_ETM_SUPPORT == ENABLED)
490 "hmac-ripemd160-etm@openssh.com",
492 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED)
494 "hmac-ripemd160@openssh.com",
496 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED && \
497 SSH_ETM_SUPPORT == ENABLED)
498 "hmac-md5-etm@openssh.com",
500 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED)
503 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED && \
504 SSH_ETM_SUPPORT == ENABLED)
505 "hmac-sha1-96-etm@openssh.com",
507 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED)
510 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED && \
511 SSH_ETM_SUPPORT == ENABLED)
512 "hmac-md5-96-etm@openssh.com",
514 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED)
517 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
520 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
523 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
524 "AEAD_CAMELLIA_128_GCM",
526 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED)
527 "AEAD_CAMELLIA_256_GCM",
537 static const char_t *
const sshSupportedCompressionAlgos[] =
560 n =
sizeof(uint32_t);
563 for(i = 0; i <
arraysize(sshSupportedKexAlgos); i++)
568 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
576 sshSupportedKexAlgos[i]) >= 0)
583 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED)
608 if(
n !=
sizeof(uint32_t))
621 #if (SSH_EXT_INFO_SUPPORT == ENABLED)
626 if(!connection->newKeysSent)
628 const char_t *indicatorName;
631 if(
n !=
sizeof(uint32_t))
641 indicatorName =
"ext-info-c";
645 indicatorName =
"ext-info-s";
656 #if (SSH_KEX_STRICT_SUPPORT == ENABLED)
659 if(!connection->newKeysSent)
661 const char_t *indicatorName;
664 if(
n !=
sizeof(uint32_t))
674 indicatorName =
"kex-strict-c-v00@openssh.com";
678 indicatorName =
"kex-strict-s-v00@openssh.com";
717 n =
sizeof(uint32_t);
720 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos); i++)
723 entry = &sshSupportedHostKeyAlgos[i];
732 if(
n !=
sizeof(uint32_t))
786 arraysize(sshSupportedMacAlgos) - 1,
p, written);
804 arraysize(sshSupportedCompressionAlgos),
p, written);
825 n =
sizeof(uint32_t);
828 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos); i++)
831 entry = &sshSupportedHostKeyAlgos[i];
834 if(
n !=
sizeof(uint32_t))
867 const char_t *
const *supportedAlgoList,
uint_t supportedAlgoListLen)
872 const char_t *selectedAlgo;
881 for(i = 0; i < supportedAlgoListLen && selectedAlgo == NULL; i++)
884 for(j = 0; selectedAlgo == NULL; j++)
894 selectedAlgo = supportedAlgoList[i];
908 for(j = 0; selectedAlgo == NULL; j++)
914 for(i = 0; i < supportedAlgoListLen && selectedAlgo == NULL; i++)
921 selectedAlgo = supportedAlgoList[i];
951 const char_t *selectedAlgo;
960 for(i = 0; i <
arraysize(sshSupportedKexAlgos) &&
961 selectedAlgo == NULL; i++)
964 for(j = 0; selectedAlgo == NULL; j++)
974 selectedAlgo = sshSupportedKexAlgos[i];
988 for(j = 0; selectedAlgo == NULL; j++)
994 for(i = 0; i <
arraysize(sshSupportedKexAlgos) &&
995 selectedAlgo == NULL; i++)
1000 #if (SSH_RSA_KEX_SUPPORT == ENABLED)
1007 sshSupportedKexAlgos[i]) >= 0)
1009 selectedAlgo = sshSupportedKexAlgos[i];
1014 #if (SSH_DH_GEX_KEX_SUPPORT == ENABLED)
1025 selectedAlgo = sshSupportedKexAlgos[i];
1033 selectedAlgo = sshSupportedKexAlgos[i];
1046 #if (SSH_EXT_INFO_SUPPORT == ENABLED)
1051 if(!connection->newKeysSent)
1053 const char_t *indicatorName;
1060 indicatorName =
"ext-info-s";
1064 indicatorName =
"ext-info-c";
1070 connection->extInfoReceived =
TRUE;
1074 connection->extInfoReceived =
FALSE;
1079 #if (SSH_KEX_STRICT_SUPPORT == ENABLED)
1082 if(!connection->newKeysSent)
1084 const char_t *indicatorName;
1091 indicatorName =
"kex-strict-s-v00@openssh.com";
1095 indicatorName =
"kex-strict-c-v00@openssh.com";
1101 connection->kexStrictReceived =
TRUE;
1105 connection->kexStrictReceived =
FALSE;
1111 return selectedAlgo;
1128 const char_t *selectedAlgo;
1132 selectedAlgo = NULL;
1138 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1139 selectedAlgo == NULL; i++)
1142 entry = &sshSupportedHostKeyAlgos[i];
1145 for(j = 0; selectedAlgo == NULL; j++)
1169 for(j = 0; selectedAlgo == NULL; j++)
1175 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1176 selectedAlgo == NULL; i++)
1179 entry = &sshSupportedHostKeyAlgos[i];
1203 return selectedAlgo;
1219 return sshSelectAlgo(context, peerAlgoList, sshSupportedEncAlgos,
1235 const char_t *selectedAlgo;
1237 #if (SSH_GCM_CIPHER_SUPPORT == ENABLED || SSH_CHACHA20_POLY1305_SUPPORT == ENABLED)
1247 selectedAlgo = sshSupportedMacAlgos[
arraysize(sshSupportedMacAlgos) - 1];
1251 #if (SSH_RFC5647_SUPPORT == ENABLED)
1260 selectedAlgo = encAlgo;
1268 selectedAlgo =
sshSelectAlgo(context, peerAlgoList, sshSupportedMacAlgos,
1273 return selectedAlgo;
1289 return sshSelectAlgo(context, peerAlgoList, sshSupportedCompressionAlgos,
1290 arraysize(sshSupportedCompressionAlgos));
1309 const char_t *selectedAlgo;
1313 selectedAlgo = NULL;
1316 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1317 selectedAlgo == NULL; i++)
1320 entry = &sshSupportedHostKeyAlgos[i];
1326 if(peerAlgoList != NULL)
1329 for(j = 0; selectedAlgo == NULL; j++)
1357 return selectedAlgo;
1370 const char_t *keyFormatId;
1377 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1378 keyFormatId == NULL; i++)
1381 entry = &sshSupportedHostKeyAlgos[i];
1404 const char_t *signFormatId;
1408 signFormatId = NULL;
1411 for(i = 0; i <
arraysize(sshSupportedHostKeyAlgos) &&
1412 signFormatId == NULL; i++)
1415 entry = &sshSupportedHostKeyAlgos[i];
1425 return signFormatId;
1447 correct =
sshGetName(kexAlgoList, 0, &preferredKexAlgo);
1453 correct =
sshGetName(hostKeyAlgoList, 0, &preferredHostKeyAlgo);
1463 !
sshCompareString(&preferredHostKeyAlgo, sshSupportedHostKeyAlgos[0].publicKeyAlgo))
1530 if(
sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha1") ||
1531 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha256") ||
1532 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha224@ssh.com") ||
1533 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha384@ssh.com") ||
1534 sshCompareAlgo(kexAlgo,
"diffie-hellman-group-exchange-sha512@ssh.com"))
1634 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp256-cert-v01@openssh.com") ||
1635 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp384-cert-v01@openssh.com") ||
1636 sshCompareString(publicKeyAlgo,
"ecdsa-sha2-nistp521-cert-v01@openssh.com") ||
const char_t * sshSelectEncAlgo(SshContext *context, const SshNameList *peerAlgoList)
Encryption algorithm negotiation.
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.
bool_t sshIsMlkemKexAlgo(const char_t *kexAlgo)
Test if the specified algorithm is an ML-KEM key exchange 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.