blob: 723e84a68436a36273abacc05b5f9bc6eb62157c [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"
18#include "psa_crypto.h"
Antonio de Angelis4743e672019-04-11 11:38:48 +010019#ifdef TFM_PSA_API
20#include "psa_service.h"
21
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 Angelis8908f472018-08-31 15:44:25 +010043
44 /* Used to force the enum size */
45 TFM_CRYPTO_OPERATION_TYPE_MAX = INT_MAX
46};
47
48/**
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010049 * \brief Initialise the service
Antonio de Angelis8908f472018-08-31 15:44:25 +010050 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000051 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010052 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000053psa_status_t tfm_crypto_init(void);
Antonio de Angelis8908f472018-08-31 15:44:25 +010054
55/**
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010056 * \brief Initialise the Alloc module
57 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000058 * \return Return values as described in \ref psa_status_t
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010059 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000060psa_status_t tfm_crypto_init_alloc(void);
Antonio de Angeliscf85ba22018-10-09 13:29:40 +010061
62/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +000063 * \brief Allocate an operation context in the backend
Antonio de Angelis8908f472018-08-31 15:44:25 +010064 *
Antonio de Angelis4743e672019-04-11 11:38:48 +010065 * \param[in] type Type of the operation context to allocate
66 * \param[out] handle Pointer to the hold the allocated handle
67 * \param[out ctx Double pointer to the corresponding context
Antonio de Angelis8908f472018-08-31 15:44:25 +010068 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000069 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010070 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000071psa_status_t tfm_crypto_operation_alloc(enum tfm_crypto_operation_type type,
Antonio de Angelis4743e672019-04-11 11:38:48 +010072 uint32_t *handle,
Antonio de Angelis819c2f32019-02-06 14:32:02 +000073 void **ctx);
Antonio de Angelis8908f472018-08-31 15:44:25 +010074/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +000075 * \brief Release an operation context in the backend
Antonio de Angelis8908f472018-08-31 15:44:25 +010076 *
Antonio de Angelis4743e672019-04-11 11:38:48 +010077 * \param[in] handle Pointer to the handle of the context to release
Antonio de Angelis8908f472018-08-31 15:44:25 +010078 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000079 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010080 */
Antonio de Angelis4743e672019-04-11 11:38:48 +010081psa_status_t tfm_crypto_operation_release(uint32_t *handle);
Antonio de Angelis8908f472018-08-31 15:44:25 +010082/**
Antonio de Angelis819c2f32019-02-06 14:32:02 +000083 * \brief Look up an operation context in the backend for the corresponding
84 * frontend operation
Antonio de Angelis8908f472018-08-31 15:44:25 +010085 *
Antonio de Angelis4743e672019-04-11 11:38:48 +010086 * \param[in] type Type of the operation context to look up
87 * \param[in] handle Handle of the context to lookup
88 * \param[out] ctx Double pointer to the corresponding context
Antonio de Angelis8908f472018-08-31 15:44:25 +010089 *
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000090 * \return Return values as described in \ref psa_status_t
Antonio de Angelis8908f472018-08-31 15:44:25 +010091 */
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000092psa_status_t tfm_crypto_operation_lookup(enum tfm_crypto_operation_type type,
Antonio de Angelis4743e672019-04-11 11:38:48 +010093 uint32_t handle,
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000094 void **ctx);
Antonio de Angelis8908f472018-08-31 15:44:25 +010095
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000096#define LIST_TFM_CRYPTO_UNIFORM_SIGNATURE_API \
Jamie Fox0e54ebc2019-04-09 14:21:04 +010097 X(tfm_crypto_allocate_key); \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +000098 X(tfm_crypto_import_key); \
99 X(tfm_crypto_destroy_key); \
100 X(tfm_crypto_get_key_information); \
101 X(tfm_crypto_export_key); \
Jamie Fox0e54ebc2019-04-09 14:21:04 +0100102 X(tfm_crypto_export_public_key); \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000103 X(tfm_crypto_set_key_policy); \
104 X(tfm_crypto_get_key_policy); \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000105 X(tfm_crypto_get_key_lifetime); \
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000106 X(tfm_crypto_cipher_set_iv); \
107 X(tfm_crypto_cipher_encrypt_setup); \
108 X(tfm_crypto_cipher_decrypt_setup); \
109 X(tfm_crypto_cipher_update); \
110 X(tfm_crypto_cipher_finish); \
111 X(tfm_crypto_cipher_abort); \
112 X(tfm_crypto_hash_setup); \
113 X(tfm_crypto_hash_update); \
114 X(tfm_crypto_hash_finish); \
115 X(tfm_crypto_hash_verify); \
116 X(tfm_crypto_hash_abort); \
117 X(tfm_crypto_mac_sign_setup); \
118 X(tfm_crypto_mac_verify_setup); \
119 X(tfm_crypto_mac_update); \
120 X(tfm_crypto_mac_sign_finish); \
121 X(tfm_crypto_mac_verify_finish); \
122 X(tfm_crypto_mac_abort); \
123 X(tfm_crypto_aead_encrypt); \
124 X(tfm_crypto_aead_decrypt); \
Jamie Foxefd82732018-11-26 10:34:32 +0000125
Antonio de Angelisab85ccd2019-03-25 15:14:29 +0000126#define X(api_name) UNIFORM_SIGNATURE_API(api_name)
127LIST_TFM_CRYPTO_UNIFORM_SIGNATURE_API
128#undef X
Jamie Foxefd82732018-11-26 10:34:32 +0000129
Antonio de Angelis8908f472018-08-31 15:44:25 +0100130#ifdef __cplusplus
131}
132#endif
133
134#endif /* __TFM_CRYPTO_API_H__ */