summaryrefslogtreecommitdiff
path: root/src/lib/libssl/d1_clnt.c
diff options
context:
space:
mode:
authorjsing <>2014-12-14 16:19:38 +0000
committerjsing <>2014-12-14 16:19:38 +0000
commit9d7627cb78b8d58f06310b08151767a7309504dc (patch)
treecbd847f515646f61373c178d71312104700ac3da /src/lib/libssl/d1_clnt.c
parent07ed3281a22942e6f12d90c428ffd29e5f4f1ddb (diff)
downloadopenbsd-9d7627cb78b8d58f06310b08151767a7309504dc.tar.gz
openbsd-9d7627cb78b8d58f06310b08151767a7309504dc.tar.bz2
openbsd-9d7627cb78b8d58f06310b08151767a7309504dc.zip
Convert all of the straight forward client handshake handling code to use
the new handshake functions. ok miod@
Diffstat (limited to 'src/lib/libssl/d1_clnt.c')
-rw-r--r--src/lib/libssl/d1_clnt.c71
1 files changed, 19 insertions, 52 deletions
diff --git a/src/lib/libssl/d1_clnt.c b/src/lib/libssl/d1_clnt.c
index 490e2849f1..3687f5917c 100644
--- a/src/lib/libssl/d1_clnt.c
+++ b/src/lib/libssl/d1_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_clnt.c,v 1.40 2014/12/10 15:43:31 jsing Exp $ */ 1/* $OpenBSD: d1_clnt.c,v 1.41 2014/12/14 16:19:38 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.
@@ -759,14 +759,12 @@ end:
759int 759int
760dtls1_client_hello(SSL *s) 760dtls1_client_hello(SSL *s)
761{ 761{
762 unsigned char *buf; 762 unsigned char *bufend, *d, *p;
763 unsigned char *p, *d;
764 unsigned int i; 763 unsigned int i;
765 unsigned long l;
766 764
767 buf = (unsigned char *)s->init_buf->data;
768 if (s->state == SSL3_ST_CW_CLNT_HELLO_A) { 765 if (s->state == SSL3_ST_CW_CLNT_HELLO_A) {
769 SSL_SESSION *sess = s->session; 766 SSL_SESSION *sess = s->session;
767
770 if ((s->session == NULL) || 768 if ((s->session == NULL) ||
771 (s->session->ssl_version != s->version) || 769 (s->session->ssl_version != s->version) ||
772 (!sess->session_id_length && !sess->tlsext_tick) || 770 (!sess->session_id_length && !sess->tlsext_tick) ||
@@ -785,8 +783,7 @@ dtls1_client_hello(SSL *s)
785 if (i == sizeof(s->s3->client_random)) 783 if (i == sizeof(s->s3->client_random))
786 arc4random_buf(p, sizeof(s->s3->client_random)); 784 arc4random_buf(p, sizeof(s->s3->client_random));
787 785
788 /* Do the message type and length last */ 786 d = p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_HELLO);
789 d = p = &(buf[DTLS1_HM_HEADER_LENGTH]);
790 787
791 *(p++) = s->version >> 8; 788 *(p++) = s->version >> 8;
792 *(p++) = s->version&0xff; 789 *(p++) = s->version&0xff;
@@ -835,29 +832,20 @@ dtls1_client_hello(SSL *s)
835 *(p++) = 1; 832 *(p++) = 1;
836 *(p++) = 0; /* Add the NULL method */ 833 *(p++) = 0; /* Add the NULL method */
837 834
838 if ((p = ssl_add_clienthello_tlsext(s, p, 835 bufend = (unsigned char *)s->init_buf->data +
839 buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { 836 SSL3_RT_MAX_PLAIN_LENGTH;
837 if ((p = ssl_add_clienthello_tlsext(s, p, bufend)) == NULL) {
840 SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); 838 SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
841 goto err; 839 goto err;
842 } 840 }
843 841
844 l = (p - d); 842 ssl3_handshake_msg_finish(s, p - d);
845 d = buf;
846
847 d = dtls1_set_message_header(s, d, SSL3_MT_CLIENT_HELLO,
848 l, 0, l);
849 843
850 s->state = SSL3_ST_CW_CLNT_HELLO_B; 844 s->state = SSL3_ST_CW_CLNT_HELLO_B;
851 /* number of bytes to write */
852 s->init_num = p - buf;
853 s->init_off = 0;
854
855 /* buffer the message to handle re-xmits */
856 dtls1_buffer_message(s, 0);
857 } 845 }
858 846
859 /* SSL3_ST_CW_CLNT_HELLO_B */ 847 /* SSL3_ST_CW_CLNT_HELLO_B */
860 return (dtls1_do_write(s, SSL3_RT_HANDSHAKE)); 848 return (ssl3_handshake_write(s));
861err: 849err:
862 return (-1); 850 return (-1);
863} 851}
@@ -919,10 +907,9 @@ f_err:
919int 907int
920dtls1_send_client_key_exchange(SSL *s) 908dtls1_send_client_key_exchange(SSL *s)
921{ 909{
922 unsigned char *p, *d; 910 unsigned char *p, *q;
923 int n; 911 int n;
924 unsigned long alg_k; 912 unsigned long alg_k;
925 unsigned char *q;
926 EVP_PKEY *pkey = NULL; 913 EVP_PKEY *pkey = NULL;
927 EC_KEY *clnt_ecdh = NULL; 914 EC_KEY *clnt_ecdh = NULL;
928 const EC_POINT *srvr_ecpoint = NULL; 915 const EC_POINT *srvr_ecpoint = NULL;
@@ -932,8 +919,7 @@ dtls1_send_client_key_exchange(SSL *s)
932 BN_CTX * bn_ctx = NULL; 919 BN_CTX * bn_ctx = NULL;
933 920
934 if (s->state == SSL3_ST_CW_KEY_EXCH_A) { 921 if (s->state == SSL3_ST_CW_KEY_EXCH_A) {
935 d = (unsigned char *)s->init_buf->data; 922 p = ssl3_handshake_msg_start(s, SSL3_MT_CLIENT_KEY_EXCHANGE);
936 p = &(d[DTLS1_HM_HEADER_LENGTH]);
937 923
938 alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 924 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
939 925
@@ -1217,26 +1203,13 @@ dtls1_send_client_key_exchange(SSL *s)
1217 goto err; 1203 goto err;
1218 } 1204 }
1219 1205
1220 d = dtls1_set_message_header(s, d, 1206 ssl3_handshake_msg_finish(s, n);
1221 SSL3_MT_CLIENT_KEY_EXCHANGE, n, 0, n);
1222 /*
1223 *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
1224 l2n3(n,d);
1225 l2n(s->d1->handshake_write_seq,d);
1226 s->d1->handshake_write_seq++;
1227 */
1228 1207
1229 s->state = SSL3_ST_CW_KEY_EXCH_B; 1208 s->state = SSL3_ST_CW_KEY_EXCH_B;
1230 /* number of bytes to write */
1231 s->init_num = n + DTLS1_HM_HEADER_LENGTH;
1232 s->init_off = 0;
1233
1234 /* buffer the message to handle re-xmits */
1235 dtls1_buffer_message(s, 0);
1236 } 1209 }
1237 1210
1238 /* SSL3_ST_CW_KEY_EXCH_B */ 1211 /* SSL3_ST_CW_KEY_EXCH_B */
1239 return (dtls1_do_write(s, SSL3_RT_HANDSHAKE)); 1212 return (ssl3_handshake_write(s));
1240 1213
1241err: 1214err:
1242 BN_CTX_free(bn_ctx); 1215 BN_CTX_free(bn_ctx);
@@ -1249,7 +1222,7 @@ err:
1249int 1222int
1250dtls1_send_client_verify(SSL *s) 1223dtls1_send_client_verify(SSL *s)
1251{ 1224{
1252 unsigned char *p, *d; 1225 unsigned char *p;
1253 unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH]; 1226 unsigned char data[MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH];
1254 EVP_PKEY *pkey; 1227 EVP_PKEY *pkey;
1255 unsigned u = 0; 1228 unsigned u = 0;
@@ -1257,8 +1230,8 @@ dtls1_send_client_verify(SSL *s)
1257 int j; 1230 int j;
1258 1231
1259 if (s->state == SSL3_ST_CW_CERT_VRFY_A) { 1232 if (s->state == SSL3_ST_CW_CERT_VRFY_A) {
1260 d = (unsigned char *)s->init_buf->data; 1233 p = ssl3_handshake_msg_start(s, SSL3_MT_CERTIFICATE_VERIFY);
1261 p = &(d[DTLS1_HM_HEADER_LENGTH]); 1234
1262 pkey = s->cert->key->privatekey; 1235 pkey = s->cert->key->privatekey;
1263 1236
1264 s->method->ssl3_enc->cert_verify_mac(s, NID_sha1, 1237 s->method->ssl3_enc->cert_verify_mac(s, NID_sha1,
@@ -1304,20 +1277,14 @@ dtls1_send_client_verify(SSL *s)
1304 goto err; 1277 goto err;
1305 } 1278 }
1306 1279
1307 d = dtls1_set_message_header(s, d, 1280 ssl3_handshake_msg_finish(s, n);
1308 SSL3_MT_CERTIFICATE_VERIFY, n, 0, n);
1309
1310 s->init_num = (int)n + DTLS1_HM_HEADER_LENGTH;
1311 s->init_off = 0;
1312
1313 /* buffer the message to handle re-xmits */
1314 dtls1_buffer_message(s, 0);
1315 1281
1316 s->state = SSL3_ST_CW_CERT_VRFY_B; 1282 s->state = SSL3_ST_CW_CERT_VRFY_B;
1317 } 1283 }
1318 1284
1319 /* s->state = SSL3_ST_CW_CERT_VRFY_B */ 1285 /* s->state = SSL3_ST_CW_CERT_VRFY_B */
1320 return (dtls1_do_write(s, SSL3_RT_HANDSHAKE)); 1286 return (ssl3_handshake_write(s));
1287
1321err: 1288err:
1322 return (-1); 1289 return (-1);
1323} 1290}