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.