summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/s3_srvr.c79
-rw-r--r--src/lib/libssl/src/ssl/s3_srvr.c79
2 files changed, 70 insertions, 88 deletions
diff --git a/src/lib/libssl/s3_srvr.c b/src/lib/libssl/s3_srvr.c
index da7f6d71cd..e9496f9b9d 100644
--- a/src/lib/libssl/s3_srvr.c
+++ b/src/lib/libssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.118 2015/09/11 18:08:21 jsing Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.119 2015/09/12 13:03:06 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 *
@@ -1256,8 +1256,7 @@ ssl3_send_server_key_exchange(SSL *s)
1256 r[0] = dh->p; 1256 r[0] = dh->p;
1257 r[1] = dh->g; 1257 r[1] = dh->g;
1258 r[2] = dh->pub_key; 1258 r[2] = dh->pub_key;
1259 } else 1259 } else if (type & SSL_kECDHE) {
1260 if (type & SSL_kECDHE) {
1261 const EC_GROUP *group; 1260 const EC_GROUP *group;
1262 1261
1263 ecdhp = cert->ecdh_tmp; 1262 ecdhp = cert->ecdh_tmp;
@@ -1404,8 +1403,9 @@ ssl3_send_server_key_exchange(SSL *s)
1404 ERR_LIB_BUF); 1403 ERR_LIB_BUF);
1405 goto err; 1404 goto err;
1406 } 1405 }
1407 d = (unsigned char *)s->init_buf->data; 1406
1408 p = &d[4]; 1407 d = p = ssl3_handshake_msg_start(s,
1408 SSL3_MT_SERVER_KEY_EXCHANGE);
1409 1409
1410 for (i = 0; i < 4 && r[i] != NULL; i++) { 1410 for (i = 0; i < 4 && r[i] != NULL; i++) {
1411 s2n(nr[i], p); 1411 s2n(nr[i], p);
@@ -1458,7 +1458,7 @@ ssl3_send_server_key_exchange(SSL *s)
1458 EVP_DigestUpdate(&md_ctx, 1458 EVP_DigestUpdate(&md_ctx,
1459 s->s3->server_random, 1459 s->s3->server_random,
1460 SSL3_RANDOM_SIZE); 1460 SSL3_RANDOM_SIZE);
1461 EVP_DigestUpdate(&md_ctx, &d[4], n); 1461 EVP_DigestUpdate(&md_ctx, d, n);
1462 EVP_DigestFinal_ex(&md_ctx, q, 1462 EVP_DigestFinal_ex(&md_ctx, q,
1463 (unsigned int *)&i); 1463 (unsigned int *)&i);
1464 q += i; 1464 q += i;
@@ -1493,7 +1493,7 @@ ssl3_send_server_key_exchange(SSL *s)
1493 EVP_SignUpdate(&md_ctx, 1493 EVP_SignUpdate(&md_ctx,
1494 s->s3->server_random, 1494 s->s3->server_random,
1495 SSL3_RANDOM_SIZE); 1495 SSL3_RANDOM_SIZE);
1496 EVP_SignUpdate(&md_ctx, &d[4], n); 1496 EVP_SignUpdate(&md_ctx, d, n);
1497 if (!EVP_SignFinal(&md_ctx, &p[2], 1497 if (!EVP_SignFinal(&md_ctx, &p[2],
1498 (unsigned int *)&i, pkey)) { 1498 (unsigned int *)&i, pkey)) {
1499 SSLerr( 1499 SSLerr(
@@ -1514,17 +1514,14 @@ ssl3_send_server_key_exchange(SSL *s)
1514 } 1514 }
1515 } 1515 }
1516 1516
1517 *(d++) = SSL3_MT_SERVER_KEY_EXCHANGE; 1517 ssl3_handshake_msg_finish(s, n);
1518 l2n3(n, d);
1519
1520 /* we should now have things packed up, so lets send it off */
1521 s->init_num = n + 4;
1522 s->init_off = 0;
1523 } 1518 }
1524 1519
1525 s->state = SSL3_ST_SW_KEY_EXCH_B; 1520 s->state = SSL3_ST_SW_KEY_EXCH_B;
1526 EVP_MD_CTX_cleanup(&md_ctx); 1521 EVP_MD_CTX_cleanup(&md_ctx);
1527 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 1522
1523 return (ssl3_handshake_write(s));
1524
1528f_err: 1525f_err:
1529 ssl3_send_alert(s, SSL3_AL_FATAL, al); 1526 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1530err: 1527err:
@@ -1546,7 +1543,8 @@ ssl3_send_certificate_request(SSL *s)
1546 if (s->state == SSL3_ST_SW_CERT_REQ_A) { 1543 if (s->state == SSL3_ST_SW_CERT_REQ_A) {
1547 buf = s->init_buf; 1544 buf = s->init_buf;
1548 1545
1549 d = p = (unsigned char *)&(buf->data[4]); 1546 d = p = ssl3_handshake_msg_start(s,
1547 SSL3_MT_CERTIFICATE_REQUEST);
1550 1548
1551 /* get the list of acceptable cert types */ 1549 /* get the list of acceptable cert types */
1552 p++; 1550 p++;
@@ -1578,7 +1576,8 @@ ssl3_send_certificate_request(SSL *s)
1578 ERR_R_BUF_LIB); 1576 ERR_R_BUF_LIB);
1579 goto err; 1577 goto err;
1580 } 1578 }
1581 p = (unsigned char *)&(buf->data[4 + n]); 1579 p = ssl3_handshake_msg_start(s,
1580 SSL3_MT_CERTIFICATE_REQUEST) + n;
1582 s2n(j, p); 1581 s2n(j, p);
1583 i2d_X509_NAME(name, &p); 1582 i2d_X509_NAME(name, &p);
1584 n += 2 + j; 1583 n += 2 + j;
@@ -1586,22 +1585,17 @@ ssl3_send_certificate_request(SSL *s)
1586 } 1585 }
1587 } 1586 }
1588 /* else no CA names */ 1587 /* else no CA names */
1589 p = (unsigned char *)&(buf->data[4 + off]); 1588 p = ssl3_handshake_msg_start(s,
1589 SSL3_MT_CERTIFICATE_REQUEST) + off;
1590 s2n(nl, p); 1590 s2n(nl, p);
1591 1591
1592 d = (unsigned char *)buf->data; 1592 ssl3_handshake_msg_finish(s, n);
1593 *(d++) = SSL3_MT_CERTIFICATE_REQUEST;
1594 l2n3(n, d);
1595
1596 /* we should now have things packed up, so lets send it off */
1597 s->init_num = n + 4;
1598 s->init_off = 0;
1599 1593
1600 s->state = SSL3_ST_SW_CERT_REQ_B; 1594 s->state = SSL3_ST_SW_CERT_REQ_B;
1601 } 1595 }
1602 1596
1603 /* SSL3_ST_SW_CERT_REQ_B */ 1597 /* SSL3_ST_SW_CERT_REQ_B */
1604 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 1598 return (ssl3_handshake_write(s));
1605err: 1599err:
1606 return (-1); 1600 return (-1);
1607} 1601}
@@ -2464,7 +2458,7 @@ ssl3_send_server_certificate(SSL *s)
2464 } 2458 }
2465 2459
2466 /* SSL3_ST_SW_CERT_B */ 2460 /* SSL3_ST_SW_CERT_B */
2467 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 2461 return (ssl3_handshake_write(s));
2468} 2462}
2469 2463
2470/* send a new session ticket (not necessarily for a new session) */ 2464/* send a new session ticket (not necessarily for a new session) */
@@ -2472,7 +2466,7 @@ int
2472ssl3_send_newsession_ticket(SSL *s) 2466ssl3_send_newsession_ticket(SSL *s)
2473{ 2467{
2474 if (s->state == SSL3_ST_SW_SESSION_TICKET_A) { 2468 if (s->state == SSL3_ST_SW_SESSION_TICKET_A) {
2475 unsigned char *p, *senc, *macstart; 2469 unsigned char *d, *p, *senc, *macstart;
2476 const unsigned char *const_p; 2470 const unsigned char *const_p;
2477 int len, slen_full, slen; 2471 int len, slen_full, slen;
2478 SSL_SESSION *sess; 2472 SSL_SESSION *sess;
@@ -2536,13 +2530,11 @@ ssl3_send_newsession_ticket(SSL *s)
2536 return (-1); 2530 return (-1);
2537 } 2531 }
2538 2532
2539 p = (unsigned char *)s->init_buf->data; 2533 d = p = ssl3_handshake_msg_start(s, SSL3_MT_NEWSESSION_TICKET);
2540 /* do the header */ 2534
2541 *(p++) = SSL3_MT_NEWSESSION_TICKET;
2542 /* Skip message length for now */
2543 p += 3;
2544 EVP_CIPHER_CTX_init(&ctx); 2535 EVP_CIPHER_CTX_init(&ctx);
2545 HMAC_CTX_init(&hctx); 2536 HMAC_CTX_init(&hctx);
2537
2546 /* 2538 /*
2547 * Initialize HMAC and cipher contexts. If callback present 2539 * Initialize HMAC and cipher contexts. If callback present
2548 * it does all the work otherwise use generated values 2540 * it does all the work otherwise use generated values
@@ -2591,26 +2583,25 @@ ssl3_send_newsession_ticket(SSL *s)
2591 HMAC_Update(&hctx, macstart, p - macstart); 2583 HMAC_Update(&hctx, macstart, p - macstart);
2592 HMAC_Final(&hctx, p, &hlen); 2584 HMAC_Final(&hctx, p, &hlen);
2593 HMAC_CTX_cleanup(&hctx); 2585 HMAC_CTX_cleanup(&hctx);
2594
2595 p += hlen; 2586 p += hlen;
2587
2596 /* Now write out lengths: p points to end of data written */ 2588 /* Now write out lengths: p points to end of data written */
2597 /* Total length */ 2589 /* Total length */
2598 len = p - (unsigned char *)s->init_buf->data; 2590 len = p - d;
2599 p = (unsigned char *)s->init_buf->data + 1; 2591
2600 l2n3(len - 4, p); /* Message length */ 2592 /* Skip ticket lifetime hint. */
2601 p += 4; 2593 p = d + 4;
2602 s2n(len - 10, p); 2594 s2n(len - 6, p); /* Message length */
2603 /* Ticket length */ 2595
2604 2596 ssl3_handshake_msg_finish(s, len);
2605 /* number of bytes to write */ 2597
2606 s->init_num = len;
2607 s->state = SSL3_ST_SW_SESSION_TICKET_B; 2598 s->state = SSL3_ST_SW_SESSION_TICKET_B;
2608 s->init_off = 0; 2599
2609 free(senc); 2600 free(senc);
2610 } 2601 }
2611 2602
2612 /* SSL3_ST_SW_SESSION_TICKET_B */ 2603 /* SSL3_ST_SW_SESSION_TICKET_B */
2613 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 2604 return (ssl3_handshake_write(s));
2614} 2605}
2615 2606
2616int 2607int
diff --git a/src/lib/libssl/src/ssl/s3_srvr.c b/src/lib/libssl/src/ssl/s3_srvr.c
index da7f6d71cd..e9496f9b9d 100644
--- a/src/lib/libssl/src/ssl/s3_srvr.c
+++ b/src/lib/libssl/src/ssl/s3_srvr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_srvr.c,v 1.118 2015/09/11 18:08:21 jsing Exp $ */ 1/* $OpenBSD: s3_srvr.c,v 1.119 2015/09/12 13:03:06 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 *
@@ -1256,8 +1256,7 @@ ssl3_send_server_key_exchange(SSL *s)
1256 r[0] = dh->p; 1256 r[0] = dh->p;
1257 r[1] = dh->g; 1257 r[1] = dh->g;
1258 r[2] = dh->pub_key; 1258 r[2] = dh->pub_key;
1259 } else 1259 } else if (type & SSL_kECDHE) {
1260 if (type & SSL_kECDHE) {
1261 const EC_GROUP *group; 1260 const EC_GROUP *group;
1262 1261
1263 ecdhp = cert->ecdh_tmp; 1262 ecdhp = cert->ecdh_tmp;
@@ -1404,8 +1403,9 @@ ssl3_send_server_key_exchange(SSL *s)
1404 ERR_LIB_BUF); 1403 ERR_LIB_BUF);
1405 goto err; 1404 goto err;
1406 } 1405 }
1407 d = (unsigned char *)s->init_buf->data; 1406
1408 p = &d[4]; 1407 d = p = ssl3_handshake_msg_start(s,
1408 SSL3_MT_SERVER_KEY_EXCHANGE);
1409 1409
1410 for (i = 0; i < 4 && r[i] != NULL; i++) { 1410 for (i = 0; i < 4 && r[i] != NULL; i++) {
1411 s2n(nr[i], p); 1411 s2n(nr[i], p);
@@ -1458,7 +1458,7 @@ ssl3_send_server_key_exchange(SSL *s)
1458 EVP_DigestUpdate(&md_ctx, 1458 EVP_DigestUpdate(&md_ctx,
1459 s->s3->server_random, 1459 s->s3->server_random,
1460 SSL3_RANDOM_SIZE); 1460 SSL3_RANDOM_SIZE);
1461 EVP_DigestUpdate(&md_ctx, &d[4], n); 1461 EVP_DigestUpdate(&md_ctx, d, n);
1462 EVP_DigestFinal_ex(&md_ctx, q, 1462 EVP_DigestFinal_ex(&md_ctx, q,
1463 (unsigned int *)&i); 1463 (unsigned int *)&i);
1464 q += i; 1464 q += i;
@@ -1493,7 +1493,7 @@ ssl3_send_server_key_exchange(SSL *s)
1493 EVP_SignUpdate(&md_ctx, 1493 EVP_SignUpdate(&md_ctx,
1494 s->s3->server_random, 1494 s->s3->server_random,
1495 SSL3_RANDOM_SIZE); 1495 SSL3_RANDOM_SIZE);
1496 EVP_SignUpdate(&md_ctx, &d[4], n); 1496 EVP_SignUpdate(&md_ctx, d, n);
1497 if (!EVP_SignFinal(&md_ctx, &p[2], 1497 if (!EVP_SignFinal(&md_ctx, &p[2],
1498 (unsigned int *)&i, pkey)) { 1498 (unsigned int *)&i, pkey)) {
1499 SSLerr( 1499 SSLerr(
@@ -1514,17 +1514,14 @@ ssl3_send_server_key_exchange(SSL *s)
1514 } 1514 }
1515 } 1515 }
1516 1516
1517 *(d++) = SSL3_MT_SERVER_KEY_EXCHANGE; 1517 ssl3_handshake_msg_finish(s, n);
1518 l2n3(n, d);
1519
1520 /* we should now have things packed up, so lets send it off */
1521 s->init_num = n + 4;
1522 s->init_off = 0;
1523 } 1518 }
1524 1519
1525 s->state = SSL3_ST_SW_KEY_EXCH_B; 1520 s->state = SSL3_ST_SW_KEY_EXCH_B;
1526 EVP_MD_CTX_cleanup(&md_ctx); 1521 EVP_MD_CTX_cleanup(&md_ctx);
1527 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 1522
1523 return (ssl3_handshake_write(s));
1524
1528f_err: 1525f_err:
1529 ssl3_send_alert(s, SSL3_AL_FATAL, al); 1526 ssl3_send_alert(s, SSL3_AL_FATAL, al);
1530err: 1527err:
@@ -1546,7 +1543,8 @@ ssl3_send_certificate_request(SSL *s)
1546 if (s->state == SSL3_ST_SW_CERT_REQ_A) { 1543 if (s->state == SSL3_ST_SW_CERT_REQ_A) {
1547 buf = s->init_buf; 1544 buf = s->init_buf;
1548 1545
1549 d = p = (unsigned char *)&(buf->data[4]); 1546 d = p = ssl3_handshake_msg_start(s,
1547 SSL3_MT_CERTIFICATE_REQUEST);
1550 1548
1551 /* get the list of acceptable cert types */ 1549 /* get the list of acceptable cert types */
1552 p++; 1550 p++;
@@ -1578,7 +1576,8 @@ ssl3_send_certificate_request(SSL *s)
1578 ERR_R_BUF_LIB); 1576 ERR_R_BUF_LIB);
1579 goto err; 1577 goto err;
1580 } 1578 }
1581 p = (unsigned char *)&(buf->data[4 + n]); 1579 p = ssl3_handshake_msg_start(s,
1580 SSL3_MT_CERTIFICATE_REQUEST) + n;
1582 s2n(j, p); 1581 s2n(j, p);
1583 i2d_X509_NAME(name, &p); 1582 i2d_X509_NAME(name, &p);
1584 n += 2 + j; 1583 n += 2 + j;
@@ -1586,22 +1585,17 @@ ssl3_send_certificate_request(SSL *s)
1586 } 1585 }
1587 } 1586 }
1588 /* else no CA names */ 1587 /* else no CA names */
1589 p = (unsigned char *)&(buf->data[4 + off]); 1588 p = ssl3_handshake_msg_start(s,
1589 SSL3_MT_CERTIFICATE_REQUEST) + off;
1590 s2n(nl, p); 1590 s2n(nl, p);
1591 1591
1592 d = (unsigned char *)buf->data; 1592 ssl3_handshake_msg_finish(s, n);
1593 *(d++) = SSL3_MT_CERTIFICATE_REQUEST;
1594 l2n3(n, d);
1595
1596 /* we should now have things packed up, so lets send it off */
1597 s->init_num = n + 4;
1598 s->init_off = 0;
1599 1593
1600 s->state = SSL3_ST_SW_CERT_REQ_B; 1594 s->state = SSL3_ST_SW_CERT_REQ_B;
1601 } 1595 }
1602 1596
1603 /* SSL3_ST_SW_CERT_REQ_B */ 1597 /* SSL3_ST_SW_CERT_REQ_B */
1604 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 1598 return (ssl3_handshake_write(s));
1605err: 1599err:
1606 return (-1); 1600 return (-1);
1607} 1601}
@@ -2464,7 +2458,7 @@ ssl3_send_server_certificate(SSL *s)
2464 } 2458 }
2465 2459
2466 /* SSL3_ST_SW_CERT_B */ 2460 /* SSL3_ST_SW_CERT_B */
2467 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 2461 return (ssl3_handshake_write(s));
2468} 2462}
2469 2463
2470/* send a new session ticket (not necessarily for a new session) */ 2464/* send a new session ticket (not necessarily for a new session) */
@@ -2472,7 +2466,7 @@ int
2472ssl3_send_newsession_ticket(SSL *s) 2466ssl3_send_newsession_ticket(SSL *s)
2473{ 2467{
2474 if (s->state == SSL3_ST_SW_SESSION_TICKET_A) { 2468 if (s->state == SSL3_ST_SW_SESSION_TICKET_A) {
2475 unsigned char *p, *senc, *macstart; 2469 unsigned char *d, *p, *senc, *macstart;
2476 const unsigned char *const_p; 2470 const unsigned char *const_p;
2477 int len, slen_full, slen; 2471 int len, slen_full, slen;
2478 SSL_SESSION *sess; 2472 SSL_SESSION *sess;
@@ -2536,13 +2530,11 @@ ssl3_send_newsession_ticket(SSL *s)
2536 return (-1); 2530 return (-1);
2537 } 2531 }
2538 2532
2539 p = (unsigned char *)s->init_buf->data; 2533 d = p = ssl3_handshake_msg_start(s, SSL3_MT_NEWSESSION_TICKET);
2540 /* do the header */ 2534
2541 *(p++) = SSL3_MT_NEWSESSION_TICKET;
2542 /* Skip message length for now */
2543 p += 3;
2544 EVP_CIPHER_CTX_init(&ctx); 2535 EVP_CIPHER_CTX_init(&ctx);
2545 HMAC_CTX_init(&hctx); 2536 HMAC_CTX_init(&hctx);
2537
2546 /* 2538 /*
2547 * Initialize HMAC and cipher contexts. If callback present 2539 * Initialize HMAC and cipher contexts. If callback present
2548 * it does all the work otherwise use generated values 2540 * it does all the work otherwise use generated values
@@ -2591,26 +2583,25 @@ ssl3_send_newsession_ticket(SSL *s)
2591 HMAC_Update(&hctx, macstart, p - macstart); 2583 HMAC_Update(&hctx, macstart, p - macstart);
2592 HMAC_Final(&hctx, p, &hlen); 2584 HMAC_Final(&hctx, p, &hlen);
2593 HMAC_CTX_cleanup(&hctx); 2585 HMAC_CTX_cleanup(&hctx);
2594
2595 p += hlen; 2586 p += hlen;
2587
2596 /* Now write out lengths: p points to end of data written */ 2588 /* Now write out lengths: p points to end of data written */
2597 /* Total length */ 2589 /* Total length */
2598 len = p - (unsigned char *)s->init_buf->data; 2590 len = p - d;
2599 p = (unsigned char *)s->init_buf->data + 1; 2591
2600 l2n3(len - 4, p); /* Message length */ 2592 /* Skip ticket lifetime hint. */
2601 p += 4; 2593 p = d + 4;
2602 s2n(len - 10, p); 2594 s2n(len - 6, p); /* Message length */
2603 /* Ticket length */ 2595
2604 2596 ssl3_handshake_msg_finish(s, len);
2605 /* number of bytes to write */ 2597
2606 s->init_num = len;
2607 s->state = SSL3_ST_SW_SESSION_TICKET_B; 2598 s->state = SSL3_ST_SW_SESSION_TICKET_B;
2608 s->init_off = 0; 2599
2609 free(senc); 2600 free(senc);
2610 } 2601 }
2611 2602
2612 /* SSL3_ST_SW_SESSION_TICKET_B */ 2603 /* SSL3_ST_SW_SESSION_TICKET_B */
2613 return (ssl3_do_write(s, SSL3_RT_HANDSHAKE)); 2604 return (ssl3_handshake_write(s));
2614} 2605}
2615 2606
2616int 2607int