mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-12 08:43:53 -05:00
Support ECDH key exchange using the 'curve25519' curve.
This is the kex protocol id "curve25519-sha256@libssh.org", so called because it's over the prime field of order 2^255 - 19. Arithmetic in this curve is done using the Montgomery representation, rather than the Weierstrass representation. So 'struct ec_curve' has grown a discriminant field and a union of subtypes.
This commit is contained in:

committed by
Simon Tatham

parent
7d6bf4a6ca
commit
541abf9258
32
ssh.h
32
ssh.h
@ -110,27 +110,51 @@ struct ec_point {
|
||||
|
||||
void ec_point_free(struct ec_point *point);
|
||||
|
||||
struct ec_curve {
|
||||
unsigned int fieldBits;
|
||||
Bignum p, a, b, n;
|
||||
/* Weierstrass form curve */
|
||||
struct ec_wcurve
|
||||
{
|
||||
Bignum a, b, n;
|
||||
struct ec_point G;
|
||||
};
|
||||
|
||||
/* Montgomery form curve */
|
||||
struct ec_mcurve
|
||||
{
|
||||
Bignum a, b;
|
||||
struct ec_point G;
|
||||
};
|
||||
|
||||
struct ec_curve {
|
||||
enum { EC_WEIERSTRASS, EC_MONTGOMERY } type;
|
||||
unsigned int fieldBits;
|
||||
Bignum p;
|
||||
union {
|
||||
struct ec_wcurve w;
|
||||
struct ec_mcurve m;
|
||||
};
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
struct ec_key {
|
||||
struct ec_point publicKey;
|
||||
Bignum privateKey;
|
||||
};
|
||||
|
||||
struct ec_point *ec_public(const Bignum privateKey, const struct ec_curve *curve);
|
||||
|
||||
int makekey(const unsigned char *data, int len, struct RSAKey *result,
|
||||
const unsigned char **keystr, int order);
|
||||
int makeprivate(const unsigned char *data, int len, struct RSAKey *result);
|
||||
@ -176,7 +200,7 @@ void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen,
|
||||
/*
|
||||
* SSH2 ECDH key exchange functions
|
||||
*/
|
||||
void *ssh_ecdhkex_newkey(struct ec_curve *curve);
|
||||
void *ssh_ecdhkex_newkey(const char *name);
|
||||
void ssh_ecdhkex_freekey(void *key);
|
||||
char *ssh_ecdhkex_getpublic(void *key, int *len);
|
||||
Bignum ssh_ecdhkex_getkey(void *key, char *remoteKey, int remoteKeyLen);
|
||||
|
Reference in New Issue
Block a user