Coverage Report

Created: 2025-03-09 06:52

/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
}