diff options
author | tb <> | 2018-09-02 17:20:31 +0000 |
---|---|---|
committer | tb <> | 2018-09-02 17:20:31 +0000 |
commit | d23674fa7bf171c2eb3f71954bbddb5ac8d1f0ec (patch) | |
tree | 33c780ca3be4916eff529d97ddc782b338a32305 | |
parent | 9200435a5b6465d7acbe3e3c950e8d6438edab09 (diff) | |
download | openbsd-d23674fa7bf171c2eb3f71954bbddb5ac8d1f0ec.tar.gz openbsd-d23674fa7bf171c2eb3f71954bbddb5ac8d1f0ec.tar.bz2 openbsd-d23674fa7bf171c2eb3f71954bbddb5ac8d1f0ec.zip |
Elliptic curve arithmetic only makes sense between points that belong to
the same curve. Some Wycheproof tests violate this assumption, making
ECDH_compute_key() compute and return garbage. Check that pub_key lies
on the curve of the private key so that the calculations make sense.
Most paths that get here have this checked (in particular those from
OpenSSH and libssl), but one might get here after using d2i_* or manual
computation.
discussed with & ok jsing;
"good catch!" markus
-rw-r--r-- | src/lib/libcrypto/ecdh/ech_key.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/lib/libcrypto/ecdh/ech_key.c b/src/lib/libcrypto/ecdh/ech_key.c index 5c2dc70b63..6911f1e341 100644 --- a/src/lib/libcrypto/ecdh/ech_key.c +++ b/src/lib/libcrypto/ecdh/ech_key.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ech_key.c,v 1.7 2017/01/29 17:49:23 beck Exp $ */ | 1 | /* $OpenBSD: ech_key.c,v 1.8 2018/09/02 17:20:31 tb Exp $ */ |
2 | /* ==================================================================== | 2 | /* ==================================================================== |
3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. |
4 | * | 4 | * |
@@ -125,6 +125,10 @@ ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, | |||
125 | } | 125 | } |
126 | 126 | ||
127 | group = EC_KEY_get0_group(ecdh); | 127 | group = EC_KEY_get0_group(ecdh); |
128 | |||
129 | if (!EC_POINT_is_on_curve(group, pub_key, ctx)) | ||
130 | goto err; | ||
131 | |||
128 | if ((tmp = EC_POINT_new(group)) == NULL) { | 132 | if ((tmp = EC_POINT_new(group)) == NULL) { |
129 | ECDHerror(ERR_R_MALLOC_FAILURE); | 133 | ECDHerror(ERR_R_MALLOC_FAILURE); |
130 | goto err; | 134 | goto err; |