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