| lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 1 | State Machine Design | 
|  | 2 | ==================== | 
|  | 3 |  | 
|  | 4 | This file provides some guidance on the thinking behind the design of the | 
|  | 5 | state machine code to aid future maintenance. | 
|  | 6 |  | 
|  | 7 | The state machine code replaces an older state machine present in OpenSSL | 
|  | 8 | versions 1.0.2 and below. The new state machine has the following objectives: | 
|  | 9 | - Remove duplication of state code between client and server | 
|  | 10 | - Remove duplication of state code between TLS and DTLS | 
|  | 11 | - Simplify transitions and bring the logic together in a single location | 
|  | 12 | so that it is easier to validate | 
|  | 13 | - Remove duplication of code between each of the message handling functions | 
|  | 14 | - Receive a message first and then work out whether that is a valid | 
|  | 15 | transition - not the other way around (the other way causes lots of issues | 
|  | 16 | where we are expecting one type of message next but actually get something | 
|  | 17 | else) | 
|  | 18 | - Separate message flow state from handshake state (in order to better | 
|  | 19 | understand each) | 
|  | 20 | - message flow state = when to flush buffers; handling restarts in the | 
|  | 21 | event of NBIO events; handling the common flow of steps for reading a | 
|  | 22 | message and the common flow of steps for writing a message etc | 
|  | 23 | - handshake state = what handshake message are we working on now | 
|  | 24 | - Control complexity: only the state machine can change state: keep all | 
|  | 25 | the state changes local to the state machine component | 
|  | 26 |  | 
|  | 27 | The message flow state machine is divided into a reading sub-state machine and a | 
|  | 28 | writing sub-state machine. See the source comments in statem.c for a more | 
|  | 29 | detailed description of the various states and transitions possible. | 
|  | 30 |  | 
|  | 31 | Conceptually the state machine component is designed as follows: | 
|  | 32 |  | 
|  | 33 | libssl | 
|  | 34 | | | 
|  | 35 | ---------------------------|-----statem.h-------------------------------------- | 
|  | 36 | | | 
|  | 37 | _______V____________________ | 
|  | 38 | |                            | | 
|  | 39 | |    statem.c                | | 
|  | 40 | |                            | | 
|  | 41 | |    Core state machine code | | 
|  | 42 | |____________________________| | 
|  | 43 | statem_local.h     ^          ^ | 
|  | 44 | _________|          |_______ | 
|  | 45 | |                            | | 
|  | 46 | _____________|____________   _____________|____________ | 
|  | 47 | |                          | |                          | | 
|  | 48 | | statem_clnt.c            | | statem_srvr.c            | | 
|  | 49 | |                          | |                          | | 
|  | 50 | | TLS/DTLS client specific | | TLS/DTLS server specific | | 
|  | 51 | | state machine code       | | state machine code       | | 
|  | 52 | |__________________________| |__________________________| | 
|  | 53 | |        |_______________|__       | | 
|  | 54 | |        ________________|  |      | | 
|  | 55 | |       |                   |      | | 
|  | 56 | ____________V_______V________   ________V______V_______________ | 
|  | 57 | |                             | |                               | | 
|  | 58 | | statem_lib.c                | | statem_dtls.c                 | | 
|  | 59 | |                             | |                               | | 
|  | 60 | | Non core functions common   | | Non core functions common to  | | 
|  | 61 | | to both servers and clients | | both DTLS servers and clients | | 
|  | 62 | |_____________________________| |_______________________________| | 
|  | 63 |  |