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