1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-16 02:27:32 -05:00

RSA key authentication in ssh1 works; SSH2 is nearly there

[originally from svn r572]
This commit is contained in:
Simon Tatham
2000-09-07 16:33:49 +00:00
parent 0f1e449189
commit d9af8f4b90
12 changed files with 1109 additions and 373 deletions

47
ssh.h
View File

@ -18,6 +18,13 @@
#define APIEXTRA 0
#endif
/*
* A Bignum is stored as a sequence of `unsigned short' words. The
* first tells how many remain; the remaining ones are digits, LS
* first.
*/
typedef unsigned short *Bignum;
struct RSAKey {
int bits;
int bytes;
@ -25,14 +32,19 @@ struct RSAKey {
unsigned long exponent;
unsigned char *modulus;
#else
void *modulus;
void *exponent;
Bignum modulus;
Bignum exponent;
Bignum private_exponent;
#endif
};
int makekey(unsigned char *data, struct RSAKey *result,
unsigned char **keystr);
unsigned char **keystr, int order);
int makeprivate(unsigned char *data, struct RSAKey *result);
void rsaencrypt(unsigned char *data, int length, struct RSAKey *key);
Bignum rsadecrypt(Bignum input, struct RSAKey *key);
void rsasign(unsigned char *data, int length, struct RSAKey *key);
void rsasanitise(struct RSAKey *key);
int rsastr_len(struct RSAKey *key);
void rsastr_fmt(char *str, struct RSAKey *key);
@ -71,6 +83,7 @@ typedef struct {
void SHA_Init(SHA_State *s);
void SHA_Bytes(SHA_State *s, void *p, int len);
void SHA_Final(SHA_State *s, unsigned char *output);
void SHA_Simple(void *p, int len, unsigned char *output);
struct ssh_cipher {
void (*sesskey)(unsigned char *key); /* for ssh 1 */
@ -94,10 +107,20 @@ struct ssh_mac {
};
struct ssh_kex {
/*
* Plugging in another KEX algorithm requires structural chaos,
* so it's hard to abstract them into nice little structures
* like this. Hence, for the moment, this is just a
* placeholder. I claim justification in the fact that OpenSSH
* does this too :-)
*/
char *name;
};
struct ssh_hostkey {
void (*setkey)(char *data, int len);
char *(*fmtkey)(void);
int (*verifysig)(char *sig, int siglen, char *data, int datalen);
char *name;
};
@ -114,16 +137,20 @@ void random_add_noise(void *noise, int length);
void logevent (char *);
/*
* A Bignum is stored as a sequence of `unsigned short' words. The
* first tells how many remain; the remaining ones are digits, LS
* first.
*/
typedef unsigned short *Bignum;
Bignum newbn(int length);
Bignum copybn(Bignum b);
void freebn(Bignum b);
void modpow(Bignum base, Bignum exp, Bignum mod, Bignum result);
void modmul(Bignum a, Bignum b, Bignum mod, Bignum result);
void decbn(Bignum n);
extern Bignum Zero, One;
int ssh1_read_bignum(unsigned char *data, Bignum *result);
Bignum dh_create_e(void);
Bignum dh_find_K(Bignum f);
int loadrsakey(char *filename, struct RSAKey *key, char *passphrase);
int rsakey_encrypted(char *filename);
void des3_decrypt_pubkey(unsigned char *key,
unsigned char *blk, int len);