Lines Matching +full:blocking +full:- +full:io

2  * Copyright 2015-2022 The OpenSSL Project Authors. All Rights Reserved.
30 * including handling of non-blocking IO events, flushing of the underlying
32 * separate sub-state machines which control reading and writing respectively.
40 * --------------------------------------------- -------------------
44 * | -------------------- -------------------- | Transition | Handshake state |
46 * | | sub-state | | sub-state | |----------->| |
49 * | -------------------- -------------------- | | |
51 * --------------------------------------------- -------------------
73 return ssl->statem.hand_state; in SSL_get_state()
78 return s->statem.in_init; in SSL_in_init()
83 return !(s->statem.in_init) && (s->statem.hand_state == TLS_ST_OK); in SSL_is_init_finished()
95 return (s->statem.hand_state == TLS_ST_BEFORE) in SSL_in_before()
96 && (s->statem.state == MSG_FLOW_UNINITED); in SSL_in_before()
104 s->statem.state = MSG_FLOW_UNINITED; in ossl_statem_clear()
105 s->statem.hand_state = TLS_ST_BEFORE; in ossl_statem_clear()
106 s->statem.in_init = 1; in ossl_statem_clear()
107 s->statem.no_cert_verify = 0; in ossl_statem_clear()
115 s->statem.in_init = 1; in ossl_statem_set_renegotiate()
116 s->statem.request_state = TLS_ST_SW_HELLO_REQ; in ossl_statem_set_renegotiate()
122 if (s->statem.in_init && s->statem.state == MSG_FLOW_ERROR) in ossl_statem_send_fatal()
124 s->statem.in_init = 1; in ossl_statem_send_fatal()
125 s->statem.state = MSG_FLOW_ERROR; in ossl_statem_send_fatal()
127 && s->statem.enc_write_state != ENC_WRITE_STATE_INVALID) in ossl_statem_send_fatal()
155 if (!ossl_assert((s)->statem.in_init \
156 && (s)->statem.state == MSG_FLOW_ERROR)) \
169 if (s->statem.state == MSG_FLOW_ERROR) in ossl_statem_in_error()
177 s->statem.in_init = init; in ossl_statem_set_in_init()
182 return s->statem.in_handshake; in ossl_statem_get_in_handshake()
188 s->statem.in_handshake++; in ossl_statem_set_in_handshake()
190 s->statem.in_handshake--; in ossl_statem_set_in_handshake()
196 if (s->ext.early_data != SSL_EARLY_DATA_REJECTED) in ossl_statem_skip_early_data()
199 if (!s->server in ossl_statem_skip_early_data()
200 || s->statem.hand_state != TLS_ST_EARLY_DATA in ossl_statem_skip_early_data()
201 || s->hello_retry_request == SSL_HRR_COMPLETE) in ossl_statem_skip_early_data()
212 * attempting to read data (SSL_read*()), or -1 if we are in SSL_do_handshake()
217 if (sending == -1) { in ossl_statem_check_finish_init()
218 if (s->statem.hand_state == TLS_ST_PENDING_EARLY_DATA_END in ossl_statem_check_finish_init()
219 || s->statem.hand_state == TLS_ST_EARLY_DATA) { in ossl_statem_check_finish_init()
221 if (s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY) { in ossl_statem_check_finish_init()
226 s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING; in ossl_statem_check_finish_init()
229 } else if (!s->server) { in ossl_statem_check_finish_init()
230 if ((sending && (s->statem.hand_state == TLS_ST_PENDING_EARLY_DATA_END in ossl_statem_check_finish_init()
231 || s->statem.hand_state == TLS_ST_EARLY_DATA) in ossl_statem_check_finish_init()
232 && s->early_data_state != SSL_EARLY_DATA_WRITING) in ossl_statem_check_finish_init()
233 || (!sending && s->statem.hand_state == TLS_ST_EARLY_DATA)) { in ossl_statem_check_finish_init()
239 if (sending && s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY) in ossl_statem_check_finish_init()
240 s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING; in ossl_statem_check_finish_init()
243 if (s->early_data_state == SSL_EARLY_DATA_FINISHED_READING in ossl_statem_check_finish_init()
244 && s->statem.hand_state == TLS_ST_EARLY_DATA) in ossl_statem_check_finish_init()
251 s->statem.state = MSG_FLOW_UNINITED; in ossl_statem_set_hello_verify_done()
252 s->statem.in_init = 1; in ossl_statem_set_hello_verify_done()
260 s->statem.hand_state = TLS_ST_SR_CLNT_HELLO; in ossl_statem_set_hello_verify_done()
277 if (s->info_callback != NULL) in get_callback()
278 return s->info_callback; in get_callback()
279 else if (s->ctx->info_callback != NULL) in get_callback()
280 return s->ctx->info_callback; in get_callback()
292 * +-----------------------+
294 * MSG_FLOW_WRITING <---> MSG_FLOW_READING
304 * MSG_FLOW_WRITING and MSG_FLOW_READING have sub-state machines associated with them.
317 OSSL_STATEM *st = &s->statem; in state_machine()
318 int ret = -1; in state_machine()
321 if (st->state == MSG_FLOW_ERROR) { in state_machine()
323 return -1; in state_machine()
331 st->in_handshake++; in state_machine()
334 * If we are stateless then we already called SSL_clear() - don't do in state_machine()
337 if ((s->s3.flags & TLS1_FLAGS_STATELESS) == 0 && !SSL_clear(s)) in state_machine()
338 return -1; in state_machine()
347 st->in_handshake, NULL); in state_machine()
352 if (st->state == MSG_FLOW_UNINITED in state_machine()
353 || st->state == MSG_FLOW_FINISHED) { in state_machine()
354 if (st->state == MSG_FLOW_UNINITED) { in state_machine()
355 st->hand_state = TLS_ST_BEFORE; in state_machine()
356 st->request_state = TLS_ST_BEFORE; in state_machine()
359 s->server = server; in state_machine()
372 if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00) && in state_machine()
373 (server || (s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00))) { in state_machine()
378 if ((s->version >> 8) != SSL3_VERSION_MAJOR) { in state_machine()
384 if (!ssl_security(s, SSL_SECOP_VERSION, 0, s->version, NULL)) { in state_machine()
389 if (s->init_buf == NULL) { in state_machine()
398 s->init_buf = buf; in state_machine()
406 s->init_num = 0; in state_machine()
411 s->s3.change_cipher_spec = 0; in state_machine()
426 || s->renegotiate) { in state_machine()
433 st->read_state_first_init = 1; in state_machine()
436 st->state = MSG_FLOW_WRITING; in state_machine()
440 while (st->state != MSG_FLOW_FINISHED) { in state_machine()
441 if (st->state == MSG_FLOW_READING) { in state_machine()
444 st->state = MSG_FLOW_WRITING; in state_machine()
450 } else if (st->state == MSG_FLOW_WRITING) { in state_machine()
453 st->state = MSG_FLOW_READING; in state_machine()
456 st->state = MSG_FLOW_FINISHED; in state_machine()
472 st->in_handshake--; in state_machine()
481 st->in_handshake, NULL); in state_machine()
496 * Initialise the MSG_FLOW_READING sub-state machine
500 OSSL_STATEM *st = &s->statem; in init_read_state_machine()
502 st->read_state = READ_STATE_HEADER; in init_read_state_machine()
507 size_t msg_offset = (char *)s->init_msg - s->init_buf->data; in grow_init_buf()
509 if (!BUF_MEM_grow_clean(s->init_buf, (int)size)) in grow_init_buf()
515 s->init_msg = s->init_buf->data + msg_offset; in grow_init_buf()
521 * This function implements the sub-state machine when the message flow is in
522 * MSG_FLOW_READING. The valid sub-states and transitions are:
524 * READ_STATE_HEADER <--+<-------------+
527 * READ_STATE_BODY -----+-->READ_STATE_POST_PROCESS
529 * +----------------------------+
548 OSSL_STATEM *st = &s->statem; in read_state_machine()
560 if (s->server) { in read_state_machine()
572 if (st->read_state_first_init) { in read_state_machine()
573 s->first_packet = 1; in read_state_machine()
574 st->read_state_first_init = 0; in read_state_machine()
578 switch (st->read_state) { in read_state_machine()
583 * In DTLS we get the whole message in one go - header and body in read_state_machine()
591 /* Could be non-blocking IO */ in read_state_machine()
597 if (s->server) in read_state_machine()
609 if (s->s3.tmp.message_size > max_message_size(s)) { in read_state_machine()
617 && s->s3.tmp.message_size > 0 in read_state_machine()
618 && !grow_init_buf(s, s->s3.tmp.message_size in read_state_machine()
624 st->read_state = READ_STATE_BODY; in read_state_machine()
638 /* Could be non-blocking IO */ in read_state_machine()
642 s->first_packet = 0; in read_state_machine()
643 if (!PACKET_buf_init(&pkt, s->init_msg, len)) { in read_state_machine()
650 s->init_num = 0; in read_state_machine()
664 st->read_state = READ_STATE_POST_PROCESS; in read_state_machine()
665 st->read_state_work = WORK_MORE_A; in read_state_machine()
669 st->read_state = READ_STATE_HEADER; in read_state_machine()
675 st->read_state_work = post_process_message(s, st->read_state_work); in read_state_machine()
676 switch (st->read_state_work) { in read_state_machine()
686 st->read_state = READ_STATE_HEADER; in read_state_machine()
710 OSSL_STATEM *st = &s->statem; in statem_do_write()
712 if (st->hand_state == TLS_ST_CW_CHANGE in statem_do_write()
713 || st->hand_state == TLS_ST_SW_CHANGE) { in statem_do_write()
724 * Initialise the MSG_FLOW_WRITING sub-state machine
728 OSSL_STATEM *st = &s->statem; in init_write_state_machine()
730 st->write_state = WRITE_STATE_TRANSITION; in init_write_state_machine()
734 * This function implements the sub-state machine when the message flow is in
735 * MSG_FLOW_WRITING. The valid sub-states and transitions are:
737 * +-> WRITE_STATE_TRANSITION ------> [SUB_STATE_FINISHED]
740 * | WRITE_STATE_PRE_WORK -----> [SUB_STATE_END_HANDSHAKE]
748 * +-------------+
766 OSSL_STATEM *st = &s->statem; in write_state_machine()
781 if (s->server) { in write_state_machine()
794 switch (st->write_state) { in write_state_machine()
798 if (s->server) in write_state_machine()
805 st->write_state = WRITE_STATE_PRE_WORK; in write_state_machine()
806 st->write_state_work = WORK_MORE_A; in write_state_machine()
820 switch (st->write_state_work = pre_work(s, st->write_state_work)) { in write_state_machine()
830 st->write_state = WRITE_STATE_SEND; in write_state_machine()
842 st->write_state = WRITE_STATE_POST_WORK; in write_state_machine()
843 st->write_state_work = WORK_MORE_A; in write_state_machine()
846 if (!WPACKET_init(&pkt, s->init_buf) in write_state_machine()
866 st->write_state = WRITE_STATE_POST_WORK; in write_state_machine()
867 st->write_state_work = WORK_MORE_A; in write_state_machine()
881 if (SSL_IS_DTLS(s) && st->use_timer) { in write_state_machine()
888 st->write_state = WRITE_STATE_POST_WORK; in write_state_machine()
889 st->write_state_work = WORK_MORE_A; in write_state_machine()
893 switch (st->write_state_work = post_work(s, st->write_state_work)) { in write_state_machine()
903 st->write_state = WRITE_STATE_TRANSITION; in write_state_machine()
923 s->rwstate = SSL_WRITING; in statem_flush()
924 if (BIO_flush(s->wbio) <= 0) { in statem_flush()
927 s->rwstate = SSL_NOTHING; in statem_flush()
942 OSSL_STATEM *st = &s->statem; in ossl_statem_app_data_allowed()
944 if (st->state == MSG_FLOW_UNINITED) in ossl_statem_app_data_allowed()
947 if (!s->s3.in_read_app_data || (s->s3.total_renegotiations == 0)) in ossl_statem_app_data_allowed()
950 if (s->server) { in ossl_statem_app_data_allowed()
955 if (st->hand_state == TLS_ST_BEFORE in ossl_statem_app_data_allowed()
956 || st->hand_state == TLS_ST_SR_CLNT_HELLO) in ossl_statem_app_data_allowed()
963 if (st->hand_state == TLS_ST_CW_CLNT_HELLO) in ossl_statem_app_data_allowed()
976 return s->s3.previous_server_finished_len != 0 in ossl_statem_export_allowed()
977 && s->statem.hand_state != TLS_ST_SW_FINISHED; in ossl_statem_export_allowed()
991 return s->ext.early_data == SSL_EARLY_DATA_ACCEPTED in ossl_statem_export_early_allowed()
992 || (!s->server && s->ext.early_data != SSL_EARLY_DATA_NOT_SENT); in ossl_statem_export_early_allowed()