mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-06 22:12:47 -05:00
Merge the ssh1_cipher type into ssh2_cipher.
The aim of this reorganisation is to make it easier to test all the ciphers in PuTTY in a uniform way. It was inconvenient that there were two separate vtable systems for the ciphers used in SSH-1 and SSH-2 with different functionality. Now there's only one type, called ssh_cipher. But really it's the old ssh2_cipher, just renamed: I haven't made any changes to the API on the SSH-2 side. Instead, I've removed ssh1_cipher completely, and adapted the SSH-1 BPP to use the SSH-2 style API. (The relevant differences are that ssh1_cipher encapsulated both the sending and receiving directions in one object - so now ssh1bpp has to make a separate cipher instance per direction - and that ssh1_cipher automatically initialised the IV to all zeroes, which ssh1bpp now has to do by hand.) The previous ssh1_cipher vtable for single-DES has been removed completely, because when converted into the new API it became identical to the SSH-2 single-DES vtable; so now there's just one vtable for DES-CBC which works in both protocols. The other two SSH-1 ciphers each had to stay separate, because 3DES is completely different between SSH-1 and SSH-2 (three layers of CBC structure versus one), and Blowfish varies in endianness and key length between the two. (Actually, while I'm here, I've only just noticed that the SSH-1 Blowfish cipher mis-describes itself in log messages as Blowfish-128. In fact it passes the whole of the input key buffer, which has length SSH1_SESSION_KEY_LENGTH == 32 bytes == 256 bits. So it's actually Blowfish-256, and has been all along!)
This commit is contained in:
125
ssh.h
125
ssh.h
@ -554,8 +554,8 @@ mp_int *dss_gen_k(const char *id_string,
|
||||
mp_int *modulus, mp_int *private_key,
|
||||
unsigned char *digest, int digest_len);
|
||||
|
||||
struct ssh2_cipher {
|
||||
const ssh2_cipheralg *vt;
|
||||
struct ssh_cipher {
|
||||
const ssh_cipheralg *vt;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@ -625,39 +625,19 @@ void SHA384_Init(SHA384_State * s);
|
||||
void SHA384_Final(SHA384_State * s, unsigned char *output);
|
||||
void SHA384_Simple(const void *p, int len, unsigned char *output);
|
||||
|
||||
struct ssh1_cipher {
|
||||
const ssh1_cipheralg *vt;
|
||||
};
|
||||
|
||||
struct ssh1_cipheralg {
|
||||
ssh1_cipher *(*new)(void);
|
||||
void (*free)(ssh1_cipher *);
|
||||
void (*sesskey)(ssh1_cipher *, const void *key);
|
||||
void (*encrypt)(ssh1_cipher *, void *blk, int len);
|
||||
void (*decrypt)(ssh1_cipher *, void *blk, int len);
|
||||
int blksize;
|
||||
const char *text_name;
|
||||
};
|
||||
|
||||
#define ssh1_cipher_new(alg) ((alg)->new())
|
||||
#define ssh1_cipher_free(ctx) ((ctx)->vt->free(ctx))
|
||||
#define ssh1_cipher_sesskey(ctx, key) ((ctx)->vt->sesskey(ctx, key))
|
||||
#define ssh1_cipher_encrypt(ctx, blk, len) ((ctx)->vt->encrypt(ctx, blk, len))
|
||||
#define ssh1_cipher_decrypt(ctx, blk, len) ((ctx)->vt->decrypt(ctx, blk, len))
|
||||
|
||||
struct ssh2_cipheralg {
|
||||
ssh2_cipher *(*new)(const ssh2_cipheralg *alg);
|
||||
void (*free)(ssh2_cipher *);
|
||||
void (*setiv)(ssh2_cipher *, const void *iv);
|
||||
void (*setkey)(ssh2_cipher *, const void *key);
|
||||
void (*encrypt)(ssh2_cipher *, void *blk, int len);
|
||||
void (*decrypt)(ssh2_cipher *, void *blk, int len);
|
||||
struct ssh_cipheralg {
|
||||
ssh_cipher *(*new)(const ssh_cipheralg *alg);
|
||||
void (*free)(ssh_cipher *);
|
||||
void (*setiv)(ssh_cipher *, const void *iv);
|
||||
void (*setkey)(ssh_cipher *, const void *key);
|
||||
void (*encrypt)(ssh_cipher *, void *blk, int len);
|
||||
void (*decrypt)(ssh_cipher *, void *blk, int len);
|
||||
/* Ignored unless SSH_CIPHER_SEPARATE_LENGTH flag set */
|
||||
void (*encrypt_length)(ssh2_cipher *, void *blk, int len,
|
||||
void (*encrypt_length)(ssh_cipher *, void *blk, int len,
|
||||
unsigned long seq);
|
||||
void (*decrypt_length)(ssh2_cipher *, void *blk, int len,
|
||||
void (*decrypt_length)(ssh_cipher *, void *blk, int len,
|
||||
unsigned long seq);
|
||||
const char *name;
|
||||
const char *ssh2_id;
|
||||
int blksize;
|
||||
/* real_keybits is the number of bits of entropy genuinely used by
|
||||
* the cipher scheme; it's used for deciding how big a
|
||||
@ -683,21 +663,21 @@ struct ssh2_cipheralg {
|
||||
const void *extra;
|
||||
};
|
||||
|
||||
#define ssh2_cipher_new(alg) ((alg)->new(alg))
|
||||
#define ssh2_cipher_free(ctx) ((ctx)->vt->free(ctx))
|
||||
#define ssh2_cipher_setiv(ctx, iv) ((ctx)->vt->setiv(ctx, iv))
|
||||
#define ssh2_cipher_setkey(ctx, key) ((ctx)->vt->setkey(ctx, key))
|
||||
#define ssh2_cipher_encrypt(ctx, blk, len) ((ctx)->vt->encrypt(ctx, blk, len))
|
||||
#define ssh2_cipher_decrypt(ctx, blk, len) ((ctx)->vt->decrypt(ctx, blk, len))
|
||||
#define ssh2_cipher_encrypt_length(ctx, blk, len, seq) \
|
||||
#define ssh_cipher_new(alg) ((alg)->new(alg))
|
||||
#define ssh_cipher_free(ctx) ((ctx)->vt->free(ctx))
|
||||
#define ssh_cipher_setiv(ctx, iv) ((ctx)->vt->setiv(ctx, iv))
|
||||
#define ssh_cipher_setkey(ctx, key) ((ctx)->vt->setkey(ctx, key))
|
||||
#define ssh_cipher_encrypt(ctx, blk, len) ((ctx)->vt->encrypt(ctx, blk, len))
|
||||
#define ssh_cipher_decrypt(ctx, blk, len) ((ctx)->vt->decrypt(ctx, blk, len))
|
||||
#define ssh_cipher_encrypt_length(ctx, blk, len, seq) \
|
||||
((ctx)->vt->encrypt_length(ctx, blk, len, seq))
|
||||
#define ssh2_cipher_decrypt_length(ctx, blk, len, seq) \
|
||||
#define ssh_cipher_decrypt_length(ctx, blk, len, seq) \
|
||||
((ctx)->vt->decrypt_length(ctx, blk, len, seq))
|
||||
#define ssh2_cipher_alg(ctx) ((ctx)->vt)
|
||||
#define ssh_cipher_alg(ctx) ((ctx)->vt)
|
||||
|
||||
struct ssh2_ciphers {
|
||||
int nciphers;
|
||||
const ssh2_cipheralg *const *list;
|
||||
const ssh_cipheralg *const *list;
|
||||
};
|
||||
|
||||
struct ssh2_mac {
|
||||
@ -707,7 +687,7 @@ struct ssh2_mac {
|
||||
|
||||
struct ssh2_macalg {
|
||||
/* Passes in the cipher context */
|
||||
ssh2_mac *(*new)(const ssh2_macalg *alg, ssh2_cipher *cipher);
|
||||
ssh2_mac *(*new)(const ssh2_macalg *alg, ssh_cipher *cipher);
|
||||
void (*free)(ssh2_mac *);
|
||||
void (*setkey)(ssh2_mac *, ptrlen key);
|
||||
void (*start)(ssh2_mac *);
|
||||
@ -854,36 +834,35 @@ struct ssh2_userkey {
|
||||
/* The maximum length of any hash algorithm. (bytes) */
|
||||
#define MAX_HASH_LEN (64) /* longest is SHA-512 */
|
||||
|
||||
extern const ssh1_cipheralg ssh1_3des;
|
||||
extern const ssh1_cipheralg ssh1_des;
|
||||
extern const ssh1_cipheralg ssh1_blowfish;
|
||||
extern const ssh2_cipheralg ssh_3des_ssh2_ctr;
|
||||
extern const ssh2_cipheralg ssh_3des_ssh2;
|
||||
extern const ssh2_cipheralg ssh_des_ssh2;
|
||||
extern const ssh2_cipheralg ssh_des_sshcom_ssh2;
|
||||
extern const ssh2_cipheralg ssh_aes256_sdctr;
|
||||
extern const ssh2_cipheralg ssh_aes256_sdctr_hw;
|
||||
extern const ssh2_cipheralg ssh_aes256_sdctr_sw;
|
||||
extern const ssh2_cipheralg ssh_aes256_cbc;
|
||||
extern const ssh2_cipheralg ssh_aes256_cbc_hw;
|
||||
extern const ssh2_cipheralg ssh_aes256_cbc_sw;
|
||||
extern const ssh2_cipheralg ssh_aes192_sdctr;
|
||||
extern const ssh2_cipheralg ssh_aes192_sdctr_hw;
|
||||
extern const ssh2_cipheralg ssh_aes192_sdctr_sw;
|
||||
extern const ssh2_cipheralg ssh_aes192_cbc;
|
||||
extern const ssh2_cipheralg ssh_aes192_cbc_hw;
|
||||
extern const ssh2_cipheralg ssh_aes192_cbc_sw;
|
||||
extern const ssh2_cipheralg ssh_aes128_sdctr;
|
||||
extern const ssh2_cipheralg ssh_aes128_sdctr_hw;
|
||||
extern const ssh2_cipheralg ssh_aes128_sdctr_sw;
|
||||
extern const ssh2_cipheralg ssh_aes128_cbc;
|
||||
extern const ssh2_cipheralg ssh_aes128_cbc_hw;
|
||||
extern const ssh2_cipheralg ssh_aes128_cbc_sw;
|
||||
extern const ssh2_cipheralg ssh_blowfish_ssh2_ctr;
|
||||
extern const ssh2_cipheralg ssh_blowfish_ssh2;
|
||||
extern const ssh2_cipheralg ssh_arcfour256_ssh2;
|
||||
extern const ssh2_cipheralg ssh_arcfour128_ssh2;
|
||||
extern const ssh2_cipheralg ssh2_chacha20_poly1305;
|
||||
extern const ssh_cipheralg ssh_3des_ssh1;
|
||||
extern const ssh_cipheralg ssh_blowfish_ssh1;
|
||||
extern const ssh_cipheralg ssh_3des_ssh2_ctr;
|
||||
extern const ssh_cipheralg ssh_3des_ssh2;
|
||||
extern const ssh_cipheralg ssh_des;
|
||||
extern const ssh_cipheralg ssh_des_sshcom_ssh2;
|
||||
extern const ssh_cipheralg ssh_aes256_sdctr;
|
||||
extern const ssh_cipheralg ssh_aes256_sdctr_hw;
|
||||
extern const ssh_cipheralg ssh_aes256_sdctr_sw;
|
||||
extern const ssh_cipheralg ssh_aes256_cbc;
|
||||
extern const ssh_cipheralg ssh_aes256_cbc_hw;
|
||||
extern const ssh_cipheralg ssh_aes256_cbc_sw;
|
||||
extern const ssh_cipheralg ssh_aes192_sdctr;
|
||||
extern const ssh_cipheralg ssh_aes192_sdctr_hw;
|
||||
extern const ssh_cipheralg ssh_aes192_sdctr_sw;
|
||||
extern const ssh_cipheralg ssh_aes192_cbc;
|
||||
extern const ssh_cipheralg ssh_aes192_cbc_hw;
|
||||
extern const ssh_cipheralg ssh_aes192_cbc_sw;
|
||||
extern const ssh_cipheralg ssh_aes128_sdctr;
|
||||
extern const ssh_cipheralg ssh_aes128_sdctr_hw;
|
||||
extern const ssh_cipheralg ssh_aes128_sdctr_sw;
|
||||
extern const ssh_cipheralg ssh_aes128_cbc;
|
||||
extern const ssh_cipheralg ssh_aes128_cbc_hw;
|
||||
extern const ssh_cipheralg ssh_aes128_cbc_sw;
|
||||
extern const ssh_cipheralg ssh_blowfish_ssh2_ctr;
|
||||
extern const ssh_cipheralg ssh_blowfish_ssh2;
|
||||
extern const ssh_cipheralg ssh_arcfour256_ssh2;
|
||||
extern const ssh_cipheralg ssh_arcfour128_ssh2;
|
||||
extern const ssh_cipheralg ssh2_chacha20_poly1305;
|
||||
extern const ssh2_ciphers ssh2_3des;
|
||||
extern const ssh2_ciphers ssh2_des;
|
||||
extern const ssh2_ciphers ssh2_aes;
|
||||
|
Reference in New Issue
Block a user