psa_crypto_slot_management.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 HAW Hamburg
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
21 #ifndef PSA_CRYPTO_SLOT_MANAGEMENT_H
22 #define PSA_CRYPTO_SLOT_MANAGEMENT_H
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #include "clist.h"
29 #include "psa/crypto.h"
31 
35 #define PSA_PROTECTED_KEY_COUNT (CONFIG_PSA_PROTECTED_KEY_COUNT)
36 
40 #define PSA_ASYMMETRIC_KEYPAIR_COUNT (CONFIG_PSA_ASYMMETRIC_KEYPAIR_COUNT)
41 
45 #define PSA_SINGLE_KEY_COUNT (CONFIG_PSA_SINGLE_KEY_COUNT)
46 
50 #define PSA_KEY_SLOT_COUNT (PSA_PROTECTED_KEY_COUNT + \
51  PSA_ASYMMETRIC_KEYPAIR_COUNT + \
52  PSA_SINGLE_KEY_COUNT)
53 
59 #define PSA_KEY_ID_VOLATILE_MIN (PSA_KEY_ID_VENDOR_MIN)
60 
66 #define PSA_KEY_ID_VOLATILE_MAX (PSA_KEY_ID_VENDOR_MAX)
67 
76 typedef struct {
78  size_t lock_count;
81 #if PSA_SINGLE_KEY_COUNT
82  struct key_data {
83  uint8_t data[PSA_MAX_KEY_DATA_SIZE];
84  size_t data_len;
85  } key;
86 #endif /* PSA_SINGLE_KEY_COUNT */
88 
89 #if PSA_PROTECTED_KEY_COUNT
96 typedef struct {
97  clist_node_t node;
98  size_t lock_count;
100  struct prot_key_data {
101  psa_key_slot_number_t slot_number;
102 #if IS_USED(MODULE_PSA_ASYMMETRIC)
103  uint8_t pubkey_data[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
104  size_t pubkey_data_len;
105 #endif
106  } key;
107 } psa_prot_key_slot_t;
108 #endif /* PSA_PROTECTED_KEY_COUNT */
109 
110 #if PSA_ASYMMETRIC_KEYPAIR_COUNT
117 typedef struct {
118  clist_node_t node;
119  size_t lock_count;
121  struct key_pair_data {
123  uint8_t privkey_data[PSA_BITS_TO_BYTES(PSA_MAX_PRIV_KEY_SIZE)];
125  size_t privkey_data_len;
127  uint8_t pubkey_data[PSA_EXPORT_PUBLIC_KEY_MAX_SIZE];
129  size_t pubkey_data_len;
130  } key;
131 } psa_key_pair_slot_t;
132 #endif /* PSA_ASYMMETRIC_KEYPAIR_COUNT */
133 
138 
147 static inline int psa_key_id_is_volatile(psa_key_id_t key_id)
148 {
149  return ((key_id >= PSA_KEY_ID_VOLATILE_MIN) &&
150  (key_id <= PSA_KEY_ID_VOLATILE_MAX));
151 }
152 
160 static inline int psa_is_key_slot_locked(psa_key_slot_t *slot)
161 {
162  return (slot->lock_count > 0);
163 }
164 
172 
182 {
184 }
185 
195 
200 
212 
220 
232  const psa_key_attributes_t *attr,
233  psa_key_slot_t **p_slot);
234 
244 
254 
265  psa_se_drv_data_t **driver);
266 
276 
286 int psa_is_valid_key_id(psa_key_id_t id, int vendor);
287 
298  uint8_t **key_data,
299  size_t **key_bytes);
300 
309  uint8_t **pubkey_data,
310  size_t **pubkey_data_len);
311 
312 #ifdef __cplusplus
313 }
314 #endif
315 
316 #endif /* PSA_CRYPTO_SLOT_MANAGEMENT_H */
Circular linked list.
Function declarations for PSA Crypto.
#define PSA_MAX_PRIV_KEY_SIZE
The maximum size of an asymmetric private key.
Definition: crypto_sizes.h:940
#define PSA_MAX_KEY_DATA_SIZE
The maximum size of the used key data.
#define PSA_EXPORT_PUBLIC_KEY_MAX_SIZE
Sufficient buffer size for exporting any asymmetric public key.
#define PSA_BITS_TO_BYTES(bits)
Functions to convert bits to bytes.
Definition: crypto_sizes.h:42
uint64_t psa_key_slot_number_t
Encoding of a key slot number on a secure element.
int psa_is_valid_key_id(psa_key_id_t id, int vendor)
Check if provided key ID is either a valid user ID or vendor ID.
psa_status_t psa_lock_key_slot(psa_key_slot_t *slot)
Increase lock count.
#define PSA_KEY_ID_VOLATILE_MAX
Maximum key id for volatile keys.
void psa_init_key_slots(void)
Initializes the allocated key slots and prepares the internal key slot lists.
static int psa_is_key_slot_locked(psa_key_slot_t *slot)
Check whether a key slot is locked.
static int psa_key_lifetime_is_external(psa_key_lifetime_t lifetime)
Check whether a key is stored on an external device.
psa_status_t psa_validate_key_persistence(psa_key_lifetime_t lifetime)
Validate key persistence.
psa_status_t psa_get_and_lock_key_slot(psa_key_id_t id, psa_key_slot_t **slot)
Find a key slot in local memory and lock it.
psa_status_t psa_validate_key_location(psa_key_lifetime_t lifetime, psa_se_drv_data_t **driver)
Check if key location exists.
psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot)
Wipe volatile key slot and its contents.
#define PSA_KEY_ID_VOLATILE_MIN
Minimum key id for volatile keys.
psa_status_t psa_persist_key_slot_in_storage(psa_key_slot_t *slot)
Store a key slot in persistent storage.
psa_status_t psa_allocate_empty_key_slot(psa_key_id_t *id, const psa_key_attributes_t *attr, psa_key_slot_t **p_slot)
Find a currently empty key slot that is appropriate for the key.
psa_status_t psa_unlock_key_slot(psa_key_slot_t *slot)
Decrease lock count.
psa_key_slot_number_t * psa_key_slot_get_slot_number(const psa_key_slot_t *slot)
Get slot number in protected memory.
void psa_get_public_key_data_from_key_slot(const psa_key_slot_t *slot, uint8_t **pubkey_data, size_t **pubkey_data_len)
Get public key data and size from key slot.
void psa_wipe_all_key_slots(void)
Wipe all existing volatile key slots.
static int psa_key_id_is_volatile(psa_key_id_t key_id)
Check whether a key identifier is a volatile key identifier.
size_t psa_get_key_data_from_key_slot(const psa_key_slot_t *slot, uint8_t **key_data, size_t **key_bytes)
Get key data and key size from key slot.
uint32_t psa_key_id_t
Key identifier.
Definition: id.h:37
#define PSA_KEY_LOCATION_LOCAL_STORAGE
The local storage area for persistent keys.
Definition: lifetime.h:202
#define PSA_KEY_LIFETIME_GET_LOCATION(lifetime)
Extract the location indicator from a key lifetime.
Definition: lifetime.h:245
uint32_t psa_key_lifetime_t
Encoding of key lifetimes.
Definition: lifetime.h:67
int32_t psa_status_t
Status code type used for all PSA Certified APIs.
Definition: error.h:41
PSA Secure Element management function declarations.
List node structure.
Definition: list.h:40
Structure storing key attributes.
Definition: attributes.h:52
Structure of a virtual key slot in local memory.
clist_node_t node
List node to link slot in global list.
psa_key_attributes_t attr
Attributes associated with the stored key.
size_t lock_count
Number of entities accessing the slot.
Structure containing secure element driver data and contexts.