blob: 34400ad14a4db1a5c9931b8269c559cc94ed089d [file] [log] [blame]
Antonio de Angelis8908f472018-08-31 15:44:25 +01001/*
Antonio de Angelis377a1552018-11-22 17:02:40 +00002 * Copyright (c) 2018-2019, Arm Limited. All rights reserved.
Antonio de Angelis8908f472018-08-31 15:44:25 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#ifndef __TFM_CRYPTO_API_H__
9#define __TFM_CRYPTO_API_H__
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15#include <stdint.h>
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000016#include "tfm_api.h"
Antonio de Angelis8908f472018-08-31 15:44:25 +010017#include "tfm_crypto_defs.h"
Jamie Foxcc31d402019-01-28 17:13:52 +000018#include "psa/crypto.h"
Antonio de Angelis4743e672019-04-11 11:38:48 +010019#ifdef TFM_PSA_API
Jamie Foxcc31d402019-01-28 17:13:52 +000020#include "psa/service.h"
Antonio de Angelis4743e672019-04-11 11:38:48 +010021
22/**
23 * \brief This define is a function pointer type to the Uniform Signature API
24 * prototype.
25 */
26typedef psa_status_t (*tfm_crypto_us_t)(psa_invec[],size_t,psa_outvec[],size_t);
27#endif
Antonio de Angelis8908f472018-08-31 15:44:25 +010028
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000029#define UNIFORM_SIGNATURE_API(api_name) \
30 psa_status_t api_name(psa_invec[], size_t, psa_outvec[], size_t)
31
Antonio de Angelis8908f472018-08-31 15:44:25 +010032/**
33 * \brief List of possible operation types supported by the TFM based
34 * implementation. This type is needed by the operation allocation,
35 * lookup and release functions.
36 *
37 */
38enum tfm_crypto_operation_type {
39 TFM_CRYPTO_OPERATION_NONE = 0,
40 TFM_CRYPTO_CIPHER_OPERATION = 1,
41 TFM_CRYPTO_MAC_OPERATION = 2,
42 TFM_CRYPTO_HASH_OPERATION = 3,
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +010043 TFM_CRYPTO_GENERATOR_OPERATION = 4,
Antonio de Angelis8908f472018-08-31 15:44:25 +010044
45 /* Used to force the enum size */
46 TFM_CRYPTO_OPERATION_TYPE_MAX = INT_MAX
47};
48
49/**
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010050 * \brief Initialise the service
Antonio de Angelis8908f472018-08-31 15:44:25 +010051 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000052 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010053 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000054psa_status_t tfm_crypto_init(void);
Antonio de Angelis8908f472018-08-31 15:44:25 +010055
56/**
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010057 * \brief Initialise the Alloc module
58 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000059 * \return Return values as described in \ref psa_status_t
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010060 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000061psa_status_t tfm_crypto_init_alloc(void);
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010062
63/**
Antonio de Angelis60a6fe62019-06-18 15:27:34 +010064 * \brief Returns the ID of the caller
65 *
66 * \param[out] id Pointer to hold the ID of the caller
67 *
68 * \return Return values as described in \ref psa_status_t
69 */
70psa_status_t tfm_crypto_get_caller_id(int32_t *id);
71
72/**
73 * \brief Checks that the requested handle belongs to the requesting
74 * partition
75 *
76 * \param[in] handle Handle given as input
77 * \param[out] index Optionally, pointer to hold the internal index
78 * corresponding to the input handle. Valid only
79 * on PSA_SUCCESS, it's returned only if the input
80 * parameter is not NULL.
81 *
82 * \return Return values as described in \ref psa_status_t
83 */
84psa_status_t tfm_crypto_check_handle_owner(psa_key_handle_t handle,
85 uint32_t *index);
86/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +000087 * \brief Allocate an operation context in the backend
Antonio de Angelis8908f472018-08-31 15:44:25 +010088 *
Antonio de Angelis4743e672019-04-11 11:38:48 +010089 * \param[in] type Type of the operation context to allocate
Antonio de Angelis60a6fe62019-06-18 15:27:34 +010090 * \param[out] handle Pointer to hold the allocated handle
Antonio de Angelis4743e672019-04-11 11:38:48 +010091 * \param[out ctx Double pointer to the corresponding context
Antonio de Angelis8908f472018-08-31 15:44:25 +010092 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000093 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010094 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000095psa_status_t tfm_crypto_operation_alloc(enum tfm_crypto_operation_type type,
Antonio de Angelis4743e672019-04-11 11:38:48 +010096 uint32_t *handle,
Antonio de Angelis819c2f32019-02-06 14:32:02 +000097 void **ctx);
Antonio de Angelis8908f472018-08-31 15:44:25 +010098/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +000099 * \brief Release an operation context in the backend
Antonio de Angelis8908f472018-08-31 15:44:25 +0100100 *
Antonio de Angelis4743e672019-04-11 11:38:48 +0100101 * \param[in] handle Pointer to the handle of the context to release
Antonio de Angelis8908f472018-08-31 15:44:25 +0100102 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000103 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +0100104 */
Antonio de Angelis4743e672019-04-11 11:38:48 +0100105psa_status_t tfm_crypto_operation_release(uint32_t *handle);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100106/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +0000107 * \brief Look up an operation context in the backend for the corresponding
108 * frontend operation
Antonio de Angelis8908f472018-08-31 15:44:25 +0100109 *
Antonio de Angelis4743e672019-04-11 11:38:48 +0100110 * \param[in] type Type of the operation context to look up
111 * \param[in] handle Handle of the context to lookup
112 * \param[out] ctx Double pointer to the corresponding context
Antonio de Angelis8908f472018-08-31 15:44:25 +0100113 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000114 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +0100115 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000116psa_status_t tfm_crypto_operation_lookup(enum tfm_crypto_operation_type type,
Antonio de Angelis4743e672019-04-11 11:38:48 +0100117 uint32_t handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000118 void **ctx);
Antonio de Angelis8908f472018-08-31 15:44:25 +0100119
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000120#define LIST_TFM_CRYPTO_UNIFORM_SIGNATURE_API \
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100121 X(tfm_crypto_allocate_key) \
Jamie Foxdadb4e82019-09-03 17:59:41 +0100122 X(tfm_crypto_open_key) \
123 X(tfm_crypto_close_key) \
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100124 X(tfm_crypto_import_key) \
125 X(tfm_crypto_destroy_key) \
126 X(tfm_crypto_get_key_information) \
127 X(tfm_crypto_export_key) \
128 X(tfm_crypto_export_public_key) \
129 X(tfm_crypto_copy_key) \
130 X(tfm_crypto_set_key_policy) \
131 X(tfm_crypto_get_key_policy) \
132 X(tfm_crypto_get_key_lifetime) \
133 X(tfm_crypto_cipher_generate_iv) \
134 X(tfm_crypto_cipher_set_iv) \
135 X(tfm_crypto_cipher_encrypt_setup) \
136 X(tfm_crypto_cipher_decrypt_setup) \
137 X(tfm_crypto_cipher_update) \
138 X(tfm_crypto_cipher_abort) \
139 X(tfm_crypto_cipher_finish) \
140 X(tfm_crypto_hash_setup) \
141 X(tfm_crypto_hash_update) \
142 X(tfm_crypto_hash_finish) \
143 X(tfm_crypto_hash_verify) \
144 X(tfm_crypto_hash_abort) \
145 X(tfm_crypto_hash_clone) \
146 X(tfm_crypto_mac_sign_setup) \
147 X(tfm_crypto_mac_verify_setup) \
148 X(tfm_crypto_mac_update) \
149 X(tfm_crypto_mac_sign_finish) \
150 X(tfm_crypto_mac_verify_finish) \
151 X(tfm_crypto_mac_abort) \
152 X(tfm_crypto_aead_encrypt) \
153 X(tfm_crypto_aead_decrypt) \
154 X(tfm_crypto_asymmetric_sign) \
155 X(tfm_crypto_asymmetric_verify) \
156 X(tfm_crypto_asymmetric_encrypt) \
157 X(tfm_crypto_asymmetric_decrypt) \
158 X(tfm_crypto_get_generator_capacity) \
159 X(tfm_crypto_generator_read) \
160 X(tfm_crypto_generator_import_key) \
161 X(tfm_crypto_generator_abort) \
162 X(tfm_crypto_key_derivation) \
163 X(tfm_crypto_key_agreement) \
164 X(tfm_crypto_generate_random) \
165 X(tfm_crypto_generate_key) \
Jamie Foxefd82732018-11-26 10:34:32 +0000166
Antonio de Angelis25e2b2d2019-04-25 14:49:50 +0100167#define X(api_name) UNIFORM_SIGNATURE_API(api_name);
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000168LIST_TFM_CRYPTO_UNIFORM_SIGNATURE_API
169#undef X
Jamie Foxefd82732018-11-26 10:34:32 +0000170
Antonio de Angelis8908f472018-08-31 15:44:25 +0100171#ifdef __cplusplus
172}
173#endif
174
175#endif /* __TFM_CRYPTO_API_H__ */