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