statem.c revision 1.1 1 1.1 christos /*
2 1.1 christos * Copyright 2015-2019 The OpenSSL Project Authors. All Rights Reserved.
3 1.1 christos *
4 1.1 christos * Licensed under the OpenSSL license (the "License"). You may not use
5 1.1 christos * this file except in compliance with the License. You can obtain a copy
6 1.1 christos * in the file LICENSE in the source distribution or at
7 1.1 christos * https://www.openssl.org/source/license.html
8 1.1 christos */
9 1.1 christos
10 1.1 christos #include "internal/cryptlib.h"
11 1.1 christos #include <openssl/rand.h>
12 1.1 christos #include "../ssl_local.h"
13 1.1 christos #include "statem_local.h"
14 1.1 christos #include <assert.h>
15 1.1 christos
16 1.1 christos /*
17 1.1 christos * This file implements the SSL/TLS/DTLS state machines.
18 1.1 christos *
19 1.1 christos * There are two primary state machines:
20 1.1 christos *
21 1.1 christos * 1) Message flow state machine
22 1.1 christos * 2) Handshake state machine
23 1.1 christos *
24 1.1 christos * The Message flow state machine controls the reading and sending of messages
25 1.1 christos * including handling of non-blocking IO events, flushing of the underlying
26 1.1 christos * write BIO, handling unexpected messages, etc. It is itself broken into two
27 1.1 christos * separate sub-state machines which control reading and writing respectively.
28 1.1 christos *
29 1.1 christos * The Handshake state machine keeps track of the current SSL/TLS handshake
30 1.1 christos * state. Transitions of the handshake state are the result of events that
31 1.1 christos * occur within the Message flow state machine.
32 1.1 christos *
33 1.1 christos * Overall it looks like this:
34 1.1 christos *
35 1.1 christos * --------------------------------------------- -------------------
36 1.1 christos * | | | |
37 1.1 christos * | Message flow state machine | | |
38 1.1 christos * | | | |
39 1.1 christos * | -------------------- -------------------- | Transition | Handshake state |
40 1.1 christos * | | MSG_FLOW_READING | | MSG_FLOW_WRITING | | Event | machine |
41 1.1 christos * | | sub-state | | sub-state | |----------->| |
42 1.1 christos * | | machine for | | machine for | | | |
43 1.1 christos * | | reading messages | | writing messages | | | |
44 1.1 christos * | -------------------- -------------------- | | |
45 1.1 christos * | | | |
46 1.1 christos * --------------------------------------------- -------------------
47 1.1 christos *
48 1.1 christos */
49 1.1 christos
50 1.1 christos /* Sub state machine return values */
51 1.1 christos typedef enum {
52 1.1 christos /* Something bad happened or NBIO */
53 1.1 christos SUB_STATE_ERROR,
54 1.1 christos /* Sub state finished go to the next sub state */
55 1.1 christos SUB_STATE_FINISHED,
56 1.1 christos /* Sub state finished and handshake was completed */
57 1.1 christos SUB_STATE_END_HANDSHAKE
58 1.1 christos } SUB_STATE_RETURN;
59 1.1 christos
60 1.1 christos static int state_machine(SSL *s, int server);
61 1.1 christos static void init_read_state_machine(SSL *s);
62 1.1 christos static SUB_STATE_RETURN read_state_machine(SSL *s);
63 1.1 christos static void init_write_state_machine(SSL *s);
64 1.1 christos static SUB_STATE_RETURN write_state_machine(SSL *s);
65 1.1 christos
66 1.1 christos OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl)
67 1.1 christos {
68 1.1 christos return ssl->statem.hand_state;
69 1.1 christos }
70 1.1 christos
71 1.1 christos int SSL_in_init(const SSL *s)
72 1.1 christos {
73 1.1 christos return s->statem.in_init;
74 1.1 christos }
75 1.1 christos
76 1.1 christos int SSL_is_init_finished(const SSL *s)
77 1.1 christos {
78 1.1 christos return !(s->statem.in_init) && (s->statem.hand_state == TLS_ST_OK);
79 1.1 christos }
80 1.1 christos
81 1.1 christos int SSL_in_before(const SSL *s)
82 1.1 christos {
83 1.1 christos /*
84 1.1 christos * Historically being "in before" meant before anything had happened. In the
85 1.1 christos * current code though we remain in the "before" state for a while after we
86 1.1 christos * have started the handshake process (e.g. as a server waiting for the
87 1.1 christos * first message to arrive). There "in before" is taken to mean "in before"
88 1.1 christos * and not started any handshake process yet.
89 1.1 christos */
90 1.1 christos return (s->statem.hand_state == TLS_ST_BEFORE)
91 1.1 christos && (s->statem.state == MSG_FLOW_UNINITED);
92 1.1 christos }
93 1.1 christos
94 1.1 christos /*
95 1.1 christos * Clear the state machine state and reset back to MSG_FLOW_UNINITED
96 1.1 christos */
97 1.1 christos void ossl_statem_clear(SSL *s)
98 1.1 christos {
99 1.1 christos s->statem.state = MSG_FLOW_UNINITED;
100 1.1 christos s->statem.hand_state = TLS_ST_BEFORE;
101 1.1 christos s->statem.in_init = 1;
102 1.1 christos s->statem.no_cert_verify = 0;
103 1.1 christos }
104 1.1 christos
105 1.1 christos /*
106 1.1 christos * Set the state machine up ready for a renegotiation handshake
107 1.1 christos */
108 1.1 christos void ossl_statem_set_renegotiate(SSL *s)
109 1.1 christos {
110 1.1 christos s->statem.in_init = 1;
111 1.1 christos s->statem.request_state = TLS_ST_SW_HELLO_REQ;
112 1.1 christos }
113 1.1 christos
114 1.1 christos /*
115 1.1 christos * Put the state machine into an error state and send an alert if appropriate.
116 1.1 christos * This is a permanent error for the current connection.
117 1.1 christos */
118 1.1 christos void ossl_statem_fatal(SSL *s, int al, int func, int reason, const char *file,
119 1.1 christos int line)
120 1.1 christos {
121 1.1 christos ERR_put_error(ERR_LIB_SSL, func, reason, file, line);
122 1.1 christos /* We shouldn't call SSLfatal() twice. Once is enough */
123 1.1 christos if (s->statem.in_init && s->statem.state == MSG_FLOW_ERROR)
124 1.1 christos return;
125 1.1 christos s->statem.in_init = 1;
126 1.1 christos s->statem.state = MSG_FLOW_ERROR;
127 1.1 christos if (al != SSL_AD_NO_ALERT
128 1.1 christos && s->statem.enc_write_state != ENC_WRITE_STATE_INVALID)
129 1.1 christos ssl3_send_alert(s, SSL3_AL_FATAL, al);
130 1.1 christos }
131 1.1 christos
132 1.1 christos /*
133 1.1 christos * This macro should only be called if we are already expecting to be in
134 1.1 christos * a fatal error state. We verify that we are, and set it if not (this would
135 1.1 christos * indicate a bug).
136 1.1 christos */
137 1.1 christos #define check_fatal(s, f) \
138 1.1 christos do { \
139 1.1 christos if (!ossl_assert((s)->statem.in_init \
140 1.1 christos && (s)->statem.state == MSG_FLOW_ERROR)) \
141 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, (f), \
142 1.1 christos SSL_R_MISSING_FATAL); \
143 1.1 christos } while (0)
144 1.1 christos
145 1.1 christos /*
146 1.1 christos * Discover whether the current connection is in the error state.
147 1.1 christos *
148 1.1 christos * Valid return values are:
149 1.1 christos * 1: Yes
150 1.1 christos * 0: No
151 1.1 christos */
152 1.1 christos int ossl_statem_in_error(const SSL *s)
153 1.1 christos {
154 1.1 christos if (s->statem.state == MSG_FLOW_ERROR)
155 1.1 christos return 1;
156 1.1 christos
157 1.1 christos return 0;
158 1.1 christos }
159 1.1 christos
160 1.1 christos void ossl_statem_set_in_init(SSL *s, int init)
161 1.1 christos {
162 1.1 christos s->statem.in_init = init;
163 1.1 christos }
164 1.1 christos
165 1.1 christos int ossl_statem_get_in_handshake(SSL *s)
166 1.1 christos {
167 1.1 christos return s->statem.in_handshake;
168 1.1 christos }
169 1.1 christos
170 1.1 christos void ossl_statem_set_in_handshake(SSL *s, int inhand)
171 1.1 christos {
172 1.1 christos if (inhand)
173 1.1 christos s->statem.in_handshake++;
174 1.1 christos else
175 1.1 christos s->statem.in_handshake--;
176 1.1 christos }
177 1.1 christos
178 1.1 christos /* Are we in a sensible state to skip over unreadable early data? */
179 1.1 christos int ossl_statem_skip_early_data(SSL *s)
180 1.1 christos {
181 1.1 christos if (s->ext.early_data != SSL_EARLY_DATA_REJECTED)
182 1.1 christos return 0;
183 1.1 christos
184 1.1 christos if (!s->server
185 1.1 christos || s->statem.hand_state != TLS_ST_EARLY_DATA
186 1.1 christos || s->hello_retry_request == SSL_HRR_COMPLETE)
187 1.1 christos return 0;
188 1.1 christos
189 1.1 christos return 1;
190 1.1 christos }
191 1.1 christos
192 1.1 christos /*
193 1.1 christos * Called when we are in SSL_read*(), SSL_write*(), or SSL_accept()
194 1.1 christos * /SSL_connect()/SSL_do_handshake(). Used to test whether we are in an early
195 1.1 christos * data state and whether we should attempt to move the handshake on if so.
196 1.1 christos * |sending| is 1 if we are attempting to send data (SSL_write*()), 0 if we are
197 1.1 christos * attempting to read data (SSL_read*()), or -1 if we are in SSL_do_handshake()
198 1.1 christos * or similar.
199 1.1 christos */
200 1.1 christos void ossl_statem_check_finish_init(SSL *s, int sending)
201 1.1 christos {
202 1.1 christos if (sending == -1) {
203 1.1 christos if (s->statem.hand_state == TLS_ST_PENDING_EARLY_DATA_END
204 1.1 christos || s->statem.hand_state == TLS_ST_EARLY_DATA) {
205 1.1 christos ossl_statem_set_in_init(s, 1);
206 1.1 christos if (s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY) {
207 1.1 christos /*
208 1.1 christos * SSL_connect() or SSL_do_handshake() has been called directly.
209 1.1 christos * We don't allow any more writing of early data.
210 1.1 christos */
211 1.1 christos s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING;
212 1.1 christos }
213 1.1 christos }
214 1.1 christos } else if (!s->server) {
215 1.1 christos if ((sending && (s->statem.hand_state == TLS_ST_PENDING_EARLY_DATA_END
216 1.1 christos || s->statem.hand_state == TLS_ST_EARLY_DATA)
217 1.1 christos && s->early_data_state != SSL_EARLY_DATA_WRITING)
218 1.1 christos || (!sending && s->statem.hand_state == TLS_ST_EARLY_DATA)) {
219 1.1 christos ossl_statem_set_in_init(s, 1);
220 1.1 christos /*
221 1.1 christos * SSL_write() has been called directly. We don't allow any more
222 1.1 christos * writing of early data.
223 1.1 christos */
224 1.1 christos if (sending && s->early_data_state == SSL_EARLY_DATA_WRITE_RETRY)
225 1.1 christos s->early_data_state = SSL_EARLY_DATA_FINISHED_WRITING;
226 1.1 christos }
227 1.1 christos } else {
228 1.1 christos if (s->early_data_state == SSL_EARLY_DATA_FINISHED_READING
229 1.1 christos && s->statem.hand_state == TLS_ST_EARLY_DATA)
230 1.1 christos ossl_statem_set_in_init(s, 1);
231 1.1 christos }
232 1.1 christos }
233 1.1 christos
234 1.1 christos void ossl_statem_set_hello_verify_done(SSL *s)
235 1.1 christos {
236 1.1 christos s->statem.state = MSG_FLOW_UNINITED;
237 1.1 christos s->statem.in_init = 1;
238 1.1 christos /*
239 1.1 christos * This will get reset (briefly) back to TLS_ST_BEFORE when we enter
240 1.1 christos * state_machine() because |state| is MSG_FLOW_UNINITED, but until then any
241 1.1 christos * calls to SSL_in_before() will return false. Also calls to
242 1.1 christos * SSL_state_string() and SSL_state_string_long() will return something
243 1.1 christos * sensible.
244 1.1 christos */
245 1.1 christos s->statem.hand_state = TLS_ST_SR_CLNT_HELLO;
246 1.1 christos }
247 1.1 christos
248 1.1 christos int ossl_statem_connect(SSL *s)
249 1.1 christos {
250 1.1 christos return state_machine(s, 0);
251 1.1 christos }
252 1.1 christos
253 1.1 christos int ossl_statem_accept(SSL *s)
254 1.1 christos {
255 1.1 christos return state_machine(s, 1);
256 1.1 christos }
257 1.1 christos
258 1.1 christos typedef void (*info_cb) (const SSL *, int, int);
259 1.1 christos
260 1.1 christos static info_cb get_callback(SSL *s)
261 1.1 christos {
262 1.1 christos if (s->info_callback != NULL)
263 1.1 christos return s->info_callback;
264 1.1 christos else if (s->ctx->info_callback != NULL)
265 1.1 christos return s->ctx->info_callback;
266 1.1 christos
267 1.1 christos return NULL;
268 1.1 christos }
269 1.1 christos
270 1.1 christos /*
271 1.1 christos * The main message flow state machine. We start in the MSG_FLOW_UNINITED or
272 1.1 christos * MSG_FLOW_FINISHED state and finish in MSG_FLOW_FINISHED. Valid states and
273 1.1 christos * transitions are as follows:
274 1.1 christos *
275 1.1 christos * MSG_FLOW_UNINITED MSG_FLOW_FINISHED
276 1.1 christos * | |
277 1.1 christos * +-----------------------+
278 1.1 christos * v
279 1.1 christos * MSG_FLOW_WRITING <---> MSG_FLOW_READING
280 1.1 christos * |
281 1.1 christos * V
282 1.1 christos * MSG_FLOW_FINISHED
283 1.1 christos * |
284 1.1 christos * V
285 1.1 christos * [SUCCESS]
286 1.1 christos *
287 1.1 christos * We may exit at any point due to an error or NBIO event. If an NBIO event
288 1.1 christos * occurs then we restart at the point we left off when we are recalled.
289 1.1 christos * MSG_FLOW_WRITING and MSG_FLOW_READING have sub-state machines associated with them.
290 1.1 christos *
291 1.1 christos * In addition to the above there is also the MSG_FLOW_ERROR state. We can move
292 1.1 christos * into that state at any point in the event that an irrecoverable error occurs.
293 1.1 christos *
294 1.1 christos * Valid return values are:
295 1.1 christos * 1: Success
296 1.1 christos * <=0: NBIO or error
297 1.1 christos */
298 1.1 christos static int state_machine(SSL *s, int server)
299 1.1 christos {
300 1.1 christos BUF_MEM *buf = NULL;
301 1.1 christos void (*cb) (const SSL *ssl, int type, int val) = NULL;
302 1.1 christos OSSL_STATEM *st = &s->statem;
303 1.1 christos int ret = -1;
304 1.1 christos int ssret;
305 1.1 christos
306 1.1 christos if (st->state == MSG_FLOW_ERROR) {
307 1.1 christos /* Shouldn't have been called if we're already in the error state */
308 1.1 christos return -1;
309 1.1 christos }
310 1.1 christos
311 1.1 christos ERR_clear_error();
312 1.1 christos clear_sys_error();
313 1.1 christos
314 1.1 christos cb = get_callback(s);
315 1.1 christos
316 1.1 christos st->in_handshake++;
317 1.1 christos if (!SSL_in_init(s) || SSL_in_before(s)) {
318 1.1 christos /*
319 1.1 christos * If we are stateless then we already called SSL_clear() - don't do
320 1.1 christos * it again and clear the STATELESS flag itself.
321 1.1 christos */
322 1.1 christos if ((s->s3->flags & TLS1_FLAGS_STATELESS) == 0 && !SSL_clear(s))
323 1.1 christos return -1;
324 1.1 christos }
325 1.1 christos #ifndef OPENSSL_NO_SCTP
326 1.1 christos if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) {
327 1.1 christos /*
328 1.1 christos * Notify SCTP BIO socket to enter handshake mode and prevent stream
329 1.1 christos * identifier other than 0.
330 1.1 christos */
331 1.1 christos BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
332 1.1 christos st->in_handshake, NULL);
333 1.1 christos }
334 1.1 christos #endif
335 1.1 christos
336 1.1 christos /* Initialise state machine */
337 1.1 christos if (st->state == MSG_FLOW_UNINITED
338 1.1 christos || st->state == MSG_FLOW_FINISHED) {
339 1.1 christos if (st->state == MSG_FLOW_UNINITED) {
340 1.1 christos st->hand_state = TLS_ST_BEFORE;
341 1.1 christos st->request_state = TLS_ST_BEFORE;
342 1.1 christos }
343 1.1 christos
344 1.1 christos s->server = server;
345 1.1 christos if (cb != NULL) {
346 1.1 christos if (SSL_IS_FIRST_HANDSHAKE(s) || !SSL_IS_TLS13(s))
347 1.1 christos cb(s, SSL_CB_HANDSHAKE_START, 1);
348 1.1 christos }
349 1.1 christos
350 1.1 christos /*
351 1.1 christos * Fatal errors in this block don't send an alert because we have
352 1.1 christos * failed to even initialise properly. Sending an alert is probably
353 1.1 christos * doomed to failure.
354 1.1 christos */
355 1.1 christos
356 1.1 christos if (SSL_IS_DTLS(s)) {
357 1.1 christos if ((s->version & 0xff00) != (DTLS1_VERSION & 0xff00) &&
358 1.1 christos (server || (s->version & 0xff00) != (DTLS1_BAD_VER & 0xff00))) {
359 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
360 1.1 christos ERR_R_INTERNAL_ERROR);
361 1.1 christos goto end;
362 1.1 christos }
363 1.1 christos } else {
364 1.1 christos if ((s->version >> 8) != SSL3_VERSION_MAJOR) {
365 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
366 1.1 christos ERR_R_INTERNAL_ERROR);
367 1.1 christos goto end;
368 1.1 christos }
369 1.1 christos }
370 1.1 christos
371 1.1 christos if (!ssl_security(s, SSL_SECOP_VERSION, 0, s->version, NULL)) {
372 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
373 1.1 christos ERR_R_INTERNAL_ERROR);
374 1.1 christos goto end;
375 1.1 christos }
376 1.1 christos
377 1.1 christos if (s->init_buf == NULL) {
378 1.1 christos if ((buf = BUF_MEM_new()) == NULL) {
379 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
380 1.1 christos ERR_R_INTERNAL_ERROR);
381 1.1 christos goto end;
382 1.1 christos }
383 1.1 christos if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) {
384 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
385 1.1 christos ERR_R_INTERNAL_ERROR);
386 1.1 christos goto end;
387 1.1 christos }
388 1.1 christos s->init_buf = buf;
389 1.1 christos buf = NULL;
390 1.1 christos }
391 1.1 christos
392 1.1 christos if (!ssl3_setup_buffers(s)) {
393 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
394 1.1 christos ERR_R_INTERNAL_ERROR);
395 1.1 christos goto end;
396 1.1 christos }
397 1.1 christos s->init_num = 0;
398 1.1 christos
399 1.1 christos /*
400 1.1 christos * Should have been reset by tls_process_finished, too.
401 1.1 christos */
402 1.1 christos s->s3->change_cipher_spec = 0;
403 1.1 christos
404 1.1 christos /*
405 1.1 christos * Ok, we now need to push on a buffering BIO ...but not with
406 1.1 christos * SCTP
407 1.1 christos */
408 1.1 christos #ifndef OPENSSL_NO_SCTP
409 1.1 christos if (!SSL_IS_DTLS(s) || !BIO_dgram_is_sctp(SSL_get_wbio(s)))
410 1.1 christos #endif
411 1.1 christos if (!ssl_init_wbio_buffer(s)) {
412 1.1 christos SSLfatal(s, SSL_AD_NO_ALERT, SSL_F_STATE_MACHINE,
413 1.1 christos ERR_R_INTERNAL_ERROR);
414 1.1 christos goto end;
415 1.1 christos }
416 1.1 christos
417 1.1 christos if ((SSL_in_before(s))
418 1.1 christos || s->renegotiate) {
419 1.1 christos if (!tls_setup_handshake(s)) {
420 1.1 christos /* SSLfatal() already called */
421 1.1 christos goto end;
422 1.1 christos }
423 1.1 christos
424 1.1 christos if (SSL_IS_FIRST_HANDSHAKE(s))
425 1.1 christos st->read_state_first_init = 1;
426 1.1 christos }
427 1.1 christos
428 1.1 christos st->state = MSG_FLOW_WRITING;
429 1.1 christos init_write_state_machine(s);
430 1.1 christos }
431 1.1 christos
432 1.1 christos while (st->state != MSG_FLOW_FINISHED) {
433 1.1 christos if (st->state == MSG_FLOW_READING) {
434 1.1 christos ssret = read_state_machine(s);
435 1.1 christos if (ssret == SUB_STATE_FINISHED) {
436 1.1 christos st->state = MSG_FLOW_WRITING;
437 1.1 christos init_write_state_machine(s);
438 1.1 christos } else {
439 1.1 christos /* NBIO or error */
440 1.1 christos goto end;
441 1.1 christos }
442 1.1 christos } else if (st->state == MSG_FLOW_WRITING) {
443 1.1 christos ssret = write_state_machine(s);
444 1.1 christos if (ssret == SUB_STATE_FINISHED) {
445 1.1 christos st->state = MSG_FLOW_READING;
446 1.1 christos init_read_state_machine(s);
447 1.1 christos } else if (ssret == SUB_STATE_END_HANDSHAKE) {
448 1.1 christos st->state = MSG_FLOW_FINISHED;
449 1.1 christos } else {
450 1.1 christos /* NBIO or error */
451 1.1 christos goto end;
452 1.1 christos }
453 1.1 christos } else {
454 1.1 christos /* Error */
455 1.1 christos check_fatal(s, SSL_F_STATE_MACHINE);
456 1.1 christos SSLerr(SSL_F_STATE_MACHINE, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
457 1.1 christos goto end;
458 1.1 christos }
459 1.1 christos }
460 1.1 christos
461 1.1 christos ret = 1;
462 1.1 christos
463 1.1 christos end:
464 1.1 christos st->in_handshake--;
465 1.1 christos
466 1.1 christos #ifndef OPENSSL_NO_SCTP
467 1.1 christos if (SSL_IS_DTLS(s) && BIO_dgram_is_sctp(SSL_get_wbio(s))) {
468 1.1 christos /*
469 1.1 christos * Notify SCTP BIO socket to leave handshake mode and allow stream
470 1.1 christos * identifier other than 0.
471 1.1 christos */
472 1.1 christos BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE,
473 1.1 christos st->in_handshake, NULL);
474 1.1 christos }
475 1.1 christos #endif
476 1.1 christos
477 1.1 christos BUF_MEM_free(buf);
478 1.1 christos if (cb != NULL) {
479 1.1 christos if (server)
480 1.1 christos cb(s, SSL_CB_ACCEPT_EXIT, ret);
481 1.1 christos else
482 1.1 christos cb(s, SSL_CB_CONNECT_EXIT, ret);
483 1.1 christos }
484 1.1 christos return ret;
485 1.1 christos }
486 1.1 christos
487 1.1 christos /*
488 1.1 christos * Initialise the MSG_FLOW_READING sub-state machine
489 1.1 christos */
490 1.1 christos static void init_read_state_machine(SSL *s)
491 1.1 christos {
492 1.1 christos OSSL_STATEM *st = &s->statem;
493 1.1 christos
494 1.1 christos st->read_state = READ_STATE_HEADER;
495 1.1 christos }
496 1.1 christos
497 1.1 christos static int grow_init_buf(SSL *s, size_t size) {
498 1.1 christos
499 1.1 christos size_t msg_offset = (char *)s->init_msg - s->init_buf->data;
500 1.1 christos
501 1.1 christos if (!BUF_MEM_grow_clean(s->init_buf, (int)size))
502 1.1 christos return 0;
503 1.1 christos
504 1.1 christos if (size < msg_offset)
505 1.1 christos return 0;
506 1.1 christos
507 1.1 christos s->init_msg = s->init_buf->data + msg_offset;
508 1.1 christos
509 1.1 christos return 1;
510 1.1 christos }
511 1.1 christos
512 1.1 christos /*
513 1.1 christos * This function implements the sub-state machine when the message flow is in
514 1.1 christos * MSG_FLOW_READING. The valid sub-states and transitions are:
515 1.1 christos *
516 1.1 christos * READ_STATE_HEADER <--+<-------------+
517 1.1 christos * | | |
518 1.1 christos * v | |
519 1.1 christos * READ_STATE_BODY -----+-->READ_STATE_POST_PROCESS
520 1.1 christos * | |
521 1.1 christos * +----------------------------+
522 1.1 christos * v
523 1.1 christos * [SUB_STATE_FINISHED]
524 1.1 christos *
525 1.1 christos * READ_STATE_HEADER has the responsibility for reading in the message header
526 1.1 christos * and transitioning the state of the handshake state machine.
527 1.1 christos *
528 1.1 christos * READ_STATE_BODY reads in the rest of the message and then subsequently
529 1.1 christos * processes it.
530 1.1 christos *
531 1.1 christos * READ_STATE_POST_PROCESS is an optional step that may occur if some post
532 1.1 christos * processing activity performed on the message may block.
533 1.1 christos *
534 1.1 christos * Any of the above states could result in an NBIO event occurring in which case
535 1.1 christos * control returns to the calling application. When this function is recalled we
536 1.1 christos * will resume in the same state where we left off.
537 1.1 christos */
538 1.1 christos static SUB_STATE_RETURN read_state_machine(SSL *s)
539 1.1 christos {
540 1.1 christos OSSL_STATEM *st = &s->statem;
541 1.1 christos int ret, mt;
542 1.1 christos size_t len = 0;
543 1.1 christos int (*transition) (SSL *s, int mt);
544 1.1 christos PACKET pkt;
545 1.1 christos MSG_PROCESS_RETURN(*process_message) (SSL *s, PACKET *pkt);
546 1.1 christos WORK_STATE(*post_process_message) (SSL *s, WORK_STATE wst);
547 1.1 christos size_t (*max_message_size) (SSL *s);
548 1.1 christos void (*cb) (const SSL *ssl, int type, int val) = NULL;
549 1.1 christos
550 1.1 christos cb = get_callback(s);
551 1.1 christos
552 1.1 christos if (s->server) {
553 1.1 christos transition = ossl_statem_server_read_transition;
554 1.1 christos process_message = ossl_statem_server_process_message;
555 1.1 christos max_message_size = ossl_statem_server_max_message_size;
556 1.1 christos post_process_message = ossl_statem_server_post_process_message;
557 1.1 christos } else {
558 1.1 christos transition = ossl_statem_client_read_transition;
559 1.1 christos process_message = ossl_statem_client_process_message;
560 1.1 christos max_message_size = ossl_statem_client_max_message_size;
561 1.1 christos post_process_message = ossl_statem_client_post_process_message;
562 1.1 christos }
563 1.1 christos
564 1.1 christos if (st->read_state_first_init) {
565 1.1 christos s->first_packet = 1;
566 1.1 christos st->read_state_first_init = 0;
567 1.1 christos }
568 1.1 christos
569 1.1 christos while (1) {
570 1.1 christos switch (st->read_state) {
571 1.1 christos case READ_STATE_HEADER:
572 1.1 christos /* Get the state the peer wants to move to */
573 1.1 christos if (SSL_IS_DTLS(s)) {
574 1.1 christos /*
575 1.1 christos * In DTLS we get the whole message in one go - header and body
576 1.1 christos */
577 1.1 christos ret = dtls_get_message(s, &mt, &len);
578 1.1 christos } else {
579 1.1 christos ret = tls_get_message_header(s, &mt);
580 1.1 christos }
581 1.1 christos
582 1.1 christos if (ret == 0) {
583 1.1 christos /* Could be non-blocking IO */
584 1.1 christos return SUB_STATE_ERROR;
585 1.1 christos }
586 1.1 christos
587 1.1 christos if (cb != NULL) {
588 1.1 christos /* Notify callback of an impending state change */
589 1.1 christos if (s->server)
590 1.1 christos cb(s, SSL_CB_ACCEPT_LOOP, 1);
591 1.1 christos else
592 1.1 christos cb(s, SSL_CB_CONNECT_LOOP, 1);
593 1.1 christos }
594 1.1 christos /*
595 1.1 christos * Validate that we are allowed to move to the new state and move
596 1.1 christos * to that state if so
597 1.1 christos */
598 1.1 christos if (!transition(s, mt))
599 1.1 christos return SUB_STATE_ERROR;
600 1.1 christos
601 1.1 christos if (s->s3->tmp.message_size > max_message_size(s)) {
602 1.1 christos SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_READ_STATE_MACHINE,
603 1.1 christos SSL_R_EXCESSIVE_MESSAGE_SIZE);
604 1.1 christos return SUB_STATE_ERROR;
605 1.1 christos }
606 1.1 christos
607 1.1 christos /* dtls_get_message already did this */
608 1.1 christos if (!SSL_IS_DTLS(s)
609 1.1 christos && s->s3->tmp.message_size > 0
610 1.1 christos && !grow_init_buf(s, s->s3->tmp.message_size
611 1.1 christos + SSL3_HM_HEADER_LENGTH)) {
612 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_READ_STATE_MACHINE,
613 1.1 christos ERR_R_BUF_LIB);
614 1.1 christos return SUB_STATE_ERROR;
615 1.1 christos }
616 1.1 christos
617 1.1 christos st->read_state = READ_STATE_BODY;
618 1.1 christos /* Fall through */
619 1.1 christos
620 1.1 christos case READ_STATE_BODY:
621 1.1 christos if (!SSL_IS_DTLS(s)) {
622 1.1 christos /* We already got this above for DTLS */
623 1.1 christos ret = tls_get_message_body(s, &len);
624 1.1 christos if (ret == 0) {
625 1.1 christos /* Could be non-blocking IO */
626 1.1 christos return SUB_STATE_ERROR;
627 1.1 christos }
628 1.1 christos }
629 1.1 christos
630 1.1 christos s->first_packet = 0;
631 1.1 christos if (!PACKET_buf_init(&pkt, s->init_msg, len)) {
632 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_READ_STATE_MACHINE,
633 1.1 christos ERR_R_INTERNAL_ERROR);
634 1.1 christos return SUB_STATE_ERROR;
635 1.1 christos }
636 1.1 christos ret = process_message(s, &pkt);
637 1.1 christos
638 1.1 christos /* Discard the packet data */
639 1.1 christos s->init_num = 0;
640 1.1 christos
641 1.1 christos switch (ret) {
642 1.1 christos case MSG_PROCESS_ERROR:
643 1.1 christos check_fatal(s, SSL_F_READ_STATE_MACHINE);
644 1.1 christos return SUB_STATE_ERROR;
645 1.1 christos
646 1.1 christos case MSG_PROCESS_FINISHED_READING:
647 1.1 christos if (SSL_IS_DTLS(s)) {
648 1.1 christos dtls1_stop_timer(s);
649 1.1 christos }
650 1.1 christos return SUB_STATE_FINISHED;
651 1.1 christos
652 1.1 christos case MSG_PROCESS_CONTINUE_PROCESSING:
653 1.1 christos st->read_state = READ_STATE_POST_PROCESS;
654 1.1 christos st->read_state_work = WORK_MORE_A;
655 1.1 christos break;
656 1.1 christos
657 1.1 christos default:
658 1.1 christos st->read_state = READ_STATE_HEADER;
659 1.1 christos break;
660 1.1 christos }
661 1.1 christos break;
662 1.1 christos
663 1.1 christos case READ_STATE_POST_PROCESS:
664 1.1 christos st->read_state_work = post_process_message(s, st->read_state_work);
665 1.1 christos switch (st->read_state_work) {
666 1.1 christos case WORK_ERROR:
667 1.1 christos check_fatal(s, SSL_F_READ_STATE_MACHINE);
668 1.1 christos /* Fall through */
669 1.1 christos case WORK_MORE_A:
670 1.1 christos case WORK_MORE_B:
671 1.1 christos case WORK_MORE_C:
672 1.1 christos return SUB_STATE_ERROR;
673 1.1 christos
674 1.1 christos case WORK_FINISHED_CONTINUE:
675 1.1 christos st->read_state = READ_STATE_HEADER;
676 1.1 christos break;
677 1.1 christos
678 1.1 christos case WORK_FINISHED_STOP:
679 1.1 christos if (SSL_IS_DTLS(s)) {
680 1.1 christos dtls1_stop_timer(s);
681 1.1 christos }
682 1.1 christos return SUB_STATE_FINISHED;
683 1.1 christos }
684 1.1 christos break;
685 1.1 christos
686 1.1 christos default:
687 1.1 christos /* Shouldn't happen */
688 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_READ_STATE_MACHINE,
689 1.1 christos ERR_R_INTERNAL_ERROR);
690 1.1 christos return SUB_STATE_ERROR;
691 1.1 christos }
692 1.1 christos }
693 1.1 christos }
694 1.1 christos
695 1.1 christos /*
696 1.1 christos * Send a previously constructed message to the peer.
697 1.1 christos */
698 1.1 christos static int statem_do_write(SSL *s)
699 1.1 christos {
700 1.1 christos OSSL_STATEM *st = &s->statem;
701 1.1 christos
702 1.1 christos if (st->hand_state == TLS_ST_CW_CHANGE
703 1.1 christos || st->hand_state == TLS_ST_SW_CHANGE) {
704 1.1 christos if (SSL_IS_DTLS(s))
705 1.1 christos return dtls1_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC);
706 1.1 christos else
707 1.1 christos return ssl3_do_write(s, SSL3_RT_CHANGE_CIPHER_SPEC);
708 1.1 christos } else {
709 1.1 christos return ssl_do_write(s);
710 1.1 christos }
711 1.1 christos }
712 1.1 christos
713 1.1 christos /*
714 1.1 christos * Initialise the MSG_FLOW_WRITING sub-state machine
715 1.1 christos */
716 1.1 christos static void init_write_state_machine(SSL *s)
717 1.1 christos {
718 1.1 christos OSSL_STATEM *st = &s->statem;
719 1.1 christos
720 1.1 christos st->write_state = WRITE_STATE_TRANSITION;
721 1.1 christos }
722 1.1 christos
723 1.1 christos /*
724 1.1 christos * This function implements the sub-state machine when the message flow is in
725 1.1 christos * MSG_FLOW_WRITING. The valid sub-states and transitions are:
726 1.1 christos *
727 1.1 christos * +-> WRITE_STATE_TRANSITION ------> [SUB_STATE_FINISHED]
728 1.1 christos * | |
729 1.1 christos * | v
730 1.1 christos * | WRITE_STATE_PRE_WORK -----> [SUB_STATE_END_HANDSHAKE]
731 1.1 christos * | |
732 1.1 christos * | v
733 1.1 christos * | WRITE_STATE_SEND
734 1.1 christos * | |
735 1.1 christos * | v
736 1.1 christos * | WRITE_STATE_POST_WORK
737 1.1 christos * | |
738 1.1 christos * +-------------+
739 1.1 christos *
740 1.1 christos * WRITE_STATE_TRANSITION transitions the state of the handshake state machine
741 1.1 christos
742 1.1 christos * WRITE_STATE_PRE_WORK performs any work necessary to prepare the later
743 1.1 christos * sending of the message. This could result in an NBIO event occurring in
744 1.1 christos * which case control returns to the calling application. When this function
745 1.1 christos * is recalled we will resume in the same state where we left off.
746 1.1 christos *
747 1.1 christos * WRITE_STATE_SEND sends the message and performs any work to be done after
748 1.1 christos * sending.
749 1.1 christos *
750 1.1 christos * WRITE_STATE_POST_WORK performs any work necessary after the sending of the
751 1.1 christos * message has been completed. As for WRITE_STATE_PRE_WORK this could also
752 1.1 christos * result in an NBIO event.
753 1.1 christos */
754 1.1 christos static SUB_STATE_RETURN write_state_machine(SSL *s)
755 1.1 christos {
756 1.1 christos OSSL_STATEM *st = &s->statem;
757 1.1 christos int ret;
758 1.1 christos WRITE_TRAN(*transition) (SSL *s);
759 1.1 christos WORK_STATE(*pre_work) (SSL *s, WORK_STATE wst);
760 1.1 christos WORK_STATE(*post_work) (SSL *s, WORK_STATE wst);
761 1.1 christos int (*get_construct_message_f) (SSL *s, WPACKET *pkt,
762 1.1 christos int (**confunc) (SSL *s, WPACKET *pkt),
763 1.1 christos int *mt);
764 1.1 christos void (*cb) (const SSL *ssl, int type, int val) = NULL;
765 1.1 christos int (*confunc) (SSL *s, WPACKET *pkt);
766 1.1 christos int mt;
767 1.1 christos WPACKET pkt;
768 1.1 christos
769 1.1 christos cb = get_callback(s);
770 1.1 christos
771 1.1 christos if (s->server) {
772 1.1 christos transition = ossl_statem_server_write_transition;
773 1.1 christos pre_work = ossl_statem_server_pre_work;
774 1.1 christos post_work = ossl_statem_server_post_work;
775 1.1 christos get_construct_message_f = ossl_statem_server_construct_message;
776 1.1 christos } else {
777 1.1 christos transition = ossl_statem_client_write_transition;
778 1.1 christos pre_work = ossl_statem_client_pre_work;
779 1.1 christos post_work = ossl_statem_client_post_work;
780 1.1 christos get_construct_message_f = ossl_statem_client_construct_message;
781 1.1 christos }
782 1.1 christos
783 1.1 christos while (1) {
784 1.1 christos switch (st->write_state) {
785 1.1 christos case WRITE_STATE_TRANSITION:
786 1.1 christos if (cb != NULL) {
787 1.1 christos /* Notify callback of an impending state change */
788 1.1 christos if (s->server)
789 1.1 christos cb(s, SSL_CB_ACCEPT_LOOP, 1);
790 1.1 christos else
791 1.1 christos cb(s, SSL_CB_CONNECT_LOOP, 1);
792 1.1 christos }
793 1.1 christos switch (transition(s)) {
794 1.1 christos case WRITE_TRAN_CONTINUE:
795 1.1 christos st->write_state = WRITE_STATE_PRE_WORK;
796 1.1 christos st->write_state_work = WORK_MORE_A;
797 1.1 christos break;
798 1.1 christos
799 1.1 christos case WRITE_TRAN_FINISHED:
800 1.1 christos return SUB_STATE_FINISHED;
801 1.1 christos break;
802 1.1 christos
803 1.1 christos case WRITE_TRAN_ERROR:
804 1.1 christos check_fatal(s, SSL_F_WRITE_STATE_MACHINE);
805 1.1 christos return SUB_STATE_ERROR;
806 1.1 christos }
807 1.1 christos break;
808 1.1 christos
809 1.1 christos case WRITE_STATE_PRE_WORK:
810 1.1 christos switch (st->write_state_work = pre_work(s, st->write_state_work)) {
811 1.1 christos case WORK_ERROR:
812 1.1 christos check_fatal(s, SSL_F_WRITE_STATE_MACHINE);
813 1.1 christos /* Fall through */
814 1.1 christos case WORK_MORE_A:
815 1.1 christos case WORK_MORE_B:
816 1.1 christos case WORK_MORE_C:
817 1.1 christos return SUB_STATE_ERROR;
818 1.1 christos
819 1.1 christos case WORK_FINISHED_CONTINUE:
820 1.1 christos st->write_state = WRITE_STATE_SEND;
821 1.1 christos break;
822 1.1 christos
823 1.1 christos case WORK_FINISHED_STOP:
824 1.1 christos return SUB_STATE_END_HANDSHAKE;
825 1.1 christos }
826 1.1 christos if (!get_construct_message_f(s, &pkt, &confunc, &mt)) {
827 1.1 christos /* SSLfatal() already called */
828 1.1 christos return SUB_STATE_ERROR;
829 1.1 christos }
830 1.1 christos if (mt == SSL3_MT_DUMMY) {
831 1.1 christos /* Skip construction and sending. This isn't a "real" state */
832 1.1 christos st->write_state = WRITE_STATE_POST_WORK;
833 1.1 christos st->write_state_work = WORK_MORE_A;
834 1.1 christos break;
835 1.1 christos }
836 1.1 christos if (!WPACKET_init(&pkt, s->init_buf)
837 1.1 christos || !ssl_set_handshake_header(s, &pkt, mt)) {
838 1.1 christos WPACKET_cleanup(&pkt);
839 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_WRITE_STATE_MACHINE,
840 1.1 christos ERR_R_INTERNAL_ERROR);
841 1.1 christos return SUB_STATE_ERROR;
842 1.1 christos }
843 1.1 christos if (confunc != NULL && !confunc(s, &pkt)) {
844 1.1 christos WPACKET_cleanup(&pkt);
845 1.1 christos check_fatal(s, SSL_F_WRITE_STATE_MACHINE);
846 1.1 christos return SUB_STATE_ERROR;
847 1.1 christos }
848 1.1 christos if (!ssl_close_construct_packet(s, &pkt, mt)
849 1.1 christos || !WPACKET_finish(&pkt)) {
850 1.1 christos WPACKET_cleanup(&pkt);
851 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_WRITE_STATE_MACHINE,
852 1.1 christos ERR_R_INTERNAL_ERROR);
853 1.1 christos return SUB_STATE_ERROR;
854 1.1 christos }
855 1.1 christos
856 1.1 christos /* Fall through */
857 1.1 christos
858 1.1 christos case WRITE_STATE_SEND:
859 1.1 christos if (SSL_IS_DTLS(s) && st->use_timer) {
860 1.1 christos dtls1_start_timer(s);
861 1.1 christos }
862 1.1 christos ret = statem_do_write(s);
863 1.1 christos if (ret <= 0) {
864 1.1 christos return SUB_STATE_ERROR;
865 1.1 christos }
866 1.1 christos st->write_state = WRITE_STATE_POST_WORK;
867 1.1 christos st->write_state_work = WORK_MORE_A;
868 1.1 christos /* Fall through */
869 1.1 christos
870 1.1 christos case WRITE_STATE_POST_WORK:
871 1.1 christos switch (st->write_state_work = post_work(s, st->write_state_work)) {
872 1.1 christos case WORK_ERROR:
873 1.1 christos check_fatal(s, SSL_F_WRITE_STATE_MACHINE);
874 1.1 christos /* Fall through */
875 1.1 christos case WORK_MORE_A:
876 1.1 christos case WORK_MORE_B:
877 1.1 christos case WORK_MORE_C:
878 1.1 christos return SUB_STATE_ERROR;
879 1.1 christos
880 1.1 christos case WORK_FINISHED_CONTINUE:
881 1.1 christos st->write_state = WRITE_STATE_TRANSITION;
882 1.1 christos break;
883 1.1 christos
884 1.1 christos case WORK_FINISHED_STOP:
885 1.1 christos return SUB_STATE_END_HANDSHAKE;
886 1.1 christos }
887 1.1 christos break;
888 1.1 christos
889 1.1 christos default:
890 1.1 christos SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_WRITE_STATE_MACHINE,
891 1.1 christos ERR_R_INTERNAL_ERROR);
892 1.1 christos return SUB_STATE_ERROR;
893 1.1 christos }
894 1.1 christos }
895 1.1 christos }
896 1.1 christos
897 1.1 christos /*
898 1.1 christos * Flush the write BIO
899 1.1 christos */
900 1.1 christos int statem_flush(SSL *s)
901 1.1 christos {
902 1.1 christos s->rwstate = SSL_WRITING;
903 1.1 christos if (BIO_flush(s->wbio) <= 0) {
904 1.1 christos return 0;
905 1.1 christos }
906 1.1 christos s->rwstate = SSL_NOTHING;
907 1.1 christos
908 1.1 christos return 1;
909 1.1 christos }
910 1.1 christos
911 1.1 christos /*
912 1.1 christos * Called by the record layer to determine whether application data is
913 1.1 christos * allowed to be received in the current handshake state or not.
914 1.1 christos *
915 1.1 christos * Return values are:
916 1.1 christos * 1: Yes (application data allowed)
917 1.1 christos * 0: No (application data not allowed)
918 1.1 christos */
919 1.1 christos int ossl_statem_app_data_allowed(SSL *s)
920 1.1 christos {
921 1.1 christos OSSL_STATEM *st = &s->statem;
922 1.1 christos
923 1.1 christos if (st->state == MSG_FLOW_UNINITED)
924 1.1 christos return 0;
925 1.1 christos
926 1.1 christos if (!s->s3->in_read_app_data || (s->s3->total_renegotiations == 0))
927 1.1 christos return 0;
928 1.1 christos
929 1.1 christos if (s->server) {
930 1.1 christos /*
931 1.1 christos * If we're a server and we haven't got as far as writing our
932 1.1 christos * ServerHello yet then we allow app data
933 1.1 christos */
934 1.1 christos if (st->hand_state == TLS_ST_BEFORE
935 1.1 christos || st->hand_state == TLS_ST_SR_CLNT_HELLO)
936 1.1 christos return 1;
937 1.1 christos } else {
938 1.1 christos /*
939 1.1 christos * If we're a client and we haven't read the ServerHello yet then we
940 1.1 christos * allow app data
941 1.1 christos */
942 1.1 christos if (st->hand_state == TLS_ST_CW_CLNT_HELLO)
943 1.1 christos return 1;
944 1.1 christos }
945 1.1 christos
946 1.1 christos return 0;
947 1.1 christos }
948 1.1 christos
949 1.1 christos /*
950 1.1 christos * This function returns 1 if TLS exporter is ready to export keying
951 1.1 christos * material, or 0 if otherwise.
952 1.1 christos */
953 1.1 christos int ossl_statem_export_allowed(SSL *s)
954 1.1 christos {
955 1.1 christos return s->s3->previous_server_finished_len != 0
956 1.1 christos && s->statem.hand_state != TLS_ST_SW_FINISHED;
957 1.1 christos }
958 1.1 christos
959 1.1 christos /*
960 1.1 christos * Return 1 if early TLS exporter is ready to export keying material,
961 1.1 christos * or 0 if otherwise.
962 1.1 christos */
963 1.1 christos int ossl_statem_export_early_allowed(SSL *s)
964 1.1 christos {
965 1.1 christos /*
966 1.1 christos * The early exporter secret is only present on the server if we
967 1.1 christos * have accepted early_data. It is present on the client as long
968 1.1 christos * as we have sent early_data.
969 1.1 christos */
970 1.1 christos return s->ext.early_data == SSL_EARLY_DATA_ACCEPTED
971 1.1 christos || (!s->server && s->ext.early_data != SSL_EARLY_DATA_NOT_SENT);
972 1.1 christos }
973