summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/d1_srvr.c26
-rw-r--r--src/lib/libssl/s3_lib.c4
-rw-r--r--src/lib/libssl/ssl_ciph.c22
-rw-r--r--src/lib/libssl/ssl_clnt.c22
-rw-r--r--src/lib/libssl/ssl_locl.h8
-rw-r--r--src/lib/libssl/ssl_srvr.c32
-rw-r--r--src/lib/libssl/t1_enc.c97
7 files changed, 45 insertions, 166 deletions
diff --git a/src/lib/libssl/d1_srvr.c b/src/lib/libssl/d1_srvr.c
index 508e131730..605f0a59ad 100644
--- a/src/lib/libssl/d1_srvr.c
+++ b/src/lib/libssl/d1_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_srvr.c,v 1.85 2017/03/05 14:24:12 jsing Exp $ */ 1/* $OpenBSD: d1_srvr.c,v 1.86 2017/03/10 16:03:27 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -519,13 +519,23 @@ dtls1_accept(SSL *s)
519 s->internal->state = SSL3_ST_SR_CERT_VRFY_A; 519 s->internal->state = SSL3_ST_SR_CERT_VRFY_A;
520 s->internal->init_num = 0; 520 s->internal->init_num = 0;
521 521
522 /* We need to get hashes here so if there is 522 /*
523 * a client cert, it can be verified */ 523 * We need to get hashes here so if there is
524 tls1_cert_verify_mac(s, 524 * a client cert, it can be verified.
525 NID_md5, &(S3I(s)->tmp.cert_verify_md[0])); 525 */
526 tls1_cert_verify_mac(s, 526 if (S3I(s)->handshake_buffer) {
527 NID_sha1, 527 if (!tls1_digest_cached_records(s)) {
528 &(S3I(s)->tmp.cert_verify_md[MD5_DIGEST_LENGTH])); 528 ret = -1;
529 goto end;
530 }
531 }
532 if (!tls1_handshake_hash_value(s,
533 S3I(s)->tmp.cert_verify_md,
534 sizeof(S3I(s)->tmp.cert_verify_md),
535 NULL)) {
536 ret = -1;
537 goto end;
538 }
529 } 539 }
530 break; 540 break;
531 541
diff --git a/src/lib/libssl/s3_lib.c b/src/lib/libssl/s3_lib.c
index d6bf6a4574..8d45e1f8c1 100644
--- a/src/lib/libssl/s3_lib.c
+++ b/src/lib/libssl/s3_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_lib.c,v 1.137 2017/03/05 14:39:53 jsing Exp $ */ 1/* $OpenBSD: s3_lib.c,v 1.138 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1842,7 +1842,6 @@ ssl3_free(SSL *s)
1842 1842
1843 BIO_free(S3I(s)->handshake_buffer); 1843 BIO_free(S3I(s)->handshake_buffer);
1844 1844
1845 tls1_free_digest_list(s);
1846 tls1_handshake_hash_free(s); 1845 tls1_handshake_hash_free(s);
1847 1846
1848 free(S3I(s)->alpn_selected); 1847 free(S3I(s)->alpn_selected);
@@ -1884,7 +1883,6 @@ ssl3_clear(SSL *s)
1884 BIO_free(S3I(s)->handshake_buffer); 1883 BIO_free(S3I(s)->handshake_buffer);
1885 S3I(s)->handshake_buffer = NULL; 1884 S3I(s)->handshake_buffer = NULL;
1886 1885
1887 tls1_free_digest_list(s);
1888 tls1_handshake_hash_free(s); 1886 tls1_handshake_hash_free(s);
1889 1887
1890 free(S3I(s)->alpn_selected); 1888 free(S3I(s)->alpn_selected);
diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c
index da48765aba..49af292d6c 100644
--- a/src/lib/libssl/ssl_ciph.c
+++ b/src/lib/libssl/ssl_ciph.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_ciph.c,v 1.95 2017/03/05 14:39:53 jsing Exp $ */ 1/* $OpenBSD: ssl_ciph.c,v 1.96 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -193,12 +193,6 @@ static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = {
193 0, 0, 0, 0, 0, 0, 0, 193 0, 0, 0, 0, 0, 0, 0,
194}; 194};
195 195
196static int ssl_handshake_digest_flag[SSL_MD_NUM_IDX] = {
197 SSL_HANDSHAKE_MAC_MD5, SSL_HANDSHAKE_MAC_SHA,
198 SSL_HANDSHAKE_MAC_GOST94, 0, SSL_HANDSHAKE_MAC_SHA256,
199 SSL_HANDSHAKE_MAC_SHA384, SSL_HANDSHAKE_MAC_STREEBOG256,
200};
201
202#define CIPHER_ADD 1 196#define CIPHER_ADD 1
203#define CIPHER_KILL 2 197#define CIPHER_KILL 2
204#define CIPHER_DEL 3 198#define CIPHER_DEL 3
@@ -706,20 +700,6 @@ ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead)
706} 700}
707 701
708int 702int
709ssl_get_handshake_digest(int idx, long *mask, const EVP_MD **md)
710{
711 if (idx < 0 || idx >= SSL_MD_NUM_IDX) {
712 return 0;
713 }
714 *mask = ssl_handshake_digest_flag[idx];
715 if (*mask)
716 *md = ssl_digest_methods[idx];
717 else
718 *md = NULL;
719 return 1;
720}
721
722int
723ssl_get_handshake_evp_md(SSL *s, const EVP_MD **md) 703ssl_get_handshake_evp_md(SSL *s, const EVP_MD **md)
724{ 704{
725 *md = NULL; 705 *md = NULL;
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c
index 8dd30e87fb..1cdbf86c50 100644
--- a/src/lib/libssl/ssl_clnt.c
+++ b/src/lib/libssl/ssl_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_clnt.c,v 1.10 2017/03/05 14:39:53 jsing Exp $ */ 1/* $OpenBSD: ssl_clnt.c,v 1.11 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -2354,13 +2354,21 @@ ssl3_send_client_verify(SSL *s)
2354 pkey = s->cert->key->privatekey; 2354 pkey = s->cert->key->privatekey;
2355 pctx = EVP_PKEY_CTX_new(pkey, NULL); 2355 pctx = EVP_PKEY_CTX_new(pkey, NULL);
2356 EVP_PKEY_sign_init(pctx); 2356 EVP_PKEY_sign_init(pctx);
2357 if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) { 2357
2358 if (!SSL_USE_SIGALGS(s)) 2358 /* XXX - is this needed? */
2359 tls1_cert_verify_mac(s, 2359 if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) <= 0)
2360 NID_sha1, &(data[MD5_DIGEST_LENGTH]));
2361 } else {
2362 ERR_clear_error(); 2360 ERR_clear_error();
2361
2362 if (!SSL_USE_SIGALGS(s)) {
2363 if (S3I(s)->handshake_buffer) {
2364 if (!tls1_digest_cached_records(s))
2365 goto err;
2366 }
2367 if (!tls1_handshake_hash_value(s, data, sizeof(data),
2368 NULL))
2369 goto err;
2363 } 2370 }
2371
2364 /* 2372 /*
2365 * For TLS v1.2 send signature algorithm and signature 2373 * For TLS v1.2 send signature algorithm and signature
2366 * using agreed digest and cached handshake records. 2374 * using agreed digest and cached handshake records.
@@ -2388,8 +2396,6 @@ ssl3_send_client_verify(SSL *s)
2388 if (!tls1_digest_cached_records(s)) 2396 if (!tls1_digest_cached_records(s))
2389 goto err; 2397 goto err;
2390 } else if (pkey->type == EVP_PKEY_RSA) { 2398 } else if (pkey->type == EVP_PKEY_RSA) {
2391 tls1_cert_verify_mac(
2392 s, NID_md5, &(data[0]));
2393 if (RSA_sign(NID_md5_sha1, data, 2399 if (RSA_sign(NID_md5_sha1, data,
2394 MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]), 2400 MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, &(p[2]),
2395 &u, pkey->pkey.rsa) <= 0 ) { 2401 &u, pkey->pkey.rsa) <= 0 ) {
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index 3f5d6fad20..b68b680106 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.177 2017/03/05 14:39:53 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.178 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -805,10 +805,6 @@ typedef struct ssl3_state_internal_st {
805 805
806 /* used during startup, digest all incoming/outgoing packets */ 806 /* used during startup, digest all incoming/outgoing packets */
807 BIO *handshake_buffer; 807 BIO *handshake_buffer;
808 /* When set of handshake digests is determined, buffer is hashed
809 * and freed and MD_CTX-es for all required digests are stored in
810 * this array */
811 EVP_MD_CTX **handshake_dgst;
812 808
813 /* Rolling hash of handshake messages. */ 809 /* Rolling hash of handshake messages. */
814 EVP_MD_CTX *handshake_hash; 810 EVP_MD_CTX *handshake_hash;
@@ -1103,7 +1099,6 @@ void ssl_update_cache(SSL *s, int mode);
1103int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, 1099int ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc,
1104 const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size); 1100 const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size);
1105int ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead); 1101int ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead);
1106int ssl_get_handshake_digest(int i, long *mask, const EVP_MD **md);
1107int ssl_get_handshake_evp_md(SSL *s, const EVP_MD **md); 1102int ssl_get_handshake_evp_md(SSL *s, const EVP_MD **md);
1108 1103
1109int ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk); 1104int ssl_verify_cert_chain(SSL *s, STACK_OF(X509) *sk);
@@ -1293,7 +1288,6 @@ int tls1_change_cipher_state(SSL *s, int which);
1293int tls1_setup_key_block(SSL *s); 1288int tls1_setup_key_block(SSL *s);
1294int tls1_enc(SSL *s, int snd); 1289int tls1_enc(SSL *s, int snd);
1295int tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *p); 1290int tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *p);
1296int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *p);
1297int tls1_mac(SSL *ssl, unsigned char *md, int snd); 1291int tls1_mac(SSL *ssl, unsigned char *md, int snd);
1298int tls1_generate_master_secret(SSL *s, unsigned char *out, 1292int tls1_generate_master_secret(SSL *s, unsigned char *out,
1299 unsigned char *p, int len); 1293 unsigned char *p, int len);
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c
index a48cf246da..d98a76f8f0 100644
--- a/src/lib/libssl/ssl_srvr.c
+++ b/src/lib/libssl/ssl_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_srvr.c,v 1.10 2017/03/05 14:39:53 jsing Exp $ */ 1/* $OpenBSD: ssl_srvr.c,v 1.11 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -493,18 +493,12 @@ ssl3_accept(SSL *s)
493 goto end; 493 goto end;
494 } 494 }
495 } else { 495 } else {
496 int offset = 0;
497 int dgst_num;
498
499 s->internal->state = SSL3_ST_SR_CERT_VRFY_A; 496 s->internal->state = SSL3_ST_SR_CERT_VRFY_A;
500 s->internal->init_num = 0; 497 s->internal->init_num = 0;
501 498
502 /* 499 /*
503 * We need to get hashes here so if there is 500 * We need to get hashes here so if there is
504 * a client cert, it can be verified 501 * a client cert, it can be verified.
505 * FIXME - digest processing for
506 * CertificateVerify should be generalized.
507 * But it is next step
508 */ 502 */
509 if (S3I(s)->handshake_buffer) { 503 if (S3I(s)->handshake_buffer) {
510 if (!tls1_digest_cached_records(s)) { 504 if (!tls1_digest_cached_records(s)) {
@@ -512,22 +506,12 @@ ssl3_accept(SSL *s)
512 goto end; 506 goto end;
513 } 507 }
514 } 508 }
515 for (dgst_num = 0; dgst_num < SSL_MAX_DIGEST; 509 if (!tls1_handshake_hash_value(s,
516 dgst_num++) 510 S3I(s)->tmp.cert_verify_md,
517 if (S3I(s)->handshake_dgst[dgst_num]) { 511 sizeof(S3I(s)->tmp.cert_verify_md),
518 int dgst_size; 512 NULL)) {
519 513 ret = -1;
520 tls1_cert_verify_mac(s, 514 goto end;
521 EVP_MD_CTX_type(
522 S3I(s)->handshake_dgst[dgst_num]),
523 &(S3I(s)->tmp.cert_verify_md[offset]));
524 dgst_size = EVP_MD_CTX_size(
525 S3I(s)->handshake_dgst[dgst_num]);
526 if (dgst_size < 0) {
527 ret = -1;
528 goto end;
529 }
530 offset += dgst_size;
531 } 515 }
532 } 516 }
533 break; 517 break;
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index 0179ac3061..e9a9713134 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: t1_enc.c,v 1.101 2017/03/10 15:08:49 jsing Exp $ */ 1/* $OpenBSD: t1_enc.c,v 1.102 2017/03/10 16:03:27 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -165,7 +165,6 @@ int
165tls1_init_finished_mac(SSL *s) 165tls1_init_finished_mac(SSL *s)
166{ 166{
167 BIO_free(S3I(s)->handshake_buffer); 167 BIO_free(S3I(s)->handshake_buffer);
168 tls1_free_digest_list(s);
169 168
170 S3I(s)->handshake_buffer = BIO_new(BIO_s_mem()); 169 S3I(s)->handshake_buffer = BIO_new(BIO_s_mem());
171 if (S3I(s)->handshake_buffer == NULL) 170 if (S3I(s)->handshake_buffer == NULL)
@@ -176,29 +175,9 @@ tls1_init_finished_mac(SSL *s)
176 return (1); 175 return (1);
177} 176}
178 177
179void
180tls1_free_digest_list(SSL *s)
181{
182 int i;
183
184 if (s == NULL)
185 return;
186 if (S3I(s)->handshake_dgst == NULL)
187 return;
188
189 for (i = 0; i < SSL_MAX_DIGEST; i++) {
190 if (S3I(s)->handshake_dgst[i])
191 EVP_MD_CTX_destroy(S3I(s)->handshake_dgst[i]);
192 }
193 free(S3I(s)->handshake_dgst);
194 S3I(s)->handshake_dgst = NULL;
195}
196
197int 178int
198tls1_finish_mac(SSL *s, const unsigned char *buf, int len) 179tls1_finish_mac(SSL *s, const unsigned char *buf, int len)
199{ 180{
200 int i;
201
202 if (len < 0) 181 if (len < 0)
203 return 0; 182 return 0;
204 183
@@ -211,60 +190,21 @@ tls1_finish_mac(SSL *s, const unsigned char *buf, int len)
211 return 1; 190 return 1;
212 } 191 }
213 192
214 for (i = 0; i < SSL_MAX_DIGEST; i++) {
215 if (S3I(s)->handshake_dgst[i] == NULL)
216 continue;
217 if (!EVP_DigestUpdate(S3I(s)->handshake_dgst[i], buf, len)) {
218 SSLerror(s, ERR_R_EVP_LIB);
219 return 0;
220 }
221 }
222
223 return 1; 193 return 1;
224} 194}
225 195
226int 196int
227tls1_digest_cached_records(SSL *s) 197tls1_digest_cached_records(SSL *s)
228{ 198{
229 const EVP_MD *md; 199 long hdatalen;
230 long hdatalen, mask;
231 void *hdata; 200 void *hdata;
232 int i;
233
234 tls1_free_digest_list(s);
235 201
236 S3I(s)->handshake_dgst = calloc(SSL_MAX_DIGEST, sizeof(EVP_MD_CTX *));
237 if (S3I(s)->handshake_dgst == NULL) {
238 SSLerror(s, ERR_R_MALLOC_FAILURE);
239 goto err;
240 }
241 hdatalen = BIO_get_mem_data(S3I(s)->handshake_buffer, &hdata); 202 hdatalen = BIO_get_mem_data(S3I(s)->handshake_buffer, &hdata);
242 if (hdatalen <= 0) { 203 if (hdatalen <= 0) {
243 SSLerror(s, SSL_R_BAD_HANDSHAKE_LENGTH); 204 SSLerror(s, SSL_R_BAD_HANDSHAKE_LENGTH);
244 goto err; 205 goto err;
245 } 206 }
246 207
247 /* Loop through bits of the algorithm2 field and create MD contexts. */
248 for (i = 0; ssl_get_handshake_digest(i, &mask, &md); i++) {
249 if ((mask & ssl_get_algorithm2(s)) == 0 || md == NULL)
250 continue;
251
252 S3I(s)->handshake_dgst[i] = EVP_MD_CTX_create();
253 if (S3I(s)->handshake_dgst[i] == NULL) {
254 SSLerror(s, ERR_R_MALLOC_FAILURE);
255 goto err;
256 }
257 if (!EVP_DigestInit_ex(S3I(s)->handshake_dgst[i], md, NULL)) {
258 SSLerror(s, ERR_R_EVP_LIB);
259 goto err;
260 }
261 if (!EVP_DigestUpdate(S3I(s)->handshake_dgst[i], hdata,
262 hdatalen)) {
263 SSLerror(s, ERR_R_EVP_LIB);
264 goto err;
265 }
266 }
267
268 if (!(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) { 208 if (!(s->s3->flags & TLS1_FLAGS_KEEP_HANDSHAKE)) {
269 BIO_free(S3I(s)->handshake_buffer); 209 BIO_free(S3I(s)->handshake_buffer);
270 S3I(s)->handshake_buffer = NULL; 210 S3I(s)->handshake_buffer = NULL;
@@ -273,7 +213,6 @@ tls1_digest_cached_records(SSL *s)
273 return 1; 213 return 1;
274 214
275 err: 215 err:
276 tls1_free_digest_list(s);
277 return 0; 216 return 0;
278} 217}
279 218
@@ -1091,38 +1030,6 @@ tls1_enc(SSL *s, int send)
1091} 1030}
1092 1031
1093int 1032int
1094tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
1095{
1096 EVP_MD_CTX ctx, *d = NULL;
1097 unsigned int ret;
1098 int i;
1099
1100 if (S3I(s)->handshake_buffer)
1101 if (!tls1_digest_cached_records(s))
1102 return 0;
1103
1104 for (i = 0; i < SSL_MAX_DIGEST; i++) {
1105 if (S3I(s)->handshake_dgst[i] &&
1106 EVP_MD_CTX_type(S3I(s)->handshake_dgst[i]) == md_nid) {
1107 d = S3I(s)->handshake_dgst[i];
1108 break;
1109 }
1110 }
1111 if (d == NULL) {
1112 SSLerror(s, SSL_R_NO_REQUIRED_DIGEST);
1113 return 0;
1114 }
1115
1116 EVP_MD_CTX_init(&ctx);
1117 if (!EVP_MD_CTX_copy_ex(&ctx, d))
1118 return 0;
1119 EVP_DigestFinal_ex(&ctx, out, &ret);
1120 EVP_MD_CTX_cleanup(&ctx);
1121
1122 return ((int)ret);
1123}
1124
1125int
1126tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *out) 1033tls1_final_finish_mac(SSL *s, const char *str, int slen, unsigned char *out)
1127{ 1034{
1128 unsigned char buf1[EVP_MAX_MD_SIZE]; 1035 unsigned char buf1[EVP_MAX_MD_SIZE];