1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-24 06:25:03 -05:00

Log which elliptic curve we're using for ECDH kex.

It seems like quite an important thing to mention in the event log!
Suppose there's a bug affecting only one curve, for example? Fixed-
group Diffie-Hellman has always logged the group, but the ECDH log
message just told you the hash and not also the curve.

To implement this, I've added a 'textname' field to all elliptic
curves, whether they're used for kex or signing or both, suitable for
use in this log message and any others we might find a need for in
future.
This commit is contained in:
Simon Tatham 2015-05-19 08:42:23 +01:00
parent 35fde00fd1
commit a209b9044e
3 changed files with 23 additions and 5 deletions

3
ssh.c
View File

@ -6770,7 +6770,8 @@ static void do_ssh2_transport(Ssh ssh, const void *vin, int inlen,
} }
} else if (ssh->kex->main_type == KEXTYPE_ECDH) { } else if (ssh->kex->main_type == KEXTYPE_ECDH) {
logeventf(ssh, "Doing ECDH key exchange with hash %s", logeventf(ssh, "Doing ECDH key exchange with curve %s and hash %s",
ssh_ecdhkex_curve_textname(ssh->kex),
ssh->kex->hash->text_name); ssh->kex->hash->text_name);
ssh->pkt_kctx = SSH2_PKTCTX_ECDHKEX; ssh->pkt_kctx = SSH2_PKTCTX_ECDHKEX;

10
ssh.h
View File

@ -134,7 +134,14 @@ struct ec_ecurve
struct ec_curve { struct ec_curve {
enum { EC_WEIERSTRASS, EC_MONTGOMERY, EC_EDWARDS } type; enum { EC_WEIERSTRASS, EC_MONTGOMERY, EC_EDWARDS } type;
const char *name; /* 'name' is the identifier of the curve when it has to appear in
* wire protocol encodings, as it does in e.g. the public key and
* signature formats for NIST curves. Curves which do not format
* their keys or signatures in this way just have name==NULL.
*
* 'textname' is non-NULL for all curves, and is a human-readable
* identification suitable for putting in log messages. */
const char *name, *textname;
unsigned int fieldBits; unsigned int fieldBits;
Bignum p; Bignum p;
union { union {
@ -210,6 +217,7 @@ void ssh_rsakex_encrypt(const struct ssh_hash *h, unsigned char *in, int inlen,
* SSH2 ECDH key exchange functions * SSH2 ECDH key exchange functions
*/ */
struct ssh_kex; struct ssh_kex;
const char *ssh_ecdhkex_curve_textname(const struct ssh_kex *kex);
void *ssh_ecdhkex_newkey(const struct ssh_kex *kex); void *ssh_ecdhkex_newkey(const struct ssh_kex *kex);
void ssh_ecdhkex_freekey(void *key); void ssh_ecdhkex_freekey(void *key);
char *ssh_ecdhkex_getpublic(void *key, int *len); char *ssh_ecdhkex_getpublic(void *key, int *len);

View File

@ -157,7 +157,7 @@ static struct ec_curve *ec_p256(void)
}; };
initialise_wcurve(&curve, 256, p, a, b, n, Gx, Gy); initialise_wcurve(&curve, 256, p, a, b, n, Gx, Gy);
curve.name = "nistp256"; curve.textname = curve.name = "nistp256";
/* Now initialised, no need to do it again */ /* Now initialised, no need to do it again */
initialised = 1; initialised = 1;
@ -223,7 +223,7 @@ static struct ec_curve *ec_p384(void)
}; };
initialise_wcurve(&curve, 384, p, a, b, n, Gx, Gy); initialise_wcurve(&curve, 384, p, a, b, n, Gx, Gy);
curve.name = "nistp384"; curve.textname = curve.name = "nistp384";
/* Now initialised, no need to do it again */ /* Now initialised, no need to do it again */
initialised = 1; initialised = 1;
@ -307,7 +307,7 @@ static struct ec_curve *ec_p521(void)
}; };
initialise_wcurve(&curve, 521, p, a, b, n, Gx, Gy); initialise_wcurve(&curve, 521, p, a, b, n, Gx, Gy);
curve.name = "nistp521"; curve.textname = curve.name = "nistp521";
/* Now initialised, no need to do it again */ /* Now initialised, no need to do it again */
initialised = 1; initialised = 1;
@ -352,6 +352,7 @@ static struct ec_curve *ec_curve25519(void)
/* This curve doesn't need a name, because it's never used in /* This curve doesn't need a name, because it's never used in
* any format that embeds the curve name */ * any format that embeds the curve name */
curve.name = NULL; curve.name = NULL;
curve.textname = "Curve25519";
/* Now initialised, no need to do it again */ /* Now initialised, no need to do it again */
initialised = 1; initialised = 1;
@ -403,6 +404,7 @@ static struct ec_curve *ec_ed25519(void)
curve.name = NULL; curve.name = NULL;
initialise_ecurve(&curve, 256, q, l, d, Bx, By); initialise_ecurve(&curve, 256, q, l, d, Bx, By);
curve.textname = "Ed25519";
/* Now initialised, no need to do it again */ /* Now initialised, no need to do it again */
initialised = 1; initialised = 1;
@ -2704,6 +2706,13 @@ static Bignum ecdh_calculate(const Bignum private,
return ret; return ret;
} }
const char *ssh_ecdhkex_curve_textname(const struct ssh_kex *kex)
{
const struct eckex_extra *extra = (const struct eckex_extra *)kex->extra;
struct ec_curve *curve = extra->curve();
return curve->textname;
}
void *ssh_ecdhkex_newkey(const struct ssh_kex *kex) void *ssh_ecdhkex_newkey(const struct ssh_kex *kex)
{ {
const struct eckex_extra *extra = (const struct eckex_extra *)kex->extra; const struct eckex_extra *extra = (const struct eckex_extra *)kex->extra;