xref: /freebsd/crypto/openssl/ssl/record/record.h (revision 44096ebd22ddd0081a357011714eff8963614b65)
1e71b7053SJung-uk Kim /*
2*44096ebdSEnji Cooper  * Copyright 1995-2024 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim  */
9e71b7053SJung-uk Kim 
10e71b7053SJung-uk Kim /*****************************************************************************
11e71b7053SJung-uk Kim  *                                                                           *
12e71b7053SJung-uk Kim  * These structures should be considered PRIVATE to the record layer. No     *
13e71b7053SJung-uk Kim  * non-record layer code should be using these structures in any way.        *
14e71b7053SJung-uk Kim  *                                                                           *
15e71b7053SJung-uk Kim  *****************************************************************************/
16e71b7053SJung-uk Kim 
17e71b7053SJung-uk Kim typedef struct ssl3_buffer_st {
18e71b7053SJung-uk Kim     /* at least SSL3_RT_MAX_PACKET_SIZE bytes, see ssl3_setup_buffers() */
19e71b7053SJung-uk Kim     unsigned char *buf;
20e71b7053SJung-uk Kim     /* default buffer size (or 0 if no default set) */
21e71b7053SJung-uk Kim     size_t default_len;
22e71b7053SJung-uk Kim     /* buffer size */
23e71b7053SJung-uk Kim     size_t len;
24e71b7053SJung-uk Kim     /* where to 'copy from' */
25e71b7053SJung-uk Kim     size_t offset;
26e71b7053SJung-uk Kim     /* how many bytes left */
27e71b7053SJung-uk Kim     size_t left;
28aa906e2aSJohn Baldwin     /* 'buf' is from application for KTLS */
29aa906e2aSJohn Baldwin     int app_buffer;
30e71b7053SJung-uk Kim } SSL3_BUFFER;
31e71b7053SJung-uk Kim 
32e71b7053SJung-uk Kim #define SEQ_NUM_SIZE                            8
33e71b7053SJung-uk Kim 
34e71b7053SJung-uk Kim typedef struct ssl3_record_st {
35e71b7053SJung-uk Kim     /* Record layer version */
36e71b7053SJung-uk Kim     /* r */
37e71b7053SJung-uk Kim     int rec_version;
38e71b7053SJung-uk Kim     /* type of record */
39e71b7053SJung-uk Kim     /* r */
40e71b7053SJung-uk Kim     int type;
41e71b7053SJung-uk Kim     /* How many bytes available */
42e71b7053SJung-uk Kim     /* rw */
43e71b7053SJung-uk Kim     size_t length;
44e71b7053SJung-uk Kim     /*
45e71b7053SJung-uk Kim      * How many bytes were available before padding was removed? This is used
46e71b7053SJung-uk Kim      * to implement the MAC check in constant time for CBC records.
47e71b7053SJung-uk Kim      */
48e71b7053SJung-uk Kim     /* rw */
49e71b7053SJung-uk Kim     size_t orig_len;
50e71b7053SJung-uk Kim     /* read/write offset into 'buf' */
51e71b7053SJung-uk Kim     /* r */
52e71b7053SJung-uk Kim     size_t off;
53e71b7053SJung-uk Kim     /* pointer to the record data */
54e71b7053SJung-uk Kim     /* rw */
55e71b7053SJung-uk Kim     unsigned char *data;
56e71b7053SJung-uk Kim     /* where the decode bytes are */
57e71b7053SJung-uk Kim     /* rw */
58e71b7053SJung-uk Kim     unsigned char *input;
59e71b7053SJung-uk Kim     /* only used with decompression - malloc()ed */
60e71b7053SJung-uk Kim     /* r */
61e71b7053SJung-uk Kim     unsigned char *comp;
62e71b7053SJung-uk Kim     /* Whether the data from this record has already been read or not */
63e71b7053SJung-uk Kim     /* r */
64e71b7053SJung-uk Kim     unsigned int read;
65e71b7053SJung-uk Kim     /* epoch number, needed by DTLS1 */
66e71b7053SJung-uk Kim     /* r */
67e71b7053SJung-uk Kim     unsigned long epoch;
68e71b7053SJung-uk Kim     /* sequence number, needed by DTLS1 */
69e71b7053SJung-uk Kim     /* r */
70e71b7053SJung-uk Kim     unsigned char seq_num[SEQ_NUM_SIZE];
71e71b7053SJung-uk Kim } SSL3_RECORD;
72e71b7053SJung-uk Kim 
73e71b7053SJung-uk Kim typedef struct dtls1_bitmap_st {
74e71b7053SJung-uk Kim     /* Track 32 packets on 32-bit systems and 64 - on 64-bit systems */
75e71b7053SJung-uk Kim     unsigned long map;
76e71b7053SJung-uk Kim     /* Max record number seen so far, 64-bit value in big-endian encoding */
77e71b7053SJung-uk Kim     unsigned char max_seq_num[SEQ_NUM_SIZE];
78e71b7053SJung-uk Kim } DTLS1_BITMAP;
79e71b7053SJung-uk Kim 
80e71b7053SJung-uk Kim typedef struct record_pqueue_st {
81e71b7053SJung-uk Kim     unsigned short epoch;
82e71b7053SJung-uk Kim     struct pqueue_st *q;
83e71b7053SJung-uk Kim } record_pqueue;
84e71b7053SJung-uk Kim 
85e71b7053SJung-uk Kim typedef struct dtls1_record_data_st {
86e71b7053SJung-uk Kim     unsigned char *packet;
87e71b7053SJung-uk Kim     size_t packet_length;
88e71b7053SJung-uk Kim     SSL3_BUFFER rbuf;
89e71b7053SJung-uk Kim     SSL3_RECORD rrec;
90e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SCTP
91e71b7053SJung-uk Kim     struct bio_dgram_sctp_rcvinfo recordinfo;
92e71b7053SJung-uk Kim #endif
93e71b7053SJung-uk Kim } DTLS1_RECORD_DATA;
94e71b7053SJung-uk Kim 
95e71b7053SJung-uk Kim typedef struct dtls_record_layer_st {
96e71b7053SJung-uk Kim     /*
97e71b7053SJung-uk Kim      * The current data and handshake epoch.  This is initially
98e71b7053SJung-uk Kim      * undefined, and starts at zero once the initial handshake is
99e71b7053SJung-uk Kim      * completed
100e71b7053SJung-uk Kim      */
101e71b7053SJung-uk Kim     unsigned short r_epoch;
102e71b7053SJung-uk Kim     unsigned short w_epoch;
103e71b7053SJung-uk Kim     /* records being received in the current epoch */
104e71b7053SJung-uk Kim     DTLS1_BITMAP bitmap;
105e71b7053SJung-uk Kim     /* renegotiation starts a new set of sequence numbers */
106e71b7053SJung-uk Kim     DTLS1_BITMAP next_bitmap;
107e71b7053SJung-uk Kim     /* Received handshake records (processed and unprocessed) */
108e71b7053SJung-uk Kim     record_pqueue unprocessed_rcds;
109e71b7053SJung-uk Kim     record_pqueue processed_rcds;
110e71b7053SJung-uk Kim     /*
111e71b7053SJung-uk Kim      * Buffered application records. Only for records between CCS and
112e71b7053SJung-uk Kim      * Finished to prevent either protocol violation or unnecessary message
113e71b7053SJung-uk Kim      * loss.
114e71b7053SJung-uk Kim      */
115e71b7053SJung-uk Kim     record_pqueue buffered_app_data;
116e71b7053SJung-uk Kim     /* save last and current sequence numbers for retransmissions */
117e71b7053SJung-uk Kim     unsigned char last_write_sequence[8];
118e71b7053SJung-uk Kim     unsigned char curr_write_sequence[8];
119e71b7053SJung-uk Kim } DTLS_RECORD_LAYER;
120e71b7053SJung-uk Kim 
121e71b7053SJung-uk Kim /*****************************************************************************
122e71b7053SJung-uk Kim  *                                                                           *
123e71b7053SJung-uk Kim  * This structure should be considered "opaque" to anything outside of the   *
124e71b7053SJung-uk Kim  * record layer. No non-record layer code should be accessing the members of *
125e71b7053SJung-uk Kim  * this structure.                                                           *
126e71b7053SJung-uk Kim  *                                                                           *
127e71b7053SJung-uk Kim  *****************************************************************************/
128e71b7053SJung-uk Kim 
129e71b7053SJung-uk Kim typedef struct record_layer_st {
130e71b7053SJung-uk Kim     /* The parent SSL structure */
131e71b7053SJung-uk Kim     SSL *s;
132e71b7053SJung-uk Kim     /*
133e71b7053SJung-uk Kim      * Read as many input bytes as possible (for
134e71b7053SJung-uk Kim      * non-blocking reads)
135e71b7053SJung-uk Kim      */
136e71b7053SJung-uk Kim     int read_ahead;
137e71b7053SJung-uk Kim     /* where we are when reading */
138e71b7053SJung-uk Kim     int rstate;
139e71b7053SJung-uk Kim     /* How many pipelines can be used to read data */
140e71b7053SJung-uk Kim     size_t numrpipes;
141e71b7053SJung-uk Kim     /* How many pipelines can be used to write data */
142e71b7053SJung-uk Kim     size_t numwpipes;
143e71b7053SJung-uk Kim     /* read IO goes into here */
144e71b7053SJung-uk Kim     SSL3_BUFFER rbuf;
145e71b7053SJung-uk Kim     /* write IO goes into here */
146e71b7053SJung-uk Kim     SSL3_BUFFER wbuf[SSL_MAX_PIPELINES];
147e71b7053SJung-uk Kim     /* each decoded record goes in here */
148e71b7053SJung-uk Kim     SSL3_RECORD rrec[SSL_MAX_PIPELINES];
149e71b7053SJung-uk Kim     /* used internally to point at a raw packet */
150e71b7053SJung-uk Kim     unsigned char *packet;
151e71b7053SJung-uk Kim     size_t packet_length;
152e71b7053SJung-uk Kim     /* number of bytes sent so far */
153e71b7053SJung-uk Kim     size_t wnum;
154e71b7053SJung-uk Kim     unsigned char handshake_fragment[4];
155e71b7053SJung-uk Kim     size_t handshake_fragment_len;
156e71b7053SJung-uk Kim     /* The number of consecutive empty records we have received */
157e71b7053SJung-uk Kim     size_t empty_record_count;
158e71b7053SJung-uk Kim     /* partial write - check the numbers match */
159e71b7053SJung-uk Kim     /* number bytes written */
160e71b7053SJung-uk Kim     size_t wpend_tot;
161e71b7053SJung-uk Kim     int wpend_type;
162e71b7053SJung-uk Kim     /* number of bytes submitted */
163e71b7053SJung-uk Kim     size_t wpend_ret;
164e71b7053SJung-uk Kim     const unsigned char *wpend_buf;
165e71b7053SJung-uk Kim     unsigned char read_sequence[SEQ_NUM_SIZE];
166e71b7053SJung-uk Kim     unsigned char write_sequence[SEQ_NUM_SIZE];
167e71b7053SJung-uk Kim     /* Set to true if this is the first record in a connection */
168e71b7053SJung-uk Kim     unsigned int is_first_record;
169e71b7053SJung-uk Kim     /* Count of the number of consecutive warning alerts received */
170e71b7053SJung-uk Kim     unsigned int alert_count;
171e71b7053SJung-uk Kim     DTLS_RECORD_LAYER *d;
172e71b7053SJung-uk Kim } RECORD_LAYER;
173e71b7053SJung-uk Kim 
174e71b7053SJung-uk Kim /*****************************************************************************
175e71b7053SJung-uk Kim  *                                                                           *
176e71b7053SJung-uk Kim  * The following macros/functions represent the libssl internal API to the   *
177e71b7053SJung-uk Kim  * record layer. Any libssl code may call these functions/macros             *
178e71b7053SJung-uk Kim  *                                                                           *
179e71b7053SJung-uk Kim  *****************************************************************************/
180e71b7053SJung-uk Kim 
181b077aed3SPierre Pronchery struct ssl_mac_buf_st {
182b077aed3SPierre Pronchery     unsigned char *mac;
183b077aed3SPierre Pronchery     int alloced;
184b077aed3SPierre Pronchery };
185b077aed3SPierre Pronchery typedef struct ssl_mac_buf_st SSL_MAC_BUF;
186b077aed3SPierre Pronchery 
187e71b7053SJung-uk Kim #define MIN_SSL2_RECORD_LEN     9
188e71b7053SJung-uk Kim 
189e71b7053SJung-uk Kim #define RECORD_LAYER_set_read_ahead(rl, ra)     ((rl)->read_ahead = (ra))
190e71b7053SJung-uk Kim #define RECORD_LAYER_get_read_ahead(rl)         ((rl)->read_ahead)
191e71b7053SJung-uk Kim #define RECORD_LAYER_get_packet(rl)             ((rl)->packet)
192e71b7053SJung-uk Kim #define RECORD_LAYER_get_packet_length(rl)      ((rl)->packet_length)
193e71b7053SJung-uk Kim #define RECORD_LAYER_add_packet_length(rl, inc) ((rl)->packet_length += (inc))
194e71b7053SJung-uk Kim #define DTLS_RECORD_LAYER_get_w_epoch(rl)       ((rl)->d->w_epoch)
195e71b7053SJung-uk Kim #define DTLS_RECORD_LAYER_get_processed_rcds(rl) \
196e71b7053SJung-uk Kim                                                 ((rl)->d->processed_rcds)
197e71b7053SJung-uk Kim #define DTLS_RECORD_LAYER_get_unprocessed_rcds(rl) \
198e71b7053SJung-uk Kim                                                 ((rl)->d->unprocessed_rcds)
199c9cf7b5cSJung-uk Kim #define RECORD_LAYER_get_rbuf(rl)               (&(rl)->rbuf)
200c9cf7b5cSJung-uk Kim #define RECORD_LAYER_get_wbuf(rl)               ((rl)->wbuf)
201e71b7053SJung-uk Kim 
202e71b7053SJung-uk Kim void RECORD_LAYER_init(RECORD_LAYER *rl, SSL *s);
203e71b7053SJung-uk Kim void RECORD_LAYER_clear(RECORD_LAYER *rl);
204e71b7053SJung-uk Kim void RECORD_LAYER_release(RECORD_LAYER *rl);
205e71b7053SJung-uk Kim int RECORD_LAYER_read_pending(const RECORD_LAYER *rl);
206e71b7053SJung-uk Kim int RECORD_LAYER_processed_read_pending(const RECORD_LAYER *rl);
207e71b7053SJung-uk Kim int RECORD_LAYER_write_pending(const RECORD_LAYER *rl);
208*44096ebdSEnji Cooper int RECORD_LAYER_data_present(const RECORD_LAYER *rl);
209e71b7053SJung-uk Kim void RECORD_LAYER_reset_read_sequence(RECORD_LAYER *rl);
210e71b7053SJung-uk Kim void RECORD_LAYER_reset_write_sequence(RECORD_LAYER *rl);
211e71b7053SJung-uk Kim int RECORD_LAYER_is_sslv2_record(RECORD_LAYER *rl);
212e71b7053SJung-uk Kim size_t RECORD_LAYER_get_rrec_length(RECORD_LAYER *rl);
213e71b7053SJung-uk Kim __owur size_t ssl3_pending(const SSL *s);
214e71b7053SJung-uk Kim __owur int ssl3_write_bytes(SSL *s, int type, const void *buf, size_t len,
215e71b7053SJung-uk Kim                             size_t *written);
216e71b7053SJung-uk Kim int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
217e71b7053SJung-uk Kim                   size_t *pipelens, size_t numpipes,
218e71b7053SJung-uk Kim                   int create_empty_fragment, size_t *written);
219e71b7053SJung-uk Kim __owur int ssl3_read_bytes(SSL *s, int type, int *recvd_type,
220e71b7053SJung-uk Kim                            unsigned char *buf, size_t len, int peek,
221e71b7053SJung-uk Kim                            size_t *readbytes);
222e71b7053SJung-uk Kim __owur int ssl3_setup_buffers(SSL *s);
223b077aed3SPierre Pronchery __owur int ssl3_enc(SSL *s, SSL3_RECORD *inrecs, size_t n_recs, int send,
224b077aed3SPierre Pronchery                     SSL_MAC_BUF *mac, size_t macsize);
225e71b7053SJung-uk Kim __owur int n_ssl3_mac(SSL *ssl, SSL3_RECORD *rec, unsigned char *md, int send);
226e71b7053SJung-uk Kim __owur int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, size_t len,
227e71b7053SJung-uk Kim                               size_t *written);
228b077aed3SPierre Pronchery __owur int tls1_enc(SSL *s, SSL3_RECORD *recs, size_t n_recs, int sending,
229b077aed3SPierre Pronchery                     SSL_MAC_BUF *mac, size_t macsize);
230e71b7053SJung-uk Kim __owur int tls1_mac(SSL *ssl, SSL3_RECORD *rec, unsigned char *md, int send);
231b077aed3SPierre Pronchery __owur int tls13_enc(SSL *s, SSL3_RECORD *recs, size_t n_recs, int send,
232b077aed3SPierre Pronchery                      SSL_MAC_BUF *mac, size_t macsize);
233e71b7053SJung-uk Kim int DTLS_RECORD_LAYER_new(RECORD_LAYER *rl);
234e71b7053SJung-uk Kim void DTLS_RECORD_LAYER_free(RECORD_LAYER *rl);
235e71b7053SJung-uk Kim void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl);
236e71b7053SJung-uk Kim void DTLS_RECORD_LAYER_set_saved_w_epoch(RECORD_LAYER *rl, unsigned short e);
237e71b7053SJung-uk Kim void DTLS_RECORD_LAYER_clear(RECORD_LAYER *rl);
238e71b7053SJung-uk Kim void DTLS_RECORD_LAYER_set_write_sequence(RECORD_LAYER *rl, unsigned char *seq);
239e71b7053SJung-uk Kim __owur int dtls1_read_bytes(SSL *s, int type, int *recvd_type,
240e71b7053SJung-uk Kim                             unsigned char *buf, size_t len, int peek,
241e71b7053SJung-uk Kim                             size_t *readbytes);
242e71b7053SJung-uk Kim __owur int dtls1_write_bytes(SSL *s, int type, const void *buf, size_t len,
243e71b7053SJung-uk Kim                              size_t *written);
244e71b7053SJung-uk Kim int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
245e71b7053SJung-uk Kim                    size_t len, int create_empty_fragment, size_t *written);
246e71b7053SJung-uk Kim void dtls1_reset_seq_numbers(SSL *s, int rw);
247c9cf7b5cSJung-uk Kim int dtls_buffer_listen_record(SSL *s, size_t len, unsigned char *seq,
248c9cf7b5cSJung-uk Kim                               size_t off);
249