X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=ssh.h;h=4fc4edeae986daf7ae2cc12cd0f847e07e152c76;hb=fb4fbe11588d3e53be99909f57dd179d1105aaf5;hp=272bc8b94c090a0812b670a9c7e4062a66c2d249;hpb=79fe96155a9486a58c1ce588069975346b4f4a22;p=PuTTY.git diff --git a/ssh.h b/ssh.h index 272bc8b9..4fc4edea 100644 --- a/ssh.h +++ b/ssh.h @@ -133,6 +133,7 @@ struct ec_ecurve struct ec_curve { enum { EC_WEIERSTRASS, EC_MONTGOMERY, EC_EDWARDS } type; + const char *name; unsigned int fieldBits; Bignum p; union { @@ -142,21 +143,20 @@ struct ec_curve { }; }; -extern unsigned char nistp256_oid[]; -extern unsigned char nistp384_oid[]; -extern unsigned char nistp521_oid[]; -extern unsigned char curve25519_oid[]; -extern int nistp256_oid_len; -extern int nistp384_oid_len; -extern int nistp521_oid_len; -extern int curve25519_oid_len; -struct ec_curve *ec_p256(void); -struct ec_curve *ec_p384(void); -struct ec_curve *ec_p521(void); -struct ec_curve *ec_ed25519(void); -struct ec_curve *ec_curve25519(void); +const struct ssh_signkey *ec_alg_by_oid(int len, const void *oid, + const struct ec_curve **curve); +const unsigned char *ec_alg_oid(const struct ssh_signkey *alg, int *oidlen); +const int ec_nist_alg_and_curve_by_bits(int bits, + const struct ec_curve **curve, + const struct ssh_signkey **alg); +const int ec_ed_alg_and_curve_by_bits(int bits, + const struct ec_curve **curve, + const struct ssh_signkey **alg); + +struct ssh_signkey; struct ec_key { + const struct ssh_signkey *signalg; struct ec_point publicKey; Bignum privateKey; }; @@ -208,7 +208,8 @@ void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen, /* * SSH2 ECDH key exchange functions */ -void *ssh_ecdhkex_newkey(const char *name); +struct ssh_kex; +void *ssh_ecdhkex_newkey(const struct ssh_kex *kex); void ssh_ecdhkex_freekey(void *key); char *ssh_ecdhkex_getpublic(void *key, int *len); Bignum ssh_ecdhkex_getkey(void *key, char *remoteKey, int remoteKeyLen); @@ -293,7 +294,7 @@ struct ssh_cipher { void (*encrypt) (void *, unsigned char *blk, int len); void (*decrypt) (void *, unsigned char *blk, int len); int blksize; - char *text_name; + const char *text_name; }; struct ssh2_cipher { @@ -308,7 +309,7 @@ struct ssh2_cipher { int keylen; unsigned int flags; #define SSH_CIPHER_IS_CBC 1 - char *text_name; + const char *text_name; }; struct ssh2_ciphers { @@ -328,9 +329,9 @@ struct ssh_mac { void (*bytes) (void *, unsigned char const *, int); void (*genresult) (void *, unsigned char *); int (*verresult) (void *, unsigned char const *); - char *name, *etm_name; + const char *name, *etm_name; int len; - char *text_name; + const char *text_name; }; struct ssh_hash { @@ -338,16 +339,14 @@ struct ssh_hash { void (*bytes)(void *, const void *, int); void (*final)(void *, unsigned char *); /* also frees context */ int hlen; /* output length in bytes */ - char *text_name; + const char *text_name; }; struct ssh_kex { char *name, *groupname; enum { KEXTYPE_DH, KEXTYPE_RSA, KEXTYPE_ECDH } main_type; - /* For DH */ - const unsigned char *pdata, *gdata; /* NULL means group exchange */ - int plen, glen; const struct ssh_hash *hash; + const void *extra; /* private to the kex methods */ }; struct ssh_kexes { @@ -356,14 +355,17 @@ struct ssh_kexes { }; struct ssh_signkey { - void *(*newkey) (const char *data, int len); + void *(*newkey) (const struct ssh_signkey *self, + const char *data, int len); void (*freekey) (void *key); char *(*fmtkey) (void *key); unsigned char *(*public_blob) (void *key, int *len); unsigned char *(*private_blob) (void *key, int *len); - void *(*createkey) (const unsigned char *pub_blob, int pub_len, + void *(*createkey) (const struct ssh_signkey *self, + const unsigned char *pub_blob, int pub_len, const unsigned char *priv_blob, int priv_len); - void *(*openssh_createkey) (const unsigned char **blob, int *len); + void *(*openssh_createkey) (const struct ssh_signkey *self, + const unsigned char **blob, int *len); int (*openssh_fmtkey) (void *key, unsigned char *blob, int len); /* OpenSSH private key blobs, as created by openssh_fmtkey and * consumed by openssh_createkey, always (at least so far...) take @@ -374,13 +376,15 @@ struct ssh_signkey { * skip over the right number to find the next key in the file. * openssh_private_npieces gives that information. */ int openssh_private_npieces; - int (*pubkey_bits) (const void *blob, int len); + int (*pubkey_bits) (const struct ssh_signkey *self, + const void *blob, int len); int (*verifysig) (void *key, const char *sig, int siglen, const char *data, int datalen); unsigned char *(*sign) (void *key, const char *data, int datalen, int *siglen); - char *name; - char *keytype; /* for host key cache */ + const char *name; + const char *keytype; /* for host key cache */ + const void *extra; /* private to the public key methods */ }; struct ssh_compress { @@ -397,7 +401,7 @@ struct ssh_compress { int (*decompress) (void *, unsigned char *block, int len, unsigned char **outblock, int *outlen); int (*disable_compression) (void *); - char *text_name; + const char *text_name; }; struct ssh2_userkey { @@ -635,6 +639,7 @@ Bignum bignum_from_decimal(const char *decimal); void diagbn(char *prefix, Bignum md); #endif +int dh_is_gex(const struct ssh_kex *kex); void *dh_setup_group(const struct ssh_kex *kex); void *dh_setup_gex(Bignum pval, Bignum gval); void dh_cleanup(void *);