1a8e1175bSopenharmony_ci/* 2a8e1175bSopenharmony_ci * Test driver for key agreement functions. 3a8e1175bSopenharmony_ci */ 4a8e1175bSopenharmony_ci/* Copyright The Mbed TLS Contributors 5a8e1175bSopenharmony_ci * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 6a8e1175bSopenharmony_ci */ 7a8e1175bSopenharmony_ci 8a8e1175bSopenharmony_ci#include <test/helpers.h> 9a8e1175bSopenharmony_ci 10a8e1175bSopenharmony_ci#if defined(PSA_CRYPTO_DRIVER_TEST) 11a8e1175bSopenharmony_ci 12a8e1175bSopenharmony_ci#include "psa/crypto.h" 13a8e1175bSopenharmony_ci#include "psa_crypto_core.h" 14a8e1175bSopenharmony_ci#include "psa_crypto_ecp.h" 15a8e1175bSopenharmony_ci#include "psa_crypto_ffdh.h" 16a8e1175bSopenharmony_ci 17a8e1175bSopenharmony_ci#include "test/drivers/key_agreement.h" 18a8e1175bSopenharmony_ci#include "test/drivers/test_driver.h" 19a8e1175bSopenharmony_ci 20a8e1175bSopenharmony_ci#include <string.h> 21a8e1175bSopenharmony_ci 22a8e1175bSopenharmony_ci#if defined(MBEDTLS_TEST_LIBTESTDRIVER1) 23a8e1175bSopenharmony_ci#include "libtestdriver1/include/psa/crypto.h" 24a8e1175bSopenharmony_ci#include "libtestdriver1/library/psa_crypto_ecp.h" 25a8e1175bSopenharmony_ci#include "libtestdriver1/library/psa_crypto_ffdh.h" 26a8e1175bSopenharmony_ci#endif 27a8e1175bSopenharmony_ci 28a8e1175bSopenharmony_cimbedtls_test_driver_key_agreement_hooks_t 29a8e1175bSopenharmony_ci mbedtls_test_driver_key_agreement_hooks = MBEDTLS_TEST_DRIVER_KEY_AGREEMENT_INIT; 30a8e1175bSopenharmony_ci 31a8e1175bSopenharmony_cipsa_status_t mbedtls_test_transparent_key_agreement( 32a8e1175bSopenharmony_ci const psa_key_attributes_t *attributes, 33a8e1175bSopenharmony_ci const uint8_t *key_buffer, 34a8e1175bSopenharmony_ci size_t key_buffer_size, 35a8e1175bSopenharmony_ci psa_algorithm_t alg, 36a8e1175bSopenharmony_ci const uint8_t *peer_key, 37a8e1175bSopenharmony_ci size_t peer_key_length, 38a8e1175bSopenharmony_ci uint8_t *shared_secret, 39a8e1175bSopenharmony_ci size_t shared_secret_size, 40a8e1175bSopenharmony_ci size_t *shared_secret_length) 41a8e1175bSopenharmony_ci{ 42a8e1175bSopenharmony_ci mbedtls_test_driver_key_agreement_hooks.hits++; 43a8e1175bSopenharmony_ci 44a8e1175bSopenharmony_ci if (mbedtls_test_driver_key_agreement_hooks.forced_status != PSA_SUCCESS) { 45a8e1175bSopenharmony_ci return mbedtls_test_driver_key_agreement_hooks.forced_status; 46a8e1175bSopenharmony_ci } 47a8e1175bSopenharmony_ci 48a8e1175bSopenharmony_ci if (mbedtls_test_driver_key_agreement_hooks.forced_output != NULL) { 49a8e1175bSopenharmony_ci if (mbedtls_test_driver_key_agreement_hooks.forced_output_length > shared_secret_size) { 50a8e1175bSopenharmony_ci return PSA_ERROR_BUFFER_TOO_SMALL; 51a8e1175bSopenharmony_ci } 52a8e1175bSopenharmony_ci 53a8e1175bSopenharmony_ci memcpy(shared_secret, mbedtls_test_driver_key_agreement_hooks.forced_output, 54a8e1175bSopenharmony_ci mbedtls_test_driver_key_agreement_hooks.forced_output_length); 55a8e1175bSopenharmony_ci *shared_secret_length = mbedtls_test_driver_key_agreement_hooks.forced_output_length; 56a8e1175bSopenharmony_ci 57a8e1175bSopenharmony_ci return PSA_SUCCESS; 58a8e1175bSopenharmony_ci } 59a8e1175bSopenharmony_ci 60a8e1175bSopenharmony_ci if (PSA_ALG_IS_ECDH(alg)) { 61a8e1175bSopenharmony_ci#if (defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ 62a8e1175bSopenharmony_ci defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_ECDH)) 63a8e1175bSopenharmony_ci return libtestdriver1_mbedtls_psa_key_agreement_ecdh( 64a8e1175bSopenharmony_ci (const libtestdriver1_psa_key_attributes_t *) attributes, 65a8e1175bSopenharmony_ci key_buffer, key_buffer_size, 66a8e1175bSopenharmony_ci alg, peer_key, peer_key_length, 67a8e1175bSopenharmony_ci shared_secret, shared_secret_size, 68a8e1175bSopenharmony_ci shared_secret_length); 69a8e1175bSopenharmony_ci#elif defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) 70a8e1175bSopenharmony_ci return mbedtls_psa_key_agreement_ecdh( 71a8e1175bSopenharmony_ci attributes, 72a8e1175bSopenharmony_ci key_buffer, key_buffer_size, 73a8e1175bSopenharmony_ci alg, peer_key, peer_key_length, 74a8e1175bSopenharmony_ci shared_secret, shared_secret_size, 75a8e1175bSopenharmony_ci shared_secret_length); 76a8e1175bSopenharmony_ci#else 77a8e1175bSopenharmony_ci (void) attributes; 78a8e1175bSopenharmony_ci (void) key_buffer; 79a8e1175bSopenharmony_ci (void) key_buffer_size; 80a8e1175bSopenharmony_ci (void) peer_key; 81a8e1175bSopenharmony_ci (void) peer_key_length; 82a8e1175bSopenharmony_ci (void) shared_secret; 83a8e1175bSopenharmony_ci (void) shared_secret_size; 84a8e1175bSopenharmony_ci (void) shared_secret_length; 85a8e1175bSopenharmony_ci return PSA_ERROR_NOT_SUPPORTED; 86a8e1175bSopenharmony_ci#endif 87a8e1175bSopenharmony_ci } 88a8e1175bSopenharmony_ci if (PSA_ALG_IS_FFDH(alg)) { 89a8e1175bSopenharmony_ci#if (defined(MBEDTLS_TEST_LIBTESTDRIVER1) && \ 90a8e1175bSopenharmony_ci defined(LIBTESTDRIVER1_MBEDTLS_PSA_BUILTIN_ALG_FFDH)) 91a8e1175bSopenharmony_ci return libtestdriver1_mbedtls_psa_ffdh_key_agreement( 92a8e1175bSopenharmony_ci (const libtestdriver1_psa_key_attributes_t *) attributes, 93a8e1175bSopenharmony_ci peer_key, peer_key_length, 94a8e1175bSopenharmony_ci key_buffer, key_buffer_size, 95a8e1175bSopenharmony_ci shared_secret, shared_secret_size, 96a8e1175bSopenharmony_ci shared_secret_length); 97a8e1175bSopenharmony_ci#elif defined(MBEDTLS_PSA_BUILTIN_ALG_FFDH) 98a8e1175bSopenharmony_ci return mbedtls_psa_ffdh_key_agreement( 99a8e1175bSopenharmony_ci attributes, 100a8e1175bSopenharmony_ci peer_key, 101a8e1175bSopenharmony_ci peer_key_length, 102a8e1175bSopenharmony_ci key_buffer, 103a8e1175bSopenharmony_ci key_buffer_size, 104a8e1175bSopenharmony_ci shared_secret, 105a8e1175bSopenharmony_ci shared_secret_size, 106a8e1175bSopenharmony_ci shared_secret_length); 107a8e1175bSopenharmony_ci#else 108a8e1175bSopenharmony_ci (void) attributes; 109a8e1175bSopenharmony_ci (void) key_buffer; 110a8e1175bSopenharmony_ci (void) key_buffer_size; 111a8e1175bSopenharmony_ci (void) peer_key; 112a8e1175bSopenharmony_ci (void) peer_key_length; 113a8e1175bSopenharmony_ci (void) shared_secret; 114a8e1175bSopenharmony_ci (void) shared_secret_size; 115a8e1175bSopenharmony_ci (void) shared_secret_length; 116a8e1175bSopenharmony_ci return PSA_ERROR_NOT_SUPPORTED; 117a8e1175bSopenharmony_ci#endif 118a8e1175bSopenharmony_ci } else { 119a8e1175bSopenharmony_ci return PSA_ERROR_INVALID_ARGUMENT; 120a8e1175bSopenharmony_ci } 121a8e1175bSopenharmony_ci 122a8e1175bSopenharmony_ci} 123a8e1175bSopenharmony_ci 124a8e1175bSopenharmony_cipsa_status_t mbedtls_test_opaque_key_agreement( 125a8e1175bSopenharmony_ci const psa_key_attributes_t *attributes, 126a8e1175bSopenharmony_ci const uint8_t *key_buffer, 127a8e1175bSopenharmony_ci size_t key_buffer_size, 128a8e1175bSopenharmony_ci psa_algorithm_t alg, 129a8e1175bSopenharmony_ci const uint8_t *peer_key, 130a8e1175bSopenharmony_ci size_t peer_key_length, 131a8e1175bSopenharmony_ci uint8_t *shared_secret, 132a8e1175bSopenharmony_ci size_t shared_secret_size, 133a8e1175bSopenharmony_ci size_t *shared_secret_length) 134a8e1175bSopenharmony_ci{ 135a8e1175bSopenharmony_ci (void) attributes; 136a8e1175bSopenharmony_ci (void) key_buffer; 137a8e1175bSopenharmony_ci (void) key_buffer_size; 138a8e1175bSopenharmony_ci (void) alg; 139a8e1175bSopenharmony_ci (void) peer_key; 140a8e1175bSopenharmony_ci (void) peer_key_length; 141a8e1175bSopenharmony_ci (void) shared_secret; 142a8e1175bSopenharmony_ci (void) shared_secret_size; 143a8e1175bSopenharmony_ci (void) shared_secret_length; 144a8e1175bSopenharmony_ci return PSA_ERROR_NOT_SUPPORTED; 145a8e1175bSopenharmony_ci} 146a8e1175bSopenharmony_ci 147a8e1175bSopenharmony_ci#endif /* PSA_CRYPTO_DRIVER_TEST */ 148