diff options
Diffstat (limited to 'src/lib/libssl/d1_srvr.c')
-rw-r--r-- | src/lib/libssl/d1_srvr.c | 26 |
1 files changed, 7 insertions, 19 deletions
diff --git a/src/lib/libssl/d1_srvr.c b/src/lib/libssl/d1_srvr.c index a6a4c87ea6..301ceda7a5 100644 --- a/src/lib/libssl/d1_srvr.c +++ b/src/lib/libssl/d1_srvr.c | |||
@@ -150,7 +150,6 @@ int dtls1_accept(SSL *s) | |||
150 | unsigned long alg_k; | 150 | unsigned long alg_k; |
151 | int ret= -1; | 151 | int ret= -1; |
152 | int new_state,state,skip=0; | 152 | int new_state,state,skip=0; |
153 | int listen; | ||
154 | 153 | ||
155 | RAND_add(&Time,sizeof(Time),0); | 154 | RAND_add(&Time,sizeof(Time),0); |
156 | ERR_clear_error(); | 155 | ERR_clear_error(); |
@@ -160,15 +159,11 @@ int dtls1_accept(SSL *s) | |||
160 | cb=s->info_callback; | 159 | cb=s->info_callback; |
161 | else if (s->ctx->info_callback != NULL) | 160 | else if (s->ctx->info_callback != NULL) |
162 | cb=s->ctx->info_callback; | 161 | cb=s->ctx->info_callback; |
163 | |||
164 | listen = s->d1->listen; | ||
165 | 162 | ||
166 | /* init things to blank */ | 163 | /* init things to blank */ |
167 | s->in_handshake++; | 164 | s->in_handshake++; |
168 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 165 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); |
169 | 166 | ||
170 | s->d1->listen = listen; | ||
171 | |||
172 | if (s->cert == NULL) | 167 | if (s->cert == NULL) |
173 | { | 168 | { |
174 | SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET); | 169 | SSLerr(SSL_F_DTLS1_ACCEPT,SSL_R_NO_CERTIFICATE_SET); |
@@ -278,23 +273,11 @@ int dtls1_accept(SSL *s) | |||
278 | 273 | ||
279 | s->init_num=0; | 274 | s->init_num=0; |
280 | 275 | ||
281 | /* Reflect ClientHello sequence to remain stateless while listening */ | ||
282 | if (listen) | ||
283 | { | ||
284 | memcpy(s->s3->write_sequence, s->s3->read_sequence, sizeof(s->s3->write_sequence)); | ||
285 | } | ||
286 | |||
287 | /* If we're just listening, stop here */ | 276 | /* If we're just listening, stop here */ |
288 | if (listen && s->state == SSL3_ST_SW_SRVR_HELLO_A) | 277 | if (s->d1->listen && s->state == SSL3_ST_SW_SRVR_HELLO_A) |
289 | { | 278 | { |
290 | ret = 2; | 279 | ret = 2; |
291 | s->d1->listen = 0; | 280 | s->d1->listen = 0; |
292 | /* Set expected sequence numbers | ||
293 | * to continue the handshake. | ||
294 | */ | ||
295 | s->d1->handshake_read_seq = 2; | ||
296 | s->d1->handshake_write_seq = 1; | ||
297 | s->d1->next_handshake_write_seq = 1; | ||
298 | goto end; | 281 | goto end; |
299 | } | 282 | } |
300 | 283 | ||
@@ -303,6 +286,7 @@ int dtls1_accept(SSL *s) | |||
303 | case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: | 286 | case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A: |
304 | case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: | 287 | case DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B: |
305 | 288 | ||
289 | dtls1_start_timer(s); | ||
306 | ret = dtls1_send_hello_verify_request(s); | 290 | ret = dtls1_send_hello_verify_request(s); |
307 | if ( ret <= 0) goto end; | 291 | if ( ret <= 0) goto end; |
308 | s->state=SSL3_ST_SW_FLUSH; | 292 | s->state=SSL3_ST_SW_FLUSH; |
@@ -752,6 +736,9 @@ int dtls1_send_hello_verify_request(SSL *s) | |||
752 | /* number of bytes to write */ | 736 | /* number of bytes to write */ |
753 | s->init_num=p-buf; | 737 | s->init_num=p-buf; |
754 | s->init_off=0; | 738 | s->init_off=0; |
739 | |||
740 | /* buffer the message to handle re-xmits */ | ||
741 | dtls1_buffer_message(s, 0); | ||
755 | } | 742 | } |
756 | 743 | ||
757 | /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */ | 744 | /* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */ |
@@ -1030,11 +1017,12 @@ int dtls1_send_server_key_exchange(SSL *s) | |||
1030 | SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); | 1017 | SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); |
1031 | goto err; | 1018 | goto err; |
1032 | } | 1019 | } |
1033 | if ((ecdh = EC_KEY_dup(ecdhp)) == NULL) | 1020 | if (!EC_KEY_up_ref(ecdhp)) |
1034 | { | 1021 | { |
1035 | SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); | 1022 | SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_ECDH_LIB); |
1036 | goto err; | 1023 | goto err; |
1037 | } | 1024 | } |
1025 | ecdh = ecdhp; | ||
1038 | 1026 | ||
1039 | s->s3->tmp.ecdh=ecdh; | 1027 | s->s3->tmp.ecdh=ecdh; |
1040 | if ((EC_KEY_get0_public_key(ecdh) == NULL) || | 1028 | if ((EC_KEY_get0_public_key(ecdh) == NULL) || |