summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/kdf/tls1_prf.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/lib/libcrypto/kdf/tls1_prf.c b/src/lib/libcrypto/kdf/tls1_prf.c
index a0979b4c72..3bef26ea7a 100644
--- a/src/lib/libcrypto/kdf/tls1_prf.c
+++ b/src/lib/libcrypto/kdf/tls1_prf.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls1_prf.c,v 1.22 2024/07/09 16:53:33 tb Exp $ */ 1/* $OpenBSD: tls1_prf.c,v 1.23 2024/07/09 16:54:13 tb Exp $ */
2/* 2/*
3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4 * 2016. 4 * 2016.
@@ -70,7 +70,7 @@
70static int tls1_prf_alg(const EVP_MD *md, 70static int tls1_prf_alg(const EVP_MD *md,
71 const unsigned char *secret, size_t secret_len, 71 const unsigned char *secret, size_t secret_len,
72 const unsigned char *seed, size_t seed_len, 72 const unsigned char *seed, size_t seed_len,
73 unsigned char *out, size_t olen); 73 unsigned char *out, size_t out_len);
74 74
75#define TLS1_PRF_MAXBUF 1024 75#define TLS1_PRF_MAXBUF 1024
76 76
@@ -249,7 +249,7 @@ static int
249tls1_prf_P_hash(const EVP_MD *md, 249tls1_prf_P_hash(const EVP_MD *md,
250 const unsigned char *secret, size_t sec_len, 250 const unsigned char *secret, size_t sec_len,
251 const unsigned char *seed, size_t seed_len, 251 const unsigned char *seed, size_t seed_len,
252 unsigned char *out, size_t olen) 252 unsigned char *out, size_t out_len)
253{ 253{
254 int chunk; 254 int chunk;
255 EVP_MD_CTX *ctx = NULL, *ctx_tmp = NULL, *ctx_init = NULL; 255 EVP_MD_CTX *ctx = NULL, *ctx_tmp = NULL, *ctx_init = NULL;
@@ -286,24 +286,24 @@ tls1_prf_P_hash(const EVP_MD *md,
286 goto err; 286 goto err;
287 if (!EVP_DigestSignUpdate(ctx, A1, A1_len)) 287 if (!EVP_DigestSignUpdate(ctx, A1, A1_len))
288 goto err; 288 goto err;
289 if (olen > (size_t)chunk && !EVP_MD_CTX_copy_ex(ctx_tmp, ctx)) 289 if (out_len > (size_t)chunk && !EVP_MD_CTX_copy_ex(ctx_tmp, ctx))
290 goto err; 290 goto err;
291 if (seed && !EVP_DigestSignUpdate(ctx, seed, seed_len)) 291 if (seed && !EVP_DigestSignUpdate(ctx, seed, seed_len))
292 goto err; 292 goto err;
293 293
294 if (olen > (size_t)chunk) { 294 if (out_len > (size_t)chunk) {
295 size_t mac_len; 295 size_t mac_len;
296 if (!EVP_DigestSignFinal(ctx, out, &mac_len)) 296 if (!EVP_DigestSignFinal(ctx, out, &mac_len))
297 goto err; 297 goto err;
298 out += mac_len; 298 out += mac_len;
299 olen -= mac_len; 299 out_len -= mac_len;
300 /* calc the next A1 value */ 300 /* calc the next A1 value */
301 if (!EVP_DigestSignFinal(ctx_tmp, A1, &A1_len)) 301 if (!EVP_DigestSignFinal(ctx_tmp, A1, &A1_len))
302 goto err; 302 goto err;
303 } else { /* last one */ 303 } else { /* last one */
304 if (!EVP_DigestSignFinal(ctx, A1, &A1_len)) 304 if (!EVP_DigestSignFinal(ctx, A1, &A1_len))
305 goto err; 305 goto err;
306 memcpy(out, A1, olen); 306 memcpy(out, A1, out_len);
307 break; 307 break;
308 } 308 }
309 } 309 }
@@ -324,7 +324,7 @@ static int
324tls1_prf_alg(const EVP_MD *md, 324tls1_prf_alg(const EVP_MD *md,
325 const unsigned char *secret, size_t secret_len, 325 const unsigned char *secret, size_t secret_len,
326 const unsigned char *seed, size_t seed_len, 326 const unsigned char *seed, size_t seed_len,
327 unsigned char *out, size_t olen) 327 unsigned char *out, size_t out_len)
328{ 328{
329 329
330 if (EVP_MD_type(md) == NID_md5_sha1) { 330 if (EVP_MD_type(md) == NID_md5_sha1) {
@@ -332,24 +332,24 @@ tls1_prf_alg(const EVP_MD *md,
332 unsigned char *tmp; 332 unsigned char *tmp;
333 if (!tls1_prf_P_hash(EVP_md5(), 333 if (!tls1_prf_P_hash(EVP_md5(),
334 secret, secret_len/2 + (secret_len & 1), 334 secret, secret_len/2 + (secret_len & 1),
335 seed, seed_len, out, olen)) 335 seed, seed_len, out, out_len))
336 return 0; 336 return 0;
337 337
338 if ((tmp = calloc(1, olen)) == NULL) { 338 if ((tmp = calloc(1, out_len)) == NULL) {
339 KDFerror(ERR_R_MALLOC_FAILURE); 339 KDFerror(ERR_R_MALLOC_FAILURE);
340 return 0; 340 return 0;
341 } 341 }
342 if (!tls1_prf_P_hash(EVP_sha1(), secret + secret_len/2, 342 if (!tls1_prf_P_hash(EVP_sha1(), secret + secret_len/2,
343 secret_len/2 + (secret_len & 1), seed, seed_len, tmp, olen)) { 343 secret_len/2 + (secret_len & 1), seed, seed_len, tmp, out_len)) {
344 freezero(tmp, olen); 344 freezero(tmp, out_len);
345 return 0; 345 return 0;
346 } 346 }
347 for (i = 0; i < olen; i++) 347 for (i = 0; i < out_len; i++)
348 out[i] ^= tmp[i]; 348 out[i] ^= tmp[i];
349 freezero(tmp, olen); 349 freezero(tmp, out_len);
350 return 1; 350 return 1;
351 } 351 }
352 if (!tls1_prf_P_hash(md, secret, secret_len, seed, seed_len, out, olen)) 352 if (!tls1_prf_P_hash(md, secret, secret_len, seed, seed_len, out, out_len))
353 return 0; 353 return 0;
354 354
355 return 1; 355 return 1;