diff options
| author | jsing <> | 2014-12-14 16:19:38 +0000 |
|---|---|---|
| committer | jsing <> | 2014-12-14 16:19:38 +0000 |
| commit | ec933bfbb9988ed5f18f0b1e880ad24930af48d2 (patch) | |
| tree | cbd847f515646f61373c178d71312104700ac3da /src/lib/libssl/d1_clnt.c | |
| parent | e2ae5544583a38410ebe312a44de7b1e30c8a533 (diff) | |
| download | openbsd-ec933bfbb9988ed5f18f0b1e880ad24930af48d2.tar.gz openbsd-ec933bfbb9988ed5f18f0b1e880ad24930af48d2.tar.bz2 openbsd-ec933bfbb9988ed5f18f0b1e880ad24930af48d2.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.c | 71 |
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: | |||
| 759 | int | 759 | int |
| 760 | dtls1_client_hello(SSL *s) | 760 | dtls1_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)); |
| 861 | err: | 849 | err: |
| 862 | return (-1); | 850 | return (-1); |
| 863 | } | 851 | } |
| @@ -919,10 +907,9 @@ f_err: | |||
| 919 | int | 907 | int |
| 920 | dtls1_send_client_key_exchange(SSL *s) | 908 | dtls1_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 | ||
| 1241 | err: | 1214 | err: |
| 1242 | BN_CTX_free(bn_ctx); | 1215 | BN_CTX_free(bn_ctx); |
| @@ -1249,7 +1222,7 @@ err: | |||
| 1249 | int | 1222 | int |
| 1250 | dtls1_send_client_verify(SSL *s) | 1223 | dtls1_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 | |||
| 1321 | err: | 1288 | err: |
| 1322 | return (-1); | 1289 | return (-1); |
| 1323 | } | 1290 | } |
