1a8e1175bSopenharmony_ci/** \file ssl_helpers.c
2a8e1175bSopenharmony_ci *
3a8e1175bSopenharmony_ci * \brief Helper functions to set up a TLS connection.
4a8e1175bSopenharmony_ci */
5a8e1175bSopenharmony_ci
6a8e1175bSopenharmony_ci/*
7a8e1175bSopenharmony_ci *  Copyright The Mbed TLS Contributors
8a8e1175bSopenharmony_ci *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9a8e1175bSopenharmony_ci */
10a8e1175bSopenharmony_ci
11a8e1175bSopenharmony_ci#include <test/ssl_helpers.h>
12a8e1175bSopenharmony_ci#include "mbedtls/psa_util.h"
13a8e1175bSopenharmony_ci
14a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS_C)
15a8e1175bSopenharmony_ciint mbedtls_test_random(void *p_rng, unsigned char *output, size_t output_len)
16a8e1175bSopenharmony_ci{
17a8e1175bSopenharmony_ci    (void) p_rng;
18a8e1175bSopenharmony_ci    for (size_t i = 0; i < output_len; i++) {
19a8e1175bSopenharmony_ci        output[i] = rand();
20a8e1175bSopenharmony_ci    }
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ci    return 0;
23a8e1175bSopenharmony_ci}
24a8e1175bSopenharmony_ci
25a8e1175bSopenharmony_civoid mbedtls_test_ssl_log_analyzer(void *ctx, int level,
26a8e1175bSopenharmony_ci                                   const char *file, int line,
27a8e1175bSopenharmony_ci                                   const char *str)
28a8e1175bSopenharmony_ci{
29a8e1175bSopenharmony_ci    mbedtls_test_ssl_log_pattern *p = (mbedtls_test_ssl_log_pattern *) ctx;
30a8e1175bSopenharmony_ci
31a8e1175bSopenharmony_ci    (void) level;
32a8e1175bSopenharmony_ci    (void) line;
33a8e1175bSopenharmony_ci    (void) file;
34a8e1175bSopenharmony_ci
35a8e1175bSopenharmony_ci    if (NULL != p &&
36a8e1175bSopenharmony_ci        NULL != p->pattern &&
37a8e1175bSopenharmony_ci        NULL != strstr(str, p->pattern)) {
38a8e1175bSopenharmony_ci        p->counter++;
39a8e1175bSopenharmony_ci    }
40a8e1175bSopenharmony_ci}
41a8e1175bSopenharmony_ci
42a8e1175bSopenharmony_civoid mbedtls_test_init_handshake_options(
43a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *opts)
44a8e1175bSopenharmony_ci{
45a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
46a8e1175bSopenharmony_ci    static int rng_seed = 0xBEEF;
47a8e1175bSopenharmony_ci
48a8e1175bSopenharmony_ci    srand(rng_seed);
49a8e1175bSopenharmony_ci    rng_seed += 0xD0;
50a8e1175bSopenharmony_ci#endif
51a8e1175bSopenharmony_ci
52a8e1175bSopenharmony_ci    memset(opts, 0, sizeof(*opts));
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ci    opts->cipher = "";
55a8e1175bSopenharmony_ci    opts->client_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
56a8e1175bSopenharmony_ci    opts->client_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
57a8e1175bSopenharmony_ci    opts->server_min_version = MBEDTLS_SSL_VERSION_UNKNOWN;
58a8e1175bSopenharmony_ci    opts->server_max_version = MBEDTLS_SSL_VERSION_UNKNOWN;
59a8e1175bSopenharmony_ci    opts->expected_negotiated_version = MBEDTLS_SSL_VERSION_TLS1_3;
60a8e1175bSopenharmony_ci    opts->pk_alg = MBEDTLS_PK_RSA;
61a8e1175bSopenharmony_ci    opts->srv_auth_mode = MBEDTLS_SSL_VERIFY_NONE;
62a8e1175bSopenharmony_ci    opts->mfl = MBEDTLS_SSL_MAX_FRAG_LEN_NONE;
63a8e1175bSopenharmony_ci    opts->cli_msg_len = 100;
64a8e1175bSopenharmony_ci    opts->srv_msg_len = 100;
65a8e1175bSopenharmony_ci    opts->expected_cli_fragments = 1;
66a8e1175bSopenharmony_ci    opts->expected_srv_fragments = 1;
67a8e1175bSopenharmony_ci    opts->legacy_renegotiation = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION;
68a8e1175bSopenharmony_ci    opts->resize_buffers = 1;
69a8e1175bSopenharmony_ci    opts->early_data = MBEDTLS_SSL_EARLY_DATA_DISABLED;
70a8e1175bSopenharmony_ci    opts->max_early_data_size = -1;
71a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CACHE_C)
72a8e1175bSopenharmony_ci    TEST_CALLOC(opts->cache, 1);
73a8e1175bSopenharmony_ci    mbedtls_ssl_cache_init(opts->cache);
74a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME)
75a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_ssl_cache_get_timeout(opts->cache),
76a8e1175bSopenharmony_ci               MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT);
77a8e1175bSopenharmony_ci#endif
78a8e1175bSopenharmony_ciexit:
79a8e1175bSopenharmony_ci    return;
80a8e1175bSopenharmony_ci#endif
81a8e1175bSopenharmony_ci}
82a8e1175bSopenharmony_ci
83a8e1175bSopenharmony_civoid mbedtls_test_free_handshake_options(
84a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *opts)
85a8e1175bSopenharmony_ci{
86a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CACHE_C)
87a8e1175bSopenharmony_ci    mbedtls_ssl_cache_free(opts->cache);
88a8e1175bSopenharmony_ci    mbedtls_free(opts->cache);
89a8e1175bSopenharmony_ci#else
90a8e1175bSopenharmony_ci    (void) opts;
91a8e1175bSopenharmony_ci#endif
92a8e1175bSopenharmony_ci}
93a8e1175bSopenharmony_ci
94a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_HOOKS)
95a8e1175bSopenharmony_cistatic void set_chk_buf_ptr_args(
96a8e1175bSopenharmony_ci    mbedtls_ssl_chk_buf_ptr_args *args,
97a8e1175bSopenharmony_ci    unsigned char *cur, unsigned char *end, size_t need)
98a8e1175bSopenharmony_ci{
99a8e1175bSopenharmony_ci    args->cur = cur;
100a8e1175bSopenharmony_ci    args->end = end;
101a8e1175bSopenharmony_ci    args->need = need;
102a8e1175bSopenharmony_ci}
103a8e1175bSopenharmony_ci
104a8e1175bSopenharmony_cistatic void reset_chk_buf_ptr_args(mbedtls_ssl_chk_buf_ptr_args *args)
105a8e1175bSopenharmony_ci{
106a8e1175bSopenharmony_ci    memset(args, 0, sizeof(*args));
107a8e1175bSopenharmony_ci}
108a8e1175bSopenharmony_ci#endif /* MBEDTLS_TEST_HOOKS */
109a8e1175bSopenharmony_ci
110a8e1175bSopenharmony_civoid mbedtls_test_ssl_buffer_init(mbedtls_test_ssl_buffer *buf)
111a8e1175bSopenharmony_ci{
112a8e1175bSopenharmony_ci    memset(buf, 0, sizeof(*buf));
113a8e1175bSopenharmony_ci}
114a8e1175bSopenharmony_ci
115a8e1175bSopenharmony_ciint mbedtls_test_ssl_buffer_setup(mbedtls_test_ssl_buffer *buf,
116a8e1175bSopenharmony_ci                                  size_t capacity)
117a8e1175bSopenharmony_ci{
118a8e1175bSopenharmony_ci    buf->buffer = (unsigned char *) mbedtls_calloc(capacity,
119a8e1175bSopenharmony_ci                                                   sizeof(unsigned char));
120a8e1175bSopenharmony_ci    if (NULL == buf->buffer) {
121a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_ALLOC_FAILED;
122a8e1175bSopenharmony_ci    }
123a8e1175bSopenharmony_ci    buf->capacity = capacity;
124a8e1175bSopenharmony_ci
125a8e1175bSopenharmony_ci    return 0;
126a8e1175bSopenharmony_ci}
127a8e1175bSopenharmony_ci
128a8e1175bSopenharmony_civoid mbedtls_test_ssl_buffer_free(mbedtls_test_ssl_buffer *buf)
129a8e1175bSopenharmony_ci{
130a8e1175bSopenharmony_ci    if (buf->buffer != NULL) {
131a8e1175bSopenharmony_ci        mbedtls_free(buf->buffer);
132a8e1175bSopenharmony_ci    }
133a8e1175bSopenharmony_ci
134a8e1175bSopenharmony_ci    memset(buf, 0, sizeof(*buf));
135a8e1175bSopenharmony_ci}
136a8e1175bSopenharmony_ci
137a8e1175bSopenharmony_ciint mbedtls_test_ssl_buffer_put(mbedtls_test_ssl_buffer *buf,
138a8e1175bSopenharmony_ci                                const unsigned char *input, size_t input_len)
139a8e1175bSopenharmony_ci{
140a8e1175bSopenharmony_ci    size_t overflow = 0;
141a8e1175bSopenharmony_ci
142a8e1175bSopenharmony_ci    if ((buf == NULL) || (buf->buffer == NULL)) {
143a8e1175bSopenharmony_ci        return -1;
144a8e1175bSopenharmony_ci    }
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci    /* Reduce input_len to a number that fits in the buffer. */
147a8e1175bSopenharmony_ci    if ((buf->content_length + input_len) > buf->capacity) {
148a8e1175bSopenharmony_ci        input_len = buf->capacity - buf->content_length;
149a8e1175bSopenharmony_ci    }
150a8e1175bSopenharmony_ci
151a8e1175bSopenharmony_ci    if (input == NULL) {
152a8e1175bSopenharmony_ci        return (input_len == 0) ? 0 : -1;
153a8e1175bSopenharmony_ci    }
154a8e1175bSopenharmony_ci
155a8e1175bSopenharmony_ci    /* Check if the buffer has not come full circle and free space is not in
156a8e1175bSopenharmony_ci     * the middle */
157a8e1175bSopenharmony_ci    if (buf->start + buf->content_length < buf->capacity) {
158a8e1175bSopenharmony_ci
159a8e1175bSopenharmony_ci        /* Calculate the number of bytes that need to be placed at lower memory
160a8e1175bSopenharmony_ci         * address */
161a8e1175bSopenharmony_ci        if (buf->start + buf->content_length + input_len
162a8e1175bSopenharmony_ci            > buf->capacity) {
163a8e1175bSopenharmony_ci            overflow = (buf->start + buf->content_length + input_len)
164a8e1175bSopenharmony_ci                       % buf->capacity;
165a8e1175bSopenharmony_ci        }
166a8e1175bSopenharmony_ci
167a8e1175bSopenharmony_ci        memcpy(buf->buffer + buf->start + buf->content_length, input,
168a8e1175bSopenharmony_ci               input_len - overflow);
169a8e1175bSopenharmony_ci        memcpy(buf->buffer, input + input_len - overflow, overflow);
170a8e1175bSopenharmony_ci
171a8e1175bSopenharmony_ci    } else {
172a8e1175bSopenharmony_ci        /* The buffer has come full circle and free space is in the middle */
173a8e1175bSopenharmony_ci        memcpy(buf->buffer + buf->start + buf->content_length - buf->capacity,
174a8e1175bSopenharmony_ci               input, input_len);
175a8e1175bSopenharmony_ci    }
176a8e1175bSopenharmony_ci
177a8e1175bSopenharmony_ci    buf->content_length += input_len;
178a8e1175bSopenharmony_ci    return (input_len > INT_MAX) ? INT_MAX : (int) input_len;
179a8e1175bSopenharmony_ci}
180a8e1175bSopenharmony_ci
181a8e1175bSopenharmony_ciint mbedtls_test_ssl_buffer_get(mbedtls_test_ssl_buffer *buf,
182a8e1175bSopenharmony_ci                                unsigned char *output, size_t output_len)
183a8e1175bSopenharmony_ci{
184a8e1175bSopenharmony_ci    size_t overflow = 0;
185a8e1175bSopenharmony_ci
186a8e1175bSopenharmony_ci    if ((buf == NULL) || (buf->buffer == NULL)) {
187a8e1175bSopenharmony_ci        return -1;
188a8e1175bSopenharmony_ci    }
189a8e1175bSopenharmony_ci
190a8e1175bSopenharmony_ci    if (output == NULL && output_len == 0) {
191a8e1175bSopenharmony_ci        return 0;
192a8e1175bSopenharmony_ci    }
193a8e1175bSopenharmony_ci
194a8e1175bSopenharmony_ci    if (buf->content_length < output_len) {
195a8e1175bSopenharmony_ci        output_len = buf->content_length;
196a8e1175bSopenharmony_ci    }
197a8e1175bSopenharmony_ci
198a8e1175bSopenharmony_ci    /* Calculate the number of bytes that need to be drawn from lower memory
199a8e1175bSopenharmony_ci     * address */
200a8e1175bSopenharmony_ci    if (buf->start + output_len > buf->capacity) {
201a8e1175bSopenharmony_ci        overflow = (buf->start + output_len) % buf->capacity;
202a8e1175bSopenharmony_ci    }
203a8e1175bSopenharmony_ci
204a8e1175bSopenharmony_ci    if (output != NULL) {
205a8e1175bSopenharmony_ci        memcpy(output, buf->buffer + buf->start, output_len - overflow);
206a8e1175bSopenharmony_ci        memcpy(output + output_len - overflow, buf->buffer, overflow);
207a8e1175bSopenharmony_ci    }
208a8e1175bSopenharmony_ci
209a8e1175bSopenharmony_ci    buf->content_length -= output_len;
210a8e1175bSopenharmony_ci    buf->start = (buf->start + output_len) % buf->capacity;
211a8e1175bSopenharmony_ci
212a8e1175bSopenharmony_ci    return (output_len > INT_MAX) ? INT_MAX : (int) output_len;
213a8e1175bSopenharmony_ci}
214a8e1175bSopenharmony_ci
215a8e1175bSopenharmony_ciint mbedtls_test_ssl_message_queue_setup(
216a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue, size_t capacity)
217a8e1175bSopenharmony_ci{
218a8e1175bSopenharmony_ci    queue->messages = (size_t *) mbedtls_calloc(capacity, sizeof(size_t));
219a8e1175bSopenharmony_ci    if (NULL == queue->messages) {
220a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_ALLOC_FAILED;
221a8e1175bSopenharmony_ci    }
222a8e1175bSopenharmony_ci
223a8e1175bSopenharmony_ci    queue->capacity = (capacity > INT_MAX) ? INT_MAX : (int) capacity;
224a8e1175bSopenharmony_ci    queue->pos = 0;
225a8e1175bSopenharmony_ci    queue->num = 0;
226a8e1175bSopenharmony_ci
227a8e1175bSopenharmony_ci    return 0;
228a8e1175bSopenharmony_ci}
229a8e1175bSopenharmony_ci
230a8e1175bSopenharmony_civoid mbedtls_test_ssl_message_queue_free(
231a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue)
232a8e1175bSopenharmony_ci{
233a8e1175bSopenharmony_ci    if (queue == NULL) {
234a8e1175bSopenharmony_ci        return;
235a8e1175bSopenharmony_ci    }
236a8e1175bSopenharmony_ci
237a8e1175bSopenharmony_ci    if (queue->messages != NULL) {
238a8e1175bSopenharmony_ci        mbedtls_free(queue->messages);
239a8e1175bSopenharmony_ci    }
240a8e1175bSopenharmony_ci
241a8e1175bSopenharmony_ci    memset(queue, 0, sizeof(*queue));
242a8e1175bSopenharmony_ci}
243a8e1175bSopenharmony_ci
244a8e1175bSopenharmony_ciint mbedtls_test_ssl_message_queue_push_info(
245a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue, size_t len)
246a8e1175bSopenharmony_ci{
247a8e1175bSopenharmony_ci    int place;
248a8e1175bSopenharmony_ci    if (queue == NULL) {
249a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_ARG_NULL;
250a8e1175bSopenharmony_ci    }
251a8e1175bSopenharmony_ci
252a8e1175bSopenharmony_ci    if (queue->num >= queue->capacity) {
253a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_WRITE;
254a8e1175bSopenharmony_ci    }
255a8e1175bSopenharmony_ci
256a8e1175bSopenharmony_ci    place = (queue->pos + queue->num) % queue->capacity;
257a8e1175bSopenharmony_ci    queue->messages[place] = len;
258a8e1175bSopenharmony_ci    queue->num++;
259a8e1175bSopenharmony_ci    return (len > INT_MAX) ? INT_MAX : (int) len;
260a8e1175bSopenharmony_ci}
261a8e1175bSopenharmony_ci
262a8e1175bSopenharmony_ciint mbedtls_test_ssl_message_queue_pop_info(
263a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue, size_t buf_len)
264a8e1175bSopenharmony_ci{
265a8e1175bSopenharmony_ci    size_t message_length;
266a8e1175bSopenharmony_ci    if (queue == NULL) {
267a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_ARG_NULL;
268a8e1175bSopenharmony_ci    }
269a8e1175bSopenharmony_ci    if (queue->num == 0) {
270a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_READ;
271a8e1175bSopenharmony_ci    }
272a8e1175bSopenharmony_ci
273a8e1175bSopenharmony_ci    message_length = queue->messages[queue->pos];
274a8e1175bSopenharmony_ci    queue->messages[queue->pos] = 0;
275a8e1175bSopenharmony_ci    queue->num--;
276a8e1175bSopenharmony_ci    queue->pos++;
277a8e1175bSopenharmony_ci    queue->pos %= queue->capacity;
278a8e1175bSopenharmony_ci    if (queue->pos < 0) {
279a8e1175bSopenharmony_ci        queue->pos += queue->capacity;
280a8e1175bSopenharmony_ci    }
281a8e1175bSopenharmony_ci
282a8e1175bSopenharmony_ci    return (message_length > INT_MAX && buf_len > INT_MAX) ? INT_MAX :
283a8e1175bSopenharmony_ci           (message_length > buf_len) ? (int) buf_len : (int) message_length;
284a8e1175bSopenharmony_ci}
285a8e1175bSopenharmony_ci
286a8e1175bSopenharmony_ci/*
287a8e1175bSopenharmony_ci * Take a peek on the info about the next message length from the queue.
288a8e1175bSopenharmony_ci * This will be the oldest inserted message length(fifo).
289a8e1175bSopenharmony_ci *
290a8e1175bSopenharmony_ci * \retval  MBEDTLS_TEST_ERROR_ARG_NULL, if the queue is null.
291a8e1175bSopenharmony_ci * \retval  MBEDTLS_ERR_SSL_WANT_READ, if the queue is empty.
292a8e1175bSopenharmony_ci * \retval  0, if the peek was successful.
293a8e1175bSopenharmony_ci * \retval  MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED, if the given buffer length is
294a8e1175bSopenharmony_ci *          too small to fit the message. In this case the \p msg_len will be
295a8e1175bSopenharmony_ci *          set to the full message length so that the
296a8e1175bSopenharmony_ci *          caller knows what portion of the message can be dropped.
297a8e1175bSopenharmony_ci */
298a8e1175bSopenharmony_cistatic int test_ssl_message_queue_peek_info(
299a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue,
300a8e1175bSopenharmony_ci    size_t buf_len, size_t *msg_len)
301a8e1175bSopenharmony_ci{
302a8e1175bSopenharmony_ci    if (queue == NULL || msg_len == NULL) {
303a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_ARG_NULL;
304a8e1175bSopenharmony_ci    }
305a8e1175bSopenharmony_ci    if (queue->num == 0) {
306a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_READ;
307a8e1175bSopenharmony_ci    }
308a8e1175bSopenharmony_ci
309a8e1175bSopenharmony_ci    *msg_len = queue->messages[queue->pos];
310a8e1175bSopenharmony_ci    return (*msg_len > buf_len) ? MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED : 0;
311a8e1175bSopenharmony_ci}
312a8e1175bSopenharmony_ci
313a8e1175bSopenharmony_civoid mbedtls_test_mock_socket_init(mbedtls_test_mock_socket *socket)
314a8e1175bSopenharmony_ci{
315a8e1175bSopenharmony_ci    memset(socket, 0, sizeof(*socket));
316a8e1175bSopenharmony_ci}
317a8e1175bSopenharmony_ci
318a8e1175bSopenharmony_civoid mbedtls_test_mock_socket_close(mbedtls_test_mock_socket *socket)
319a8e1175bSopenharmony_ci{
320a8e1175bSopenharmony_ci    if (socket == NULL) {
321a8e1175bSopenharmony_ci        return;
322a8e1175bSopenharmony_ci    }
323a8e1175bSopenharmony_ci
324a8e1175bSopenharmony_ci    if (socket->input != NULL) {
325a8e1175bSopenharmony_ci        mbedtls_test_ssl_buffer_free(socket->input);
326a8e1175bSopenharmony_ci        mbedtls_free(socket->input);
327a8e1175bSopenharmony_ci    }
328a8e1175bSopenharmony_ci
329a8e1175bSopenharmony_ci    if (socket->output != NULL) {
330a8e1175bSopenharmony_ci        mbedtls_test_ssl_buffer_free(socket->output);
331a8e1175bSopenharmony_ci        mbedtls_free(socket->output);
332a8e1175bSopenharmony_ci    }
333a8e1175bSopenharmony_ci
334a8e1175bSopenharmony_ci    if (socket->peer != NULL) {
335a8e1175bSopenharmony_ci        memset(socket->peer, 0, sizeof(*socket->peer));
336a8e1175bSopenharmony_ci    }
337a8e1175bSopenharmony_ci
338a8e1175bSopenharmony_ci    memset(socket, 0, sizeof(*socket));
339a8e1175bSopenharmony_ci}
340a8e1175bSopenharmony_ci
341a8e1175bSopenharmony_ciint mbedtls_test_mock_socket_connect(mbedtls_test_mock_socket *peer1,
342a8e1175bSopenharmony_ci                                     mbedtls_test_mock_socket *peer2,
343a8e1175bSopenharmony_ci                                     size_t bufsize)
344a8e1175bSopenharmony_ci{
345a8e1175bSopenharmony_ci    int ret = -1;
346a8e1175bSopenharmony_ci
347a8e1175bSopenharmony_ci    peer1->output =
348a8e1175bSopenharmony_ci        (mbedtls_test_ssl_buffer *) mbedtls_calloc(
349a8e1175bSopenharmony_ci            1, sizeof(mbedtls_test_ssl_buffer));
350a8e1175bSopenharmony_ci    if (peer1->output == NULL) {
351a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
352a8e1175bSopenharmony_ci        goto exit;
353a8e1175bSopenharmony_ci    }
354a8e1175bSopenharmony_ci    mbedtls_test_ssl_buffer_init(peer1->output);
355a8e1175bSopenharmony_ci    if (0 != (ret = mbedtls_test_ssl_buffer_setup(peer1->output, bufsize))) {
356a8e1175bSopenharmony_ci        goto exit;
357a8e1175bSopenharmony_ci    }
358a8e1175bSopenharmony_ci
359a8e1175bSopenharmony_ci    peer2->output =
360a8e1175bSopenharmony_ci        (mbedtls_test_ssl_buffer *) mbedtls_calloc(
361a8e1175bSopenharmony_ci            1, sizeof(mbedtls_test_ssl_buffer));
362a8e1175bSopenharmony_ci    if (peer2->output == NULL) {
363a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
364a8e1175bSopenharmony_ci        goto exit;
365a8e1175bSopenharmony_ci    }
366a8e1175bSopenharmony_ci    mbedtls_test_ssl_buffer_init(peer2->output);
367a8e1175bSopenharmony_ci    if (0 != (ret = mbedtls_test_ssl_buffer_setup(peer2->output, bufsize))) {
368a8e1175bSopenharmony_ci        goto exit;
369a8e1175bSopenharmony_ci    }
370a8e1175bSopenharmony_ci
371a8e1175bSopenharmony_ci    peer1->peer = peer2;
372a8e1175bSopenharmony_ci    peer2->peer = peer1;
373a8e1175bSopenharmony_ci    peer1->input = peer2->output;
374a8e1175bSopenharmony_ci    peer2->input = peer1->output;
375a8e1175bSopenharmony_ci
376a8e1175bSopenharmony_ci    peer1->status = peer2->status = MBEDTLS_MOCK_SOCKET_CONNECTED;
377a8e1175bSopenharmony_ci    ret = 0;
378a8e1175bSopenharmony_ci
379a8e1175bSopenharmony_ciexit:
380a8e1175bSopenharmony_ci
381a8e1175bSopenharmony_ci    if (ret != 0) {
382a8e1175bSopenharmony_ci        mbedtls_test_mock_socket_close(peer1);
383a8e1175bSopenharmony_ci        mbedtls_test_mock_socket_close(peer2);
384a8e1175bSopenharmony_ci    }
385a8e1175bSopenharmony_ci
386a8e1175bSopenharmony_ci    return ret;
387a8e1175bSopenharmony_ci}
388a8e1175bSopenharmony_ci
389a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_send_b(void *ctx,
390a8e1175bSopenharmony_ci                                 const unsigned char *buf, size_t len)
391a8e1175bSopenharmony_ci{
392a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
393a8e1175bSopenharmony_ci
394a8e1175bSopenharmony_ci    if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
395a8e1175bSopenharmony_ci        return -1;
396a8e1175bSopenharmony_ci    }
397a8e1175bSopenharmony_ci
398a8e1175bSopenharmony_ci    return mbedtls_test_ssl_buffer_put(socket->output, buf, len);
399a8e1175bSopenharmony_ci}
400a8e1175bSopenharmony_ci
401a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_recv_b(void *ctx, unsigned char *buf, size_t len)
402a8e1175bSopenharmony_ci{
403a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
404a8e1175bSopenharmony_ci
405a8e1175bSopenharmony_ci    if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
406a8e1175bSopenharmony_ci        return -1;
407a8e1175bSopenharmony_ci    }
408a8e1175bSopenharmony_ci
409a8e1175bSopenharmony_ci    return mbedtls_test_ssl_buffer_get(socket->input, buf, len);
410a8e1175bSopenharmony_ci}
411a8e1175bSopenharmony_ci
412a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_send_nb(void *ctx,
413a8e1175bSopenharmony_ci                                  const unsigned char *buf, size_t len)
414a8e1175bSopenharmony_ci{
415a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
416a8e1175bSopenharmony_ci
417a8e1175bSopenharmony_ci    if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
418a8e1175bSopenharmony_ci        return -1;
419a8e1175bSopenharmony_ci    }
420a8e1175bSopenharmony_ci
421a8e1175bSopenharmony_ci    if (socket->output->capacity == socket->output->content_length) {
422a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_WRITE;
423a8e1175bSopenharmony_ci    }
424a8e1175bSopenharmony_ci
425a8e1175bSopenharmony_ci    return mbedtls_test_ssl_buffer_put(socket->output, buf, len);
426a8e1175bSopenharmony_ci}
427a8e1175bSopenharmony_ci
428a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_recv_nb(void *ctx, unsigned char *buf, size_t len)
429a8e1175bSopenharmony_ci{
430a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket = (mbedtls_test_mock_socket *) ctx;
431a8e1175bSopenharmony_ci
432a8e1175bSopenharmony_ci    if (socket == NULL || socket->status != MBEDTLS_MOCK_SOCKET_CONNECTED) {
433a8e1175bSopenharmony_ci        return -1;
434a8e1175bSopenharmony_ci    }
435a8e1175bSopenharmony_ci
436a8e1175bSopenharmony_ci    if (socket->input->content_length == 0) {
437a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_READ;
438a8e1175bSopenharmony_ci    }
439a8e1175bSopenharmony_ci
440a8e1175bSopenharmony_ci    return mbedtls_test_ssl_buffer_get(socket->input, buf, len);
441a8e1175bSopenharmony_ci}
442a8e1175bSopenharmony_ci
443a8e1175bSopenharmony_civoid mbedtls_test_message_socket_init(
444a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *ctx)
445a8e1175bSopenharmony_ci{
446a8e1175bSopenharmony_ci    ctx->queue_input = NULL;
447a8e1175bSopenharmony_ci    ctx->queue_output = NULL;
448a8e1175bSopenharmony_ci    ctx->socket = NULL;
449a8e1175bSopenharmony_ci}
450a8e1175bSopenharmony_ci
451a8e1175bSopenharmony_ciint mbedtls_test_message_socket_setup(
452a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue_input,
453a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue_output,
454a8e1175bSopenharmony_ci    size_t queue_capacity,
455a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket,
456a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *ctx)
457a8e1175bSopenharmony_ci{
458a8e1175bSopenharmony_ci    int ret = mbedtls_test_ssl_message_queue_setup(queue_input, queue_capacity);
459a8e1175bSopenharmony_ci    if (ret != 0) {
460a8e1175bSopenharmony_ci        return ret;
461a8e1175bSopenharmony_ci    }
462a8e1175bSopenharmony_ci    ctx->queue_input = queue_input;
463a8e1175bSopenharmony_ci    ctx->queue_output = queue_output;
464a8e1175bSopenharmony_ci    ctx->socket = socket;
465a8e1175bSopenharmony_ci    mbedtls_test_mock_socket_init(socket);
466a8e1175bSopenharmony_ci
467a8e1175bSopenharmony_ci    return 0;
468a8e1175bSopenharmony_ci}
469a8e1175bSopenharmony_ci
470a8e1175bSopenharmony_civoid mbedtls_test_message_socket_close(
471a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *ctx)
472a8e1175bSopenharmony_ci{
473a8e1175bSopenharmony_ci    if (ctx == NULL) {
474a8e1175bSopenharmony_ci        return;
475a8e1175bSopenharmony_ci    }
476a8e1175bSopenharmony_ci
477a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue_free(ctx->queue_input);
478a8e1175bSopenharmony_ci    mbedtls_test_mock_socket_close(ctx->socket);
479a8e1175bSopenharmony_ci    memset(ctx, 0, sizeof(*ctx));
480a8e1175bSopenharmony_ci}
481a8e1175bSopenharmony_ci
482a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_send_msg(void *ctx,
483a8e1175bSopenharmony_ci                                   const unsigned char *buf, size_t len)
484a8e1175bSopenharmony_ci{
485a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue;
486a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket;
487a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *context =
488a8e1175bSopenharmony_ci        (mbedtls_test_message_socket_context *) ctx;
489a8e1175bSopenharmony_ci
490a8e1175bSopenharmony_ci    if (context == NULL || context->socket == NULL
491a8e1175bSopenharmony_ci        || context->queue_output == NULL) {
492a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
493a8e1175bSopenharmony_ci    }
494a8e1175bSopenharmony_ci
495a8e1175bSopenharmony_ci    queue = context->queue_output;
496a8e1175bSopenharmony_ci    socket = context->socket;
497a8e1175bSopenharmony_ci
498a8e1175bSopenharmony_ci    if (queue->num >= queue->capacity) {
499a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_WANT_WRITE;
500a8e1175bSopenharmony_ci    }
501a8e1175bSopenharmony_ci
502a8e1175bSopenharmony_ci    if (mbedtls_test_mock_tcp_send_b(socket, buf, len) != (int) len) {
503a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_SEND_FAILED;
504a8e1175bSopenharmony_ci    }
505a8e1175bSopenharmony_ci
506a8e1175bSopenharmony_ci    return mbedtls_test_ssl_message_queue_push_info(queue, len);
507a8e1175bSopenharmony_ci}
508a8e1175bSopenharmony_ci
509a8e1175bSopenharmony_ciint mbedtls_test_mock_tcp_recv_msg(void *ctx,
510a8e1175bSopenharmony_ci                                   unsigned char *buf, size_t buf_len)
511a8e1175bSopenharmony_ci{
512a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *queue;
513a8e1175bSopenharmony_ci    mbedtls_test_mock_socket *socket;
514a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *context =
515a8e1175bSopenharmony_ci        (mbedtls_test_message_socket_context *) ctx;
516a8e1175bSopenharmony_ci    size_t drop_len = 0;
517a8e1175bSopenharmony_ci    size_t msg_len;
518a8e1175bSopenharmony_ci    int ret;
519a8e1175bSopenharmony_ci
520a8e1175bSopenharmony_ci    if (context == NULL || context->socket == NULL
521a8e1175bSopenharmony_ci        || context->queue_input == NULL) {
522a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_CONTEXT_ERROR;
523a8e1175bSopenharmony_ci    }
524a8e1175bSopenharmony_ci
525a8e1175bSopenharmony_ci    queue = context->queue_input;
526a8e1175bSopenharmony_ci    socket = context->socket;
527a8e1175bSopenharmony_ci
528a8e1175bSopenharmony_ci    /* Peek first, so that in case of a socket error the data remains in
529a8e1175bSopenharmony_ci     * the queue. */
530a8e1175bSopenharmony_ci    ret = test_ssl_message_queue_peek_info(queue, buf_len, &msg_len);
531a8e1175bSopenharmony_ci    if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
532a8e1175bSopenharmony_ci        /* Calculate how much to drop */
533a8e1175bSopenharmony_ci        drop_len = msg_len - buf_len;
534a8e1175bSopenharmony_ci
535a8e1175bSopenharmony_ci        /* Set the requested message len to be buffer length */
536a8e1175bSopenharmony_ci        msg_len = buf_len;
537a8e1175bSopenharmony_ci    } else if (ret != 0) {
538a8e1175bSopenharmony_ci        return ret;
539a8e1175bSopenharmony_ci    }
540a8e1175bSopenharmony_ci
541a8e1175bSopenharmony_ci    if (mbedtls_test_mock_tcp_recv_b(socket, buf, msg_len) != (int) msg_len) {
542a8e1175bSopenharmony_ci        return MBEDTLS_TEST_ERROR_RECV_FAILED;
543a8e1175bSopenharmony_ci    }
544a8e1175bSopenharmony_ci
545a8e1175bSopenharmony_ci    if (ret == MBEDTLS_TEST_ERROR_MESSAGE_TRUNCATED) {
546a8e1175bSopenharmony_ci        /* Drop the remaining part of the message */
547a8e1175bSopenharmony_ci        if (mbedtls_test_mock_tcp_recv_b(socket, NULL, drop_len) !=
548a8e1175bSopenharmony_ci            (int) drop_len) {
549a8e1175bSopenharmony_ci            /* Inconsistent state - part of the message was read,
550a8e1175bSopenharmony_ci             * and a part couldn't. Not much we can do here, but it should not
551a8e1175bSopenharmony_ci             * happen in test environment, unless forced manually. */
552a8e1175bSopenharmony_ci        }
553a8e1175bSopenharmony_ci    }
554a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue_pop_info(queue, buf_len);
555a8e1175bSopenharmony_ci
556a8e1175bSopenharmony_ci    return (msg_len > INT_MAX) ? INT_MAX : (int) msg_len;
557a8e1175bSopenharmony_ci}
558a8e1175bSopenharmony_ci
559a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
560a8e1175bSopenharmony_ci
561a8e1175bSopenharmony_ci/*
562a8e1175bSopenharmony_ci * Deinitializes certificates from endpoint represented by \p ep.
563a8e1175bSopenharmony_ci */
564a8e1175bSopenharmony_cistatic void test_ssl_endpoint_certificate_free(mbedtls_test_ssl_endpoint *ep)
565a8e1175bSopenharmony_ci{
566a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_certificate *cert = &(ep->cert);
567a8e1175bSopenharmony_ci    if (cert != NULL) {
568a8e1175bSopenharmony_ci        if (cert->ca_cert != NULL) {
569a8e1175bSopenharmony_ci            mbedtls_x509_crt_free(cert->ca_cert);
570a8e1175bSopenharmony_ci            mbedtls_free(cert->ca_cert);
571a8e1175bSopenharmony_ci            cert->ca_cert = NULL;
572a8e1175bSopenharmony_ci        }
573a8e1175bSopenharmony_ci        if (cert->cert != NULL) {
574a8e1175bSopenharmony_ci            mbedtls_x509_crt_free(cert->cert);
575a8e1175bSopenharmony_ci            mbedtls_free(cert->cert);
576a8e1175bSopenharmony_ci            cert->cert = NULL;
577a8e1175bSopenharmony_ci        }
578a8e1175bSopenharmony_ci        if (cert->pkey != NULL) {
579a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
580a8e1175bSopenharmony_ci            if (mbedtls_pk_get_type(cert->pkey) == MBEDTLS_PK_OPAQUE) {
581a8e1175bSopenharmony_ci                psa_destroy_key(cert->pkey->priv_id);
582a8e1175bSopenharmony_ci            }
583a8e1175bSopenharmony_ci#endif
584a8e1175bSopenharmony_ci            mbedtls_pk_free(cert->pkey);
585a8e1175bSopenharmony_ci            mbedtls_free(cert->pkey);
586a8e1175bSopenharmony_ci            cert->pkey = NULL;
587a8e1175bSopenharmony_ci        }
588a8e1175bSopenharmony_ci    }
589a8e1175bSopenharmony_ci}
590a8e1175bSopenharmony_ci
591a8e1175bSopenharmony_ciint mbedtls_test_ssl_endpoint_certificate_init(mbedtls_test_ssl_endpoint *ep,
592a8e1175bSopenharmony_ci                                               int pk_alg,
593a8e1175bSopenharmony_ci                                               int opaque_alg, int opaque_alg2,
594a8e1175bSopenharmony_ci                                               int opaque_usage)
595a8e1175bSopenharmony_ci{
596a8e1175bSopenharmony_ci    int i = 0;
597a8e1175bSopenharmony_ci    int ret = -1;
598a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_certificate *cert = NULL;
599a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
600a8e1175bSopenharmony_ci    mbedtls_svc_key_id_t key_slot = MBEDTLS_SVC_KEY_ID_INIT;
601a8e1175bSopenharmony_ci#endif
602a8e1175bSopenharmony_ci
603a8e1175bSopenharmony_ci    if (ep == NULL) {
604a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
605a8e1175bSopenharmony_ci    }
606a8e1175bSopenharmony_ci
607a8e1175bSopenharmony_ci    cert = &(ep->cert);
608a8e1175bSopenharmony_ci    TEST_CALLOC(cert->ca_cert, 1);
609a8e1175bSopenharmony_ci    TEST_CALLOC(cert->cert, 1);
610a8e1175bSopenharmony_ci    TEST_CALLOC(cert->pkey, 1);
611a8e1175bSopenharmony_ci
612a8e1175bSopenharmony_ci    mbedtls_x509_crt_init(cert->ca_cert);
613a8e1175bSopenharmony_ci    mbedtls_x509_crt_init(cert->cert);
614a8e1175bSopenharmony_ci    mbedtls_pk_init(cert->pkey);
615a8e1175bSopenharmony_ci
616a8e1175bSopenharmony_ci    /* Load the trusted CA */
617a8e1175bSopenharmony_ci
618a8e1175bSopenharmony_ci    for (i = 0; mbedtls_test_cas_der[i] != NULL; i++) {
619a8e1175bSopenharmony_ci        ret = mbedtls_x509_crt_parse_der(
620a8e1175bSopenharmony_ci            cert->ca_cert,
621a8e1175bSopenharmony_ci            (const unsigned char *) mbedtls_test_cas_der[i],
622a8e1175bSopenharmony_ci            mbedtls_test_cas_der_len[i]);
623a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
624a8e1175bSopenharmony_ci    }
625a8e1175bSopenharmony_ci
626a8e1175bSopenharmony_ci    /* Load own certificate and private key */
627a8e1175bSopenharmony_ci
628a8e1175bSopenharmony_ci    if (ep->conf.endpoint == MBEDTLS_SSL_IS_SERVER) {
629a8e1175bSopenharmony_ci        if (pk_alg == MBEDTLS_PK_RSA) {
630a8e1175bSopenharmony_ci            ret = mbedtls_x509_crt_parse(
631a8e1175bSopenharmony_ci                cert->cert,
632a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_srv_crt_rsa_sha256_der,
633a8e1175bSopenharmony_ci                mbedtls_test_srv_crt_rsa_sha256_der_len);
634a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
635a8e1175bSopenharmony_ci
636a8e1175bSopenharmony_ci            ret = mbedtls_pk_parse_key(
637a8e1175bSopenharmony_ci                cert->pkey,
638a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_srv_key_rsa_der,
639a8e1175bSopenharmony_ci                mbedtls_test_srv_key_rsa_der_len, NULL, 0,
640a8e1175bSopenharmony_ci                mbedtls_test_rnd_std_rand, NULL);
641a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
642a8e1175bSopenharmony_ci        } else {
643a8e1175bSopenharmony_ci            ret = mbedtls_x509_crt_parse(
644a8e1175bSopenharmony_ci                cert->cert,
645a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_srv_crt_ec_der,
646a8e1175bSopenharmony_ci                mbedtls_test_srv_crt_ec_der_len);
647a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
648a8e1175bSopenharmony_ci
649a8e1175bSopenharmony_ci            ret = mbedtls_pk_parse_key(
650a8e1175bSopenharmony_ci                cert->pkey,
651a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_srv_key_ec_der,
652a8e1175bSopenharmony_ci                mbedtls_test_srv_key_ec_der_len, NULL, 0,
653a8e1175bSopenharmony_ci                mbedtls_test_rnd_std_rand, NULL);
654a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
655a8e1175bSopenharmony_ci        }
656a8e1175bSopenharmony_ci    } else {
657a8e1175bSopenharmony_ci        if (pk_alg == MBEDTLS_PK_RSA) {
658a8e1175bSopenharmony_ci            ret = mbedtls_x509_crt_parse(
659a8e1175bSopenharmony_ci                cert->cert,
660a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_cli_crt_rsa_der,
661a8e1175bSopenharmony_ci                mbedtls_test_cli_crt_rsa_der_len);
662a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
663a8e1175bSopenharmony_ci
664a8e1175bSopenharmony_ci            ret = mbedtls_pk_parse_key(
665a8e1175bSopenharmony_ci                cert->pkey,
666a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_cli_key_rsa_der,
667a8e1175bSopenharmony_ci                mbedtls_test_cli_key_rsa_der_len, NULL, 0,
668a8e1175bSopenharmony_ci                mbedtls_test_rnd_std_rand, NULL);
669a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
670a8e1175bSopenharmony_ci        } else {
671a8e1175bSopenharmony_ci            ret = mbedtls_x509_crt_parse(
672a8e1175bSopenharmony_ci                cert->cert,
673a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_cli_crt_ec_der,
674a8e1175bSopenharmony_ci                mbedtls_test_cli_crt_ec_len);
675a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
676a8e1175bSopenharmony_ci
677a8e1175bSopenharmony_ci            ret = mbedtls_pk_parse_key(
678a8e1175bSopenharmony_ci                cert->pkey,
679a8e1175bSopenharmony_ci                (const unsigned char *) mbedtls_test_cli_key_ec_der,
680a8e1175bSopenharmony_ci                mbedtls_test_cli_key_ec_der_len, NULL, 0,
681a8e1175bSopenharmony_ci                mbedtls_test_rnd_std_rand, NULL);
682a8e1175bSopenharmony_ci            TEST_ASSERT(ret == 0);
683a8e1175bSopenharmony_ci        }
684a8e1175bSopenharmony_ci    }
685a8e1175bSopenharmony_ci
686a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
687a8e1175bSopenharmony_ci    if (opaque_alg != 0) {
688a8e1175bSopenharmony_ci        psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT;
689a8e1175bSopenharmony_ci        /* Use a fake key usage to get a successful initial guess for the PSA attributes. */
690a8e1175bSopenharmony_ci        TEST_EQUAL(mbedtls_pk_get_psa_attributes(cert->pkey, PSA_KEY_USAGE_SIGN_HASH,
691a8e1175bSopenharmony_ci                                                 &key_attr), 0);
692a8e1175bSopenharmony_ci        /* Then manually usage, alg and alg2 as requested by the test. */
693a8e1175bSopenharmony_ci        psa_set_key_usage_flags(&key_attr, opaque_usage);
694a8e1175bSopenharmony_ci        psa_set_key_algorithm(&key_attr, opaque_alg);
695a8e1175bSopenharmony_ci        if (opaque_alg2 != PSA_ALG_NONE) {
696a8e1175bSopenharmony_ci            psa_set_key_enrollment_algorithm(&key_attr, opaque_alg2);
697a8e1175bSopenharmony_ci        }
698a8e1175bSopenharmony_ci        TEST_EQUAL(mbedtls_pk_import_into_psa(cert->pkey, &key_attr, &key_slot), 0);
699a8e1175bSopenharmony_ci        mbedtls_pk_free(cert->pkey);
700a8e1175bSopenharmony_ci        mbedtls_pk_init(cert->pkey);
701a8e1175bSopenharmony_ci        TEST_EQUAL(mbedtls_pk_setup_opaque(cert->pkey, key_slot), 0);
702a8e1175bSopenharmony_ci    }
703a8e1175bSopenharmony_ci#else
704a8e1175bSopenharmony_ci    (void) opaque_alg;
705a8e1175bSopenharmony_ci    (void) opaque_alg2;
706a8e1175bSopenharmony_ci    (void) opaque_usage;
707a8e1175bSopenharmony_ci#endif
708a8e1175bSopenharmony_ci
709a8e1175bSopenharmony_ci    mbedtls_ssl_conf_ca_chain(&(ep->conf), cert->ca_cert, NULL);
710a8e1175bSopenharmony_ci
711a8e1175bSopenharmony_ci    ret = mbedtls_ssl_conf_own_cert(&(ep->conf), cert->cert,
712a8e1175bSopenharmony_ci                                    cert->pkey);
713a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
714a8e1175bSopenharmony_ci    TEST_ASSERT(ep->conf.key_cert != NULL);
715a8e1175bSopenharmony_ci
716a8e1175bSopenharmony_ci    ret = mbedtls_ssl_conf_own_cert(&(ep->conf), NULL, NULL);
717a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
718a8e1175bSopenharmony_ci    TEST_ASSERT(ep->conf.key_cert == NULL);
719a8e1175bSopenharmony_ci
720a8e1175bSopenharmony_ci    ret = mbedtls_ssl_conf_own_cert(&(ep->conf), cert->cert,
721a8e1175bSopenharmony_ci                                    cert->pkey);
722a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
723a8e1175bSopenharmony_ci
724a8e1175bSopenharmony_ciexit:
725a8e1175bSopenharmony_ci    if (ret != 0) {
726a8e1175bSopenharmony_ci        test_ssl_endpoint_certificate_free(ep);
727a8e1175bSopenharmony_ci    }
728a8e1175bSopenharmony_ci
729a8e1175bSopenharmony_ci    return ret;
730a8e1175bSopenharmony_ci}
731a8e1175bSopenharmony_ci
732a8e1175bSopenharmony_ciint mbedtls_test_ssl_endpoint_init(
733a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint *ep, int endpoint_type,
734a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *options,
735a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *dtls_context,
736a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *input_queue,
737a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue *output_queue)
738a8e1175bSopenharmony_ci{
739a8e1175bSopenharmony_ci    int ret = -1;
740a8e1175bSopenharmony_ci    uintptr_t user_data_n;
741a8e1175bSopenharmony_ci
742a8e1175bSopenharmony_ci    if (dtls_context != NULL &&
743a8e1175bSopenharmony_ci        (input_queue == NULL || output_queue == NULL)) {
744a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
745a8e1175bSopenharmony_ci
746a8e1175bSopenharmony_ci    }
747a8e1175bSopenharmony_ci
748a8e1175bSopenharmony_ci    if (ep == NULL) {
749a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
750a8e1175bSopenharmony_ci    }
751a8e1175bSopenharmony_ci
752a8e1175bSopenharmony_ci    memset(ep, 0, sizeof(*ep));
753a8e1175bSopenharmony_ci
754a8e1175bSopenharmony_ci    ep->name = (endpoint_type == MBEDTLS_SSL_IS_SERVER) ? "Server" : "Client";
755a8e1175bSopenharmony_ci
756a8e1175bSopenharmony_ci    mbedtls_ssl_init(&(ep->ssl));
757a8e1175bSopenharmony_ci    mbedtls_ssl_config_init(&(ep->conf));
758a8e1175bSopenharmony_ci    mbedtls_ssl_conf_rng(&(ep->conf), mbedtls_test_random, NULL);
759a8e1175bSopenharmony_ci
760a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&ep->conf) == NULL);
761a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_ssl_conf_get_user_data_n(&ep->conf), 0);
762a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_get_user_data_p(&ep->ssl) == NULL);
763a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_ssl_get_user_data_n(&ep->ssl), 0);
764a8e1175bSopenharmony_ci
765a8e1175bSopenharmony_ci    (void) mbedtls_test_rnd_std_rand(NULL,
766a8e1175bSopenharmony_ci                                     (void *) &user_data_n,
767a8e1175bSopenharmony_ci                                     sizeof(user_data_n));
768a8e1175bSopenharmony_ci    mbedtls_ssl_conf_set_user_data_n(&ep->conf, user_data_n);
769a8e1175bSopenharmony_ci    mbedtls_ssl_set_user_data_n(&ep->ssl, user_data_n);
770a8e1175bSopenharmony_ci
771a8e1175bSopenharmony_ci    if (dtls_context != NULL) {
772a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_message_socket_setup(input_queue, output_queue,
773a8e1175bSopenharmony_ci                                                      100, &(ep->socket),
774a8e1175bSopenharmony_ci                                                      dtls_context) == 0);
775a8e1175bSopenharmony_ci    } else {
776a8e1175bSopenharmony_ci        mbedtls_test_mock_socket_init(&(ep->socket));
777a8e1175bSopenharmony_ci    }
778a8e1175bSopenharmony_ci
779a8e1175bSopenharmony_ci    /* Non-blocking callbacks without timeout */
780a8e1175bSopenharmony_ci    if (dtls_context != NULL) {
781a8e1175bSopenharmony_ci        mbedtls_ssl_set_bio(&(ep->ssl), dtls_context,
782a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_send_msg,
783a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_recv_msg,
784a8e1175bSopenharmony_ci                            NULL);
785a8e1175bSopenharmony_ci    } else {
786a8e1175bSopenharmony_ci        mbedtls_ssl_set_bio(&(ep->ssl), &(ep->socket),
787a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_send_nb,
788a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_recv_nb,
789a8e1175bSopenharmony_ci                            NULL);
790a8e1175bSopenharmony_ci    }
791a8e1175bSopenharmony_ci
792a8e1175bSopenharmony_ci    ret = mbedtls_ssl_config_defaults(&(ep->conf), endpoint_type,
793a8e1175bSopenharmony_ci                                      (dtls_context != NULL) ?
794a8e1175bSopenharmony_ci                                      MBEDTLS_SSL_TRANSPORT_DATAGRAM :
795a8e1175bSopenharmony_ci                                      MBEDTLS_SSL_TRANSPORT_STREAM,
796a8e1175bSopenharmony_ci                                      MBEDTLS_SSL_PRESET_DEFAULT);
797a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
798a8e1175bSopenharmony_ci
799a8e1175bSopenharmony_ci    if (MBEDTLS_SSL_IS_CLIENT == endpoint_type) {
800a8e1175bSopenharmony_ci        if (options->client_min_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
801a8e1175bSopenharmony_ci            mbedtls_ssl_conf_min_tls_version(&(ep->conf),
802a8e1175bSopenharmony_ci                                             options->client_min_version);
803a8e1175bSopenharmony_ci        }
804a8e1175bSopenharmony_ci
805a8e1175bSopenharmony_ci        if (options->client_max_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
806a8e1175bSopenharmony_ci            mbedtls_ssl_conf_max_tls_version(&(ep->conf),
807a8e1175bSopenharmony_ci                                             options->client_max_version);
808a8e1175bSopenharmony_ci        }
809a8e1175bSopenharmony_ci    } else {
810a8e1175bSopenharmony_ci        if (options->server_min_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
811a8e1175bSopenharmony_ci            mbedtls_ssl_conf_min_tls_version(&(ep->conf),
812a8e1175bSopenharmony_ci                                             options->server_min_version);
813a8e1175bSopenharmony_ci        }
814a8e1175bSopenharmony_ci
815a8e1175bSopenharmony_ci        if (options->server_max_version != MBEDTLS_SSL_VERSION_UNKNOWN) {
816a8e1175bSopenharmony_ci            mbedtls_ssl_conf_max_tls_version(&(ep->conf),
817a8e1175bSopenharmony_ci                                             options->server_max_version);
818a8e1175bSopenharmony_ci        }
819a8e1175bSopenharmony_ci    }
820a8e1175bSopenharmony_ci
821a8e1175bSopenharmony_ci    if (options->group_list != NULL) {
822a8e1175bSopenharmony_ci        mbedtls_ssl_conf_groups(&(ep->conf), options->group_list);
823a8e1175bSopenharmony_ci    }
824a8e1175bSopenharmony_ci
825a8e1175bSopenharmony_ci    mbedtls_ssl_conf_authmode(&(ep->conf), MBEDTLS_SSL_VERIFY_REQUIRED);
826a8e1175bSopenharmony_ci
827a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_EARLY_DATA)
828a8e1175bSopenharmony_ci    mbedtls_ssl_conf_early_data(&(ep->conf), options->early_data);
829a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SRV_C)
830a8e1175bSopenharmony_ci    if (endpoint_type == MBEDTLS_SSL_IS_SERVER &&
831a8e1175bSopenharmony_ci        (options->max_early_data_size >= 0)) {
832a8e1175bSopenharmony_ci        mbedtls_ssl_conf_max_early_data_size(&(ep->conf),
833a8e1175bSopenharmony_ci                                             options->max_early_data_size);
834a8e1175bSopenharmony_ci    }
835a8e1175bSopenharmony_ci#endif
836a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN)
837a8e1175bSopenharmony_ci    /* check that alpn_list contains at least one valid entry */
838a8e1175bSopenharmony_ci    if (options->alpn_list[0] != NULL) {
839a8e1175bSopenharmony_ci        mbedtls_ssl_conf_alpn_protocols(&(ep->conf), options->alpn_list);
840a8e1175bSopenharmony_ci    }
841a8e1175bSopenharmony_ci#endif
842a8e1175bSopenharmony_ci#endif
843a8e1175bSopenharmony_ci
844a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CACHE_C) && defined(MBEDTLS_SSL_SRV_C)
845a8e1175bSopenharmony_ci    if (endpoint_type == MBEDTLS_SSL_IS_SERVER && options->cache != NULL) {
846a8e1175bSopenharmony_ci        mbedtls_ssl_conf_session_cache(&(ep->conf), options->cache,
847a8e1175bSopenharmony_ci                                       mbedtls_ssl_cache_get,
848a8e1175bSopenharmony_ci                                       mbedtls_ssl_cache_set);
849a8e1175bSopenharmony_ci    }
850a8e1175bSopenharmony_ci#endif
851a8e1175bSopenharmony_ci
852a8e1175bSopenharmony_ci    ret = mbedtls_ssl_setup(&(ep->ssl), &(ep->conf));
853a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
854a8e1175bSopenharmony_ci
855a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_DTLS) && defined(MBEDTLS_SSL_SRV_C)
856a8e1175bSopenharmony_ci    if (endpoint_type == MBEDTLS_SSL_IS_SERVER && dtls_context != NULL) {
857a8e1175bSopenharmony_ci        mbedtls_ssl_conf_dtls_cookies(&(ep->conf), NULL, NULL, NULL);
858a8e1175bSopenharmony_ci    }
859a8e1175bSopenharmony_ci#endif
860a8e1175bSopenharmony_ci
861a8e1175bSopenharmony_ci#if defined(MBEDTLS_DEBUG_C)
862a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SRV_C)
863a8e1175bSopenharmony_ci    if (endpoint_type == MBEDTLS_SSL_IS_SERVER &&
864a8e1175bSopenharmony_ci        options->srv_log_fun != NULL) {
865a8e1175bSopenharmony_ci        mbedtls_ssl_conf_dbg(&(ep->conf), options->srv_log_fun,
866a8e1175bSopenharmony_ci                             options->srv_log_obj);
867a8e1175bSopenharmony_ci    }
868a8e1175bSopenharmony_ci#endif
869a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CLI_C)
870a8e1175bSopenharmony_ci    if (endpoint_type == MBEDTLS_SSL_IS_CLIENT &&
871a8e1175bSopenharmony_ci        options->cli_log_fun != NULL) {
872a8e1175bSopenharmony_ci        mbedtls_ssl_conf_dbg(&(ep->conf), options->cli_log_fun,
873a8e1175bSopenharmony_ci                             options->cli_log_obj);
874a8e1175bSopenharmony_ci    }
875a8e1175bSopenharmony_ci#endif
876a8e1175bSopenharmony_ci#endif /* MBEDTLS_DEBUG_C */
877a8e1175bSopenharmony_ci
878a8e1175bSopenharmony_ci    ret = mbedtls_test_ssl_endpoint_certificate_init(ep, options->pk_alg,
879a8e1175bSopenharmony_ci                                                     options->opaque_alg,
880a8e1175bSopenharmony_ci                                                     options->opaque_alg2,
881a8e1175bSopenharmony_ci                                                     options->opaque_usage);
882a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
883a8e1175bSopenharmony_ci
884a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_ssl_conf_get_user_data_n(&ep->conf), user_data_n);
885a8e1175bSopenharmony_ci    mbedtls_ssl_conf_set_user_data_p(&ep->conf, ep);
886a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_ssl_get_user_data_n(&ep->ssl), user_data_n);
887a8e1175bSopenharmony_ci    mbedtls_ssl_set_user_data_p(&ep->ssl, ep);
888a8e1175bSopenharmony_ci
889a8e1175bSopenharmony_ciexit:
890a8e1175bSopenharmony_ci    return ret;
891a8e1175bSopenharmony_ci}
892a8e1175bSopenharmony_ci
893a8e1175bSopenharmony_civoid mbedtls_test_ssl_endpoint_free(
894a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint *ep,
895a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context *context)
896a8e1175bSopenharmony_ci{
897a8e1175bSopenharmony_ci    test_ssl_endpoint_certificate_free(ep);
898a8e1175bSopenharmony_ci
899a8e1175bSopenharmony_ci    mbedtls_ssl_free(&(ep->ssl));
900a8e1175bSopenharmony_ci    mbedtls_ssl_config_free(&(ep->conf));
901a8e1175bSopenharmony_ci
902a8e1175bSopenharmony_ci    if (context != NULL) {
903a8e1175bSopenharmony_ci        mbedtls_test_message_socket_close(context);
904a8e1175bSopenharmony_ci    } else {
905a8e1175bSopenharmony_ci        mbedtls_test_mock_socket_close(&(ep->socket));
906a8e1175bSopenharmony_ci    }
907a8e1175bSopenharmony_ci}
908a8e1175bSopenharmony_ci
909a8e1175bSopenharmony_ciint mbedtls_test_move_handshake_to_state(mbedtls_ssl_context *ssl,
910a8e1175bSopenharmony_ci                                         mbedtls_ssl_context *second_ssl,
911a8e1175bSopenharmony_ci                                         int state)
912a8e1175bSopenharmony_ci{
913a8e1175bSopenharmony_ci    enum { BUFFSIZE = 1024 };
914a8e1175bSopenharmony_ci    int max_steps = 1000;
915a8e1175bSopenharmony_ci    int ret = 0;
916a8e1175bSopenharmony_ci
917a8e1175bSopenharmony_ci    if (ssl == NULL || second_ssl == NULL) {
918a8e1175bSopenharmony_ci        return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
919a8e1175bSopenharmony_ci    }
920a8e1175bSopenharmony_ci
921a8e1175bSopenharmony_ci    /* Perform communication via connected sockets */
922a8e1175bSopenharmony_ci    while ((ssl->state != state) && (--max_steps >= 0)) {
923a8e1175bSopenharmony_ci        /* If /p second_ssl ends the handshake procedure before /p ssl then
924a8e1175bSopenharmony_ci         * there is no need to call the next step */
925a8e1175bSopenharmony_ci        if (!mbedtls_ssl_is_handshake_over(second_ssl)) {
926a8e1175bSopenharmony_ci            ret = mbedtls_ssl_handshake_step(second_ssl);
927a8e1175bSopenharmony_ci            if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
928a8e1175bSopenharmony_ci                ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
929a8e1175bSopenharmony_ci                return ret;
930a8e1175bSopenharmony_ci            }
931a8e1175bSopenharmony_ci        }
932a8e1175bSopenharmony_ci
933a8e1175bSopenharmony_ci        /* We only care about the \p ssl state and returns, so we call it last,
934a8e1175bSopenharmony_ci         * to leave the iteration as soon as the state is as expected. */
935a8e1175bSopenharmony_ci        ret = mbedtls_ssl_handshake_step(ssl);
936a8e1175bSopenharmony_ci        if (ret != 0 && ret != MBEDTLS_ERR_SSL_WANT_READ &&
937a8e1175bSopenharmony_ci            ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
938a8e1175bSopenharmony_ci            return ret;
939a8e1175bSopenharmony_ci        }
940a8e1175bSopenharmony_ci    }
941a8e1175bSopenharmony_ci
942a8e1175bSopenharmony_ci    return (max_steps >= 0) ? ret : -1;
943a8e1175bSopenharmony_ci}
944a8e1175bSopenharmony_ci
945a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
946a8e1175bSopenharmony_ci
947a8e1175bSopenharmony_ci/*
948a8e1175bSopenharmony_ci * Write application data. Increase write counter if necessary.
949a8e1175bSopenharmony_ci */
950a8e1175bSopenharmony_ciint mbedtls_ssl_write_fragment(mbedtls_ssl_context *ssl,
951a8e1175bSopenharmony_ci                               unsigned char *buf, int buf_len,
952a8e1175bSopenharmony_ci                               int *written,
953a8e1175bSopenharmony_ci                               const int expected_fragments)
954a8e1175bSopenharmony_ci{
955a8e1175bSopenharmony_ci    int ret;
956a8e1175bSopenharmony_ci    /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
957a8e1175bSopenharmony_ci     * a valid no-op for TLS connections. */
958a8e1175bSopenharmony_ci    if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
959a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_write(ssl, NULL, 0) == 0);
960a8e1175bSopenharmony_ci    }
961a8e1175bSopenharmony_ci
962a8e1175bSopenharmony_ci    ret = mbedtls_ssl_write(ssl, buf + *written, buf_len - *written);
963a8e1175bSopenharmony_ci    if (ret > 0) {
964a8e1175bSopenharmony_ci        *written += ret;
965a8e1175bSopenharmony_ci    }
966a8e1175bSopenharmony_ci
967a8e1175bSopenharmony_ci    if (expected_fragments == 0) {
968a8e1175bSopenharmony_ci        /* Used for DTLS and the message size larger than MFL. In that case
969a8e1175bSopenharmony_ci         * the message can not be fragmented and the library should return
970a8e1175bSopenharmony_ci         * MBEDTLS_ERR_SSL_BAD_INPUT_DATA error. This error must be returned
971a8e1175bSopenharmony_ci         * to prevent a dead loop inside mbedtls_test_ssl_exchange_data(). */
972a8e1175bSopenharmony_ci        return ret;
973a8e1175bSopenharmony_ci    } else if (expected_fragments == 1) {
974a8e1175bSopenharmony_ci        /* Used for TLS/DTLS and the message size lower than MFL */
975a8e1175bSopenharmony_ci        TEST_ASSERT(ret == buf_len ||
976a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_READ ||
977a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_WRITE);
978a8e1175bSopenharmony_ci    } else {
979a8e1175bSopenharmony_ci        /* Used for TLS and the message size larger than MFL */
980a8e1175bSopenharmony_ci        TEST_ASSERT(expected_fragments > 1);
981a8e1175bSopenharmony_ci        TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
982a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_READ ||
983a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_WRITE);
984a8e1175bSopenharmony_ci    }
985a8e1175bSopenharmony_ci
986a8e1175bSopenharmony_ci    return 0;
987a8e1175bSopenharmony_ci
988a8e1175bSopenharmony_ciexit:
989a8e1175bSopenharmony_ci    /* Some of the tests failed */
990a8e1175bSopenharmony_ci    return -1;
991a8e1175bSopenharmony_ci}
992a8e1175bSopenharmony_ci
993a8e1175bSopenharmony_ci/*
994a8e1175bSopenharmony_ci * Read application data and increase read counter and fragments counter
995a8e1175bSopenharmony_ci * if necessary.
996a8e1175bSopenharmony_ci */
997a8e1175bSopenharmony_ciint mbedtls_ssl_read_fragment(mbedtls_ssl_context *ssl,
998a8e1175bSopenharmony_ci                              unsigned char *buf, int buf_len,
999a8e1175bSopenharmony_ci                              int *read, int *fragments,
1000a8e1175bSopenharmony_ci                              const int expected_fragments)
1001a8e1175bSopenharmony_ci{
1002a8e1175bSopenharmony_ci    int ret;
1003a8e1175bSopenharmony_ci    /* Verify that calling mbedtls_ssl_write with a NULL buffer and zero length is
1004a8e1175bSopenharmony_ci     * a valid no-op for TLS connections. */
1005a8e1175bSopenharmony_ci    if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1006a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_read(ssl, NULL, 0) == 0);
1007a8e1175bSopenharmony_ci    }
1008a8e1175bSopenharmony_ci
1009a8e1175bSopenharmony_ci    ret = mbedtls_ssl_read(ssl, buf + *read, buf_len - *read);
1010a8e1175bSopenharmony_ci    if (ret > 0) {
1011a8e1175bSopenharmony_ci        (*fragments)++;
1012a8e1175bSopenharmony_ci        *read += ret;
1013a8e1175bSopenharmony_ci    }
1014a8e1175bSopenharmony_ci
1015a8e1175bSopenharmony_ci    if (expected_fragments == 0) {
1016a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
1017a8e1175bSopenharmony_ci    } else if (expected_fragments == 1) {
1018a8e1175bSopenharmony_ci        TEST_ASSERT(ret == buf_len ||
1019a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_READ ||
1020a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1021a8e1175bSopenharmony_ci    } else {
1022a8e1175bSopenharmony_ci        TEST_ASSERT(expected_fragments > 1);
1023a8e1175bSopenharmony_ci        TEST_ASSERT((ret >= 0 && ret <= buf_len) ||
1024a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_READ ||
1025a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_WRITE);
1026a8e1175bSopenharmony_ci    }
1027a8e1175bSopenharmony_ci
1028a8e1175bSopenharmony_ci    return 0;
1029a8e1175bSopenharmony_ci
1030a8e1175bSopenharmony_ciexit:
1031a8e1175bSopenharmony_ci    /* Some of the tests failed */
1032a8e1175bSopenharmony_ci    return -1;
1033a8e1175bSopenharmony_ci}
1034a8e1175bSopenharmony_ci
1035a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1036a8e1175bSopenharmony_cistatic void set_ciphersuite(mbedtls_ssl_config *conf, const char *cipher,
1037a8e1175bSopenharmony_ci                            int *forced_ciphersuite)
1038a8e1175bSopenharmony_ci{
1039a8e1175bSopenharmony_ci    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1040a8e1175bSopenharmony_ci    forced_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id(cipher);
1041a8e1175bSopenharmony_ci    forced_ciphersuite[1] = 0;
1042a8e1175bSopenharmony_ci
1043a8e1175bSopenharmony_ci    ciphersuite_info =
1044a8e1175bSopenharmony_ci        mbedtls_ssl_ciphersuite_from_id(forced_ciphersuite[0]);
1045a8e1175bSopenharmony_ci
1046a8e1175bSopenharmony_ci    TEST_ASSERT(ciphersuite_info != NULL);
1047a8e1175bSopenharmony_ci    TEST_ASSERT(ciphersuite_info->min_tls_version <= conf->max_tls_version);
1048a8e1175bSopenharmony_ci    TEST_ASSERT(ciphersuite_info->max_tls_version >= conf->min_tls_version);
1049a8e1175bSopenharmony_ci
1050a8e1175bSopenharmony_ci    if (conf->max_tls_version > ciphersuite_info->max_tls_version) {
1051a8e1175bSopenharmony_ci        conf->max_tls_version = (mbedtls_ssl_protocol_version) ciphersuite_info->max_tls_version;
1052a8e1175bSopenharmony_ci    }
1053a8e1175bSopenharmony_ci    if (conf->min_tls_version < ciphersuite_info->min_tls_version) {
1054a8e1175bSopenharmony_ci        conf->min_tls_version = (mbedtls_ssl_protocol_version) ciphersuite_info->min_tls_version;
1055a8e1175bSopenharmony_ci    }
1056a8e1175bSopenharmony_ci
1057a8e1175bSopenharmony_ci    mbedtls_ssl_conf_ciphersuites(conf, forced_ciphersuite);
1058a8e1175bSopenharmony_ci
1059a8e1175bSopenharmony_ciexit:
1060a8e1175bSopenharmony_ci    return;
1061a8e1175bSopenharmony_ci}
1062a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
1063a8e1175bSopenharmony_ci
1064a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) && \
1065a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)  && \
1066a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_SRV_C)
1067a8e1175bSopenharmony_cistatic int psk_dummy_callback(void *p_info, mbedtls_ssl_context *ssl,
1068a8e1175bSopenharmony_ci                              const unsigned char *name, size_t name_len)
1069a8e1175bSopenharmony_ci{
1070a8e1175bSopenharmony_ci    (void) p_info;
1071a8e1175bSopenharmony_ci    (void) ssl;
1072a8e1175bSopenharmony_ci    (void) name;
1073a8e1175bSopenharmony_ci    (void) name_len;
1074a8e1175bSopenharmony_ci
1075a8e1175bSopenharmony_ci    return 0;
1076a8e1175bSopenharmony_ci}
1077a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED &&
1078a8e1175bSopenharmony_ci          MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED  &&
1079a8e1175bSopenharmony_ci          MBEDTLS_SSL_SRV_C */
1080a8e1175bSopenharmony_ci
1081a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1082a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_HAVE_CBC) && defined(MBEDTLS_SSL_HAVE_AES)
1083a8e1175bSopenharmony_ciint mbedtls_test_psa_cipher_encrypt_helper(mbedtls_ssl_transform *transform,
1084a8e1175bSopenharmony_ci                                           const unsigned char *iv,
1085a8e1175bSopenharmony_ci                                           size_t iv_len,
1086a8e1175bSopenharmony_ci                                           const unsigned char *input,
1087a8e1175bSopenharmony_ci                                           size_t ilen,
1088a8e1175bSopenharmony_ci                                           unsigned char *output,
1089a8e1175bSopenharmony_ci                                           size_t *olen)
1090a8e1175bSopenharmony_ci{
1091a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1092a8e1175bSopenharmony_ci    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1093a8e1175bSopenharmony_ci    psa_cipher_operation_t cipher_op = PSA_CIPHER_OPERATION_INIT;
1094a8e1175bSopenharmony_ci    size_t part_len;
1095a8e1175bSopenharmony_ci
1096a8e1175bSopenharmony_ci    status = psa_cipher_encrypt_setup(&cipher_op,
1097a8e1175bSopenharmony_ci                                      transform->psa_key_enc,
1098a8e1175bSopenharmony_ci                                      transform->psa_alg);
1099a8e1175bSopenharmony_ci
1100a8e1175bSopenharmony_ci    if (status != PSA_SUCCESS) {
1101a8e1175bSopenharmony_ci        return PSA_TO_MBEDTLS_ERR(status);
1102a8e1175bSopenharmony_ci    }
1103a8e1175bSopenharmony_ci
1104a8e1175bSopenharmony_ci    status = psa_cipher_set_iv(&cipher_op, iv, iv_len);
1105a8e1175bSopenharmony_ci
1106a8e1175bSopenharmony_ci    if (status != PSA_SUCCESS) {
1107a8e1175bSopenharmony_ci        return PSA_TO_MBEDTLS_ERR(status);
1108a8e1175bSopenharmony_ci    }
1109a8e1175bSopenharmony_ci
1110a8e1175bSopenharmony_ci    status = psa_cipher_update(&cipher_op, input, ilen, output, ilen, olen);
1111a8e1175bSopenharmony_ci
1112a8e1175bSopenharmony_ci    if (status != PSA_SUCCESS) {
1113a8e1175bSopenharmony_ci        return PSA_TO_MBEDTLS_ERR(status);
1114a8e1175bSopenharmony_ci    }
1115a8e1175bSopenharmony_ci
1116a8e1175bSopenharmony_ci    status = psa_cipher_finish(&cipher_op, output + *olen, ilen - *olen,
1117a8e1175bSopenharmony_ci                               &part_len);
1118a8e1175bSopenharmony_ci
1119a8e1175bSopenharmony_ci    if (status != PSA_SUCCESS) {
1120a8e1175bSopenharmony_ci        return PSA_TO_MBEDTLS_ERR(status);
1121a8e1175bSopenharmony_ci    }
1122a8e1175bSopenharmony_ci
1123a8e1175bSopenharmony_ci    *olen += part_len;
1124a8e1175bSopenharmony_ci    return 0;
1125a8e1175bSopenharmony_ci#else
1126a8e1175bSopenharmony_ci    return mbedtls_cipher_crypt(&transform->cipher_ctx_enc,
1127a8e1175bSopenharmony_ci                                iv, iv_len, input, ilen, output, olen);
1128a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */
1129a8e1175bSopenharmony_ci}
1130a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_HAVE_CBC &&
1131a8e1175bSopenharmony_ci          MBEDTLS_SSL_HAVE_AES */
1132a8e1175bSopenharmony_ci
1133a8e1175bSopenharmony_cistatic void mbedtls_test_ssl_cipher_info_from_type(mbedtls_cipher_type_t cipher_type,
1134a8e1175bSopenharmony_ci                                                   mbedtls_cipher_mode_t *cipher_mode,
1135a8e1175bSopenharmony_ci                                                   size_t *key_bits, size_t *iv_len)
1136a8e1175bSopenharmony_ci{
1137a8e1175bSopenharmony_ci    switch (cipher_type) {
1138a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_128_CBC:
1139a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1140a8e1175bSopenharmony_ci            *key_bits = 128;
1141a8e1175bSopenharmony_ci            *iv_len = 16;
1142a8e1175bSopenharmony_ci            break;
1143a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_256_CBC:
1144a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1145a8e1175bSopenharmony_ci            *key_bits = 256;
1146a8e1175bSopenharmony_ci            *iv_len = 16;
1147a8e1175bSopenharmony_ci            break;
1148a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_ARIA_128_CBC:
1149a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1150a8e1175bSopenharmony_ci            *key_bits = 128;
1151a8e1175bSopenharmony_ci            *iv_len = 16;
1152a8e1175bSopenharmony_ci            break;
1153a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_ARIA_256_CBC:
1154a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1155a8e1175bSopenharmony_ci            *key_bits = 256;
1156a8e1175bSopenharmony_ci            *iv_len = 16;
1157a8e1175bSopenharmony_ci            break;
1158a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_128_CBC:
1159a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1160a8e1175bSopenharmony_ci            *key_bits = 128;
1161a8e1175bSopenharmony_ci            *iv_len = 16;
1162a8e1175bSopenharmony_ci            break;
1163a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_256_CBC:
1164a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CBC;
1165a8e1175bSopenharmony_ci            *key_bits = 256;
1166a8e1175bSopenharmony_ci            *iv_len = 16;
1167a8e1175bSopenharmony_ci            break;
1168a8e1175bSopenharmony_ci
1169a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_128_CCM:
1170a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1171a8e1175bSopenharmony_ci            *key_bits = 128;
1172a8e1175bSopenharmony_ci            *iv_len = 12;
1173a8e1175bSopenharmony_ci            break;
1174a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_192_CCM:
1175a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1176a8e1175bSopenharmony_ci            *key_bits = 192;
1177a8e1175bSopenharmony_ci            *iv_len = 12;
1178a8e1175bSopenharmony_ci            break;
1179a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_256_CCM:
1180a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1181a8e1175bSopenharmony_ci            *key_bits = 256;
1182a8e1175bSopenharmony_ci            *iv_len = 12;
1183a8e1175bSopenharmony_ci            break;
1184a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_128_CCM:
1185a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1186a8e1175bSopenharmony_ci            *key_bits = 128;
1187a8e1175bSopenharmony_ci            *iv_len = 12;
1188a8e1175bSopenharmony_ci            break;
1189a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_192_CCM:
1190a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1191a8e1175bSopenharmony_ci            *key_bits = 192;
1192a8e1175bSopenharmony_ci            *iv_len = 12;
1193a8e1175bSopenharmony_ci            break;
1194a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_256_CCM:
1195a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CCM;
1196a8e1175bSopenharmony_ci            *key_bits = 256;
1197a8e1175bSopenharmony_ci            *iv_len = 12;
1198a8e1175bSopenharmony_ci            break;
1199a8e1175bSopenharmony_ci
1200a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_128_GCM:
1201a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1202a8e1175bSopenharmony_ci            *key_bits = 128;
1203a8e1175bSopenharmony_ci            *iv_len = 12;
1204a8e1175bSopenharmony_ci            break;
1205a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_192_GCM:
1206a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1207a8e1175bSopenharmony_ci            *key_bits = 192;
1208a8e1175bSopenharmony_ci            *iv_len = 12;
1209a8e1175bSopenharmony_ci            break;
1210a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_AES_256_GCM:
1211a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1212a8e1175bSopenharmony_ci            *key_bits = 256;
1213a8e1175bSopenharmony_ci            *iv_len = 12;
1214a8e1175bSopenharmony_ci            break;
1215a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_128_GCM:
1216a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1217a8e1175bSopenharmony_ci            *key_bits = 128;
1218a8e1175bSopenharmony_ci            *iv_len = 12;
1219a8e1175bSopenharmony_ci            break;
1220a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_192_GCM:
1221a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1222a8e1175bSopenharmony_ci            *key_bits = 192;
1223a8e1175bSopenharmony_ci            *iv_len = 12;
1224a8e1175bSopenharmony_ci            break;
1225a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CAMELLIA_256_GCM:
1226a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_GCM;
1227a8e1175bSopenharmony_ci            *key_bits = 256;
1228a8e1175bSopenharmony_ci            *iv_len = 12;
1229a8e1175bSopenharmony_ci            break;
1230a8e1175bSopenharmony_ci
1231a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_CHACHA20_POLY1305:
1232a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_CHACHAPOLY;
1233a8e1175bSopenharmony_ci            *key_bits = 256;
1234a8e1175bSopenharmony_ci            *iv_len = 12;
1235a8e1175bSopenharmony_ci            break;
1236a8e1175bSopenharmony_ci
1237a8e1175bSopenharmony_ci        case MBEDTLS_CIPHER_NULL:
1238a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_STREAM;
1239a8e1175bSopenharmony_ci            *key_bits = 0;
1240a8e1175bSopenharmony_ci            *iv_len = 0;
1241a8e1175bSopenharmony_ci            break;
1242a8e1175bSopenharmony_ci
1243a8e1175bSopenharmony_ci        default:
1244a8e1175bSopenharmony_ci            *cipher_mode = MBEDTLS_MODE_NONE;
1245a8e1175bSopenharmony_ci            *key_bits = 0;
1246a8e1175bSopenharmony_ci            *iv_len = 0;
1247a8e1175bSopenharmony_ci    }
1248a8e1175bSopenharmony_ci}
1249a8e1175bSopenharmony_ci
1250a8e1175bSopenharmony_ciint mbedtls_test_ssl_build_transforms(mbedtls_ssl_transform *t_in,
1251a8e1175bSopenharmony_ci                                      mbedtls_ssl_transform *t_out,
1252a8e1175bSopenharmony_ci                                      int cipher_type, int hash_id,
1253a8e1175bSopenharmony_ci                                      int etm, int tag_mode,
1254a8e1175bSopenharmony_ci                                      mbedtls_ssl_protocol_version tls_version,
1255a8e1175bSopenharmony_ci                                      size_t cid0_len,
1256a8e1175bSopenharmony_ci                                      size_t cid1_len)
1257a8e1175bSopenharmony_ci{
1258a8e1175bSopenharmony_ci    mbedtls_cipher_mode_t cipher_mode = MBEDTLS_MODE_NONE;
1259a8e1175bSopenharmony_ci    size_t key_bits = 0;
1260a8e1175bSopenharmony_ci    int ret = 0;
1261a8e1175bSopenharmony_ci
1262a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1263a8e1175bSopenharmony_ci    psa_key_type_t key_type;
1264a8e1175bSopenharmony_ci    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
1265a8e1175bSopenharmony_ci    psa_algorithm_t alg;
1266a8e1175bSopenharmony_ci    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1267a8e1175bSopenharmony_ci#else
1268a8e1175bSopenharmony_ci    mbedtls_cipher_info_t const *cipher_info;
1269a8e1175bSopenharmony_ci#endif
1270a8e1175bSopenharmony_ci
1271a8e1175bSopenharmony_ci    size_t keylen, maclen, ivlen = 0;
1272a8e1175bSopenharmony_ci    unsigned char *key0 = NULL, *key1 = NULL;
1273a8e1175bSopenharmony_ci    unsigned char *md0 = NULL, *md1 = NULL;
1274a8e1175bSopenharmony_ci    unsigned char iv_enc[16], iv_dec[16];
1275a8e1175bSopenharmony_ci
1276a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1277a8e1175bSopenharmony_ci    unsigned char cid0[SSL_CID_LEN_MIN];
1278a8e1175bSopenharmony_ci    unsigned char cid1[SSL_CID_LEN_MIN];
1279a8e1175bSopenharmony_ci
1280a8e1175bSopenharmony_ci    mbedtls_test_rnd_std_rand(NULL, cid0, sizeof(cid0));
1281a8e1175bSopenharmony_ci    mbedtls_test_rnd_std_rand(NULL, cid1, sizeof(cid1));
1282a8e1175bSopenharmony_ci#else
1283a8e1175bSopenharmony_ci    ((void) cid0_len);
1284a8e1175bSopenharmony_ci    ((void) cid1_len);
1285a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1286a8e1175bSopenharmony_ci
1287a8e1175bSopenharmony_ci    maclen = 0;
1288a8e1175bSopenharmony_ci    mbedtls_test_ssl_cipher_info_from_type((mbedtls_cipher_type_t) cipher_type,
1289a8e1175bSopenharmony_ci                                           &cipher_mode, &key_bits, &ivlen);
1290a8e1175bSopenharmony_ci
1291a8e1175bSopenharmony_ci    /* Pick keys */
1292a8e1175bSopenharmony_ci    keylen = key_bits / 8;
1293a8e1175bSopenharmony_ci    /* Allocate `keylen + 1` bytes to ensure that we get
1294a8e1175bSopenharmony_ci     * a non-NULL pointers from `mbedtls_calloc` even if
1295a8e1175bSopenharmony_ci     * `keylen == 0` in the case of the NULL cipher. */
1296a8e1175bSopenharmony_ci    CHK((key0 = mbedtls_calloc(1, keylen + 1)) != NULL);
1297a8e1175bSopenharmony_ci    CHK((key1 = mbedtls_calloc(1, keylen + 1)) != NULL);
1298a8e1175bSopenharmony_ci    memset(key0, 0x1, keylen);
1299a8e1175bSopenharmony_ci    memset(key1, 0x2, keylen);
1300a8e1175bSopenharmony_ci
1301a8e1175bSopenharmony_ci#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1302a8e1175bSopenharmony_ci    /* Pick cipher */
1303a8e1175bSopenharmony_ci    cipher_info = mbedtls_cipher_info_from_type((mbedtls_cipher_type_t) cipher_type);
1304a8e1175bSopenharmony_ci    CHK(cipher_info != NULL);
1305a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_info_get_iv_size(cipher_info) <= 16);
1306a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_info_get_key_bitlen(cipher_info) % 8 == 0);
1307a8e1175bSopenharmony_ci
1308a8e1175bSopenharmony_ci    /* Setup cipher contexts */
1309a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_enc,  cipher_info) == 0);
1310a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setup(&t_in->cipher_ctx_dec,  cipher_info) == 0);
1311a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_enc, cipher_info) == 0);
1312a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setup(&t_out->cipher_ctx_dec, cipher_info) == 0);
1313a8e1175bSopenharmony_ci
1314a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC)
1315a8e1175bSopenharmony_ci    if (cipher_mode == MBEDTLS_MODE_CBC) {
1316a8e1175bSopenharmony_ci        CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_enc,
1317a8e1175bSopenharmony_ci                                            MBEDTLS_PADDING_NONE) == 0);
1318a8e1175bSopenharmony_ci        CHK(mbedtls_cipher_set_padding_mode(&t_in->cipher_ctx_dec,
1319a8e1175bSopenharmony_ci                                            MBEDTLS_PADDING_NONE) == 0);
1320a8e1175bSopenharmony_ci        CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_enc,
1321a8e1175bSopenharmony_ci                                            MBEDTLS_PADDING_NONE) == 0);
1322a8e1175bSopenharmony_ci        CHK(mbedtls_cipher_set_padding_mode(&t_out->cipher_ctx_dec,
1323a8e1175bSopenharmony_ci                                            MBEDTLS_PADDING_NONE) == 0);
1324a8e1175bSopenharmony_ci    }
1325a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_CBC */
1326a8e1175bSopenharmony_ci
1327a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_enc, key0,
1328a8e1175bSopenharmony_ci                              (keylen << 3 > INT_MAX) ? INT_MAX : (int) keylen << 3,
1329a8e1175bSopenharmony_ci                              MBEDTLS_ENCRYPT)
1330a8e1175bSopenharmony_ci        == 0);
1331a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setkey(&t_in->cipher_ctx_dec, key1,
1332a8e1175bSopenharmony_ci                              (keylen << 3 > INT_MAX) ? INT_MAX : (int) keylen << 3,
1333a8e1175bSopenharmony_ci                              MBEDTLS_DECRYPT)
1334a8e1175bSopenharmony_ci        == 0);
1335a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_enc, key1,
1336a8e1175bSopenharmony_ci                              (keylen << 3 > INT_MAX) ? INT_MAX : (int) keylen << 3,
1337a8e1175bSopenharmony_ci                              MBEDTLS_ENCRYPT)
1338a8e1175bSopenharmony_ci        == 0);
1339a8e1175bSopenharmony_ci    CHK(mbedtls_cipher_setkey(&t_out->cipher_ctx_dec, key0,
1340a8e1175bSopenharmony_ci                              (keylen << 3 > INT_MAX) ? INT_MAX : (int) keylen << 3,
1341a8e1175bSopenharmony_ci                              MBEDTLS_DECRYPT)
1342a8e1175bSopenharmony_ci        == 0);
1343a8e1175bSopenharmony_ci#endif /* !MBEDTLS_USE_PSA_CRYPTO */
1344a8e1175bSopenharmony_ci
1345a8e1175bSopenharmony_ci    /* Setup MAC contexts */
1346a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1347a8e1175bSopenharmony_ci    if (cipher_mode == MBEDTLS_MODE_CBC ||
1348a8e1175bSopenharmony_ci        cipher_mode == MBEDTLS_MODE_STREAM) {
1349a8e1175bSopenharmony_ci#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1350a8e1175bSopenharmony_ci        mbedtls_md_info_t const *md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) hash_id);
1351a8e1175bSopenharmony_ci        CHK(md_info != NULL);
1352a8e1175bSopenharmony_ci#endif
1353a8e1175bSopenharmony_ci        maclen = mbedtls_md_get_size_from_type((mbedtls_md_type_t) hash_id);
1354a8e1175bSopenharmony_ci        CHK(maclen != 0);
1355a8e1175bSopenharmony_ci        /* Pick hash keys */
1356a8e1175bSopenharmony_ci        CHK((md0 = mbedtls_calloc(1, maclen)) != NULL);
1357a8e1175bSopenharmony_ci        CHK((md1 = mbedtls_calloc(1, maclen)) != NULL);
1358a8e1175bSopenharmony_ci        memset(md0, 0x5, maclen);
1359a8e1175bSopenharmony_ci        memset(md1, 0x6, maclen);
1360a8e1175bSopenharmony_ci
1361a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1362a8e1175bSopenharmony_ci        alg = mbedtls_md_psa_alg_from_type(hash_id);
1363a8e1175bSopenharmony_ci
1364a8e1175bSopenharmony_ci        CHK(alg != 0);
1365a8e1175bSopenharmony_ci
1366a8e1175bSopenharmony_ci        t_out->psa_mac_alg = PSA_ALG_HMAC(alg);
1367a8e1175bSopenharmony_ci        t_in->psa_mac_alg = PSA_ALG_HMAC(alg);
1368a8e1175bSopenharmony_ci        t_in->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1369a8e1175bSopenharmony_ci        t_out->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
1370a8e1175bSopenharmony_ci        t_in->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1371a8e1175bSopenharmony_ci        t_out->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
1372a8e1175bSopenharmony_ci
1373a8e1175bSopenharmony_ci        psa_reset_key_attributes(&attributes);
1374a8e1175bSopenharmony_ci        psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
1375a8e1175bSopenharmony_ci        psa_set_key_algorithm(&attributes, PSA_ALG_HMAC(alg));
1376a8e1175bSopenharmony_ci        psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
1377a8e1175bSopenharmony_ci
1378a8e1175bSopenharmony_ci        CHK(psa_import_key(&attributes,
1379a8e1175bSopenharmony_ci                           md0, maclen,
1380a8e1175bSopenharmony_ci                           &t_in->psa_mac_enc) == PSA_SUCCESS);
1381a8e1175bSopenharmony_ci
1382a8e1175bSopenharmony_ci        CHK(psa_import_key(&attributes,
1383a8e1175bSopenharmony_ci                           md1, maclen,
1384a8e1175bSopenharmony_ci                           &t_out->psa_mac_enc) == PSA_SUCCESS);
1385a8e1175bSopenharmony_ci
1386a8e1175bSopenharmony_ci        if (cipher_mode == MBEDTLS_MODE_STREAM ||
1387a8e1175bSopenharmony_ci            etm == MBEDTLS_SSL_ETM_DISABLED) {
1388a8e1175bSopenharmony_ci            /* mbedtls_ct_hmac() requires the key to be exportable */
1389a8e1175bSopenharmony_ci            psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_EXPORT |
1390a8e1175bSopenharmony_ci                                    PSA_KEY_USAGE_VERIFY_HASH);
1391a8e1175bSopenharmony_ci        } else {
1392a8e1175bSopenharmony_ci            psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_HASH);
1393a8e1175bSopenharmony_ci        }
1394a8e1175bSopenharmony_ci
1395a8e1175bSopenharmony_ci        CHK(psa_import_key(&attributes,
1396a8e1175bSopenharmony_ci                           md1, maclen,
1397a8e1175bSopenharmony_ci                           &t_in->psa_mac_dec) == PSA_SUCCESS);
1398a8e1175bSopenharmony_ci
1399a8e1175bSopenharmony_ci        CHK(psa_import_key(&attributes,
1400a8e1175bSopenharmony_ci                           md0, maclen,
1401a8e1175bSopenharmony_ci                           &t_out->psa_mac_dec) == PSA_SUCCESS);
1402a8e1175bSopenharmony_ci#else
1403a8e1175bSopenharmony_ci        CHK(mbedtls_md_setup(&t_out->md_ctx_enc, md_info, 1) == 0);
1404a8e1175bSopenharmony_ci        CHK(mbedtls_md_setup(&t_out->md_ctx_dec, md_info, 1) == 0);
1405a8e1175bSopenharmony_ci        CHK(mbedtls_md_setup(&t_in->md_ctx_enc,  md_info, 1) == 0);
1406a8e1175bSopenharmony_ci        CHK(mbedtls_md_setup(&t_in->md_ctx_dec,  md_info, 1) == 0);
1407a8e1175bSopenharmony_ci
1408a8e1175bSopenharmony_ci        CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_enc,
1409a8e1175bSopenharmony_ci                                   md0, maclen) == 0);
1410a8e1175bSopenharmony_ci        CHK(mbedtls_md_hmac_starts(&t_in->md_ctx_dec,
1411a8e1175bSopenharmony_ci                                   md1, maclen) == 0);
1412a8e1175bSopenharmony_ci        CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_enc,
1413a8e1175bSopenharmony_ci                                   md1, maclen) == 0);
1414a8e1175bSopenharmony_ci        CHK(mbedtls_md_hmac_starts(&t_out->md_ctx_dec,
1415a8e1175bSopenharmony_ci                                   md0, maclen) == 0);
1416a8e1175bSopenharmony_ci#endif
1417a8e1175bSopenharmony_ci    }
1418a8e1175bSopenharmony_ci#else
1419a8e1175bSopenharmony_ci    ((void) hash_id);
1420a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
1421a8e1175bSopenharmony_ci
1422a8e1175bSopenharmony_ci
1423a8e1175bSopenharmony_ci    /* Pick IV's (regardless of whether they
1424a8e1175bSopenharmony_ci     * are being used by the transform). */
1425a8e1175bSopenharmony_ci    memset(iv_enc, 0x3, sizeof(iv_enc));
1426a8e1175bSopenharmony_ci    memset(iv_dec, 0x4, sizeof(iv_dec));
1427a8e1175bSopenharmony_ci
1428a8e1175bSopenharmony_ci    /*
1429a8e1175bSopenharmony_ci     * Setup transforms
1430a8e1175bSopenharmony_ci     */
1431a8e1175bSopenharmony_ci
1432a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1433a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1434a8e1175bSopenharmony_ci    t_out->encrypt_then_mac = etm;
1435a8e1175bSopenharmony_ci    t_in->encrypt_then_mac = etm;
1436a8e1175bSopenharmony_ci#else
1437a8e1175bSopenharmony_ci    ((void) etm);
1438a8e1175bSopenharmony_ci#endif
1439a8e1175bSopenharmony_ci
1440a8e1175bSopenharmony_ci    t_out->tls_version = tls_version;
1441a8e1175bSopenharmony_ci    t_in->tls_version = tls_version;
1442a8e1175bSopenharmony_ci    t_out->ivlen = ivlen;
1443a8e1175bSopenharmony_ci    t_in->ivlen = ivlen;
1444a8e1175bSopenharmony_ci
1445a8e1175bSopenharmony_ci    switch (cipher_mode) {
1446a8e1175bSopenharmony_ci        case MBEDTLS_MODE_GCM:
1447a8e1175bSopenharmony_ci        case MBEDTLS_MODE_CCM:
1448a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1449a8e1175bSopenharmony_ci            if (tls_version == MBEDTLS_SSL_VERSION_TLS1_3) {
1450a8e1175bSopenharmony_ci                t_out->fixed_ivlen = 12;
1451a8e1175bSopenharmony_ci                t_in->fixed_ivlen  = 12;
1452a8e1175bSopenharmony_ci            } else
1453a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1454a8e1175bSopenharmony_ci            {
1455a8e1175bSopenharmony_ci                t_out->fixed_ivlen = 4;
1456a8e1175bSopenharmony_ci                t_in->fixed_ivlen = 4;
1457a8e1175bSopenharmony_ci            }
1458a8e1175bSopenharmony_ci            t_out->maclen = 0;
1459a8e1175bSopenharmony_ci            t_in->maclen = 0;
1460a8e1175bSopenharmony_ci            switch (tag_mode) {
1461a8e1175bSopenharmony_ci                case 0: /* Full tag */
1462a8e1175bSopenharmony_ci                    t_out->taglen = 16;
1463a8e1175bSopenharmony_ci                    t_in->taglen = 16;
1464a8e1175bSopenharmony_ci                    break;
1465a8e1175bSopenharmony_ci                case 1: /* Partial tag */
1466a8e1175bSopenharmony_ci                    t_out->taglen = 8;
1467a8e1175bSopenharmony_ci                    t_in->taglen = 8;
1468a8e1175bSopenharmony_ci                    break;
1469a8e1175bSopenharmony_ci                default:
1470a8e1175bSopenharmony_ci                    ret = 1;
1471a8e1175bSopenharmony_ci                    goto cleanup;
1472a8e1175bSopenharmony_ci            }
1473a8e1175bSopenharmony_ci            break;
1474a8e1175bSopenharmony_ci
1475a8e1175bSopenharmony_ci        case MBEDTLS_MODE_CHACHAPOLY:
1476a8e1175bSopenharmony_ci            t_out->fixed_ivlen = 12;
1477a8e1175bSopenharmony_ci            t_in->fixed_ivlen = 12;
1478a8e1175bSopenharmony_ci            t_out->maclen = 0;
1479a8e1175bSopenharmony_ci            t_in->maclen = 0;
1480a8e1175bSopenharmony_ci            switch (tag_mode) {
1481a8e1175bSopenharmony_ci                case 0: /* Full tag */
1482a8e1175bSopenharmony_ci                    t_out->taglen = 16;
1483a8e1175bSopenharmony_ci                    t_in->taglen = 16;
1484a8e1175bSopenharmony_ci                    break;
1485a8e1175bSopenharmony_ci                case 1: /* Partial tag */
1486a8e1175bSopenharmony_ci                    t_out->taglen = 8;
1487a8e1175bSopenharmony_ci                    t_in->taglen = 8;
1488a8e1175bSopenharmony_ci                    break;
1489a8e1175bSopenharmony_ci                default:
1490a8e1175bSopenharmony_ci                    ret = 1;
1491a8e1175bSopenharmony_ci                    goto cleanup;
1492a8e1175bSopenharmony_ci            }
1493a8e1175bSopenharmony_ci            break;
1494a8e1175bSopenharmony_ci
1495a8e1175bSopenharmony_ci        case MBEDTLS_MODE_STREAM:
1496a8e1175bSopenharmony_ci        case MBEDTLS_MODE_CBC:
1497a8e1175bSopenharmony_ci            t_out->fixed_ivlen = 0; /* redundant, must be 0 */
1498a8e1175bSopenharmony_ci            t_in->fixed_ivlen = 0;  /* redundant, must be 0 */
1499a8e1175bSopenharmony_ci            t_out->taglen = 0;
1500a8e1175bSopenharmony_ci            t_in->taglen = 0;
1501a8e1175bSopenharmony_ci            switch (tag_mode) {
1502a8e1175bSopenharmony_ci                case 0: /* Full tag */
1503a8e1175bSopenharmony_ci                    t_out->maclen = maclen;
1504a8e1175bSopenharmony_ci                    t_in->maclen = maclen;
1505a8e1175bSopenharmony_ci                    break;
1506a8e1175bSopenharmony_ci                default:
1507a8e1175bSopenharmony_ci                    ret = 1;
1508a8e1175bSopenharmony_ci                    goto cleanup;
1509a8e1175bSopenharmony_ci            }
1510a8e1175bSopenharmony_ci            break;
1511a8e1175bSopenharmony_ci        default:
1512a8e1175bSopenharmony_ci            ret = 1;
1513a8e1175bSopenharmony_ci            goto cleanup;
1514a8e1175bSopenharmony_ci            break;
1515a8e1175bSopenharmony_ci    }
1516a8e1175bSopenharmony_ci
1517a8e1175bSopenharmony_ci    /* Setup IV's */
1518a8e1175bSopenharmony_ci
1519a8e1175bSopenharmony_ci    memcpy(&t_in->iv_dec, iv_dec, sizeof(iv_dec));
1520a8e1175bSopenharmony_ci    memcpy(&t_in->iv_enc, iv_enc, sizeof(iv_enc));
1521a8e1175bSopenharmony_ci    memcpy(&t_out->iv_dec, iv_enc, sizeof(iv_enc));
1522a8e1175bSopenharmony_ci    memcpy(&t_out->iv_enc, iv_dec, sizeof(iv_dec));
1523a8e1175bSopenharmony_ci
1524a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1525a8e1175bSopenharmony_ci    /* Add CID */
1526a8e1175bSopenharmony_ci    memcpy(&t_in->in_cid,  cid0, cid0_len);
1527a8e1175bSopenharmony_ci    memcpy(&t_in->out_cid, cid1, cid1_len);
1528a8e1175bSopenharmony_ci    t_in->in_cid_len = (uint8_t) cid0_len;
1529a8e1175bSopenharmony_ci    t_in->out_cid_len = (uint8_t) cid1_len;
1530a8e1175bSopenharmony_ci    memcpy(&t_out->in_cid,  cid1, cid1_len);
1531a8e1175bSopenharmony_ci    memcpy(&t_out->out_cid, cid0, cid0_len);
1532a8e1175bSopenharmony_ci    t_out->in_cid_len = (uint8_t) cid1_len;
1533a8e1175bSopenharmony_ci    t_out->out_cid_len = (uint8_t) cid0_len;
1534a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1535a8e1175bSopenharmony_ci
1536a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1537a8e1175bSopenharmony_ci    status = mbedtls_ssl_cipher_to_psa(cipher_type,
1538a8e1175bSopenharmony_ci                                       t_in->taglen,
1539a8e1175bSopenharmony_ci                                       &alg,
1540a8e1175bSopenharmony_ci                                       &key_type,
1541a8e1175bSopenharmony_ci                                       &key_bits);
1542a8e1175bSopenharmony_ci
1543a8e1175bSopenharmony_ci    if (status != PSA_SUCCESS) {
1544a8e1175bSopenharmony_ci        ret = PSA_TO_MBEDTLS_ERR(status);
1545a8e1175bSopenharmony_ci        goto cleanup;
1546a8e1175bSopenharmony_ci    }
1547a8e1175bSopenharmony_ci
1548a8e1175bSopenharmony_ci    t_in->psa_alg = alg;
1549a8e1175bSopenharmony_ci    t_out->psa_alg = alg;
1550a8e1175bSopenharmony_ci
1551a8e1175bSopenharmony_ci    if (alg != MBEDTLS_SSL_NULL_CIPHER) {
1552a8e1175bSopenharmony_ci        psa_reset_key_attributes(&attributes);
1553a8e1175bSopenharmony_ci        psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
1554a8e1175bSopenharmony_ci        psa_set_key_algorithm(&attributes, alg);
1555a8e1175bSopenharmony_ci        psa_set_key_type(&attributes, key_type);
1556a8e1175bSopenharmony_ci
1557a8e1175bSopenharmony_ci        status = psa_import_key(&attributes,
1558a8e1175bSopenharmony_ci                                key0,
1559a8e1175bSopenharmony_ci                                PSA_BITS_TO_BYTES(key_bits),
1560a8e1175bSopenharmony_ci                                &t_in->psa_key_enc);
1561a8e1175bSopenharmony_ci
1562a8e1175bSopenharmony_ci        if (status != PSA_SUCCESS) {
1563a8e1175bSopenharmony_ci            ret = PSA_TO_MBEDTLS_ERR(status);
1564a8e1175bSopenharmony_ci            goto cleanup;
1565a8e1175bSopenharmony_ci        }
1566a8e1175bSopenharmony_ci
1567a8e1175bSopenharmony_ci        status = psa_import_key(&attributes,
1568a8e1175bSopenharmony_ci                                key1,
1569a8e1175bSopenharmony_ci                                PSA_BITS_TO_BYTES(key_bits),
1570a8e1175bSopenharmony_ci                                &t_out->psa_key_enc);
1571a8e1175bSopenharmony_ci
1572a8e1175bSopenharmony_ci        if (status != PSA_SUCCESS) {
1573a8e1175bSopenharmony_ci            ret = PSA_TO_MBEDTLS_ERR(status);
1574a8e1175bSopenharmony_ci            goto cleanup;
1575a8e1175bSopenharmony_ci        }
1576a8e1175bSopenharmony_ci
1577a8e1175bSopenharmony_ci        psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
1578a8e1175bSopenharmony_ci
1579a8e1175bSopenharmony_ci        status = psa_import_key(&attributes,
1580a8e1175bSopenharmony_ci                                key1,
1581a8e1175bSopenharmony_ci                                PSA_BITS_TO_BYTES(key_bits),
1582a8e1175bSopenharmony_ci                                &t_in->psa_key_dec);
1583a8e1175bSopenharmony_ci
1584a8e1175bSopenharmony_ci        if (status != PSA_SUCCESS) {
1585a8e1175bSopenharmony_ci            ret = PSA_TO_MBEDTLS_ERR(status);
1586a8e1175bSopenharmony_ci            goto cleanup;
1587a8e1175bSopenharmony_ci        }
1588a8e1175bSopenharmony_ci
1589a8e1175bSopenharmony_ci        status = psa_import_key(&attributes,
1590a8e1175bSopenharmony_ci                                key0,
1591a8e1175bSopenharmony_ci                                PSA_BITS_TO_BYTES(key_bits),
1592a8e1175bSopenharmony_ci                                &t_out->psa_key_dec);
1593a8e1175bSopenharmony_ci
1594a8e1175bSopenharmony_ci        if (status != PSA_SUCCESS) {
1595a8e1175bSopenharmony_ci            ret = PSA_TO_MBEDTLS_ERR(status);
1596a8e1175bSopenharmony_ci            goto cleanup;
1597a8e1175bSopenharmony_ci        }
1598a8e1175bSopenharmony_ci    }
1599a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */
1600a8e1175bSopenharmony_ci
1601a8e1175bSopenharmony_cicleanup:
1602a8e1175bSopenharmony_ci
1603a8e1175bSopenharmony_ci    mbedtls_free(key0);
1604a8e1175bSopenharmony_ci    mbedtls_free(key1);
1605a8e1175bSopenharmony_ci
1606a8e1175bSopenharmony_ci    mbedtls_free(md0);
1607a8e1175bSopenharmony_ci    mbedtls_free(md1);
1608a8e1175bSopenharmony_ci
1609a8e1175bSopenharmony_ci    return ret;
1610a8e1175bSopenharmony_ci}
1611a8e1175bSopenharmony_ci
1612a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1613a8e1175bSopenharmony_ciint mbedtls_test_ssl_prepare_record_mac(mbedtls_record *record,
1614a8e1175bSopenharmony_ci                                        mbedtls_ssl_transform *transform_out)
1615a8e1175bSopenharmony_ci{
1616a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1617a8e1175bSopenharmony_ci    psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
1618a8e1175bSopenharmony_ci#endif
1619a8e1175bSopenharmony_ci
1620a8e1175bSopenharmony_ci    /* Serialized version of record header for MAC purposes */
1621a8e1175bSopenharmony_ci    unsigned char add_data[13];
1622a8e1175bSopenharmony_ci    memcpy(add_data, record->ctr, 8);
1623a8e1175bSopenharmony_ci    add_data[8] = record->type;
1624a8e1175bSopenharmony_ci    add_data[9] = record->ver[0];
1625a8e1175bSopenharmony_ci    add_data[10] = record->ver[1];
1626a8e1175bSopenharmony_ci    add_data[11] = (record->data_len >> 8) & 0xff;
1627a8e1175bSopenharmony_ci    add_data[12] = (record->data_len >> 0) & 0xff;
1628a8e1175bSopenharmony_ci
1629a8e1175bSopenharmony_ci    /* MAC with additional data */
1630a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1631a8e1175bSopenharmony_ci    size_t sign_mac_length = 0;
1632a8e1175bSopenharmony_ci    TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_setup(&operation,
1633a8e1175bSopenharmony_ci                                               transform_out->psa_mac_enc,
1634a8e1175bSopenharmony_ci                                               transform_out->psa_mac_alg));
1635a8e1175bSopenharmony_ci    TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation, add_data, 13));
1636a8e1175bSopenharmony_ci    TEST_EQUAL(PSA_SUCCESS, psa_mac_update(&operation,
1637a8e1175bSopenharmony_ci                                           record->buf + record->data_offset,
1638a8e1175bSopenharmony_ci                                           record->data_len));
1639a8e1175bSopenharmony_ci    /* Use a temporary buffer for the MAC, because with the truncated HMAC
1640a8e1175bSopenharmony_ci     * extension, there might not be enough room in the record for the
1641a8e1175bSopenharmony_ci     * full-length MAC. */
1642a8e1175bSopenharmony_ci    unsigned char mac[PSA_HASH_MAX_SIZE];
1643a8e1175bSopenharmony_ci    TEST_EQUAL(PSA_SUCCESS, psa_mac_sign_finish(&operation,
1644a8e1175bSopenharmony_ci                                                mac, sizeof(mac),
1645a8e1175bSopenharmony_ci                                                &sign_mac_length));
1646a8e1175bSopenharmony_ci#else
1647a8e1175bSopenharmony_ci    TEST_EQUAL(0, mbedtls_md_hmac_update(&transform_out->md_ctx_enc, add_data, 13));
1648a8e1175bSopenharmony_ci    TEST_EQUAL(0, mbedtls_md_hmac_update(&transform_out->md_ctx_enc,
1649a8e1175bSopenharmony_ci                                         record->buf + record->data_offset,
1650a8e1175bSopenharmony_ci                                         record->data_len));
1651a8e1175bSopenharmony_ci    /* Use a temporary buffer for the MAC, because with the truncated HMAC
1652a8e1175bSopenharmony_ci     * extension, there might not be enough room in the record for the
1653a8e1175bSopenharmony_ci     * full-length MAC. */
1654a8e1175bSopenharmony_ci    unsigned char mac[MBEDTLS_MD_MAX_SIZE];
1655a8e1175bSopenharmony_ci    TEST_EQUAL(0, mbedtls_md_hmac_finish(&transform_out->md_ctx_enc, mac));
1656a8e1175bSopenharmony_ci#endif
1657a8e1175bSopenharmony_ci    memcpy(record->buf + record->data_offset + record->data_len, mac, transform_out->maclen);
1658a8e1175bSopenharmony_ci    record->data_len += transform_out->maclen;
1659a8e1175bSopenharmony_ci
1660a8e1175bSopenharmony_ci    return 0;
1661a8e1175bSopenharmony_ci
1662a8e1175bSopenharmony_ciexit:
1663a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1664a8e1175bSopenharmony_ci    psa_mac_abort(&operation);
1665a8e1175bSopenharmony_ci#endif
1666a8e1175bSopenharmony_ci    return -1;
1667a8e1175bSopenharmony_ci}
1668a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
1669a8e1175bSopenharmony_ci
1670a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1671a8e1175bSopenharmony_ciint mbedtls_test_ssl_tls12_populate_session(mbedtls_ssl_session *session,
1672a8e1175bSopenharmony_ci                                            int ticket_len,
1673a8e1175bSopenharmony_ci                                            int endpoint_type,
1674a8e1175bSopenharmony_ci                                            const char *crt_file)
1675a8e1175bSopenharmony_ci{
1676a8e1175bSopenharmony_ci    (void) ticket_len;
1677a8e1175bSopenharmony_ci
1678a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME)
1679a8e1175bSopenharmony_ci    session->start = mbedtls_time(NULL) - 42;
1680a8e1175bSopenharmony_ci#endif
1681a8e1175bSopenharmony_ci    session->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
1682a8e1175bSopenharmony_ci
1683a8e1175bSopenharmony_ci    TEST_ASSERT(endpoint_type == MBEDTLS_SSL_IS_CLIENT ||
1684a8e1175bSopenharmony_ci                endpoint_type == MBEDTLS_SSL_IS_SERVER);
1685a8e1175bSopenharmony_ci
1686a8e1175bSopenharmony_ci    session->endpoint = endpoint_type;
1687a8e1175bSopenharmony_ci    session->ciphersuite = 0xabcd;
1688a8e1175bSopenharmony_ci    session->id_len = sizeof(session->id);
1689a8e1175bSopenharmony_ci    memset(session->id, 66, session->id_len);
1690a8e1175bSopenharmony_ci    memset(session->master, 17, sizeof(session->master));
1691a8e1175bSopenharmony_ci
1692a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) && defined(MBEDTLS_FS_IO)
1693a8e1175bSopenharmony_ci    if (crt_file != NULL && strlen(crt_file) != 0) {
1694a8e1175bSopenharmony_ci        mbedtls_x509_crt tmp_crt;
1695a8e1175bSopenharmony_ci        int ret;
1696a8e1175bSopenharmony_ci
1697a8e1175bSopenharmony_ci        mbedtls_x509_crt_init(&tmp_crt);
1698a8e1175bSopenharmony_ci        ret = mbedtls_x509_crt_parse_file(&tmp_crt, crt_file);
1699a8e1175bSopenharmony_ci        if (ret != 0) {
1700a8e1175bSopenharmony_ci            return ret;
1701a8e1175bSopenharmony_ci        }
1702a8e1175bSopenharmony_ci
1703a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1704a8e1175bSopenharmony_ci        /* Move temporary CRT. */
1705a8e1175bSopenharmony_ci        session->peer_cert = mbedtls_calloc(1, sizeof(*session->peer_cert));
1706a8e1175bSopenharmony_ci        if (session->peer_cert == NULL) {
1707a8e1175bSopenharmony_ci            return -1;
1708a8e1175bSopenharmony_ci        }
1709a8e1175bSopenharmony_ci        *session->peer_cert = tmp_crt;
1710a8e1175bSopenharmony_ci        memset(&tmp_crt, 0, sizeof(tmp_crt));
1711a8e1175bSopenharmony_ci#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1712a8e1175bSopenharmony_ci        /* Calculate digest of temporary CRT. */
1713a8e1175bSopenharmony_ci        session->peer_cert_digest =
1714a8e1175bSopenharmony_ci            mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN);
1715a8e1175bSopenharmony_ci        if (session->peer_cert_digest == NULL) {
1716a8e1175bSopenharmony_ci            return -1;
1717a8e1175bSopenharmony_ci        }
1718a8e1175bSopenharmony_ci
1719a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO)
1720a8e1175bSopenharmony_ci        psa_algorithm_t psa_alg = mbedtls_md_psa_alg_from_type(
1721a8e1175bSopenharmony_ci            MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE);
1722a8e1175bSopenharmony_ci        size_t hash_size = 0;
1723a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_compute(
1724a8e1175bSopenharmony_ci            psa_alg, tmp_crt.raw.p,
1725a8e1175bSopenharmony_ci            tmp_crt.raw.len,
1726a8e1175bSopenharmony_ci            session->peer_cert_digest,
1727a8e1175bSopenharmony_ci            MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN,
1728a8e1175bSopenharmony_ci            &hash_size);
1729a8e1175bSopenharmony_ci        ret = PSA_TO_MBEDTLS_ERR(status);
1730a8e1175bSopenharmony_ci#else
1731a8e1175bSopenharmony_ci        ret = mbedtls_md(mbedtls_md_info_from_type(
1732a8e1175bSopenharmony_ci                             MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE),
1733a8e1175bSopenharmony_ci                         tmp_crt.raw.p, tmp_crt.raw.len,
1734a8e1175bSopenharmony_ci                         session->peer_cert_digest);
1735a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */
1736a8e1175bSopenharmony_ci        if (ret != 0) {
1737a8e1175bSopenharmony_ci            return ret;
1738a8e1175bSopenharmony_ci        }
1739a8e1175bSopenharmony_ci        session->peer_cert_digest_type =
1740a8e1175bSopenharmony_ci            MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
1741a8e1175bSopenharmony_ci        session->peer_cert_digest_len =
1742a8e1175bSopenharmony_ci            MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
1743a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1744a8e1175bSopenharmony_ci
1745a8e1175bSopenharmony_ci        mbedtls_x509_crt_free(&tmp_crt);
1746a8e1175bSopenharmony_ci    }
1747a8e1175bSopenharmony_ci#else /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED && MBEDTLS_FS_IO */
1748a8e1175bSopenharmony_ci    (void) crt_file;
1749a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED && MBEDTLS_FS_IO */
1750a8e1175bSopenharmony_ci    session->verify_result = 0xdeadbeef;
1751a8e1175bSopenharmony_ci
1752a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1753a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CLI_C)
1754a8e1175bSopenharmony_ci    if (ticket_len != 0) {
1755a8e1175bSopenharmony_ci        session->ticket = mbedtls_calloc(1, ticket_len);
1756a8e1175bSopenharmony_ci        if (session->ticket == NULL) {
1757a8e1175bSopenharmony_ci            return -1;
1758a8e1175bSopenharmony_ci        }
1759a8e1175bSopenharmony_ci        memset(session->ticket, 33, ticket_len);
1760a8e1175bSopenharmony_ci    }
1761a8e1175bSopenharmony_ci    session->ticket_len = ticket_len;
1762a8e1175bSopenharmony_ci    session->ticket_lifetime = 86401;
1763a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_CLI_C */
1764a8e1175bSopenharmony_ci
1765a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_HAVE_TIME)
1766a8e1175bSopenharmony_ci    if (session->endpoint == MBEDTLS_SSL_IS_SERVER) {
1767a8e1175bSopenharmony_ci        session->ticket_creation_time = mbedtls_ms_time() - 42;
1768a8e1175bSopenharmony_ci    }
1769a8e1175bSopenharmony_ci#endif
1770a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SESSION_TICKETS */
1771a8e1175bSopenharmony_ci
1772a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1773a8e1175bSopenharmony_ci    session->mfl_code = 1;
1774a8e1175bSopenharmony_ci#endif
1775a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1776a8e1175bSopenharmony_ci    session->encrypt_then_mac = 1;
1777a8e1175bSopenharmony_ci#endif
1778a8e1175bSopenharmony_ci
1779a8e1175bSopenharmony_ciexit:
1780a8e1175bSopenharmony_ci    return 0;
1781a8e1175bSopenharmony_ci}
1782a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1783a8e1175bSopenharmony_ci
1784a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1785a8e1175bSopenharmony_ciint mbedtls_test_ssl_tls13_populate_session(mbedtls_ssl_session *session,
1786a8e1175bSopenharmony_ci                                            int ticket_len,
1787a8e1175bSopenharmony_ci                                            int endpoint_type)
1788a8e1175bSopenharmony_ci{
1789a8e1175bSopenharmony_ci    ((void) ticket_len);
1790a8e1175bSopenharmony_ci    session->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
1791a8e1175bSopenharmony_ci    session->endpoint = endpoint_type == MBEDTLS_SSL_IS_CLIENT ?
1792a8e1175bSopenharmony_ci                        MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER;
1793a8e1175bSopenharmony_ci    session->ciphersuite = 0xabcd;
1794a8e1175bSopenharmony_ci    session->ticket_age_add = 0x87654321;
1795a8e1175bSopenharmony_ci    session->ticket_flags = 0x7;
1796a8e1175bSopenharmony_ci
1797a8e1175bSopenharmony_ci    session->resumption_key_len = 32;
1798a8e1175bSopenharmony_ci    memset(session->resumption_key, 0x99, sizeof(session->resumption_key));
1799a8e1175bSopenharmony_ci
1800a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_EARLY_DATA)
1801a8e1175bSopenharmony_ci    session->max_early_data_size = 0x87654321;
1802a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_ALPN) && defined(MBEDTLS_SSL_SRV_C)
1803a8e1175bSopenharmony_ci    int ret = mbedtls_ssl_session_set_ticket_alpn(session, "ALPNExample");
1804a8e1175bSopenharmony_ci    if (ret != 0) {
1805a8e1175bSopenharmony_ci        return -1;
1806a8e1175bSopenharmony_ci    }
1807a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_ALPN && MBEDTLS_SSL_SRV_C */
1808a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_EARLY_DATA */
1809a8e1175bSopenharmony_ci
1810a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
1811a8e1175bSopenharmony_ci    if (session->endpoint == MBEDTLS_SSL_IS_SERVER) {
1812a8e1175bSopenharmony_ci        session->ticket_creation_time = mbedtls_ms_time() - 42;
1813a8e1175bSopenharmony_ci    }
1814a8e1175bSopenharmony_ci#endif
1815a8e1175bSopenharmony_ci
1816a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CLI_C)
1817a8e1175bSopenharmony_ci    if (session->endpoint == MBEDTLS_SSL_IS_CLIENT) {
1818a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME)
1819a8e1175bSopenharmony_ci        session->ticket_reception_time = mbedtls_ms_time() - 40;
1820a8e1175bSopenharmony_ci#endif
1821a8e1175bSopenharmony_ci        session->ticket_lifetime = 0xfedcba98;
1822a8e1175bSopenharmony_ci
1823a8e1175bSopenharmony_ci        session->ticket_len = ticket_len;
1824a8e1175bSopenharmony_ci        if (ticket_len != 0) {
1825a8e1175bSopenharmony_ci            session->ticket = mbedtls_calloc(1, ticket_len);
1826a8e1175bSopenharmony_ci            if (session->ticket == NULL) {
1827a8e1175bSopenharmony_ci                return -1;
1828a8e1175bSopenharmony_ci            }
1829a8e1175bSopenharmony_ci            memset(session->ticket, 33, ticket_len);
1830a8e1175bSopenharmony_ci        }
1831a8e1175bSopenharmony_ci    }
1832a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_CLI_C */
1833a8e1175bSopenharmony_ci
1834a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
1835a8e1175bSopenharmony_ci    session->record_size_limit = 2048;
1836a8e1175bSopenharmony_ci#endif
1837a8e1175bSopenharmony_ci
1838a8e1175bSopenharmony_ci    return 0;
1839a8e1175bSopenharmony_ci}
1840a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
1841a8e1175bSopenharmony_ci
1842a8e1175bSopenharmony_ciint mbedtls_test_ssl_exchange_data(
1843a8e1175bSopenharmony_ci    mbedtls_ssl_context *ssl_1,
1844a8e1175bSopenharmony_ci    int msg_len_1, const int expected_fragments_1,
1845a8e1175bSopenharmony_ci    mbedtls_ssl_context *ssl_2,
1846a8e1175bSopenharmony_ci    int msg_len_2, const int expected_fragments_2)
1847a8e1175bSopenharmony_ci{
1848a8e1175bSopenharmony_ci    unsigned char *msg_buf_1 = malloc(msg_len_1);
1849a8e1175bSopenharmony_ci    unsigned char *msg_buf_2 = malloc(msg_len_2);
1850a8e1175bSopenharmony_ci    unsigned char *in_buf_1  = malloc(msg_len_2);
1851a8e1175bSopenharmony_ci    unsigned char *in_buf_2  = malloc(msg_len_1);
1852a8e1175bSopenharmony_ci    int msg_type, ret = -1;
1853a8e1175bSopenharmony_ci
1854a8e1175bSopenharmony_ci    /* Perform this test with two message types. At first use a message
1855a8e1175bSopenharmony_ci     * consisting of only 0x00 for the client and only 0xFF for the server.
1856a8e1175bSopenharmony_ci     * At the second time use message with generated data */
1857a8e1175bSopenharmony_ci    for (msg_type = 0; msg_type < 2; msg_type++) {
1858a8e1175bSopenharmony_ci        int written_1 = 0;
1859a8e1175bSopenharmony_ci        int written_2 = 0;
1860a8e1175bSopenharmony_ci        int read_1 = 0;
1861a8e1175bSopenharmony_ci        int read_2 = 0;
1862a8e1175bSopenharmony_ci        int fragments_1 = 0;
1863a8e1175bSopenharmony_ci        int fragments_2 = 0;
1864a8e1175bSopenharmony_ci
1865a8e1175bSopenharmony_ci        if (msg_type == 0) {
1866a8e1175bSopenharmony_ci            memset(msg_buf_1, 0x00, msg_len_1);
1867a8e1175bSopenharmony_ci            memset(msg_buf_2, 0xff, msg_len_2);
1868a8e1175bSopenharmony_ci        } else {
1869a8e1175bSopenharmony_ci            int i, j = 0;
1870a8e1175bSopenharmony_ci            for (i = 0; i < msg_len_1; i++) {
1871a8e1175bSopenharmony_ci                msg_buf_1[i] = j++ & 0xFF;
1872a8e1175bSopenharmony_ci            }
1873a8e1175bSopenharmony_ci            for (i = 0; i < msg_len_2; i++) {
1874a8e1175bSopenharmony_ci                msg_buf_2[i] = (j -= 5) & 0xFF;
1875a8e1175bSopenharmony_ci            }
1876a8e1175bSopenharmony_ci        }
1877a8e1175bSopenharmony_ci
1878a8e1175bSopenharmony_ci        while (read_1 < msg_len_2 || read_2 < msg_len_1) {
1879a8e1175bSopenharmony_ci            /* ssl_1 sending */
1880a8e1175bSopenharmony_ci            if (msg_len_1 > written_1) {
1881a8e1175bSopenharmony_ci                ret = mbedtls_ssl_write_fragment(ssl_1, msg_buf_1,
1882a8e1175bSopenharmony_ci                                                 msg_len_1, &written_1,
1883a8e1175bSopenharmony_ci                                                 expected_fragments_1);
1884a8e1175bSopenharmony_ci                if (expected_fragments_1 == 0) {
1885a8e1175bSopenharmony_ci                    /* This error is expected when the message is too large and
1886a8e1175bSopenharmony_ci                     * cannot be fragmented */
1887a8e1175bSopenharmony_ci                    TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
1888a8e1175bSopenharmony_ci                    msg_len_1 = 0;
1889a8e1175bSopenharmony_ci                } else {
1890a8e1175bSopenharmony_ci                    TEST_ASSERT(ret == 0);
1891a8e1175bSopenharmony_ci                }
1892a8e1175bSopenharmony_ci            }
1893a8e1175bSopenharmony_ci
1894a8e1175bSopenharmony_ci            /* ssl_2 sending */
1895a8e1175bSopenharmony_ci            if (msg_len_2 > written_2) {
1896a8e1175bSopenharmony_ci                ret = mbedtls_ssl_write_fragment(ssl_2, msg_buf_2,
1897a8e1175bSopenharmony_ci                                                 msg_len_2, &written_2,
1898a8e1175bSopenharmony_ci                                                 expected_fragments_2);
1899a8e1175bSopenharmony_ci                if (expected_fragments_2 == 0) {
1900a8e1175bSopenharmony_ci                    /* This error is expected when the message is too large and
1901a8e1175bSopenharmony_ci                     * cannot be fragmented */
1902a8e1175bSopenharmony_ci                    TEST_ASSERT(ret == MBEDTLS_ERR_SSL_BAD_INPUT_DATA);
1903a8e1175bSopenharmony_ci                    msg_len_2 = 0;
1904a8e1175bSopenharmony_ci                } else {
1905a8e1175bSopenharmony_ci                    TEST_ASSERT(ret == 0);
1906a8e1175bSopenharmony_ci                }
1907a8e1175bSopenharmony_ci            }
1908a8e1175bSopenharmony_ci
1909a8e1175bSopenharmony_ci            /* ssl_1 reading */
1910a8e1175bSopenharmony_ci            if (read_1 < msg_len_2) {
1911a8e1175bSopenharmony_ci                ret = mbedtls_ssl_read_fragment(ssl_1, in_buf_1,
1912a8e1175bSopenharmony_ci                                                msg_len_2, &read_1,
1913a8e1175bSopenharmony_ci                                                &fragments_2,
1914a8e1175bSopenharmony_ci                                                expected_fragments_2);
1915a8e1175bSopenharmony_ci                TEST_ASSERT(ret == 0);
1916a8e1175bSopenharmony_ci            }
1917a8e1175bSopenharmony_ci
1918a8e1175bSopenharmony_ci            /* ssl_2 reading */
1919a8e1175bSopenharmony_ci            if (read_2 < msg_len_1) {
1920a8e1175bSopenharmony_ci                ret = mbedtls_ssl_read_fragment(ssl_2, in_buf_2,
1921a8e1175bSopenharmony_ci                                                msg_len_1, &read_2,
1922a8e1175bSopenharmony_ci                                                &fragments_1,
1923a8e1175bSopenharmony_ci                                                expected_fragments_1);
1924a8e1175bSopenharmony_ci                TEST_ASSERT(ret == 0);
1925a8e1175bSopenharmony_ci            }
1926a8e1175bSopenharmony_ci        }
1927a8e1175bSopenharmony_ci
1928a8e1175bSopenharmony_ci        ret = -1;
1929a8e1175bSopenharmony_ci        TEST_ASSERT(0 == memcmp(msg_buf_1, in_buf_2, msg_len_1));
1930a8e1175bSopenharmony_ci        TEST_ASSERT(0 == memcmp(msg_buf_2, in_buf_1, msg_len_2));
1931a8e1175bSopenharmony_ci        TEST_ASSERT(fragments_1 == expected_fragments_1);
1932a8e1175bSopenharmony_ci        TEST_ASSERT(fragments_2 == expected_fragments_2);
1933a8e1175bSopenharmony_ci    }
1934a8e1175bSopenharmony_ci
1935a8e1175bSopenharmony_ci    ret = 0;
1936a8e1175bSopenharmony_ci
1937a8e1175bSopenharmony_ciexit:
1938a8e1175bSopenharmony_ci    free(msg_buf_1);
1939a8e1175bSopenharmony_ci    free(in_buf_1);
1940a8e1175bSopenharmony_ci    free(msg_buf_2);
1941a8e1175bSopenharmony_ci    free(in_buf_2);
1942a8e1175bSopenharmony_ci
1943a8e1175bSopenharmony_ci    return ret;
1944a8e1175bSopenharmony_ci}
1945a8e1175bSopenharmony_ci
1946a8e1175bSopenharmony_ci/*
1947a8e1175bSopenharmony_ci * Perform data exchanging between \p ssl_1 and \p ssl_2. Both of endpoints
1948a8e1175bSopenharmony_ci * must be initialized and connected beforehand.
1949a8e1175bSopenharmony_ci *
1950a8e1175bSopenharmony_ci * \retval  0 on success, otherwise error code.
1951a8e1175bSopenharmony_ci */
1952a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED) && \
1953a8e1175bSopenharmony_ci    (defined(MBEDTLS_SSL_RENEGOTIATION)              || \
1954a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH))
1955a8e1175bSopenharmony_cistatic int exchange_data(mbedtls_ssl_context *ssl_1,
1956a8e1175bSopenharmony_ci                         mbedtls_ssl_context *ssl_2)
1957a8e1175bSopenharmony_ci{
1958a8e1175bSopenharmony_ci    return mbedtls_test_ssl_exchange_data(ssl_1, 256, 1,
1959a8e1175bSopenharmony_ci                                          ssl_2, 256, 1);
1960a8e1175bSopenharmony_ci}
1961a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED &&
1962a8e1175bSopenharmony_ci          (MBEDTLS_SSL_RENEGOTIATION              ||
1963a8e1175bSopenharmony_ci          MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH) */
1964a8e1175bSopenharmony_ci
1965a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
1966a8e1175bSopenharmony_cistatic int check_ssl_version(
1967a8e1175bSopenharmony_ci    mbedtls_ssl_protocol_version expected_negotiated_version,
1968a8e1175bSopenharmony_ci    const mbedtls_ssl_context *ssl)
1969a8e1175bSopenharmony_ci{
1970a8e1175bSopenharmony_ci    const char *version_string = mbedtls_ssl_get_version(ssl);
1971a8e1175bSopenharmony_ci    mbedtls_ssl_protocol_version version_number =
1972a8e1175bSopenharmony_ci        mbedtls_ssl_get_version_number(ssl);
1973a8e1175bSopenharmony_ci
1974a8e1175bSopenharmony_ci    TEST_EQUAL(ssl->tls_version, expected_negotiated_version);
1975a8e1175bSopenharmony_ci
1976a8e1175bSopenharmony_ci    if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1977a8e1175bSopenharmony_ci        TEST_EQUAL(version_string[0], 'D');
1978a8e1175bSopenharmony_ci        ++version_string;
1979a8e1175bSopenharmony_ci    }
1980a8e1175bSopenharmony_ci
1981a8e1175bSopenharmony_ci    switch (expected_negotiated_version) {
1982a8e1175bSopenharmony_ci        case MBEDTLS_SSL_VERSION_TLS1_2:
1983a8e1175bSopenharmony_ci            TEST_EQUAL(version_number, MBEDTLS_SSL_VERSION_TLS1_2);
1984a8e1175bSopenharmony_ci            TEST_ASSERT(strcmp(version_string, "TLSv1.2") == 0);
1985a8e1175bSopenharmony_ci            break;
1986a8e1175bSopenharmony_ci
1987a8e1175bSopenharmony_ci        case MBEDTLS_SSL_VERSION_TLS1_3:
1988a8e1175bSopenharmony_ci            TEST_EQUAL(version_number, MBEDTLS_SSL_VERSION_TLS1_3);
1989a8e1175bSopenharmony_ci            TEST_ASSERT(strcmp(version_string, "TLSv1.3") == 0);
1990a8e1175bSopenharmony_ci            break;
1991a8e1175bSopenharmony_ci
1992a8e1175bSopenharmony_ci        default:
1993a8e1175bSopenharmony_ci            TEST_FAIL(
1994a8e1175bSopenharmony_ci                "Version check not implemented for this protocol version");
1995a8e1175bSopenharmony_ci    }
1996a8e1175bSopenharmony_ci
1997a8e1175bSopenharmony_ci    return 1;
1998a8e1175bSopenharmony_ci
1999a8e1175bSopenharmony_ciexit:
2000a8e1175bSopenharmony_ci    return 0;
2001a8e1175bSopenharmony_ci}
2002a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2003a8e1175bSopenharmony_ci
2004a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2005a8e1175bSopenharmony_civoid mbedtls_test_ssl_perform_handshake(
2006a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *options)
2007a8e1175bSopenharmony_ci{
2008a8e1175bSopenharmony_ci    /* forced_ciphersuite needs to last until the end of the handshake */
2009a8e1175bSopenharmony_ci    int forced_ciphersuite[2];
2010a8e1175bSopenharmony_ci    enum { BUFFSIZE = 17000 };
2011a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint client, server;
2012a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
2013a8e1175bSopenharmony_ci    const char *psk_identity = "foo";
2014a8e1175bSopenharmony_ci#endif
2015a8e1175bSopenharmony_ci#if defined(MBEDTLS_TIMING_C)
2016a8e1175bSopenharmony_ci    mbedtls_timing_delay_context timer_client, timer_server;
2017a8e1175bSopenharmony_ci#endif
2018a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2019a8e1175bSopenharmony_ci    unsigned char *context_buf = NULL;
2020a8e1175bSopenharmony_ci    size_t context_buf_len;
2021a8e1175bSopenharmony_ci#endif
2022a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION)
2023a8e1175bSopenharmony_ci    int ret = -1;
2024a8e1175bSopenharmony_ci#endif
2025a8e1175bSopenharmony_ci    int expected_handshake_result = options->expected_handshake_result;
2026a8e1175bSopenharmony_ci
2027a8e1175bSopenharmony_ci    MD_OR_USE_PSA_INIT();
2028a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(&client, sizeof(client));
2029a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(&server, sizeof(server));
2030a8e1175bSopenharmony_ci    mbedtls_test_ssl_message_queue server_queue, client_queue;
2031a8e1175bSopenharmony_ci    mbedtls_test_message_socket_context server_context, client_context;
2032a8e1175bSopenharmony_ci    mbedtls_test_message_socket_init(&server_context);
2033a8e1175bSopenharmony_ci    mbedtls_test_message_socket_init(&client_context);
2034a8e1175bSopenharmony_ci
2035a8e1175bSopenharmony_ci#if defined(MBEDTLS_DEBUG_C)
2036a8e1175bSopenharmony_ci    if (options->cli_log_fun || options->srv_log_fun) {
2037a8e1175bSopenharmony_ci        mbedtls_debug_set_threshold(4);
2038a8e1175bSopenharmony_ci    }
2039a8e1175bSopenharmony_ci#endif
2040a8e1175bSopenharmony_ci
2041a8e1175bSopenharmony_ci    /* Client side */
2042a8e1175bSopenharmony_ci    if (options->dtls != 0) {
2043a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client,
2044a8e1175bSopenharmony_ci                                                   MBEDTLS_SSL_IS_CLIENT,
2045a8e1175bSopenharmony_ci                                                   options, &client_context,
2046a8e1175bSopenharmony_ci                                                   &client_queue,
2047a8e1175bSopenharmony_ci                                                   &server_queue) == 0);
2048a8e1175bSopenharmony_ci#if defined(MBEDTLS_TIMING_C)
2049a8e1175bSopenharmony_ci        mbedtls_ssl_set_timer_cb(&client.ssl, &timer_client,
2050a8e1175bSopenharmony_ci                                 mbedtls_timing_set_delay,
2051a8e1175bSopenharmony_ci                                 mbedtls_timing_get_delay);
2052a8e1175bSopenharmony_ci#endif
2053a8e1175bSopenharmony_ci    } else {
2054a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&client,
2055a8e1175bSopenharmony_ci                                                   MBEDTLS_SSL_IS_CLIENT,
2056a8e1175bSopenharmony_ci                                                   options, NULL, NULL,
2057a8e1175bSopenharmony_ci                                                   NULL) == 0);
2058a8e1175bSopenharmony_ci    }
2059a8e1175bSopenharmony_ci
2060a8e1175bSopenharmony_ci    if (strlen(options->cipher) > 0) {
2061a8e1175bSopenharmony_ci        set_ciphersuite(&client.conf, options->cipher, forced_ciphersuite);
2062a8e1175bSopenharmony_ci    }
2063a8e1175bSopenharmony_ci
2064a8e1175bSopenharmony_ci    /* Server side */
2065a8e1175bSopenharmony_ci    if (options->dtls != 0) {
2066a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server,
2067a8e1175bSopenharmony_ci                                                   MBEDTLS_SSL_IS_SERVER,
2068a8e1175bSopenharmony_ci                                                   options, &server_context,
2069a8e1175bSopenharmony_ci                                                   &server_queue,
2070a8e1175bSopenharmony_ci                                                   &client_queue) == 0);
2071a8e1175bSopenharmony_ci#if defined(MBEDTLS_TIMING_C)
2072a8e1175bSopenharmony_ci        mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
2073a8e1175bSopenharmony_ci                                 mbedtls_timing_set_delay,
2074a8e1175bSopenharmony_ci                                 mbedtls_timing_get_delay);
2075a8e1175bSopenharmony_ci#endif
2076a8e1175bSopenharmony_ci    } else {
2077a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_ssl_endpoint_init(&server,
2078a8e1175bSopenharmony_ci                                                   MBEDTLS_SSL_IS_SERVER,
2079a8e1175bSopenharmony_ci                                                   options, NULL, NULL,
2080a8e1175bSopenharmony_ci                                                   NULL) == 0);
2081a8e1175bSopenharmony_ci    }
2082a8e1175bSopenharmony_ci
2083a8e1175bSopenharmony_ci    mbedtls_ssl_conf_authmode(&server.conf, options->srv_auth_mode);
2084a8e1175bSopenharmony_ci
2085a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2086a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(server.conf),
2087a8e1175bSopenharmony_ci                                              (unsigned char) options->mfl)
2088a8e1175bSopenharmony_ci                == 0);
2089a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_conf_max_frag_len(&(client.conf),
2090a8e1175bSopenharmony_ci                                              (unsigned char) options->mfl)
2091a8e1175bSopenharmony_ci                == 0);
2092a8e1175bSopenharmony_ci#else
2093a8e1175bSopenharmony_ci    TEST_ASSERT(MBEDTLS_SSL_MAX_FRAG_LEN_NONE == options->mfl);
2094a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2095a8e1175bSopenharmony_ci
2096a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED)
2097a8e1175bSopenharmony_ci    if (options->psk_str != NULL && options->psk_str->len > 0) {
2098a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_conf_psk(
2099a8e1175bSopenharmony_ci                        &client.conf, options->psk_str->x,
2100a8e1175bSopenharmony_ci                        options->psk_str->len,
2101a8e1175bSopenharmony_ci                        (const unsigned char *) psk_identity,
2102a8e1175bSopenharmony_ci                        strlen(psk_identity)) == 0);
2103a8e1175bSopenharmony_ci
2104a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_conf_psk(
2105a8e1175bSopenharmony_ci                        &server.conf, options->psk_str->x,
2106a8e1175bSopenharmony_ci                        options->psk_str->len,
2107a8e1175bSopenharmony_ci                        (const unsigned char *) psk_identity,
2108a8e1175bSopenharmony_ci                        strlen(psk_identity)) == 0);
2109a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SRV_C)
2110a8e1175bSopenharmony_ci        mbedtls_ssl_conf_psk_cb(&server.conf, psk_dummy_callback, NULL);
2111a8e1175bSopenharmony_ci#endif
2112a8e1175bSopenharmony_ci    }
2113a8e1175bSopenharmony_ci#endif
2114a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION)
2115a8e1175bSopenharmony_ci    if (options->renegotiate) {
2116a8e1175bSopenharmony_ci        mbedtls_ssl_conf_renegotiation(&(server.conf),
2117a8e1175bSopenharmony_ci                                       MBEDTLS_SSL_RENEGOTIATION_ENABLED);
2118a8e1175bSopenharmony_ci        mbedtls_ssl_conf_renegotiation(&(client.conf),
2119a8e1175bSopenharmony_ci                                       MBEDTLS_SSL_RENEGOTIATION_ENABLED);
2120a8e1175bSopenharmony_ci
2121a8e1175bSopenharmony_ci        mbedtls_ssl_conf_legacy_renegotiation(&(server.conf),
2122a8e1175bSopenharmony_ci                                              options->legacy_renegotiation);
2123a8e1175bSopenharmony_ci        mbedtls_ssl_conf_legacy_renegotiation(&(client.conf),
2124a8e1175bSopenharmony_ci                                              options->legacy_renegotiation);
2125a8e1175bSopenharmony_ci    }
2126a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_RENEGOTIATION */
2127a8e1175bSopenharmony_ci
2128a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_mock_socket_connect(&(client.socket),
2129a8e1175bSopenharmony_ci                                                 &(server.socket),
2130a8e1175bSopenharmony_ci                                                 BUFFSIZE) == 0);
2131a8e1175bSopenharmony_ci
2132a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2133a8e1175bSopenharmony_ci    if (options->resize_buffers != 0) {
2134a8e1175bSopenharmony_ci        /* Ensure that the buffer sizes are appropriate before resizes */
2135a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2136a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
2137a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2138a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
2139a8e1175bSopenharmony_ci    }
2140a8e1175bSopenharmony_ci#endif
2141a8e1175bSopenharmony_ci
2142a8e1175bSopenharmony_ci    if (options->expected_negotiated_version == MBEDTLS_SSL_VERSION_UNKNOWN) {
2143a8e1175bSopenharmony_ci        expected_handshake_result = MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
2144a8e1175bSopenharmony_ci    }
2145a8e1175bSopenharmony_ci
2146a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_move_handshake_to_state(&(client.ssl),
2147a8e1175bSopenharmony_ci                                                     &(server.ssl),
2148a8e1175bSopenharmony_ci                                                     MBEDTLS_SSL_HANDSHAKE_OVER)
2149a8e1175bSopenharmony_ci                ==  expected_handshake_result);
2150a8e1175bSopenharmony_ci
2151a8e1175bSopenharmony_ci    if (expected_handshake_result != 0) {
2152a8e1175bSopenharmony_ci        /* Connection will have failed by this point, skip to cleanup */
2153a8e1175bSopenharmony_ci        goto exit;
2154a8e1175bSopenharmony_ci    }
2155a8e1175bSopenharmony_ci
2156a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_is_handshake_over(&client.ssl) == 1);
2157a8e1175bSopenharmony_ci
2158a8e1175bSopenharmony_ci    /* Make sure server state is moved to HANDSHAKE_OVER also. */
2159a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_move_handshake_to_state(&(server.ssl),
2160a8e1175bSopenharmony_ci                                                    &(client.ssl),
2161a8e1175bSopenharmony_ci                                                    MBEDTLS_SSL_HANDSHAKE_OVER),
2162a8e1175bSopenharmony_ci               0);
2163a8e1175bSopenharmony_ci
2164a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_is_handshake_over(&server.ssl) == 1);
2165a8e1175bSopenharmony_ci    /* Check that both sides have negotiated the expected version. */
2166a8e1175bSopenharmony_ci    mbedtls_test_set_step(0);
2167a8e1175bSopenharmony_ci    if (!check_ssl_version(options->expected_negotiated_version,
2168a8e1175bSopenharmony_ci                           &client.ssl)) {
2169a8e1175bSopenharmony_ci        goto exit;
2170a8e1175bSopenharmony_ci    }
2171a8e1175bSopenharmony_ci
2172a8e1175bSopenharmony_ci    mbedtls_test_set_step(1);
2173a8e1175bSopenharmony_ci    if (!check_ssl_version(options->expected_negotiated_version,
2174a8e1175bSopenharmony_ci                           &server.ssl)) {
2175a8e1175bSopenharmony_ci        goto exit;
2176a8e1175bSopenharmony_ci    }
2177a8e1175bSopenharmony_ci
2178a8e1175bSopenharmony_ci    if (options->expected_ciphersuite != 0) {
2179a8e1175bSopenharmony_ci        TEST_EQUAL(server.ssl.session->ciphersuite,
2180a8e1175bSopenharmony_ci                   options->expected_ciphersuite);
2181a8e1175bSopenharmony_ci    }
2182a8e1175bSopenharmony_ci
2183a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2184a8e1175bSopenharmony_ci    if (options->resize_buffers != 0) {
2185a8e1175bSopenharmony_ci        /* A server, when using DTLS, might delay a buffer resize to happen
2186a8e1175bSopenharmony_ci         * after it receives a message, so we force it. */
2187a8e1175bSopenharmony_ci        TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
2188a8e1175bSopenharmony_ci
2189a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.out_buf_len ==
2190a8e1175bSopenharmony_ci                    mbedtls_ssl_get_output_buflen(&client.ssl));
2191a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.in_buf_len ==
2192a8e1175bSopenharmony_ci                    mbedtls_ssl_get_input_buflen(&client.ssl));
2193a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.out_buf_len ==
2194a8e1175bSopenharmony_ci                    mbedtls_ssl_get_output_buflen(&server.ssl));
2195a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.in_buf_len ==
2196a8e1175bSopenharmony_ci                    mbedtls_ssl_get_input_buflen(&server.ssl));
2197a8e1175bSopenharmony_ci    }
2198a8e1175bSopenharmony_ci#endif
2199a8e1175bSopenharmony_ci
2200a8e1175bSopenharmony_ci    if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
2201a8e1175bSopenharmony_ci        /* Start data exchanging test */
2202a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_ssl_exchange_data(
2203a8e1175bSopenharmony_ci                        &(client.ssl), options->cli_msg_len,
2204a8e1175bSopenharmony_ci                        options->expected_cli_fragments,
2205a8e1175bSopenharmony_ci                        &(server.ssl), options->srv_msg_len,
2206a8e1175bSopenharmony_ci                        options->expected_srv_fragments)
2207a8e1175bSopenharmony_ci                    == 0);
2208a8e1175bSopenharmony_ci    }
2209a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2210a8e1175bSopenharmony_ci    if (options->serialize == 1) {
2211a8e1175bSopenharmony_ci        TEST_ASSERT(options->dtls == 1);
2212a8e1175bSopenharmony_ci
2213a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), NULL,
2214a8e1175bSopenharmony_ci                                             0, &context_buf_len)
2215a8e1175bSopenharmony_ci                    == MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
2216a8e1175bSopenharmony_ci
2217a8e1175bSopenharmony_ci        context_buf = mbedtls_calloc(1, context_buf_len);
2218a8e1175bSopenharmony_ci        TEST_ASSERT(context_buf != NULL);
2219a8e1175bSopenharmony_ci
2220a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_context_save(&(server.ssl), context_buf,
2221a8e1175bSopenharmony_ci                                             context_buf_len,
2222a8e1175bSopenharmony_ci                                             &context_buf_len)
2223a8e1175bSopenharmony_ci                    == 0);
2224a8e1175bSopenharmony_ci
2225a8e1175bSopenharmony_ci        mbedtls_ssl_free(&(server.ssl));
2226a8e1175bSopenharmony_ci        mbedtls_ssl_init(&(server.ssl));
2227a8e1175bSopenharmony_ci
2228a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_setup(&(server.ssl), &(server.conf)) == 0);
2229a8e1175bSopenharmony_ci
2230a8e1175bSopenharmony_ci        mbedtls_ssl_set_bio(&(server.ssl), &server_context,
2231a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_send_msg,
2232a8e1175bSopenharmony_ci                            mbedtls_test_mock_tcp_recv_msg,
2233a8e1175bSopenharmony_ci                            NULL);
2234a8e1175bSopenharmony_ci
2235a8e1175bSopenharmony_ci        mbedtls_ssl_set_user_data_p(&server.ssl, &server);
2236a8e1175bSopenharmony_ci
2237a8e1175bSopenharmony_ci#if defined(MBEDTLS_TIMING_C)
2238a8e1175bSopenharmony_ci        mbedtls_ssl_set_timer_cb(&server.ssl, &timer_server,
2239a8e1175bSopenharmony_ci                                 mbedtls_timing_set_delay,
2240a8e1175bSopenharmony_ci                                 mbedtls_timing_get_delay);
2241a8e1175bSopenharmony_ci#endif
2242a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2243a8e1175bSopenharmony_ci        if (options->resize_buffers != 0) {
2244a8e1175bSopenharmony_ci            /* Ensure that the buffer sizes are appropriate before resizes */
2245a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2246a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
2247a8e1175bSopenharmony_ci        }
2248a8e1175bSopenharmony_ci#endif
2249a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_context_load(&(server.ssl), context_buf,
2250a8e1175bSopenharmony_ci                                             context_buf_len) == 0);
2251a8e1175bSopenharmony_ci
2252a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2253a8e1175bSopenharmony_ci        /* Validate buffer sizes after context deserialization */
2254a8e1175bSopenharmony_ci        if (options->resize_buffers != 0) {
2255a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.out_buf_len ==
2256a8e1175bSopenharmony_ci                        mbedtls_ssl_get_output_buflen(&server.ssl));
2257a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.in_buf_len ==
2258a8e1175bSopenharmony_ci                        mbedtls_ssl_get_input_buflen(&server.ssl));
2259a8e1175bSopenharmony_ci        }
2260a8e1175bSopenharmony_ci#endif
2261a8e1175bSopenharmony_ci        /* Retest writing/reading */
2262a8e1175bSopenharmony_ci        if (options->cli_msg_len != 0 || options->srv_msg_len != 0) {
2263a8e1175bSopenharmony_ci            TEST_ASSERT(mbedtls_test_ssl_exchange_data(
2264a8e1175bSopenharmony_ci                            &(client.ssl), options->cli_msg_len,
2265a8e1175bSopenharmony_ci                            options->expected_cli_fragments,
2266a8e1175bSopenharmony_ci                            &(server.ssl), options->srv_msg_len,
2267a8e1175bSopenharmony_ci                            options->expected_srv_fragments)
2268a8e1175bSopenharmony_ci                        == 0);
2269a8e1175bSopenharmony_ci        }
2270a8e1175bSopenharmony_ci    }
2271a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
2272a8e1175bSopenharmony_ci
2273a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_RENEGOTIATION)
2274a8e1175bSopenharmony_ci    if (options->renegotiate) {
2275a8e1175bSopenharmony_ci        /* Start test with renegotiation */
2276a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.renego_status ==
2277a8e1175bSopenharmony_ci                    MBEDTLS_SSL_INITIAL_HANDSHAKE);
2278a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.renego_status ==
2279a8e1175bSopenharmony_ci                    MBEDTLS_SSL_INITIAL_HANDSHAKE);
2280a8e1175bSopenharmony_ci
2281a8e1175bSopenharmony_ci        /* After calling this function for the server, it only sends a handshake
2282a8e1175bSopenharmony_ci         * request. All renegotiation should happen during data exchanging */
2283a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_ssl_renegotiate(&(server.ssl)) == 0);
2284a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.renego_status ==
2285a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_PENDING);
2286a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.renego_status ==
2287a8e1175bSopenharmony_ci                    MBEDTLS_SSL_INITIAL_HANDSHAKE);
2288a8e1175bSopenharmony_ci
2289a8e1175bSopenharmony_ci        TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
2290a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.renego_status ==
2291a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_DONE);
2292a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.renego_status ==
2293a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_DONE);
2294a8e1175bSopenharmony_ci
2295a8e1175bSopenharmony_ci        /* After calling mbedtls_ssl_renegotiate for the client,
2296a8e1175bSopenharmony_ci         * all renegotiation should happen inside this function.
2297a8e1175bSopenharmony_ci         * However in this test, we cannot perform simultaneous communication
2298a8e1175bSopenharmony_ci         * between client and server so this function will return waiting error
2299a8e1175bSopenharmony_ci         * on the socket. All rest of renegotiation should happen
2300a8e1175bSopenharmony_ci         * during data exchanging */
2301a8e1175bSopenharmony_ci        ret = mbedtls_ssl_renegotiate(&(client.ssl));
2302a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2303a8e1175bSopenharmony_ci        if (options->resize_buffers != 0) {
2304a8e1175bSopenharmony_ci            /* Ensure that the buffer sizes are appropriate before resizes */
2305a8e1175bSopenharmony_ci            TEST_ASSERT(client.ssl.out_buf_len == MBEDTLS_SSL_OUT_BUFFER_LEN);
2306a8e1175bSopenharmony_ci            TEST_ASSERT(client.ssl.in_buf_len == MBEDTLS_SSL_IN_BUFFER_LEN);
2307a8e1175bSopenharmony_ci        }
2308a8e1175bSopenharmony_ci#endif
2309a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0 ||
2310a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_READ ||
2311a8e1175bSopenharmony_ci                    ret == MBEDTLS_ERR_SSL_WANT_WRITE);
2312a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.renego_status ==
2313a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_DONE);
2314a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.renego_status ==
2315a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS);
2316a8e1175bSopenharmony_ci
2317a8e1175bSopenharmony_ci        TEST_ASSERT(exchange_data(&(client.ssl), &(server.ssl)) == 0);
2318a8e1175bSopenharmony_ci        TEST_ASSERT(server.ssl.renego_status ==
2319a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_DONE);
2320a8e1175bSopenharmony_ci        TEST_ASSERT(client.ssl.renego_status ==
2321a8e1175bSopenharmony_ci                    MBEDTLS_SSL_RENEGOTIATION_DONE);
2322a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2323a8e1175bSopenharmony_ci        /* Validate buffer sizes after renegotiation */
2324a8e1175bSopenharmony_ci        if (options->resize_buffers != 0) {
2325a8e1175bSopenharmony_ci            TEST_ASSERT(client.ssl.out_buf_len ==
2326a8e1175bSopenharmony_ci                        mbedtls_ssl_get_output_buflen(&client.ssl));
2327a8e1175bSopenharmony_ci            TEST_ASSERT(client.ssl.in_buf_len ==
2328a8e1175bSopenharmony_ci                        mbedtls_ssl_get_input_buflen(&client.ssl));
2329a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.out_buf_len ==
2330a8e1175bSopenharmony_ci                        mbedtls_ssl_get_output_buflen(&server.ssl));
2331a8e1175bSopenharmony_ci            TEST_ASSERT(server.ssl.in_buf_len ==
2332a8e1175bSopenharmony_ci                        mbedtls_ssl_get_input_buflen(&server.ssl));
2333a8e1175bSopenharmony_ci        }
2334a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
2335a8e1175bSopenharmony_ci    }
2336a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_RENEGOTIATION */
2337a8e1175bSopenharmony_ci
2338a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&client.conf) == &client);
2339a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_get_user_data_p(&client.ssl) == &client);
2340a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_conf_get_user_data_p(&server.conf) == &server);
2341a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_ssl_get_user_data_p(&server.ssl) == &server);
2342a8e1175bSopenharmony_ci
2343a8e1175bSopenharmony_ciexit:
2344a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_free(&client,
2345a8e1175bSopenharmony_ci                                   options->dtls != 0 ? &client_context : NULL);
2346a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_free(&server,
2347a8e1175bSopenharmony_ci                                   options->dtls != 0 ? &server_context : NULL);
2348a8e1175bSopenharmony_ci#if defined(MBEDTLS_DEBUG_C)
2349a8e1175bSopenharmony_ci    if (options->cli_log_fun || options->srv_log_fun) {
2350a8e1175bSopenharmony_ci        mbedtls_debug_set_threshold(0);
2351a8e1175bSopenharmony_ci    }
2352a8e1175bSopenharmony_ci#endif
2353a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
2354a8e1175bSopenharmony_ci    if (context_buf != NULL) {
2355a8e1175bSopenharmony_ci        mbedtls_free(context_buf);
2356a8e1175bSopenharmony_ci    }
2357a8e1175bSopenharmony_ci#endif
2358a8e1175bSopenharmony_ci    MD_OR_USE_PSA_DONE();
2359a8e1175bSopenharmony_ci}
2360a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2361a8e1175bSopenharmony_ci
2362a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_HOOKS)
2363a8e1175bSopenharmony_ciint mbedtls_test_tweak_tls13_certificate_msg_vector_len(
2364a8e1175bSopenharmony_ci    unsigned char *buf, unsigned char **end, int tweak,
2365a8e1175bSopenharmony_ci    int *expected_result, mbedtls_ssl_chk_buf_ptr_args *args)
2366a8e1175bSopenharmony_ci{
2367a8e1175bSopenharmony_ci/*
2368a8e1175bSopenharmony_ci * The definition of the tweaks assume that the certificate list contains only
2369a8e1175bSopenharmony_ci * one certificate.
2370a8e1175bSopenharmony_ci */
2371a8e1175bSopenharmony_ci
2372a8e1175bSopenharmony_ci/*
2373a8e1175bSopenharmony_ci * struct {
2374a8e1175bSopenharmony_ci *     opaque cert_data<1..2^24-1>;
2375a8e1175bSopenharmony_ci *     Extension extensions<0..2^16-1>;
2376a8e1175bSopenharmony_ci * } CertificateEntry;
2377a8e1175bSopenharmony_ci *
2378a8e1175bSopenharmony_ci * struct {
2379a8e1175bSopenharmony_ci *     opaque certificate_request_context<0..2^8-1>;
2380a8e1175bSopenharmony_ci *     CertificateEntry certificate_list<0..2^24-1>;
2381a8e1175bSopenharmony_ci * } Certificate;
2382a8e1175bSopenharmony_ci */
2383a8e1175bSopenharmony_ci    unsigned char *p_certificate_request_context_len = buf;
2384a8e1175bSopenharmony_ci    size_t certificate_request_context_len = buf[0];
2385a8e1175bSopenharmony_ci
2386a8e1175bSopenharmony_ci    unsigned char *p_certificate_list_len =
2387a8e1175bSopenharmony_ci        buf + 1 + certificate_request_context_len;
2388a8e1175bSopenharmony_ci    unsigned char *certificate_list = p_certificate_list_len + 3;
2389a8e1175bSopenharmony_ci    size_t certificate_list_len =
2390a8e1175bSopenharmony_ci        MBEDTLS_GET_UINT24_BE(p_certificate_list_len, 0);
2391a8e1175bSopenharmony_ci
2392a8e1175bSopenharmony_ci    unsigned char *p_cert_data_len = certificate_list;
2393a8e1175bSopenharmony_ci    unsigned char *cert_data = p_cert_data_len + 3;
2394a8e1175bSopenharmony_ci    size_t cert_data_len = MBEDTLS_GET_UINT24_BE(p_cert_data_len, 0);
2395a8e1175bSopenharmony_ci
2396a8e1175bSopenharmony_ci    unsigned char *p_extensions_len = cert_data + cert_data_len;
2397a8e1175bSopenharmony_ci    unsigned char *extensions = p_extensions_len + 2;
2398a8e1175bSopenharmony_ci    size_t extensions_len = MBEDTLS_GET_UINT16_BE(p_extensions_len, 0);
2399a8e1175bSopenharmony_ci
2400a8e1175bSopenharmony_ci    *expected_result = MBEDTLS_ERR_SSL_DECODE_ERROR;
2401a8e1175bSopenharmony_ci
2402a8e1175bSopenharmony_ci    switch (tweak) {
2403a8e1175bSopenharmony_ci        case 1:
2404a8e1175bSopenharmony_ci            /* Failure when checking if the certificate request context length
2405a8e1175bSopenharmony_ci             * and certificate list length can be read
2406a8e1175bSopenharmony_ci             */
2407a8e1175bSopenharmony_ci            *end = buf + 3;
2408a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(args, buf, *end, 4);
2409a8e1175bSopenharmony_ci            break;
2410a8e1175bSopenharmony_ci
2411a8e1175bSopenharmony_ci        case 2:
2412a8e1175bSopenharmony_ci            /* Invalid certificate request context length.
2413a8e1175bSopenharmony_ci             */
2414a8e1175bSopenharmony_ci            *p_certificate_request_context_len =
2415a8e1175bSopenharmony_ci                (unsigned char) certificate_request_context_len + 1;
2416a8e1175bSopenharmony_ci            reset_chk_buf_ptr_args(args);
2417a8e1175bSopenharmony_ci            break;
2418a8e1175bSopenharmony_ci
2419a8e1175bSopenharmony_ci        case 3:
2420a8e1175bSopenharmony_ci            /* Failure when checking if certificate_list data can be read. */
2421a8e1175bSopenharmony_ci            MBEDTLS_PUT_UINT24_BE(certificate_list_len + 1,
2422a8e1175bSopenharmony_ci                                  p_certificate_list_len, 0);
2423a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(args, certificate_list, *end,
2424a8e1175bSopenharmony_ci                                 certificate_list_len + 1);
2425a8e1175bSopenharmony_ci            break;
2426a8e1175bSopenharmony_ci
2427a8e1175bSopenharmony_ci        case 4:
2428a8e1175bSopenharmony_ci            /* Failure when checking if the cert_data length can be read. */
2429a8e1175bSopenharmony_ci            MBEDTLS_PUT_UINT24_BE(2, p_certificate_list_len, 0);
2430a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(args, p_cert_data_len, certificate_list + 2, 3);
2431a8e1175bSopenharmony_ci            break;
2432a8e1175bSopenharmony_ci
2433a8e1175bSopenharmony_ci        case 5:
2434a8e1175bSopenharmony_ci            /* Failure when checking if cert_data data can be read. */
2435a8e1175bSopenharmony_ci            MBEDTLS_PUT_UINT24_BE(certificate_list_len - 3 + 1,
2436a8e1175bSopenharmony_ci                                  p_cert_data_len, 0);
2437a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(args, cert_data,
2438a8e1175bSopenharmony_ci                                 certificate_list + certificate_list_len,
2439a8e1175bSopenharmony_ci                                 certificate_list_len - 3 + 1);
2440a8e1175bSopenharmony_ci            break;
2441a8e1175bSopenharmony_ci
2442a8e1175bSopenharmony_ci        case 6:
2443a8e1175bSopenharmony_ci            /* Failure when checking if the extensions length can be read. */
2444a8e1175bSopenharmony_ci            MBEDTLS_PUT_UINT24_BE(certificate_list_len - extensions_len - 1,
2445a8e1175bSopenharmony_ci                                  p_certificate_list_len, 0);
2446a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(
2447a8e1175bSopenharmony_ci                args, p_extensions_len,
2448a8e1175bSopenharmony_ci                certificate_list + certificate_list_len - extensions_len - 1, 2);
2449a8e1175bSopenharmony_ci            break;
2450a8e1175bSopenharmony_ci
2451a8e1175bSopenharmony_ci        case 7:
2452a8e1175bSopenharmony_ci            /* Failure when checking if extensions data can be read. */
2453a8e1175bSopenharmony_ci            MBEDTLS_PUT_UINT16_BE(extensions_len + 1, p_extensions_len, 0);
2454a8e1175bSopenharmony_ci
2455a8e1175bSopenharmony_ci            set_chk_buf_ptr_args(
2456a8e1175bSopenharmony_ci                args, extensions,
2457a8e1175bSopenharmony_ci                certificate_list + certificate_list_len, extensions_len + 1);
2458a8e1175bSopenharmony_ci            break;
2459a8e1175bSopenharmony_ci
2460a8e1175bSopenharmony_ci        default:
2461a8e1175bSopenharmony_ci            return -1;
2462a8e1175bSopenharmony_ci    }
2463a8e1175bSopenharmony_ci
2464a8e1175bSopenharmony_ci    return 0;
2465a8e1175bSopenharmony_ci}
2466a8e1175bSopenharmony_ci#endif /* MBEDTLS_TEST_HOOKS */
2467a8e1175bSopenharmony_ci
2468a8e1175bSopenharmony_ci/*
2469a8e1175bSopenharmony_ci * Functions for tests based on tickets. Implementations of the
2470a8e1175bSopenharmony_ci * write/parse ticket interfaces as defined by mbedtls_ssl_ticket_write/parse_t.
2471a8e1175bSopenharmony_ci * Basically same implementations as in ticket.c without the encryption. That
2472a8e1175bSopenharmony_ci * way we can tweak easily tickets characteristics to simulate misbehaving
2473a8e1175bSopenharmony_ci * peers.
2474a8e1175bSopenharmony_ci */
2475a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2476a8e1175bSopenharmony_ciint mbedtls_test_ticket_write(
2477a8e1175bSopenharmony_ci    void *p_ticket, const mbedtls_ssl_session *session,
2478a8e1175bSopenharmony_ci    unsigned char *start, const unsigned char *end,
2479a8e1175bSopenharmony_ci    size_t *tlen, uint32_t *lifetime)
2480a8e1175bSopenharmony_ci{
2481a8e1175bSopenharmony_ci    int ret;
2482a8e1175bSopenharmony_ci    ((void) p_ticket);
2483a8e1175bSopenharmony_ci
2484a8e1175bSopenharmony_ci    if ((ret = mbedtls_ssl_session_save(session, start, end - start,
2485a8e1175bSopenharmony_ci                                        tlen)) != 0) {
2486a8e1175bSopenharmony_ci        return ret;
2487a8e1175bSopenharmony_ci    }
2488a8e1175bSopenharmony_ci
2489a8e1175bSopenharmony_ci    /* Maximum ticket lifetime as defined in RFC 8446 */
2490a8e1175bSopenharmony_ci    *lifetime = 7 * 24 * 3600;
2491a8e1175bSopenharmony_ci
2492a8e1175bSopenharmony_ci    return 0;
2493a8e1175bSopenharmony_ci}
2494a8e1175bSopenharmony_ci
2495a8e1175bSopenharmony_ciint mbedtls_test_ticket_parse(void *p_ticket, mbedtls_ssl_session *session,
2496a8e1175bSopenharmony_ci                              unsigned char *buf, size_t len)
2497a8e1175bSopenharmony_ci{
2498a8e1175bSopenharmony_ci    ((void) p_ticket);
2499a8e1175bSopenharmony_ci
2500a8e1175bSopenharmony_ci    return mbedtls_ssl_session_load(session, buf, len);
2501a8e1175bSopenharmony_ci}
2502a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2503a8e1175bSopenharmony_ci
2504a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SRV_C) && \
2505a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS) && \
2506a8e1175bSopenharmony_ci    defined(MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED)
2507a8e1175bSopenharmony_ciint mbedtls_test_get_tls13_ticket(
2508a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *client_options,
2509a8e1175bSopenharmony_ci    mbedtls_test_handshake_test_options *server_options,
2510a8e1175bSopenharmony_ci    mbedtls_ssl_session *session)
2511a8e1175bSopenharmony_ci{
2512a8e1175bSopenharmony_ci    int ret = -1;
2513a8e1175bSopenharmony_ci    unsigned char buf[64];
2514a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint client_ep, server_ep;
2515a8e1175bSopenharmony_ci
2516a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(&client_ep, sizeof(client_ep));
2517a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(&server_ep, sizeof(server_ep));
2518a8e1175bSopenharmony_ci
2519a8e1175bSopenharmony_ci    ret = mbedtls_test_ssl_endpoint_init(&client_ep, MBEDTLS_SSL_IS_CLIENT,
2520a8e1175bSopenharmony_ci                                         client_options, NULL, NULL, NULL);
2521a8e1175bSopenharmony_ci    TEST_EQUAL(ret, 0);
2522a8e1175bSopenharmony_ci
2523a8e1175bSopenharmony_ci    ret = mbedtls_test_ssl_endpoint_init(&server_ep, MBEDTLS_SSL_IS_SERVER,
2524a8e1175bSopenharmony_ci                                         server_options, NULL, NULL, NULL);
2525a8e1175bSopenharmony_ci    TEST_EQUAL(ret, 0);
2526a8e1175bSopenharmony_ci
2527a8e1175bSopenharmony_ci    mbedtls_ssl_conf_session_tickets_cb(&server_ep.conf,
2528a8e1175bSopenharmony_ci                                        mbedtls_test_ticket_write,
2529a8e1175bSopenharmony_ci                                        mbedtls_test_ticket_parse,
2530a8e1175bSopenharmony_ci                                        NULL);
2531a8e1175bSopenharmony_ci
2532a8e1175bSopenharmony_ci    ret = mbedtls_test_mock_socket_connect(&(client_ep.socket),
2533a8e1175bSopenharmony_ci                                           &(server_ep.socket), 1024);
2534a8e1175bSopenharmony_ci    TEST_EQUAL(ret, 0);
2535a8e1175bSopenharmony_ci
2536a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_move_handshake_to_state(
2537a8e1175bSopenharmony_ci                   &(server_ep.ssl), &(client_ep.ssl),
2538a8e1175bSopenharmony_ci                   MBEDTLS_SSL_HANDSHAKE_OVER), 0);
2539a8e1175bSopenharmony_ci
2540a8e1175bSopenharmony_ci    TEST_EQUAL(server_ep.ssl.handshake->new_session_tickets_count, 0);
2541a8e1175bSopenharmony_ci
2542a8e1175bSopenharmony_ci    do {
2543a8e1175bSopenharmony_ci        ret = mbedtls_ssl_read(&(client_ep.ssl), buf, sizeof(buf));
2544a8e1175bSopenharmony_ci    } while (ret != MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET);
2545a8e1175bSopenharmony_ci
2546a8e1175bSopenharmony_ci    ret = mbedtls_ssl_get_session(&(client_ep.ssl), session);
2547a8e1175bSopenharmony_ci    TEST_EQUAL(ret, 0);
2548a8e1175bSopenharmony_ci
2549a8e1175bSopenharmony_ciexit:
2550a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_free(&client_ep, NULL);
2551a8e1175bSopenharmony_ci    mbedtls_test_ssl_endpoint_free(&server_ep, NULL);
2552a8e1175bSopenharmony_ci
2553a8e1175bSopenharmony_ci    return ret;
2554a8e1175bSopenharmony_ci}
2555a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SRV_C &&
2556a8e1175bSopenharmony_ci          MBEDTLS_SSL_PROTO_TLS1_3 && MBEDTLS_SSL_SESSION_TICKETS &&
2557a8e1175bSopenharmony_ci          MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */
2558a8e1175bSopenharmony_ci
2559a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS_C */
2560