| State Machine Design | 
 | ==================== | 
 |  | 
 | This file provides some guidance on the thinking behind the design of the | 
 | state machine code to aid future maintenance. | 
 |  | 
 | The state machine code replaces an older state machine present in OpenSSL | 
 | versions 1.0.2 and below. The new state machine has the following objectives: | 
 |     - Remove duplication of state code between client and server | 
 |     - Remove duplication of state code between TLS and DTLS | 
 |     - Simplify transitions and bring the logic together in a single location | 
 |       so that it is easier to validate | 
 |     - Remove duplication of code between each of the message handling functions | 
 |     - Receive a message first and then work out whether that is a valid | 
 |       transition - not the other way around (the other way causes lots of issues | 
 |       where we are expecting one type of message next but actually get something | 
 |       else) | 
 |     - Separate message flow state from handshake state (in order to better | 
 |       understand each) | 
 |       - message flow state = when to flush buffers; handling restarts in the | 
 |         event of NBIO events; handling the common flow of steps for reading a | 
 |         message and the common flow of steps for writing a message etc | 
 |       - handshake state = what handshake message are we working on now | 
 |     - Control complexity: only the state machine can change state: keep all | 
 |       the state changes local to the state machine component | 
 |  | 
 | The message flow state machine is divided into a reading sub-state machine and a | 
 | writing sub-state machine. See the source comments in statem.c for a more | 
 | detailed description of the various states and transitions possible. | 
 |  | 
 | Conceptually the state machine component is designed as follows: | 
 |  | 
 |                         libssl | 
 |                            | | 
 | ---------------------------|-----statem.h-------------------------------------- | 
 |                            | | 
 |                     _______V____________________ | 
 |                    |                            | | 
 |                    |    statem.c                | | 
 |                    |                            | | 
 |                    |    Core state machine code | | 
 |                    |____________________________| | 
 |         statem_locl.h     ^          ^ | 
 |                  _________|          |_______ | 
 |                 |                            | | 
 |    _____________|____________   _____________|____________ | 
 |   |                          | |                          | | 
 |   | statem_clnt.c            | | statem_srvr.c            | | 
 |   |                          | |                          | | 
 |   | TLS/DTLS client specific | | TLS/DTLS server specific | | 
 |   | state machine code       | | state machine code       | | 
 |   |__________________________| |__________________________| | 
 |                |        |_______________|__       | | 
 |                |        ________________|  |      | | 
 |                |       |                   |      | | 
 |    ____________V_______V________   ________V______V_______________ | 
 |   |                             | |                               | | 
 |   | statem_both.c               | | statem_dtls.c                 | | 
 |   |                             | |                               | | 
 |   | Non core functions common   | | Non core functions common to  | | 
 |   | to both servers and clients | | both DTLS servers and clients | | 
 |   |_____________________________| |_______________________________| | 
 |  |