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