/src/libressl/ssl/tls13_handshake_msg.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* $OpenBSD: tls13_handshake_msg.c,v 1.7 2024/02/04 20:50:23 tb Exp $ */ |
2 | | /* |
3 | | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | | * |
5 | | * Permission to use, copy, modify, and distribute this software for any |
6 | | * purpose with or without fee is hereby granted, provided that the above |
7 | | * copyright notice and this permission notice appear in all copies. |
8 | | * |
9 | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
10 | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
11 | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
12 | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
13 | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
14 | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
15 | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
16 | | */ |
17 | | |
18 | | #include "bytestring.h" |
19 | | #include "tls13_internal.h" |
20 | | |
21 | 27.2k | #define TLS13_HANDSHAKE_MSG_HEADER_LEN 4 |
22 | 6.34k | #define TLS13_HANDSHAKE_MSG_INITIAL_LEN 256 |
23 | 9.01k | #define TLS13_HANDSHAKE_MSG_MAX_LEN (256 * 1024) |
24 | | |
25 | | struct tls13_handshake_msg { |
26 | | uint8_t msg_type; |
27 | | uint32_t msg_len; |
28 | | uint8_t *data; |
29 | | size_t data_len; |
30 | | |
31 | | struct tls_buffer *buf; |
32 | | CBS cbs; |
33 | | CBB cbb; |
34 | | }; |
35 | | |
36 | | struct tls13_handshake_msg * |
37 | | tls13_handshake_msg_new(void) |
38 | 15.9k | { |
39 | 15.9k | struct tls13_handshake_msg *msg = NULL; |
40 | | |
41 | 15.9k | if ((msg = calloc(1, sizeof(struct tls13_handshake_msg))) == NULL) |
42 | 0 | goto err; |
43 | 15.9k | if ((msg->buf = tls_buffer_new(0)) == NULL) |
44 | 0 | goto err; |
45 | | |
46 | 15.9k | return msg; |
47 | | |
48 | 0 | err: |
49 | 0 | tls13_handshake_msg_free(msg); |
50 | |
|
51 | 0 | return NULL; |
52 | 15.9k | } |
53 | | |
54 | | void |
55 | | tls13_handshake_msg_free(struct tls13_handshake_msg *msg) |
56 | 24.4k | { |
57 | 24.4k | if (msg == NULL) |
58 | 8.45k | return; |
59 | | |
60 | 15.9k | tls_buffer_free(msg->buf); |
61 | | |
62 | 15.9k | CBB_cleanup(&msg->cbb); |
63 | | |
64 | 15.9k | freezero(msg->data, msg->data_len); |
65 | 15.9k | freezero(msg, sizeof(struct tls13_handshake_msg)); |
66 | 15.9k | } |
67 | | |
68 | | void |
69 | | tls13_handshake_msg_data(struct tls13_handshake_msg *msg, CBS *cbs) |
70 | 36.9k | { |
71 | 36.9k | CBS_init(cbs, msg->data, msg->data_len); |
72 | 36.9k | } |
73 | | |
74 | | uint8_t |
75 | | tls13_handshake_msg_type(struct tls13_handshake_msg *msg) |
76 | 16.8k | { |
77 | 16.8k | return msg->msg_type; |
78 | 16.8k | } |
79 | | |
80 | | int |
81 | | tls13_handshake_msg_content(struct tls13_handshake_msg *msg, CBS *cbs) |
82 | 8.64k | { |
83 | 8.64k | tls13_handshake_msg_data(msg, cbs); |
84 | | |
85 | 8.64k | return CBS_skip(cbs, TLS13_HANDSHAKE_MSG_HEADER_LEN); |
86 | 8.64k | } |
87 | | |
88 | | int |
89 | | tls13_handshake_msg_start(struct tls13_handshake_msg *msg, CBB *body, |
90 | | uint8_t msg_type) |
91 | 6.34k | { |
92 | 6.34k | if (!CBB_init(&msg->cbb, TLS13_HANDSHAKE_MSG_INITIAL_LEN)) |
93 | 0 | return 0; |
94 | 6.34k | if (!CBB_add_u8(&msg->cbb, msg_type)) |
95 | 0 | return 0; |
96 | 6.34k | if (!CBB_add_u24_length_prefixed(&msg->cbb, body)) |
97 | 0 | return 0; |
98 | | |
99 | 6.34k | return 1; |
100 | 6.34k | } |
101 | | |
102 | | int |
103 | | tls13_handshake_msg_finish(struct tls13_handshake_msg *msg) |
104 | 6.31k | { |
105 | 6.31k | if (!CBB_finish(&msg->cbb, &msg->data, &msg->data_len)) |
106 | 0 | return 0; |
107 | | |
108 | 6.31k | CBS_init(&msg->cbs, msg->data, msg->data_len); |
109 | | |
110 | 6.31k | return 1; |
111 | 6.31k | } |
112 | | |
113 | | static ssize_t |
114 | | tls13_handshake_msg_read_cb(void *buf, size_t n, void *cb_arg) |
115 | 30.8k | { |
116 | 30.8k | struct tls13_record_layer *rl = cb_arg; |
117 | | |
118 | 30.8k | return tls13_read_handshake_data(rl, buf, n); |
119 | 30.8k | } |
120 | | |
121 | | int |
122 | | tls13_handshake_msg_recv(struct tls13_handshake_msg *msg, |
123 | | struct tls13_record_layer *rl) |
124 | 9.64k | { |
125 | 9.64k | uint8_t msg_type; |
126 | 9.64k | uint32_t msg_len; |
127 | 9.64k | CBS cbs; |
128 | 9.64k | int ret; |
129 | | |
130 | 9.64k | if (msg->data != NULL) |
131 | 0 | return TLS13_IO_FAILURE; |
132 | | |
133 | 9.64k | if (msg->msg_type == 0) { |
134 | 9.64k | if ((ret = tls_buffer_extend(msg->buf, |
135 | 9.64k | TLS13_HANDSHAKE_MSG_HEADER_LEN, |
136 | 9.64k | tls13_handshake_msg_read_cb, rl)) <= 0) |
137 | 628 | return ret; |
138 | | |
139 | 9.01k | if (!tls_buffer_data(msg->buf, &cbs)) |
140 | 0 | return TLS13_IO_FAILURE; |
141 | | |
142 | 9.01k | if (!CBS_get_u8(&cbs, &msg_type)) |
143 | 0 | return TLS13_IO_FAILURE; |
144 | 9.01k | if (!CBS_get_u24(&cbs, &msg_len)) |
145 | 0 | return TLS13_IO_FAILURE; |
146 | | |
147 | | /* XXX - do we want to make this variable on message type? */ |
148 | 9.01k | if (msg_len > TLS13_HANDSHAKE_MSG_MAX_LEN) |
149 | 47 | return TLS13_IO_FAILURE; |
150 | | |
151 | 8.97k | msg->msg_type = msg_type; |
152 | 8.97k | msg->msg_len = msg_len; |
153 | 8.97k | } |
154 | | |
155 | 8.97k | if ((ret = tls_buffer_extend(msg->buf, |
156 | 8.97k | TLS13_HANDSHAKE_MSG_HEADER_LEN + msg->msg_len, |
157 | 8.97k | tls13_handshake_msg_read_cb, rl)) <= 0) |
158 | 271 | return ret; |
159 | | |
160 | 8.70k | if (!tls_buffer_finish(msg->buf, &msg->data, &msg->data_len)) |
161 | 0 | return TLS13_IO_FAILURE; |
162 | | |
163 | 8.70k | return TLS13_IO_SUCCESS; |
164 | 8.70k | } |
165 | | |
166 | | int |
167 | | tls13_handshake_msg_send(struct tls13_handshake_msg *msg, |
168 | | struct tls13_record_layer *rl) |
169 | 6.23k | { |
170 | 6.23k | ssize_t ret; |
171 | | |
172 | 6.23k | if (msg->data == NULL) |
173 | 0 | return TLS13_IO_FAILURE; |
174 | | |
175 | 6.23k | if (CBS_len(&msg->cbs) == 0) |
176 | 0 | return TLS13_IO_FAILURE; |
177 | | |
178 | 12.4k | while (CBS_len(&msg->cbs) > 0) { |
179 | 6.23k | if ((ret = tls13_write_handshake_data(rl, CBS_data(&msg->cbs), |
180 | 6.23k | CBS_len(&msg->cbs))) <= 0) |
181 | 0 | return ret; |
182 | | |
183 | 6.23k | if (!CBS_skip(&msg->cbs, ret)) |
184 | 0 | return TLS13_IO_FAILURE; |
185 | 6.23k | } |
186 | | |
187 | 6.23k | return TLS13_IO_SUCCESS; |
188 | 6.23k | } |