version 1.68.2.2, 2005/03/10 17:15:04 |
version 1.69, 2004/06/21 17:36:31 |
|
|
|
|
#include <openssl/md5.h> |
#include <openssl/md5.h> |
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x00907000L |
|
extern const EVP_CIPHER *evp_rijndael(void); |
|
extern void ssh_rijndael_iv(EVP_CIPHER_CTX *, int, u_char *, u_int); |
|
#endif |
extern const EVP_CIPHER *evp_ssh1_bf(void); |
extern const EVP_CIPHER *evp_ssh1_bf(void); |
extern const EVP_CIPHER *evp_ssh1_3des(void); |
extern const EVP_CIPHER *evp_ssh1_3des(void); |
extern void ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int); |
extern void ssh1_3des_iv(EVP_CIPHER_CTX *, int, u_char *, int); |
|
|
u_int key_len; |
u_int key_len; |
const EVP_CIPHER *(*evptype)(void); |
const EVP_CIPHER *(*evptype)(void); |
} ciphers[] = { |
} ciphers[] = { |
{ "none", SSH_CIPHER_NONE, 8, 0, EVP_enc_null }, |
{ "none", SSH_CIPHER_NONE, 8, 0, EVP_enc_null }, |
{ "des", SSH_CIPHER_DES, 8, 8, EVP_des_cbc }, |
{ "des", SSH_CIPHER_DES, 8, 8, EVP_des_cbc }, |
{ "3des", SSH_CIPHER_3DES, 8, 16, evp_ssh1_3des }, |
{ "3des", SSH_CIPHER_3DES, 8, 16, evp_ssh1_3des }, |
{ "blowfish", SSH_CIPHER_BLOWFISH, 8, 32, evp_ssh1_bf }, |
{ "blowfish", SSH_CIPHER_BLOWFISH, 8, 32, evp_ssh1_bf }, |
|
|
{ "3des-cbc", SSH_CIPHER_SSH2, 8, 24, EVP_des_ede3_cbc }, |
{ "3des-cbc", SSH_CIPHER_SSH2, 8, 24, EVP_des_ede3_cbc }, |
{ "blowfish-cbc", SSH_CIPHER_SSH2, 8, 16, EVP_bf_cbc }, |
{ "blowfish-cbc", SSH_CIPHER_SSH2, 8, 16, EVP_bf_cbc }, |
{ "cast128-cbc", SSH_CIPHER_SSH2, 8, 16, EVP_cast5_cbc }, |
{ "cast128-cbc", SSH_CIPHER_SSH2, 8, 16, EVP_cast5_cbc }, |
{ "arcfour", SSH_CIPHER_SSH2, 8, 16, EVP_rc4 }, |
{ "arcfour", SSH_CIPHER_SSH2, 8, 16, EVP_rc4 }, |
|
#if OPENSSL_VERSION_NUMBER < 0x00907000L |
|
{ "aes128-cbc", SSH_CIPHER_SSH2, 16, 16, evp_rijndael }, |
|
{ "aes192-cbc", SSH_CIPHER_SSH2, 16, 24, evp_rijndael }, |
|
{ "aes256-cbc", SSH_CIPHER_SSH2, 16, 32, evp_rijndael }, |
|
{ "rijndael-cbc@lysator.liu.se", |
|
SSH_CIPHER_SSH2, 16, 32, evp_rijndael }, |
|
#else |
{ "aes128-cbc", SSH_CIPHER_SSH2, 16, 16, EVP_aes_128_cbc }, |
{ "aes128-cbc", SSH_CIPHER_SSH2, 16, 16, EVP_aes_128_cbc }, |
{ "aes192-cbc", SSH_CIPHER_SSH2, 16, 24, EVP_aes_192_cbc }, |
{ "aes192-cbc", SSH_CIPHER_SSH2, 16, 24, EVP_aes_192_cbc }, |
{ "aes256-cbc", SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc }, |
{ "aes256-cbc", SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc }, |
{ "rijndael-cbc@lysator.liu.se", |
{ "rijndael-cbc@lysator.liu.se", |
SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc }, |
SSH_CIPHER_SSH2, 16, 32, EVP_aes_256_cbc }, |
{ "aes128-ctr", SSH_CIPHER_SSH2, 16, 16, evp_aes_128_ctr }, |
#endif |
{ "aes192-ctr", SSH_CIPHER_SSH2, 16, 24, evp_aes_128_ctr }, |
{ "aes128-ctr", SSH_CIPHER_SSH2, 16, 16, evp_aes_128_ctr }, |
{ "aes256-ctr", SSH_CIPHER_SSH2, 16, 32, evp_aes_128_ctr }, |
{ "aes192-ctr", SSH_CIPHER_SSH2, 16, 24, evp_aes_128_ctr }, |
|
{ "aes256-ctr", SSH_CIPHER_SSH2, 16, 32, evp_aes_128_ctr }, |
{ "acss@openssh.org", SSH_CIPHER_SSH2, 16, 5, EVP_acss }, |
{ "acss@openssh.org", SSH_CIPHER_SSH2, 16, 5, EVP_acss }, |
|
|
{ NULL, SSH_CIPHER_INVALID, 0, 0, NULL } |
{ NULL, SSH_CIPHER_ILLEGAL, 0, 0, NULL } |
}; |
}; |
|
|
/*--*/ |
/*--*/ |
|
|
{ |
{ |
Cipher *c; |
Cipher *c; |
for (c = ciphers; c->name != NULL; c++) |
for (c = ciphers; c->name != NULL; c++) |
if (strcmp(c->name, name) == 0) |
if (strcasecmp(c->name, name) == 0) |
return c; |
return c; |
return NULL; |
return NULL; |
} |
} |
|
|
Cipher *c; |
Cipher *c; |
if (name == NULL) |
if (name == NULL) |
return -1; |
return -1; |
for (c = ciphers; c->name != NULL; c++) |
c = cipher_by_name(name); |
if (strcasecmp(c->name, name) == 0) |
return (c==NULL) ? -1 : c->number; |
return c->number; |
|
return -1; |
|
} |
} |
|
|
char * |
char * |
|
|
if (evplen != len) |
if (evplen != len) |
fatal("%s: wrong iv length %d != %d", __func__, |
fatal("%s: wrong iv length %d != %d", __func__, |
evplen, len); |
evplen, len); |
|
#if OPENSSL_VERSION_NUMBER < 0x00907000L |
|
if (c->evptype == evp_rijndael) |
|
ssh_rijndael_iv(&cc->evp, 0, iv, len); |
|
else |
|
#endif |
if (c->evptype == evp_aes_128_ctr) |
if (c->evptype == evp_aes_128_ctr) |
ssh_aes_ctr_iv(&cc->evp, 0, iv, len); |
ssh_aes_ctr_iv(&cc->evp, 0, iv, len); |
else |
else |
|
|
evplen = EVP_CIPHER_CTX_iv_length(&cc->evp); |
evplen = EVP_CIPHER_CTX_iv_length(&cc->evp); |
if (evplen == 0) |
if (evplen == 0) |
return; |
return; |
|
#if OPENSSL_VERSION_NUMBER < 0x00907000L |
|
if (c->evptype == evp_rijndael) |
|
ssh_rijndael_iv(&cc->evp, 1, iv, evplen); |
|
else |
|
#endif |
if (c->evptype == evp_aes_128_ctr) |
if (c->evptype == evp_aes_128_ctr) |
ssh_aes_ctr_iv(&cc->evp, 1, iv, evplen); |
ssh_aes_ctr_iv(&cc->evp, 1, iv, evplen); |
else |
else |
|
|
} |
} |
} |
} |
|
|
|
#if OPENSSL_VERSION_NUMBER < 0x00907000L |
|
#define EVP_X_STATE(evp) &(evp).c |
|
#define EVP_X_STATE_LEN(evp) sizeof((evp).c) |
|
#else |
#define EVP_X_STATE(evp) (evp).cipher_data |
#define EVP_X_STATE(evp) (evp).cipher_data |
#define EVP_X_STATE_LEN(evp) (evp).cipher->ctx_size |
#define EVP_X_STATE_LEN(evp) (evp).cipher->ctx_size |
|
#endif |
|
|
int |
int |
cipher_get_keycontext(const CipherContext *cc, u_char *dat) |
cipher_get_keycontext(const CipherContext *cc, u_char *dat) |