diff options
Diffstat (limited to 'src/lib/libcrypto/ecdh/ech_ossl.c')
| -rw-r--r-- | src/lib/libcrypto/ecdh/ech_ossl.c | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/src/lib/libcrypto/ecdh/ech_ossl.c b/src/lib/libcrypto/ecdh/ech_ossl.c index f05db87f78..746eb12ea3 100644 --- a/src/lib/libcrypto/ecdh/ech_ossl.c +++ b/src/lib/libcrypto/ecdh/ech_ossl.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ech_ossl.c,v 1.10 2015/09/13 10:46:20 jsing Exp $ */ | 1 | /* $OpenBSD: ech_ossl.c,v 1.11 2015/09/13 11:49:44 jsing Exp $ */ | 
| 2 | /* ==================================================================== | 2 | /* ==================================================================== | 
| 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 3 | * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | 
| 4 | * | 4 | * | 
| @@ -115,7 +115,8 @@ ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, | |||
| 115 | unsigned char *buf = NULL; | 115 | unsigned char *buf = NULL; | 
| 116 | 116 | ||
| 117 | if (outlen > INT_MAX) { | 117 | if (outlen > INT_MAX) { | 
| 118 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY,ERR_R_MALLOC_FAILURE); /* sort of, anyway */ | 118 | /* Sort of, anyway. */ | 
| 119 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_MALLOC_FAILURE); | ||
| 119 | return -1; | 120 | return -1; | 
| 120 | } | 121 | } | 
| 121 | 122 | ||
| @@ -171,6 +172,11 @@ ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, | |||
| 171 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_INTERNAL_ERROR); | 172 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_INTERNAL_ERROR); | 
| 172 | goto err; | 173 | goto err; | 
| 173 | } | 174 | } | 
| 175 | if (outlen < buflen) { | ||
| 176 | /* The resulting key would be truncated. */ | ||
| 177 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ECDH_R_KEY_TRUNCATION); | ||
| 178 | goto err; | ||
| 179 | } | ||
| 174 | if ((buf = malloc(buflen)) == NULL) { | 180 | if ((buf = malloc(buflen)) == NULL) { | 
| 175 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_MALLOC_FAILURE); | 181 | ECDHerr(ECDH_F_ECDH_COMPUTE_KEY, ERR_R_MALLOC_FAILURE); | 
| 176 | goto err; | 182 | goto err; | 
| @@ -189,9 +195,11 @@ ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, | |||
| 189 | } | 195 | } | 
| 190 | ret = outlen; | 196 | ret = outlen; | 
| 191 | } else { | 197 | } else { | 
| 192 | /* no KDF, just copy as much as we can */ | 198 | /* No KDF, just copy as much as we can and zero the rest. */ | 
| 193 | if (outlen > buflen) | 199 | if (outlen > buflen) { | 
| 200 | memset(out + buflen, 0, outlen - buflen); | ||
| 194 | outlen = buflen; | 201 | outlen = buflen; | 
| 202 | } | ||
| 195 | memcpy(out, buf, outlen); | 203 | memcpy(out, buf, outlen); | 
| 196 | ret = outlen; | 204 | ret = outlen; | 
| 197 | } | 205 | } | 
