33#elif defined(HAVE_LIBMBEDCRYPTO)
34#include <mbedtls/gcm.h>
36#include "libssh/wrapper.h"
45#ifdef HAVE_OPENSSL_ECDH_H
46#include <openssl/ecdh.h>
48#include "libssh/curve25519.h"
50#include "libssh/ecdh.h"
51#include "libssh/kex.h"
52#include "libssh/sntrup761.h"
54#define DIGEST_MAX_LEN 64
56#define AES_GCM_TAGLEN 16
57#define AES_GCM_IVLEN 12
59enum ssh_key_exchange_e {
61 SSH_KEX_DH_GROUP1_SHA1 = 1,
63 SSH_KEX_DH_GROUP14_SHA1,
68 SSH_KEX_DH_GEX_SHA256,
71 SSH_KEX_ECDH_SHA2_NISTP256,
73 SSH_KEX_ECDH_SHA2_NISTP384,
75 SSH_KEX_ECDH_SHA2_NISTP521,
77 SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG,
79 SSH_KEX_CURVE25519_SHA256,
81 SSH_KEX_DH_GROUP16_SHA512,
83 SSH_KEX_DH_GROUP18_SHA512,
85 SSH_KEX_DH_GROUP14_SHA256,
87 SSH_KEX_SNTRUP761X25519_SHA512_OPENSSH_COM,
89 SSH_KEX_SNTRUP761X25519_SHA512,
91 SSH_KEX_MLKEM768X25519_SHA256,
93 SSH_KEX_MLKEM768NISTP256_SHA256,
96 SSH_KEX_MLKEM1024NISTP384_SHA384,
99 SSH_GSS_KEX_DH_GROUP14_SHA256,
101 SSH_GSS_KEX_DH_GROUP16_SHA512,
103 SSH_GSS_KEX_ECDH_NISTP256_SHA256,
105 SSH_GSS_KEX_CURVE25519_SHA256,
122 SSH_AEAD_CHACHA20_POLY1305
127struct ssh_crypto_struct {
128 bignum shared_secret;
129 ssh_string hybrid_client_init;
130 ssh_string hybrid_server_reply;
131 ssh_string hybrid_shared_secret;
132 struct dh_ctx *dh_ctx;
134 size_t dh_pmin;
size_t dh_pn;
size_t dh_pmax;
137#ifdef HAVE_OPENSSL_ECC
138#if OPENSSL_VERSION_NUMBER < 0x30000000L
139 EC_KEY *ecdh_privkey;
141 EVP_PKEY *ecdh_privkey;
143#elif defined HAVE_GCRYPT_ECC
144 gcry_sexp_t ecdh_privkey;
145#elif defined HAVE_LIBMBEDCRYPTO
146 mbedtls_ecp_keypair *ecdh_privkey;
148 ssh_string ecdh_client_pubkey;
149 ssh_string ecdh_server_pubkey;
151#ifdef HAVE_CURVE25519
153 EVP_PKEY *curve25519_privkey;
154#elif defined(HAVE_GCRYPT_CURVE25519)
155 gcry_sexp_t curve25519_privkey;
157 ssh_curve25519_privkey curve25519_privkey;
159 ssh_curve25519_pubkey curve25519_client_pubkey;
160 ssh_curve25519_pubkey curve25519_server_pubkey;
162#ifdef HAVE_OPENSSL_MLKEM
163 EVP_PKEY *mlkem_privkey;
165 unsigned char *mlkem_privkey;
166 size_t mlkem_privkey_len;
168 ssh_string mlkem_client_pubkey;
169 ssh_string mlkem_ciphertext;
171 ssh_sntrup761_privkey sntrup761_privkey;
172 ssh_sntrup761_pubkey sntrup761_client_pubkey;
173 ssh_sntrup761_ciphertext sntrup761_ciphertext;
175 ssh_string dh_server_signature;
176 size_t session_id_len;
177 unsigned char *session_id;
179 unsigned char *secret_hash;
180 unsigned char *encryptIV;
181 unsigned char *decryptIV;
182 unsigned char *decryptkey;
183 unsigned char *encryptkey;
184 unsigned char *encryptMAC;
185 unsigned char *decryptMAC;
186 unsigned char hmacbuf[DIGEST_MAX_LEN];
187 struct ssh_cipher_struct *in_cipher, *out_cipher;
188 enum ssh_hmac_e in_hmac, out_hmac;
189 bool in_hmac_etm, out_hmac_etm;
191 ssh_key server_pubkey;
194 int delayed_compress_in;
195 int delayed_compress_out;
196 void *compress_out_ctx;
197 void *compress_in_ctx;
199 struct ssh_kex_struct server_kex;
200 struct ssh_kex_struct client_kex;
201 char *kex_methods[SSH_KEX_METHODS];
202 enum ssh_key_exchange_e kex_type;
203 enum ssh_kdf_digest digest_type;
204 enum ssh_crypto_direction_e used;
207struct ssh_cipher_struct {
209 unsigned int blocksize;
210 enum ssh_cipher_e ciphertype;
211 uint32_t lenfield_blocksize;
214 gcry_cipher_hd_t *key;
215 unsigned char last_iv[AES_GCM_IVLEN];
216#elif defined HAVE_LIBCRYPTO
217 struct ssh_3des_key_schedule *des3_key;
218 struct ssh_aes_key_schedule *aes_key;
219 const EVP_CIPHER *cipher;
221#elif defined HAVE_LIBMBEDCRYPTO
222 mbedtls_cipher_context_t encrypt_ctx;
223 mbedtls_cipher_context_t decrypt_ctx;
224 mbedtls_cipher_type_t type;
226 mbedtls_gcm_context gcm_ctx;
227 unsigned char last_iv[AES_GCM_IVLEN];
230 struct chacha20_poly1305_keysched *chacha20_schedule;
231 unsigned int keysize;
239 int (*set_encrypt_key)(
struct ssh_cipher_struct *cipher,
void *key,
void *IV);
240 int (*set_decrypt_key)(
struct ssh_cipher_struct *cipher,
void *key,
void *IV);
241 void (*encrypt)(
struct ssh_cipher_struct *cipher,
245 void (*decrypt)(
struct ssh_cipher_struct *cipher,
249 void (*aead_encrypt)(
struct ssh_cipher_struct *cipher,
void *in,
void *out,
250 size_t len, uint8_t *mac, uint64_t seq);
251 int (*aead_decrypt_length)(
struct ssh_cipher_struct *cipher,
void *in,
252 uint8_t *out,
size_t len, uint64_t seq);
253 int (*aead_decrypt)(
struct ssh_cipher_struct *cipher,
void *complete_packet, uint8_t *out,
254 size_t encrypted_size, uint64_t seq);
255 void (*cleanup)(
struct ssh_cipher_struct *cipher);
262const struct ssh_cipher_struct *ssh_get_chacha20poly1305_cipher(
void);
263int sshkdf_derive_key(
struct ssh_crypto_struct *crypto,
264 unsigned char *key,
size_t key_len,
265 uint8_t key_type,
unsigned char *output,
266 size_t requested_len);
268int secure_memcmp(
const void *s1,
const void *s2,
size_t n);
270void compress_cleanup(
struct ssh_crypto_struct *crypto);