1a8e1175bSopenharmony_ci/* 2a8e1175bSopenharmony_ci * Common code library for SSL test programs. 3a8e1175bSopenharmony_ci * 4a8e1175bSopenharmony_ci * In addition to the functions in this file, there is shared source code 5a8e1175bSopenharmony_ci * that cannot be compiled separately in "ssl_test_common_source.c". 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 12a8e1175bSopenharmony_ci#include "ssl_test_lib.h" 13a8e1175bSopenharmony_ci 14a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_HOOKS) 15a8e1175bSopenharmony_ci#include "test/threading_helpers.h" 16a8e1175bSopenharmony_ci#endif 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci#if !defined(MBEDTLS_SSL_TEST_IMPOSSIBLE) 19a8e1175bSopenharmony_ci 20a8e1175bSopenharmony_ci#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_civoid my_debug(void *ctx, int level, 23a8e1175bSopenharmony_ci const char *file, int line, 24a8e1175bSopenharmony_ci const char *str) 25a8e1175bSopenharmony_ci{ 26a8e1175bSopenharmony_ci const char *p, *basename; 27a8e1175bSopenharmony_ci 28a8e1175bSopenharmony_ci /* Extract basename from file */ 29a8e1175bSopenharmony_ci for (p = basename = file; *p != '\0'; p++) { 30a8e1175bSopenharmony_ci if (*p == '/' || *p == '\\') { 31a8e1175bSopenharmony_ci basename = p + 1; 32a8e1175bSopenharmony_ci } 33a8e1175bSopenharmony_ci } 34a8e1175bSopenharmony_ci 35a8e1175bSopenharmony_ci mbedtls_fprintf((FILE *) ctx, "%s:%04d: |%d| %s", 36a8e1175bSopenharmony_ci basename, line, level, str); 37a8e1175bSopenharmony_ci fflush((FILE *) ctx); 38a8e1175bSopenharmony_ci} 39a8e1175bSopenharmony_ci 40a8e1175bSopenharmony_ci#if defined(MBEDTLS_HAVE_TIME) 41a8e1175bSopenharmony_cimbedtls_time_t dummy_constant_time(mbedtls_time_t *time) 42a8e1175bSopenharmony_ci{ 43a8e1175bSopenharmony_ci (void) time; 44a8e1175bSopenharmony_ci return 0x5af2a056; 45a8e1175bSopenharmony_ci} 46a8e1175bSopenharmony_ci#endif 47a8e1175bSopenharmony_ci 48a8e1175bSopenharmony_ci#if !defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG) 49a8e1175bSopenharmony_cistatic int dummy_entropy(void *data, unsigned char *output, size_t len) 50a8e1175bSopenharmony_ci{ 51a8e1175bSopenharmony_ci size_t i; 52a8e1175bSopenharmony_ci int ret; 53a8e1175bSopenharmony_ci (void) data; 54a8e1175bSopenharmony_ci 55a8e1175bSopenharmony_ci ret = mbedtls_entropy_func(data, output, len); 56a8e1175bSopenharmony_ci for (i = 0; i < len; i++) { 57a8e1175bSopenharmony_ci //replace result with pseudo random 58a8e1175bSopenharmony_ci output[i] = (unsigned char) rand(); 59a8e1175bSopenharmony_ci } 60a8e1175bSopenharmony_ci return ret; 61a8e1175bSopenharmony_ci} 62a8e1175bSopenharmony_ci#endif 63a8e1175bSopenharmony_ci 64a8e1175bSopenharmony_civoid rng_init(rng_context_t *rng) 65a8e1175bSopenharmony_ci{ 66a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG) 67a8e1175bSopenharmony_ci (void) rng; 68a8e1175bSopenharmony_ci psa_crypto_init(); 69a8e1175bSopenharmony_ci#else /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 70a8e1175bSopenharmony_ci 71a8e1175bSopenharmony_ci#if defined(MBEDTLS_CTR_DRBG_C) 72a8e1175bSopenharmony_ci mbedtls_ctr_drbg_init(&rng->drbg); 73a8e1175bSopenharmony_ci#elif defined(MBEDTLS_HMAC_DRBG_C) 74a8e1175bSopenharmony_ci mbedtls_hmac_drbg_init(&rng->drbg); 75a8e1175bSopenharmony_ci#else 76a8e1175bSopenharmony_ci#error "No DRBG available" 77a8e1175bSopenharmony_ci#endif 78a8e1175bSopenharmony_ci 79a8e1175bSopenharmony_ci mbedtls_entropy_init(&rng->entropy); 80a8e1175bSopenharmony_ci#endif /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 81a8e1175bSopenharmony_ci} 82a8e1175bSopenharmony_ci 83a8e1175bSopenharmony_ciint rng_seed(rng_context_t *rng, int reproducible, const char *pers) 84a8e1175bSopenharmony_ci{ 85a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 86a8e1175bSopenharmony_ci if (reproducible) { 87a8e1175bSopenharmony_ci mbedtls_fprintf(stderr, 88a8e1175bSopenharmony_ci "MBEDTLS_USE_PSA_CRYPTO does not support reproducible mode.\n"); 89a8e1175bSopenharmony_ci return -1; 90a8e1175bSopenharmony_ci } 91a8e1175bSopenharmony_ci#endif 92a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG) 93a8e1175bSopenharmony_ci /* The PSA crypto RNG does its own seeding. */ 94a8e1175bSopenharmony_ci (void) rng; 95a8e1175bSopenharmony_ci (void) pers; 96a8e1175bSopenharmony_ci if (reproducible) { 97a8e1175bSopenharmony_ci mbedtls_fprintf(stderr, 98a8e1175bSopenharmony_ci "The PSA RNG does not support reproducible mode.\n"); 99a8e1175bSopenharmony_ci return -1; 100a8e1175bSopenharmony_ci } 101a8e1175bSopenharmony_ci return 0; 102a8e1175bSopenharmony_ci#else /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 103a8e1175bSopenharmony_ci int (*f_entropy)(void *, unsigned char *, size_t) = 104a8e1175bSopenharmony_ci (reproducible ? dummy_entropy : mbedtls_entropy_func); 105a8e1175bSopenharmony_ci 106a8e1175bSopenharmony_ci if (reproducible) { 107a8e1175bSopenharmony_ci srand(1); 108a8e1175bSopenharmony_ci } 109a8e1175bSopenharmony_ci 110a8e1175bSopenharmony_ci#if defined(MBEDTLS_CTR_DRBG_C) 111a8e1175bSopenharmony_ci int ret = mbedtls_ctr_drbg_seed(&rng->drbg, 112a8e1175bSopenharmony_ci f_entropy, &rng->entropy, 113a8e1175bSopenharmony_ci (const unsigned char *) pers, 114a8e1175bSopenharmony_ci strlen(pers)); 115a8e1175bSopenharmony_ci#elif defined(MBEDTLS_HMAC_DRBG_C) 116a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256) 117a8e1175bSopenharmony_ci const mbedtls_md_type_t md_type = MBEDTLS_MD_SHA256; 118a8e1175bSopenharmony_ci#elif defined(MBEDTLS_MD_CAN_SHA512) 119a8e1175bSopenharmony_ci const mbedtls_md_type_t md_type = MBEDTLS_MD_SHA512; 120a8e1175bSopenharmony_ci#else 121a8e1175bSopenharmony_ci#error "No message digest available for HMAC_DRBG" 122a8e1175bSopenharmony_ci#endif 123a8e1175bSopenharmony_ci int ret = mbedtls_hmac_drbg_seed(&rng->drbg, 124a8e1175bSopenharmony_ci mbedtls_md_info_from_type(md_type), 125a8e1175bSopenharmony_ci f_entropy, &rng->entropy, 126a8e1175bSopenharmony_ci (const unsigned char *) pers, 127a8e1175bSopenharmony_ci strlen(pers)); 128a8e1175bSopenharmony_ci#else /* !defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_HMAC_DRBG_C) */ 129a8e1175bSopenharmony_ci#error "No DRBG available" 130a8e1175bSopenharmony_ci#endif /* !defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_HMAC_DRBG_C) */ 131a8e1175bSopenharmony_ci 132a8e1175bSopenharmony_ci if (ret != 0) { 133a8e1175bSopenharmony_ci mbedtls_printf(" failed\n ! mbedtls_ctr_drbg_seed returned -0x%x\n", 134a8e1175bSopenharmony_ci (unsigned int) -ret); 135a8e1175bSopenharmony_ci return ret; 136a8e1175bSopenharmony_ci } 137a8e1175bSopenharmony_ci#endif /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 138a8e1175bSopenharmony_ci 139a8e1175bSopenharmony_ci return 0; 140a8e1175bSopenharmony_ci} 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_civoid rng_free(rng_context_t *rng) 143a8e1175bSopenharmony_ci{ 144a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG) 145a8e1175bSopenharmony_ci (void) rng; 146a8e1175bSopenharmony_ci /* Deinitialize the PSA crypto subsystem. This deactivates all PSA APIs. 147a8e1175bSopenharmony_ci * This is ok because none of our applications try to do any crypto after 148a8e1175bSopenharmony_ci * deinitializing the RNG. */ 149a8e1175bSopenharmony_ci mbedtls_psa_crypto_free(); 150a8e1175bSopenharmony_ci#else /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 151a8e1175bSopenharmony_ci 152a8e1175bSopenharmony_ci#if defined(MBEDTLS_CTR_DRBG_C) 153a8e1175bSopenharmony_ci mbedtls_ctr_drbg_free(&rng->drbg); 154a8e1175bSopenharmony_ci#elif defined(MBEDTLS_HMAC_DRBG_C) 155a8e1175bSopenharmony_ci mbedtls_hmac_drbg_free(&rng->drbg); 156a8e1175bSopenharmony_ci#else 157a8e1175bSopenharmony_ci#error "No DRBG available" 158a8e1175bSopenharmony_ci#endif 159a8e1175bSopenharmony_ci 160a8e1175bSopenharmony_ci mbedtls_entropy_free(&rng->entropy); 161a8e1175bSopenharmony_ci#endif /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 162a8e1175bSopenharmony_ci} 163a8e1175bSopenharmony_ci 164a8e1175bSopenharmony_ciint rng_get(void *p_rng, unsigned char *output, size_t output_len) 165a8e1175bSopenharmony_ci{ 166a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_USE_PSA_CRYPTO_RNG) 167a8e1175bSopenharmony_ci (void) p_rng; 168a8e1175bSopenharmony_ci return mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE, 169a8e1175bSopenharmony_ci output, output_len); 170a8e1175bSopenharmony_ci#else /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 171a8e1175bSopenharmony_ci rng_context_t *rng = p_rng; 172a8e1175bSopenharmony_ci 173a8e1175bSopenharmony_ci#if defined(MBEDTLS_CTR_DRBG_C) 174a8e1175bSopenharmony_ci return mbedtls_ctr_drbg_random(&rng->drbg, output, output_len); 175a8e1175bSopenharmony_ci#elif defined(MBEDTLS_HMAC_DRBG_C) 176a8e1175bSopenharmony_ci return mbedtls_hmac_drbg_random(&rng->drbg, output, output_len); 177a8e1175bSopenharmony_ci#else 178a8e1175bSopenharmony_ci#error "No DRBG available" 179a8e1175bSopenharmony_ci#endif 180a8e1175bSopenharmony_ci 181a8e1175bSopenharmony_ci#endif /* !MBEDTLS_TEST_USE_PSA_CRYPTO_RNG */ 182a8e1175bSopenharmony_ci} 183a8e1175bSopenharmony_ci 184a8e1175bSopenharmony_ciint key_opaque_alg_parse(const char *arg, const char **alg1, const char **alg2) 185a8e1175bSopenharmony_ci{ 186a8e1175bSopenharmony_ci char *separator; 187a8e1175bSopenharmony_ci if ((separator = strchr(arg, ',')) == NULL) { 188a8e1175bSopenharmony_ci return 1; 189a8e1175bSopenharmony_ci } 190a8e1175bSopenharmony_ci *separator = '\0'; 191a8e1175bSopenharmony_ci 192a8e1175bSopenharmony_ci *alg1 = arg; 193a8e1175bSopenharmony_ci *alg2 = separator + 1; 194a8e1175bSopenharmony_ci 195a8e1175bSopenharmony_ci if (strcmp(*alg1, "rsa-sign-pkcs1") != 0 && 196a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss") != 0 && 197a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha256") != 0 && 198a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha384") != 0 && 199a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha512") != 0 && 200a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-decrypt") != 0 && 201a8e1175bSopenharmony_ci strcmp(*alg1, "ecdsa-sign") != 0 && 202a8e1175bSopenharmony_ci strcmp(*alg1, "ecdh") != 0) { 203a8e1175bSopenharmony_ci return 1; 204a8e1175bSopenharmony_ci } 205a8e1175bSopenharmony_ci 206a8e1175bSopenharmony_ci if (strcmp(*alg2, "rsa-sign-pkcs1") != 0 && 207a8e1175bSopenharmony_ci strcmp(*alg2, "rsa-sign-pss") != 0 && 208a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha256") != 0 && 209a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha384") != 0 && 210a8e1175bSopenharmony_ci strcmp(*alg1, "rsa-sign-pss-sha512") != 0 && 211a8e1175bSopenharmony_ci strcmp(*alg2, "rsa-decrypt") != 0 && 212a8e1175bSopenharmony_ci strcmp(*alg2, "ecdsa-sign") != 0 && 213a8e1175bSopenharmony_ci strcmp(*alg2, "ecdh") != 0 && 214a8e1175bSopenharmony_ci strcmp(*alg2, "none") != 0) { 215a8e1175bSopenharmony_ci return 1; 216a8e1175bSopenharmony_ci } 217a8e1175bSopenharmony_ci 218a8e1175bSopenharmony_ci return 0; 219a8e1175bSopenharmony_ci} 220a8e1175bSopenharmony_ci 221a8e1175bSopenharmony_ci#if defined(MBEDTLS_USE_PSA_CRYPTO) 222a8e1175bSopenharmony_ciint key_opaque_set_alg_usage(const char *alg1, const char *alg2, 223a8e1175bSopenharmony_ci psa_algorithm_t *psa_alg1, 224a8e1175bSopenharmony_ci psa_algorithm_t *psa_alg2, 225a8e1175bSopenharmony_ci psa_key_usage_t *usage, 226a8e1175bSopenharmony_ci mbedtls_pk_type_t key_type) 227a8e1175bSopenharmony_ci{ 228a8e1175bSopenharmony_ci if (strcmp(alg1, "none") != 0) { 229a8e1175bSopenharmony_ci const char *algs[] = { alg1, alg2 }; 230a8e1175bSopenharmony_ci psa_algorithm_t *psa_algs[] = { psa_alg1, psa_alg2 }; 231a8e1175bSopenharmony_ci 232a8e1175bSopenharmony_ci for (int i = 0; i < 2; i++) { 233a8e1175bSopenharmony_ci if (strcmp(algs[i], "rsa-sign-pkcs1") == 0) { 234a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_ANY_HASH); 235a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 236a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "rsa-sign-pss") == 0) { 237a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PSS(PSA_ALG_ANY_HASH); 238a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 239a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "rsa-sign-pss-sha256") == 0) { 240a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PSS(PSA_ALG_SHA_256); 241a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 242a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "rsa-sign-pss-sha384") == 0) { 243a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PSS(PSA_ALG_SHA_384); 244a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 245a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "rsa-sign-pss-sha512") == 0) { 246a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PSS(PSA_ALG_SHA_512); 247a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 248a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "rsa-decrypt") == 0) { 249a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_RSA_PKCS1V15_CRYPT; 250a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_DECRYPT; 251a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "ecdsa-sign") == 0) { 252a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_ECDSA(PSA_ALG_ANY_HASH); 253a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_SIGN_HASH; 254a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "ecdh") == 0) { 255a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_ECDH; 256a8e1175bSopenharmony_ci *usage |= PSA_KEY_USAGE_DERIVE; 257a8e1175bSopenharmony_ci } else if (strcmp(algs[i], "none") == 0) { 258a8e1175bSopenharmony_ci *psa_algs[i] = PSA_ALG_NONE; 259a8e1175bSopenharmony_ci } 260a8e1175bSopenharmony_ci } 261a8e1175bSopenharmony_ci } else { 262a8e1175bSopenharmony_ci if (key_type == MBEDTLS_PK_ECKEY) { 263a8e1175bSopenharmony_ci *psa_alg1 = PSA_ALG_ECDSA(PSA_ALG_ANY_HASH); 264a8e1175bSopenharmony_ci *psa_alg2 = PSA_ALG_ECDH; 265a8e1175bSopenharmony_ci *usage = PSA_KEY_USAGE_SIGN_HASH | PSA_KEY_USAGE_DERIVE; 266a8e1175bSopenharmony_ci } else if (key_type == MBEDTLS_PK_RSA) { 267a8e1175bSopenharmony_ci *psa_alg1 = PSA_ALG_RSA_PKCS1V15_SIGN(PSA_ALG_ANY_HASH); 268a8e1175bSopenharmony_ci *psa_alg2 = PSA_ALG_RSA_PSS(PSA_ALG_ANY_HASH); 269a8e1175bSopenharmony_ci *usage = PSA_KEY_USAGE_SIGN_HASH; 270a8e1175bSopenharmony_ci } else { 271a8e1175bSopenharmony_ci return 1; 272a8e1175bSopenharmony_ci } 273a8e1175bSopenharmony_ci } 274a8e1175bSopenharmony_ci 275a8e1175bSopenharmony_ci return 0; 276a8e1175bSopenharmony_ci} 277a8e1175bSopenharmony_ci 278a8e1175bSopenharmony_ci#if defined(MBEDTLS_PK_C) 279a8e1175bSopenharmony_ciint pk_wrap_as_opaque(mbedtls_pk_context *pk, psa_algorithm_t psa_alg, psa_algorithm_t psa_alg2, 280a8e1175bSopenharmony_ci psa_key_usage_t psa_usage, mbedtls_svc_key_id_t *key_id) 281a8e1175bSopenharmony_ci{ 282a8e1175bSopenharmony_ci int ret; 283a8e1175bSopenharmony_ci psa_key_attributes_t key_attr = PSA_KEY_ATTRIBUTES_INIT; 284a8e1175bSopenharmony_ci 285a8e1175bSopenharmony_ci ret = mbedtls_pk_get_psa_attributes(pk, PSA_KEY_USAGE_SIGN_HASH, &key_attr); 286a8e1175bSopenharmony_ci if (ret != 0) { 287a8e1175bSopenharmony_ci return ret; 288a8e1175bSopenharmony_ci } 289a8e1175bSopenharmony_ci psa_set_key_usage_flags(&key_attr, psa_usage); 290a8e1175bSopenharmony_ci psa_set_key_algorithm(&key_attr, psa_alg); 291a8e1175bSopenharmony_ci if (psa_alg2 != PSA_ALG_NONE) { 292a8e1175bSopenharmony_ci psa_set_key_enrollment_algorithm(&key_attr, psa_alg2); 293a8e1175bSopenharmony_ci } 294a8e1175bSopenharmony_ci ret = mbedtls_pk_import_into_psa(pk, &key_attr, key_id); 295a8e1175bSopenharmony_ci if (ret != 0) { 296a8e1175bSopenharmony_ci return ret; 297a8e1175bSopenharmony_ci } 298a8e1175bSopenharmony_ci mbedtls_pk_free(pk); 299a8e1175bSopenharmony_ci mbedtls_pk_init(pk); 300a8e1175bSopenharmony_ci ret = mbedtls_pk_setup_opaque(pk, *key_id); 301a8e1175bSopenharmony_ci if (ret != 0) { 302a8e1175bSopenharmony_ci return ret; 303a8e1175bSopenharmony_ci } 304a8e1175bSopenharmony_ci 305a8e1175bSopenharmony_ci return 0; 306a8e1175bSopenharmony_ci} 307a8e1175bSopenharmony_ci#endif /* MBEDTLS_PK_C */ 308a8e1175bSopenharmony_ci#endif /* MBEDTLS_USE_PSA_CRYPTO */ 309a8e1175bSopenharmony_ci 310a8e1175bSopenharmony_ci#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK) 311a8e1175bSopenharmony_ciint ca_callback(void *data, mbedtls_x509_crt const *child, 312a8e1175bSopenharmony_ci mbedtls_x509_crt **candidates) 313a8e1175bSopenharmony_ci{ 314a8e1175bSopenharmony_ci int ret = 0; 315a8e1175bSopenharmony_ci mbedtls_x509_crt *ca = (mbedtls_x509_crt *) data; 316a8e1175bSopenharmony_ci mbedtls_x509_crt *first; 317a8e1175bSopenharmony_ci 318a8e1175bSopenharmony_ci /* This is a test-only implementation of the CA callback 319a8e1175bSopenharmony_ci * which always returns the entire list of trusted certificates. 320a8e1175bSopenharmony_ci * Production implementations managing a large number of CAs 321a8e1175bSopenharmony_ci * should use an efficient presentation and lookup for the 322a8e1175bSopenharmony_ci * set of trusted certificates (such as a hashtable) and only 323a8e1175bSopenharmony_ci * return those trusted certificates which satisfy basic 324a8e1175bSopenharmony_ci * parental checks, such as the matching of child `Issuer` 325a8e1175bSopenharmony_ci * and parent `Subject` field or matching key identifiers. */ 326a8e1175bSopenharmony_ci ((void) child); 327a8e1175bSopenharmony_ci 328a8e1175bSopenharmony_ci first = mbedtls_calloc(1, sizeof(mbedtls_x509_crt)); 329a8e1175bSopenharmony_ci if (first == NULL) { 330a8e1175bSopenharmony_ci ret = -1; 331a8e1175bSopenharmony_ci goto exit; 332a8e1175bSopenharmony_ci } 333a8e1175bSopenharmony_ci mbedtls_x509_crt_init(first); 334a8e1175bSopenharmony_ci 335a8e1175bSopenharmony_ci if (mbedtls_x509_crt_parse_der(first, ca->raw.p, ca->raw.len) != 0) { 336a8e1175bSopenharmony_ci ret = -1; 337a8e1175bSopenharmony_ci goto exit; 338a8e1175bSopenharmony_ci } 339a8e1175bSopenharmony_ci 340a8e1175bSopenharmony_ci while (ca->next != NULL) { 341a8e1175bSopenharmony_ci ca = ca->next; 342a8e1175bSopenharmony_ci if (mbedtls_x509_crt_parse_der(first, ca->raw.p, ca->raw.len) != 0) { 343a8e1175bSopenharmony_ci ret = -1; 344a8e1175bSopenharmony_ci goto exit; 345a8e1175bSopenharmony_ci } 346a8e1175bSopenharmony_ci } 347a8e1175bSopenharmony_ci 348a8e1175bSopenharmony_ciexit: 349a8e1175bSopenharmony_ci 350a8e1175bSopenharmony_ci if (ret != 0) { 351a8e1175bSopenharmony_ci mbedtls_x509_crt_free(first); 352a8e1175bSopenharmony_ci mbedtls_free(first); 353a8e1175bSopenharmony_ci first = NULL; 354a8e1175bSopenharmony_ci } 355a8e1175bSopenharmony_ci 356a8e1175bSopenharmony_ci *candidates = first; 357a8e1175bSopenharmony_ci return ret; 358a8e1175bSopenharmony_ci} 359a8e1175bSopenharmony_ci#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */ 360a8e1175bSopenharmony_ci 361a8e1175bSopenharmony_ciint delayed_recv(void *ctx, unsigned char *buf, size_t len) 362a8e1175bSopenharmony_ci{ 363a8e1175bSopenharmony_ci static int first_try = 1; 364a8e1175bSopenharmony_ci int ret; 365a8e1175bSopenharmony_ci 366a8e1175bSopenharmony_ci if (first_try) { 367a8e1175bSopenharmony_ci first_try = 0; 368a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_WANT_READ; 369a8e1175bSopenharmony_ci } 370a8e1175bSopenharmony_ci 371a8e1175bSopenharmony_ci ret = mbedtls_net_recv(ctx, buf, len); 372a8e1175bSopenharmony_ci if (ret != MBEDTLS_ERR_SSL_WANT_READ) { 373a8e1175bSopenharmony_ci first_try = 1; /* Next call will be a new operation */ 374a8e1175bSopenharmony_ci } 375a8e1175bSopenharmony_ci return ret; 376a8e1175bSopenharmony_ci} 377a8e1175bSopenharmony_ci 378a8e1175bSopenharmony_ciint delayed_send(void *ctx, const unsigned char *buf, size_t len) 379a8e1175bSopenharmony_ci{ 380a8e1175bSopenharmony_ci static int first_try = 1; 381a8e1175bSopenharmony_ci int ret; 382a8e1175bSopenharmony_ci 383a8e1175bSopenharmony_ci if (first_try) { 384a8e1175bSopenharmony_ci first_try = 0; 385a8e1175bSopenharmony_ci return MBEDTLS_ERR_SSL_WANT_WRITE; 386a8e1175bSopenharmony_ci } 387a8e1175bSopenharmony_ci 388a8e1175bSopenharmony_ci ret = mbedtls_net_send(ctx, buf, len); 389a8e1175bSopenharmony_ci if (ret != MBEDTLS_ERR_SSL_WANT_WRITE) { 390a8e1175bSopenharmony_ci first_try = 1; /* Next call will be a new operation */ 391a8e1175bSopenharmony_ci } 392a8e1175bSopenharmony_ci return ret; 393a8e1175bSopenharmony_ci} 394a8e1175bSopenharmony_ci 395a8e1175bSopenharmony_ci#if !defined(MBEDTLS_TIMING_C) 396a8e1175bSopenharmony_ciint idle(mbedtls_net_context *fd, 397a8e1175bSopenharmony_ci int idle_reason) 398a8e1175bSopenharmony_ci#else 399a8e1175bSopenharmony_ciint idle(mbedtls_net_context *fd, 400a8e1175bSopenharmony_ci mbedtls_timing_delay_context *timer, 401a8e1175bSopenharmony_ci int idle_reason) 402a8e1175bSopenharmony_ci#endif 403a8e1175bSopenharmony_ci{ 404a8e1175bSopenharmony_ci int ret; 405a8e1175bSopenharmony_ci int poll_type = 0; 406a8e1175bSopenharmony_ci 407a8e1175bSopenharmony_ci if (idle_reason == MBEDTLS_ERR_SSL_WANT_WRITE) { 408a8e1175bSopenharmony_ci poll_type = MBEDTLS_NET_POLL_WRITE; 409a8e1175bSopenharmony_ci } else if (idle_reason == MBEDTLS_ERR_SSL_WANT_READ) { 410a8e1175bSopenharmony_ci poll_type = MBEDTLS_NET_POLL_READ; 411a8e1175bSopenharmony_ci } 412a8e1175bSopenharmony_ci#if !defined(MBEDTLS_TIMING_C) 413a8e1175bSopenharmony_ci else { 414a8e1175bSopenharmony_ci return 0; 415a8e1175bSopenharmony_ci } 416a8e1175bSopenharmony_ci#endif 417a8e1175bSopenharmony_ci 418a8e1175bSopenharmony_ci while (1) { 419a8e1175bSopenharmony_ci /* Check if timer has expired */ 420a8e1175bSopenharmony_ci#if defined(MBEDTLS_TIMING_C) 421a8e1175bSopenharmony_ci if (timer != NULL && 422a8e1175bSopenharmony_ci mbedtls_timing_get_delay(timer) == 2) { 423a8e1175bSopenharmony_ci break; 424a8e1175bSopenharmony_ci } 425a8e1175bSopenharmony_ci#endif /* MBEDTLS_TIMING_C */ 426a8e1175bSopenharmony_ci 427a8e1175bSopenharmony_ci /* Check if underlying transport became available */ 428a8e1175bSopenharmony_ci if (poll_type != 0) { 429a8e1175bSopenharmony_ci ret = mbedtls_net_poll(fd, poll_type, 0); 430a8e1175bSopenharmony_ci if (ret < 0) { 431a8e1175bSopenharmony_ci return ret; 432a8e1175bSopenharmony_ci } 433a8e1175bSopenharmony_ci if (ret == poll_type) { 434a8e1175bSopenharmony_ci break; 435a8e1175bSopenharmony_ci } 436a8e1175bSopenharmony_ci } 437a8e1175bSopenharmony_ci } 438a8e1175bSopenharmony_ci 439a8e1175bSopenharmony_ci return 0; 440a8e1175bSopenharmony_ci} 441a8e1175bSopenharmony_ci 442a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_HOOKS) 443a8e1175bSopenharmony_ci 444a8e1175bSopenharmony_civoid test_hooks_init(void) 445a8e1175bSopenharmony_ci{ 446a8e1175bSopenharmony_ci mbedtls_test_info_reset(); 447a8e1175bSopenharmony_ci 448a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_MUTEX_USAGE) 449a8e1175bSopenharmony_ci mbedtls_test_mutex_usage_init(); 450a8e1175bSopenharmony_ci#endif 451a8e1175bSopenharmony_ci} 452a8e1175bSopenharmony_ci 453a8e1175bSopenharmony_ciint test_hooks_failure_detected(void) 454a8e1175bSopenharmony_ci{ 455a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_MUTEX_USAGE) 456a8e1175bSopenharmony_ci /* Errors are reported via mbedtls_test_info. */ 457a8e1175bSopenharmony_ci mbedtls_test_mutex_usage_check(); 458a8e1175bSopenharmony_ci#endif 459a8e1175bSopenharmony_ci 460a8e1175bSopenharmony_ci if (mbedtls_test_get_result() != MBEDTLS_TEST_RESULT_SUCCESS) { 461a8e1175bSopenharmony_ci return 1; 462a8e1175bSopenharmony_ci } 463a8e1175bSopenharmony_ci return 0; 464a8e1175bSopenharmony_ci} 465a8e1175bSopenharmony_ci 466a8e1175bSopenharmony_civoid test_hooks_free(void) 467a8e1175bSopenharmony_ci{ 468a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_MUTEX_USAGE) 469a8e1175bSopenharmony_ci mbedtls_test_mutex_usage_end(); 470a8e1175bSopenharmony_ci#endif 471a8e1175bSopenharmony_ci} 472a8e1175bSopenharmony_ci 473a8e1175bSopenharmony_ci#endif /* MBEDTLS_TEST_HOOKS */ 474a8e1175bSopenharmony_ci 475a8e1175bSopenharmony_cistatic const struct { 476a8e1175bSopenharmony_ci uint16_t tls_id; 477a8e1175bSopenharmony_ci const char *name; 478a8e1175bSopenharmony_ci uint8_t is_supported; 479a8e1175bSopenharmony_ci} tls_id_group_name_table[] = 480a8e1175bSopenharmony_ci{ 481a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_521) 482a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1", 1 }, 483a8e1175bSopenharmony_ci#else 484a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1", 0 }, 485a8e1175bSopenharmony_ci#endif 486a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) 487a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1", 1 }, 488a8e1175bSopenharmony_ci#else 489a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1", 0 }, 490a8e1175bSopenharmony_ci#endif 491a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_384) 492a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1", 1 }, 493a8e1175bSopenharmony_ci#else 494a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1", 0 }, 495a8e1175bSopenharmony_ci#endif 496a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) 497a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1", 1 }, 498a8e1175bSopenharmony_ci#else 499a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1", 0 }, 500a8e1175bSopenharmony_ci#endif 501a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_256) 502a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1", 1 }, 503a8e1175bSopenharmony_ci#else 504a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1", 0 }, 505a8e1175bSopenharmony_ci#endif 506a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_256) 507a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1", 1 }, 508a8e1175bSopenharmony_ci#else 509a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1", 0 }, 510a8e1175bSopenharmony_ci#endif 511a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) 512a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1", 1 }, 513a8e1175bSopenharmony_ci#else 514a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1", 0 }, 515a8e1175bSopenharmony_ci#endif 516a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_224) 517a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, "secp224r1", 1 }, 518a8e1175bSopenharmony_ci#else 519a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224R1, "secp224r1", 0 }, 520a8e1175bSopenharmony_ci#endif 521a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_224) 522a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224K1, "secp224k1", 1 }, 523a8e1175bSopenharmony_ci#else 524a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP224K1, "secp224k1", 0 }, 525a8e1175bSopenharmony_ci#endif 526a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || defined(PSA_WANT_ECC_SECP_R1_192) 527a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, "secp192r1", 1 }, 528a8e1175bSopenharmony_ci#else 529a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192R1, "secp192r1", 0 }, 530a8e1175bSopenharmony_ci#endif 531a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || defined(PSA_WANT_ECC_SECP_K1_192) 532a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192K1, "secp192k1", 1 }, 533a8e1175bSopenharmony_ci#else 534a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_SECP192K1, "secp192k1", 0 }, 535a8e1175bSopenharmony_ci#endif 536a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_255) 537a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519", 1 }, 538a8e1175bSopenharmony_ci#else 539a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519", 0 }, 540a8e1175bSopenharmony_ci#endif 541a8e1175bSopenharmony_ci#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) || defined(PSA_WANT_ECC_MONTGOMERY_448) 542a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448", 1 }, 543a8e1175bSopenharmony_ci#else 544a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448", 0 }, 545a8e1175bSopenharmony_ci#endif 546a8e1175bSopenharmony_ci#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED) && \ 547a8e1175bSopenharmony_ci defined(PSA_WANT_ALG_FFDH) 548a8e1175bSopenharmony_ci#if defined(PSA_WANT_DH_RFC7919_2048) 549a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, "ffdhe2048", 1 }, 550a8e1175bSopenharmony_ci#else /* PSA_WANT_DH_RFC7919_2048 */ 551a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, "ffdhe2048", 0 }, 552a8e1175bSopenharmony_ci#endif /* PSA_WANT_DH_RFC7919_2048 */ 553a8e1175bSopenharmony_ci#if defined(PSA_WANT_DH_RFC7919_3072) 554a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, "ffdhe3072", 1 }, 555a8e1175bSopenharmony_ci#else /* PSA_WANT_DH_RFC7919_3072 */ 556a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, "ffdhe3072", 0 }, 557a8e1175bSopenharmony_ci#endif /* PSA_WANT_DH_RFC7919_3072 */ 558a8e1175bSopenharmony_ci#if defined(PSA_WANT_DH_RFC7919_4096) 559a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096", 1 }, 560a8e1175bSopenharmony_ci#else /* PSA_WANT_DH_RFC7919_4096 */ 561a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096", 0 }, 562a8e1175bSopenharmony_ci#endif /* PSA_WANT_DH_RFC7919_4096 */ 563a8e1175bSopenharmony_ci#if defined(PSA_WANT_DH_RFC7919_6144) 564a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144", 1 }, 565a8e1175bSopenharmony_ci#else /* PSA_WANT_DH_RFC7919_6144 */ 566a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144", 0 }, 567a8e1175bSopenharmony_ci#endif /* PSA_WANT_DH_RFC7919_6144 */ 568a8e1175bSopenharmony_ci#if defined(PSA_WANT_DH_RFC7919_8192) 569a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192", 1 }, 570a8e1175bSopenharmony_ci#else /* PSA_WANT_DH_RFC7919_8192 */ 571a8e1175bSopenharmony_ci { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192", 0 }, 572a8e1175bSopenharmony_ci#endif /* PSA_WANT_DH_RFC7919_8192 */ 573a8e1175bSopenharmony_ci#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED && PSA_WANT_ALG_FFDH */ 574a8e1175bSopenharmony_ci { 0, NULL, 0 }, 575a8e1175bSopenharmony_ci}; 576a8e1175bSopenharmony_ci 577a8e1175bSopenharmony_cistatic uint16_t mbedtls_ssl_get_curve_tls_id_from_name(const char *name) 578a8e1175bSopenharmony_ci{ 579a8e1175bSopenharmony_ci if (name == NULL) { 580a8e1175bSopenharmony_ci return 0; 581a8e1175bSopenharmony_ci } 582a8e1175bSopenharmony_ci 583a8e1175bSopenharmony_ci for (int i = 0; tls_id_group_name_table[i].tls_id != 0; i++) { 584a8e1175bSopenharmony_ci if (strcmp(tls_id_group_name_table[i].name, name) == 0) { 585a8e1175bSopenharmony_ci return tls_id_group_name_table[i].tls_id; 586a8e1175bSopenharmony_ci } 587a8e1175bSopenharmony_ci } 588a8e1175bSopenharmony_ci 589a8e1175bSopenharmony_ci return 0; 590a8e1175bSopenharmony_ci} 591a8e1175bSopenharmony_ci 592a8e1175bSopenharmony_cistatic void mbedtls_ssl_print_supported_groups_list(void) 593a8e1175bSopenharmony_ci{ 594a8e1175bSopenharmony_ci for (int i = 0; tls_id_group_name_table[i].tls_id != 0; i++) { 595a8e1175bSopenharmony_ci if (tls_id_group_name_table[i].is_supported == 1) { 596a8e1175bSopenharmony_ci mbedtls_printf("%s ", tls_id_group_name_table[i].name); 597a8e1175bSopenharmony_ci } 598a8e1175bSopenharmony_ci } 599a8e1175bSopenharmony_ci} 600a8e1175bSopenharmony_ci 601a8e1175bSopenharmony_ciint parse_groups(const char *groups, uint16_t *group_list, size_t group_list_len) 602a8e1175bSopenharmony_ci{ 603a8e1175bSopenharmony_ci char *p = (char *) groups; 604a8e1175bSopenharmony_ci char *q = NULL; 605a8e1175bSopenharmony_ci size_t i = 0; 606a8e1175bSopenharmony_ci 607a8e1175bSopenharmony_ci if (strcmp(p, "none") == 0) { 608a8e1175bSopenharmony_ci group_list[0] = 0; 609a8e1175bSopenharmony_ci } else if (strcmp(p, "default") != 0) { 610a8e1175bSopenharmony_ci /* Leave room for a final NULL in group list */ 611a8e1175bSopenharmony_ci while (i < group_list_len - 1 && *p != '\0') { 612a8e1175bSopenharmony_ci uint16_t curve_tls_id; 613a8e1175bSopenharmony_ci q = p; 614a8e1175bSopenharmony_ci 615a8e1175bSopenharmony_ci /* Terminate the current string */ 616a8e1175bSopenharmony_ci while (*p != ',' && *p != '\0') { 617a8e1175bSopenharmony_ci p++; 618a8e1175bSopenharmony_ci } 619a8e1175bSopenharmony_ci if (*p == ',') { 620a8e1175bSopenharmony_ci *p++ = '\0'; 621a8e1175bSopenharmony_ci } 622a8e1175bSopenharmony_ci 623a8e1175bSopenharmony_ci if ((curve_tls_id = mbedtls_ssl_get_curve_tls_id_from_name(q)) != 0) { 624a8e1175bSopenharmony_ci group_list[i++] = curve_tls_id; 625a8e1175bSopenharmony_ci } else { 626a8e1175bSopenharmony_ci mbedtls_printf("unknown group %s\n", q); 627a8e1175bSopenharmony_ci mbedtls_printf("supported groups: "); 628a8e1175bSopenharmony_ci mbedtls_ssl_print_supported_groups_list(); 629a8e1175bSopenharmony_ci mbedtls_printf("\n"); 630a8e1175bSopenharmony_ci return -1; 631a8e1175bSopenharmony_ci } 632a8e1175bSopenharmony_ci } 633a8e1175bSopenharmony_ci 634a8e1175bSopenharmony_ci mbedtls_printf("Number of groups: %u\n", (unsigned int) i); 635a8e1175bSopenharmony_ci 636a8e1175bSopenharmony_ci if (i == group_list_len - 1 && *p != '\0') { 637a8e1175bSopenharmony_ci mbedtls_printf("groups list too long, maximum %u", 638a8e1175bSopenharmony_ci (unsigned int) (group_list_len - 1)); 639a8e1175bSopenharmony_ci return -1; 640a8e1175bSopenharmony_ci } 641a8e1175bSopenharmony_ci 642a8e1175bSopenharmony_ci group_list[i] = 0; 643a8e1175bSopenharmony_ci } 644a8e1175bSopenharmony_ci 645a8e1175bSopenharmony_ci return 0; 646a8e1175bSopenharmony_ci} 647a8e1175bSopenharmony_ci 648a8e1175bSopenharmony_ci#endif /* !defined(MBEDTLS_SSL_TEST_IMPOSSIBLE) */ 649