summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2018-09-02 17:20:31 +0000
committertb <>2018-09-02 17:20:31 +0000
commitd23674fa7bf171c2eb3f71954bbddb5ac8d1f0ec (patch)
tree33c780ca3be4916eff529d97ddc782b338a32305 /src
parent9200435a5b6465d7acbe3e3c950e8d6438edab09 (diff)
downloadopenbsd-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
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/ecdh/ech_key.c6
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;