| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-05-18 02:18:30 +08:00
										 |  |  |  * Licensed under the OpenSSL license (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*****************************************************************************
 | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							| 
									
										
										
										
											2016-03-11 04:34:48 +08:00
										 |  |  |  * These enums should be considered PRIVATE to the state machine. No         * | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |  * non-state machine code should need to use these                           * | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							|  |  |  |  *****************************************************************************/ | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Valid return codes used for functions performing work prior to or after | 
					
						
							|  |  |  |  * sending or receiving a message | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     /* Something went wrong */ | 
					
						
							|  |  |  |     WORK_ERROR, | 
					
						
							|  |  |  |     /* We're done working and there shouldn't be anything else to do after */ | 
					
						
							|  |  |  |     WORK_FINISHED_STOP, | 
					
						
							|  |  |  |     /* We're done working move onto the next thing */ | 
					
						
							|  |  |  |     WORK_FINISHED_CONTINUE, | 
					
						
							|  |  |  |     /* We're working on phase A */ | 
					
						
							|  |  |  |     WORK_MORE_A, | 
					
						
							|  |  |  |     /* We're working on phase B */ | 
					
						
							|  |  |  |     WORK_MORE_B | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | } WORK_STATE; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Write transition return codes */ | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     /* Something went wrong */ | 
					
						
							|  |  |  |     WRITE_TRAN_ERROR, | 
					
						
							|  |  |  |     /* A transition was successfully completed and we should continue */ | 
					
						
							|  |  |  |     WRITE_TRAN_CONTINUE, | 
					
						
							|  |  |  |     /* There is no more write work to be done */ | 
					
						
							|  |  |  |     WRITE_TRAN_FINISHED | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | } WRITE_TRAN; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Message flow states */ | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     /* No handshake in progress */ | 
					
						
							|  |  |  |     MSG_FLOW_UNINITED, | 
					
						
							|  |  |  |     /* A permanent error with this connection */ | 
					
						
							|  |  |  |     MSG_FLOW_ERROR, | 
					
						
							|  |  |  |     /* We are about to renegotiate */ | 
					
						
							|  |  |  |     MSG_FLOW_RENEGOTIATE, | 
					
						
							|  |  |  |     /* We are reading messages */ | 
					
						
							|  |  |  |     MSG_FLOW_READING, | 
					
						
							|  |  |  |     /* We are writing messages */ | 
					
						
							|  |  |  |     MSG_FLOW_WRITING, | 
					
						
							|  |  |  |     /* Handshake has finished */ | 
					
						
							|  |  |  |     MSG_FLOW_FINISHED | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | } MSG_FLOW_STATE; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Read states */ | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     READ_STATE_HEADER, | 
					
						
							|  |  |  |     READ_STATE_BODY, | 
					
						
							|  |  |  |     READ_STATE_POST_PROCESS | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | } READ_STATE; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Write states */ | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     WRITE_STATE_TRANSITION, | 
					
						
							|  |  |  |     WRITE_STATE_PRE_WORK, | 
					
						
							|  |  |  |     WRITE_STATE_SEND, | 
					
						
							|  |  |  |     WRITE_STATE_POST_WORK | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  | } WRITE_STATE; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*****************************************************************************
 | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							|  |  |  |  * This structure should be considered "opaque" to anything outside of the   * | 
					
						
							|  |  |  |  * state machine. No non-state machine code should be accessing the members  * | 
					
						
							|  |  |  |  * of this structure.                                                        * | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							|  |  |  |  *****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-05 17:58:52 +08:00
										 |  |  | struct ossl_statem_st { | 
					
						
							| 
									
										
										
										
											2015-10-26 19:46:33 +08:00
										 |  |  |     MSG_FLOW_STATE state; | 
					
						
							|  |  |  |     WRITE_STATE write_state; | 
					
						
							|  |  |  |     WORK_STATE write_state_work; | 
					
						
							|  |  |  |     READ_STATE read_state; | 
					
						
							|  |  |  |     WORK_STATE read_state_work; | 
					
						
							| 
									
										
										
										
											2015-10-05 17:18:06 +08:00
										 |  |  |     OSSL_HANDSHAKE_STATE hand_state; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     int in_init; | 
					
						
							|  |  |  |     int read_state_first_init; | 
					
						
							| 
									
										
										
										
											2015-10-22 20:57:18 +08:00
										 |  |  |     /* true when we are actually in SSL_accept() or SSL_connect() */ | 
					
						
							|  |  |  |     int in_handshake; | 
					
						
							| 
									
										
										
										
											2015-10-05 17:44:41 +08:00
										 |  |  |     /* Should we skip the CertificateVerify message? */ | 
					
						
							|  |  |  |     unsigned int no_cert_verify; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  |     int use_timer; | 
					
						
							|  |  |  | #ifndef OPENSSL_NO_SCTP
 | 
					
						
							|  |  |  |     int in_sctp_read_sock; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-10-05 17:58:52 +08:00
										 |  |  | typedef struct ossl_statem_st OSSL_STATEM; | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*****************************************************************************
 | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							|  |  |  |  * The following macros/functions represent the libssl internal API to the   * | 
					
						
							|  |  |  |  * state machine. Any libssl code may call these functions/macros            * | 
					
						
							|  |  |  |  *                                                                           * | 
					
						
							|  |  |  |  *****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-05 17:39:54 +08:00
										 |  |  | __owur int ossl_statem_accept(SSL *s); | 
					
						
							|  |  |  | __owur int ossl_statem_connect(SSL *s); | 
					
						
							|  |  |  | void ossl_statem_clear(SSL *s); | 
					
						
							|  |  |  | void ossl_statem_set_renegotiate(SSL *s); | 
					
						
							|  |  |  | void ossl_statem_set_error(SSL *s); | 
					
						
							|  |  |  | int ossl_statem_in_error(const SSL *s); | 
					
						
							|  |  |  | void ossl_statem_set_in_init(SSL *s, int init); | 
					
						
							| 
									
										
										
										
											2015-10-22 20:57:18 +08:00
										 |  |  | int ossl_statem_get_in_handshake(SSL *s); | 
					
						
							|  |  |  | void ossl_statem_set_in_handshake(SSL *s, int inhand); | 
					
						
							| 
									
										
										
										
											2015-10-22 19:18:45 +08:00
										 |  |  | void ossl_statem_set_hello_verify_done(SSL *s); | 
					
						
							| 
									
										
										
										
											2015-10-05 17:39:54 +08:00
										 |  |  | __owur int ossl_statem_app_data_allowed(SSL *s); | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | #ifndef OPENSSL_NO_SCTP
 | 
					
						
							| 
									
										
										
										
											2015-10-05 17:39:54 +08:00
										 |  |  | void ossl_statem_set_sctp_read_sock(SSL *s, int read_sock); | 
					
						
							|  |  |  | __owur int ossl_statem_in_sctp_read_sock(SSL *s); | 
					
						
							| 
									
										
										
										
											2015-09-11 17:48:59 +08:00
										 |  |  | #endif
 |