Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/mbedtls/include/psa/crypto_se_driver.h
9904 views
1
/**
2
* \file psa/crypto_se_driver.h
3
* \brief PSA external cryptoprocessor driver module
4
*
5
* This header declares types and function signatures for cryptography
6
* drivers that access key material via opaque references.
7
* This is meant for cryptoprocessors that have a separate key storage from the
8
* space in which the PSA Crypto implementation runs, typically secure
9
* elements (SEs).
10
*
11
* This file is part of the PSA Crypto Driver HAL (hardware abstraction layer),
12
* containing functions for driver developers to implement to enable hardware
13
* to be called in a standardized way by a PSA Cryptography API
14
* implementation. The functions comprising the driver HAL, which driver
15
* authors implement, are not intended to be called by application developers.
16
*/
17
18
/*
19
* Copyright The Mbed TLS Contributors
20
* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
21
*/
22
#ifndef PSA_CRYPTO_SE_DRIVER_H
23
#define PSA_CRYPTO_SE_DRIVER_H
24
#include "mbedtls/private_access.h"
25
26
#include "crypto_driver_common.h"
27
28
#ifdef __cplusplus
29
extern "C" {
30
#endif
31
32
/** \defgroup se_init Secure element driver initialization
33
*/
34
/**@{*/
35
36
/** \brief Driver context structure
37
*
38
* Driver functions receive a pointer to this structure.
39
* Each registered driver has one instance of this structure.
40
*
41
* Implementations must include the fields specified here and
42
* may include other fields.
43
*/
44
typedef struct {
45
/** A read-only pointer to the driver's persistent data.
46
*
47
* Drivers typically use this persistent data to keep track of
48
* which slot numbers are available. This is only a guideline:
49
* drivers may use the persistent data for any purpose, keeping
50
* in mind the restrictions on when the persistent data is saved
51
* to storage: the persistent data is only saved after calling
52
* certain functions that receive a writable pointer to the
53
* persistent data.
54
*
55
* The core allocates a memory buffer for the persistent data.
56
* The pointer is guaranteed to be suitably aligned for any data type,
57
* like a pointer returned by `malloc` (but the core can use any
58
* method to allocate the buffer, not necessarily `malloc`).
59
*
60
* The size of this buffer is in the \c persistent_data_size field of
61
* this structure.
62
*
63
* Before the driver is initialized for the first time, the content of
64
* the persistent data is all-bits-zero. After a driver upgrade, if the
65
* size of the persistent data has increased, the original data is padded
66
* on the right with zeros; if the size has decreased, the original data
67
* is truncated to the new size.
68
*
69
* This pointer is to read-only data. Only a few driver functions are
70
* allowed to modify the persistent data. These functions receive a
71
* writable pointer. These functions are:
72
* - psa_drv_se_t::p_init
73
* - psa_drv_se_key_management_t::p_allocate
74
* - psa_drv_se_key_management_t::p_destroy
75
*
76
* The PSA Cryptography core saves the persistent data from one
77
* session to the next. It does this before returning from API functions
78
* that call a driver method that is allowed to modify the persistent
79
* data, specifically:
80
* - psa_crypto_init() causes a call to psa_drv_se_t::p_init, and may call
81
* psa_drv_se_key_management_t::p_destroy to complete an action
82
* that was interrupted by a power failure.
83
* - Key creation functions cause a call to
84
* psa_drv_se_key_management_t::p_allocate, and may cause a call to
85
* psa_drv_se_key_management_t::p_destroy in case an error occurs.
86
* - psa_destroy_key() causes a call to
87
* psa_drv_se_key_management_t::p_destroy.
88
*/
89
const void *const MBEDTLS_PRIVATE(persistent_data);
90
91
/** The size of \c persistent_data in bytes.
92
*
93
* This is always equal to the value of the `persistent_data_size` field
94
* of the ::psa_drv_se_t structure when the driver is registered.
95
*/
96
const size_t MBEDTLS_PRIVATE(persistent_data_size);
97
98
/** Driver transient data.
99
*
100
* The core initializes this value to 0 and does not read or modify it
101
* afterwards. The driver may store whatever it wants in this field.
102
*/
103
uintptr_t MBEDTLS_PRIVATE(transient_data);
104
} psa_drv_se_context_t;
105
106
/** \brief A driver initialization function.
107
*
108
* \param[in,out] drv_context The driver context structure.
109
* \param[in,out] persistent_data A pointer to the persistent data
110
* that allows writing.
111
* \param location The location value for which this driver
112
* is registered. The driver will be invoked
113
* for all keys whose lifetime is in this
114
* location.
115
*
116
* \retval #PSA_SUCCESS
117
* The driver is operational.
118
* The core will update the persistent data in storage.
119
* \return
120
* Any other return value prevents the driver from being used in
121
* this session.
122
* The core will NOT update the persistent data in storage.
123
*/
124
typedef psa_status_t (*psa_drv_se_init_t)(psa_drv_se_context_t *drv_context,
125
void *persistent_data,
126
psa_key_location_t location);
127
128
#if defined(__DOXYGEN_ONLY__) || !defined(MBEDTLS_PSA_CRYPTO_SE_C)
129
/* Mbed TLS with secure element support enabled defines this type in
130
* crypto_types.h because it is also visible to applications through an
131
* implementation-specific extension.
132
* For the PSA Cryptography specification, this type is only visible
133
* via crypto_se_driver.h. */
134
/** An internal designation of a key slot between the core part of the
135
* PSA Crypto implementation and the driver. The meaning of this value
136
* is driver-dependent. */
137
typedef uint64_t psa_key_slot_number_t;
138
#endif /* __DOXYGEN_ONLY__ || !MBEDTLS_PSA_CRYPTO_SE_C */
139
140
/**@}*/
141
142
/** \defgroup se_mac Secure Element Message Authentication Codes
143
* Generation and authentication of Message Authentication Codes (MACs) using
144
* a secure element can be done either as a single function call (via the
145
* `psa_drv_se_mac_generate_t` or `psa_drv_se_mac_verify_t` functions), or in
146
* parts using the following sequence:
147
* - `psa_drv_se_mac_setup_t`
148
* - `psa_drv_se_mac_update_t`
149
* - `psa_drv_se_mac_update_t`
150
* - ...
151
* - `psa_drv_se_mac_finish_t` or `psa_drv_se_mac_finish_verify_t`
152
*
153
* If a previously started secure element MAC operation needs to be terminated,
154
* it should be done so by the `psa_drv_se_mac_abort_t`. Failure to do so may
155
* result in allocated resources not being freed or in other undefined
156
* behavior.
157
*/
158
/**@{*/
159
/** \brief A function that starts a secure element MAC operation for a PSA
160
* Crypto Driver implementation
161
*
162
* \param[in,out] drv_context The driver context structure.
163
* \param[in,out] op_context A structure that will contain the
164
* hardware-specific MAC context
165
* \param[in] key_slot The slot of the key to be used for the
166
* operation
167
* \param[in] algorithm The algorithm to be used to underly the MAC
168
* operation
169
*
170
* \retval #PSA_SUCCESS
171
* Success.
172
*/
173
typedef psa_status_t (*psa_drv_se_mac_setup_t)(psa_drv_se_context_t *drv_context,
174
void *op_context,
175
psa_key_slot_number_t key_slot,
176
psa_algorithm_t algorithm);
177
178
/** \brief A function that continues a previously started secure element MAC
179
* operation
180
*
181
* \param[in,out] op_context A hardware-specific structure for the
182
* previously-established MAC operation to be
183
* updated
184
* \param[in] p_input A buffer containing the message to be appended
185
* to the MAC operation
186
* \param[in] input_length The size in bytes of the input message buffer
187
*/
188
typedef psa_status_t (*psa_drv_se_mac_update_t)(void *op_context,
189
const uint8_t *p_input,
190
size_t input_length);
191
192
/** \brief a function that completes a previously started secure element MAC
193
* operation by returning the resulting MAC.
194
*
195
* \param[in,out] op_context A hardware-specific structure for the
196
* previously started MAC operation to be
197
* finished
198
* \param[out] p_mac A buffer where the generated MAC will be
199
* placed
200
* \param[in] mac_size The size in bytes of the buffer that has been
201
* allocated for the `output` buffer
202
* \param[out] p_mac_length After completion, will contain the number of
203
* bytes placed in the `p_mac` buffer
204
*
205
* \retval #PSA_SUCCESS
206
* Success.
207
*/
208
typedef psa_status_t (*psa_drv_se_mac_finish_t)(void *op_context,
209
uint8_t *p_mac,
210
size_t mac_size,
211
size_t *p_mac_length);
212
213
/** \brief A function that completes a previously started secure element MAC
214
* operation by comparing the resulting MAC against a provided value
215
*
216
* \param[in,out] op_context A hardware-specific structure for the previously
217
* started MAC operation to be finished
218
* \param[in] p_mac The MAC value against which the resulting MAC
219
* will be compared against
220
* \param[in] mac_length The size in bytes of the value stored in `p_mac`
221
*
222
* \retval #PSA_SUCCESS
223
* The operation completed successfully and the MACs matched each
224
* other
225
* \retval #PSA_ERROR_INVALID_SIGNATURE
226
* The operation completed successfully, but the calculated MAC did
227
* not match the provided MAC
228
*/
229
typedef psa_status_t (*psa_drv_se_mac_finish_verify_t)(void *op_context,
230
const uint8_t *p_mac,
231
size_t mac_length);
232
233
/** \brief A function that aborts a previous started secure element MAC
234
* operation
235
*
236
* \param[in,out] op_context A hardware-specific structure for the previously
237
* started MAC operation to be aborted
238
*/
239
typedef psa_status_t (*psa_drv_se_mac_abort_t)(void *op_context);
240
241
/** \brief A function that performs a secure element MAC operation in one
242
* command and returns the calculated MAC
243
*
244
* \param[in,out] drv_context The driver context structure.
245
* \param[in] p_input A buffer containing the message to be MACed
246
* \param[in] input_length The size in bytes of `p_input`
247
* \param[in] key_slot The slot of the key to be used
248
* \param[in] alg The algorithm to be used to underlie the MAC
249
* operation
250
* \param[out] p_mac A buffer where the generated MAC will be
251
* placed
252
* \param[in] mac_size The size in bytes of the `p_mac` buffer
253
* \param[out] p_mac_length After completion, will contain the number of
254
* bytes placed in the `output` buffer
255
*
256
* \retval #PSA_SUCCESS
257
* Success.
258
*/
259
typedef psa_status_t (*psa_drv_se_mac_generate_t)(psa_drv_se_context_t *drv_context,
260
const uint8_t *p_input,
261
size_t input_length,
262
psa_key_slot_number_t key_slot,
263
psa_algorithm_t alg,
264
uint8_t *p_mac,
265
size_t mac_size,
266
size_t *p_mac_length);
267
268
/** \brief A function that performs a secure element MAC operation in one
269
* command and compares the resulting MAC against a provided value
270
*
271
* \param[in,out] drv_context The driver context structure.
272
* \param[in] p_input A buffer containing the message to be MACed
273
* \param[in] input_length The size in bytes of `input`
274
* \param[in] key_slot The slot of the key to be used
275
* \param[in] alg The algorithm to be used to underlie the MAC
276
* operation
277
* \param[in] p_mac The MAC value against which the resulting MAC will
278
* be compared against
279
* \param[in] mac_length The size in bytes of `mac`
280
*
281
* \retval #PSA_SUCCESS
282
* The operation completed successfully and the MACs matched each
283
* other
284
* \retval #PSA_ERROR_INVALID_SIGNATURE
285
* The operation completed successfully, but the calculated MAC did
286
* not match the provided MAC
287
*/
288
typedef psa_status_t (*psa_drv_se_mac_verify_t)(psa_drv_se_context_t *drv_context,
289
const uint8_t *p_input,
290
size_t input_length,
291
psa_key_slot_number_t key_slot,
292
psa_algorithm_t alg,
293
const uint8_t *p_mac,
294
size_t mac_length);
295
296
/** \brief A struct containing all of the function pointers needed to
297
* perform secure element MAC operations
298
*
299
* PSA Crypto API implementations should populate the table as appropriate
300
* upon startup.
301
*
302
* If one of the functions is not implemented (such as
303
* `psa_drv_se_mac_generate_t`), it should be set to NULL.
304
*
305
* Driver implementers should ensure that they implement all of the functions
306
* that make sense for their hardware, and that they provide a full solution
307
* (for example, if they support `p_setup`, they should also support
308
* `p_update` and at least one of `p_finish` or `p_finish_verify`).
309
*
310
*/
311
typedef struct {
312
/**The size in bytes of the hardware-specific secure element MAC context
313
* structure
314
*/
315
size_t MBEDTLS_PRIVATE(context_size);
316
/** Function that performs a MAC setup operation
317
*/
318
psa_drv_se_mac_setup_t MBEDTLS_PRIVATE(p_setup);
319
/** Function that performs a MAC update operation
320
*/
321
psa_drv_se_mac_update_t MBEDTLS_PRIVATE(p_update);
322
/** Function that completes a MAC operation
323
*/
324
psa_drv_se_mac_finish_t MBEDTLS_PRIVATE(p_finish);
325
/** Function that completes a MAC operation with a verify check
326
*/
327
psa_drv_se_mac_finish_verify_t MBEDTLS_PRIVATE(p_finish_verify);
328
/** Function that aborts a previously started MAC operation
329
*/
330
psa_drv_se_mac_abort_t MBEDTLS_PRIVATE(p_abort);
331
/** Function that performs a MAC operation in one call
332
*/
333
psa_drv_se_mac_generate_t MBEDTLS_PRIVATE(p_mac);
334
/** Function that performs a MAC and verify operation in one call
335
*/
336
psa_drv_se_mac_verify_t MBEDTLS_PRIVATE(p_mac_verify);
337
} psa_drv_se_mac_t;
338
/**@}*/
339
340
/** \defgroup se_cipher Secure Element Symmetric Ciphers
341
*
342
* Encryption and Decryption using secure element keys in block modes other
343
* than ECB must be done in multiple parts, using the following flow:
344
* - `psa_drv_se_cipher_setup_t`
345
* - `psa_drv_se_cipher_set_iv_t` (optional depending upon block mode)
346
* - `psa_drv_se_cipher_update_t`
347
* - `psa_drv_se_cipher_update_t`
348
* - ...
349
* - `psa_drv_se_cipher_finish_t`
350
*
351
* If a previously started secure element Cipher operation needs to be
352
* terminated, it should be done so by the `psa_drv_se_cipher_abort_t`. Failure
353
* to do so may result in allocated resources not being freed or in other
354
* undefined behavior.
355
*
356
* In situations where a PSA Cryptographic API implementation is using a block
357
* mode not-supported by the underlying hardware or driver, it can construct
358
* the block mode itself, while calling the `psa_drv_se_cipher_ecb_t` function
359
* for the cipher operations.
360
*/
361
/**@{*/
362
363
/** \brief A function that provides the cipher setup function for a
364
* secure element driver
365
*
366
* \param[in,out] drv_context The driver context structure.
367
* \param[in,out] op_context A structure that will contain the
368
* hardware-specific cipher context.
369
* \param[in] key_slot The slot of the key to be used for the
370
* operation
371
* \param[in] algorithm The algorithm to be used in the cipher
372
* operation
373
* \param[in] direction Indicates whether the operation is an encrypt
374
* or decrypt
375
*
376
* \retval #PSA_SUCCESS \emptydescription
377
* \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
378
*/
379
typedef psa_status_t (*psa_drv_se_cipher_setup_t)(psa_drv_se_context_t *drv_context,
380
void *op_context,
381
psa_key_slot_number_t key_slot,
382
psa_algorithm_t algorithm,
383
psa_encrypt_or_decrypt_t direction);
384
385
/** \brief A function that sets the initialization vector (if
386
* necessary) for a secure element cipher operation
387
*
388
* Rationale: The `psa_se_cipher_*` operation in the PSA Cryptographic API has
389
* two IV functions: one to set the IV, and one to generate it internally. The
390
* generate function is not necessary for the drivers to implement as the PSA
391
* Crypto implementation can do the generation using its RNG features.
392
*
393
* \param[in,out] op_context A structure that contains the previously set up
394
* hardware-specific cipher context
395
* \param[in] p_iv A buffer containing the initialization vector
396
* \param[in] iv_length The size (in bytes) of the `p_iv` buffer
397
*
398
* \retval #PSA_SUCCESS \emptydescription
399
*/
400
typedef psa_status_t (*psa_drv_se_cipher_set_iv_t)(void *op_context,
401
const uint8_t *p_iv,
402
size_t iv_length);
403
404
/** \brief A function that continues a previously started secure element cipher
405
* operation
406
*
407
* \param[in,out] op_context A hardware-specific structure for the
408
* previously started cipher operation
409
* \param[in] p_input A buffer containing the data to be
410
* encrypted/decrypted
411
* \param[in] input_size The size in bytes of the buffer pointed to
412
* by `p_input`
413
* \param[out] p_output The caller-allocated buffer where the
414
* output will be placed
415
* \param[in] output_size The allocated size in bytes of the
416
* `p_output` buffer
417
* \param[out] p_output_length After completion, will contain the number
418
* of bytes placed in the `p_output` buffer
419
*
420
* \retval #PSA_SUCCESS \emptydescription
421
*/
422
typedef psa_status_t (*psa_drv_se_cipher_update_t)(void *op_context,
423
const uint8_t *p_input,
424
size_t input_size,
425
uint8_t *p_output,
426
size_t output_size,
427
size_t *p_output_length);
428
429
/** \brief A function that completes a previously started secure element cipher
430
* operation
431
*
432
* \param[in,out] op_context A hardware-specific structure for the
433
* previously started cipher operation
434
* \param[out] p_output The caller-allocated buffer where the output
435
* will be placed
436
* \param[in] output_size The allocated size in bytes of the `p_output`
437
* buffer
438
* \param[out] p_output_length After completion, will contain the number of
439
* bytes placed in the `p_output` buffer
440
*
441
* \retval #PSA_SUCCESS \emptydescription
442
*/
443
typedef psa_status_t (*psa_drv_se_cipher_finish_t)(void *op_context,
444
uint8_t *p_output,
445
size_t output_size,
446
size_t *p_output_length);
447
448
/** \brief A function that aborts a previously started secure element cipher
449
* operation
450
*
451
* \param[in,out] op_context A hardware-specific structure for the
452
* previously started cipher operation
453
*/
454
typedef psa_status_t (*psa_drv_se_cipher_abort_t)(void *op_context);
455
456
/** \brief A function that performs the ECB block mode for secure element
457
* cipher operations
458
*
459
* Note: this function should only be used with implementations that do not
460
* provide a needed higher-level operation.
461
*
462
* \param[in,out] drv_context The driver context structure.
463
* \param[in] key_slot The slot of the key to be used for the operation
464
* \param[in] algorithm The algorithm to be used in the cipher operation
465
* \param[in] direction Indicates whether the operation is an encrypt or
466
* decrypt
467
* \param[in] p_input A buffer containing the data to be
468
* encrypted/decrypted
469
* \param[in] input_size The size in bytes of the buffer pointed to by
470
* `p_input`
471
* \param[out] p_output The caller-allocated buffer where the output
472
* will be placed
473
* \param[in] output_size The allocated size in bytes of the `p_output`
474
* buffer
475
*
476
* \retval #PSA_SUCCESS \emptydescription
477
* \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
478
*/
479
typedef psa_status_t (*psa_drv_se_cipher_ecb_t)(psa_drv_se_context_t *drv_context,
480
psa_key_slot_number_t key_slot,
481
psa_algorithm_t algorithm,
482
psa_encrypt_or_decrypt_t direction,
483
const uint8_t *p_input,
484
size_t input_size,
485
uint8_t *p_output,
486
size_t output_size);
487
488
/**
489
* \brief A struct containing all of the function pointers needed to implement
490
* cipher operations using secure elements.
491
*
492
* PSA Crypto API implementations should populate instances of the table as
493
* appropriate upon startup or at build time.
494
*
495
* If one of the functions is not implemented (such as
496
* `psa_drv_se_cipher_ecb_t`), it should be set to NULL.
497
*/
498
typedef struct {
499
/** The size in bytes of the hardware-specific secure element cipher
500
* context structure
501
*/
502
size_t MBEDTLS_PRIVATE(context_size);
503
/** Function that performs a cipher setup operation */
504
psa_drv_se_cipher_setup_t MBEDTLS_PRIVATE(p_setup);
505
/** Function that sets a cipher IV (if necessary) */
506
psa_drv_se_cipher_set_iv_t MBEDTLS_PRIVATE(p_set_iv);
507
/** Function that performs a cipher update operation */
508
psa_drv_se_cipher_update_t MBEDTLS_PRIVATE(p_update);
509
/** Function that completes a cipher operation */
510
psa_drv_se_cipher_finish_t MBEDTLS_PRIVATE(p_finish);
511
/** Function that aborts a cipher operation */
512
psa_drv_se_cipher_abort_t MBEDTLS_PRIVATE(p_abort);
513
/** Function that performs ECB mode for a cipher operation
514
* (Danger: ECB mode should not be used directly by clients of the PSA
515
* Crypto Client API)
516
*/
517
psa_drv_se_cipher_ecb_t MBEDTLS_PRIVATE(p_ecb);
518
} psa_drv_se_cipher_t;
519
520
/**@}*/
521
522
/** \defgroup se_asymmetric Secure Element Asymmetric Cryptography
523
*
524
* Since the amount of data that can (or should) be encrypted or signed using
525
* asymmetric keys is limited by the key size, asymmetric key operations using
526
* keys in a secure element must be done in single function calls.
527
*/
528
/**@{*/
529
530
/**
531
* \brief A function that signs a hash or short message with a private key in
532
* a secure element
533
*
534
* \param[in,out] drv_context The driver context structure.
535
* \param[in] key_slot Key slot of an asymmetric key pair
536
* \param[in] alg A signature algorithm that is compatible
537
* with the type of `key`
538
* \param[in] p_hash The hash to sign
539
* \param[in] hash_length Size of the `p_hash` buffer in bytes
540
* \param[out] p_signature Buffer where the signature is to be written
541
* \param[in] signature_size Size of the `p_signature` buffer in bytes
542
* \param[out] p_signature_length On success, the number of bytes
543
* that make up the returned signature value
544
*
545
* \retval #PSA_SUCCESS \emptydescription
546
*/
547
typedef psa_status_t (*psa_drv_se_asymmetric_sign_t)(psa_drv_se_context_t *drv_context,
548
psa_key_slot_number_t key_slot,
549
psa_algorithm_t alg,
550
const uint8_t *p_hash,
551
size_t hash_length,
552
uint8_t *p_signature,
553
size_t signature_size,
554
size_t *p_signature_length);
555
556
/**
557
* \brief A function that verifies the signature a hash or short message using
558
* an asymmetric public key in a secure element
559
*
560
* \param[in,out] drv_context The driver context structure.
561
* \param[in] key_slot Key slot of a public key or an asymmetric key
562
* pair
563
* \param[in] alg A signature algorithm that is compatible with
564
* the type of `key`
565
* \param[in] p_hash The hash whose signature is to be verified
566
* \param[in] hash_length Size of the `p_hash` buffer in bytes
567
* \param[in] p_signature Buffer containing the signature to verify
568
* \param[in] signature_length Size of the `p_signature` buffer in bytes
569
*
570
* \retval #PSA_SUCCESS
571
* The signature is valid.
572
*/
573
typedef psa_status_t (*psa_drv_se_asymmetric_verify_t)(psa_drv_se_context_t *drv_context,
574
psa_key_slot_number_t key_slot,
575
psa_algorithm_t alg,
576
const uint8_t *p_hash,
577
size_t hash_length,
578
const uint8_t *p_signature,
579
size_t signature_length);
580
581
/**
582
* \brief A function that encrypts a short message with an asymmetric public
583
* key in a secure element
584
*
585
* \param[in,out] drv_context The driver context structure.
586
* \param[in] key_slot Key slot of a public key or an asymmetric key
587
* pair
588
* \param[in] alg An asymmetric encryption algorithm that is
589
* compatible with the type of `key`
590
* \param[in] p_input The message to encrypt
591
* \param[in] input_length Size of the `p_input` buffer in bytes
592
* \param[in] p_salt A salt or label, if supported by the
593
* encryption algorithm
594
* If the algorithm does not support a
595
* salt, pass `NULL`.
596
* If the algorithm supports an optional
597
* salt and you do not want to pass a salt,
598
* pass `NULL`.
599
* For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is
600
* supported.
601
* \param[in] salt_length Size of the `p_salt` buffer in bytes
602
* If `p_salt` is `NULL`, pass 0.
603
* \param[out] p_output Buffer where the encrypted message is to
604
* be written
605
* \param[in] output_size Size of the `p_output` buffer in bytes
606
* \param[out] p_output_length On success, the number of bytes that make up
607
* the returned output
608
*
609
* \retval #PSA_SUCCESS \emptydescription
610
*/
611
typedef psa_status_t (*psa_drv_se_asymmetric_encrypt_t)(psa_drv_se_context_t *drv_context,
612
psa_key_slot_number_t key_slot,
613
psa_algorithm_t alg,
614
const uint8_t *p_input,
615
size_t input_length,
616
const uint8_t *p_salt,
617
size_t salt_length,
618
uint8_t *p_output,
619
size_t output_size,
620
size_t *p_output_length);
621
622
/**
623
* \brief A function that decrypts a short message with an asymmetric private
624
* key in a secure element.
625
*
626
* \param[in,out] drv_context The driver context structure.
627
* \param[in] key_slot Key slot of an asymmetric key pair
628
* \param[in] alg An asymmetric encryption algorithm that is
629
* compatible with the type of `key`
630
* \param[in] p_input The message to decrypt
631
* \param[in] input_length Size of the `p_input` buffer in bytes
632
* \param[in] p_salt A salt or label, if supported by the
633
* encryption algorithm
634
* If the algorithm does not support a
635
* salt, pass `NULL`.
636
* If the algorithm supports an optional
637
* salt and you do not want to pass a salt,
638
* pass `NULL`.
639
* For #PSA_ALG_RSA_PKCS1V15_CRYPT, no salt is
640
* supported.
641
* \param[in] salt_length Size of the `p_salt` buffer in bytes
642
* If `p_salt` is `NULL`, pass 0.
643
* \param[out] p_output Buffer where the decrypted message is to
644
* be written
645
* \param[in] output_size Size of the `p_output` buffer in bytes
646
* \param[out] p_output_length On success, the number of bytes
647
* that make up the returned output
648
*
649
* \retval #PSA_SUCCESS \emptydescription
650
*/
651
typedef psa_status_t (*psa_drv_se_asymmetric_decrypt_t)(psa_drv_se_context_t *drv_context,
652
psa_key_slot_number_t key_slot,
653
psa_algorithm_t alg,
654
const uint8_t *p_input,
655
size_t input_length,
656
const uint8_t *p_salt,
657
size_t salt_length,
658
uint8_t *p_output,
659
size_t output_size,
660
size_t *p_output_length);
661
662
/**
663
* \brief A struct containing all of the function pointers needed to implement
664
* asymmetric cryptographic operations using secure elements.
665
*
666
* PSA Crypto API implementations should populate instances of the table as
667
* appropriate upon startup or at build time.
668
*
669
* If one of the functions is not implemented, it should be set to NULL.
670
*/
671
typedef struct {
672
/** Function that performs an asymmetric sign operation */
673
psa_drv_se_asymmetric_sign_t MBEDTLS_PRIVATE(p_sign);
674
/** Function that performs an asymmetric verify operation */
675
psa_drv_se_asymmetric_verify_t MBEDTLS_PRIVATE(p_verify);
676
/** Function that performs an asymmetric encrypt operation */
677
psa_drv_se_asymmetric_encrypt_t MBEDTLS_PRIVATE(p_encrypt);
678
/** Function that performs an asymmetric decrypt operation */
679
psa_drv_se_asymmetric_decrypt_t MBEDTLS_PRIVATE(p_decrypt);
680
} psa_drv_se_asymmetric_t;
681
682
/**@}*/
683
684
/** \defgroup se_aead Secure Element Authenticated Encryption with Additional Data
685
* Authenticated Encryption with Additional Data (AEAD) operations with secure
686
* elements must be done in one function call. While this creates a burden for
687
* implementers as there must be sufficient space in memory for the entire
688
* message, it prevents decrypted data from being made available before the
689
* authentication operation is complete and the data is known to be authentic.
690
*/
691
/**@{*/
692
693
/** \brief A function that performs a secure element authenticated encryption
694
* operation
695
*
696
* \param[in,out] drv_context The driver context structure.
697
* \param[in] key_slot Slot containing the key to use.
698
* \param[in] algorithm The AEAD algorithm to compute
699
* (\c PSA_ALG_XXX value such that
700
* #PSA_ALG_IS_AEAD(`alg`) is true)
701
* \param[in] p_nonce Nonce or IV to use
702
* \param[in] nonce_length Size of the `p_nonce` buffer in bytes
703
* \param[in] p_additional_data Additional data that will be
704
* authenticated but not encrypted
705
* \param[in] additional_data_length Size of `p_additional_data` in bytes
706
* \param[in] p_plaintext Data that will be authenticated and
707
* encrypted
708
* \param[in] plaintext_length Size of `p_plaintext` in bytes
709
* \param[out] p_ciphertext Output buffer for the authenticated and
710
* encrypted data. The additional data is
711
* not part of this output. For algorithms
712
* where the encrypted data and the
713
* authentication tag are defined as
714
* separate outputs, the authentication
715
* tag is appended to the encrypted data.
716
* \param[in] ciphertext_size Size of the `p_ciphertext` buffer in
717
* bytes
718
* \param[out] p_ciphertext_length On success, the size of the output in
719
* the `p_ciphertext` buffer
720
*
721
* \retval #PSA_SUCCESS
722
* Success.
723
*/
724
typedef psa_status_t (*psa_drv_se_aead_encrypt_t)(psa_drv_se_context_t *drv_context,
725
psa_key_slot_number_t key_slot,
726
psa_algorithm_t algorithm,
727
const uint8_t *p_nonce,
728
size_t nonce_length,
729
const uint8_t *p_additional_data,
730
size_t additional_data_length,
731
const uint8_t *p_plaintext,
732
size_t plaintext_length,
733
uint8_t *p_ciphertext,
734
size_t ciphertext_size,
735
size_t *p_ciphertext_length);
736
737
/** A function that performs a secure element authenticated decryption operation
738
*
739
* \param[in,out] drv_context The driver context structure.
740
* \param[in] key_slot Slot containing the key to use
741
* \param[in] algorithm The AEAD algorithm to compute
742
* (\c PSA_ALG_XXX value such that
743
* #PSA_ALG_IS_AEAD(`alg`) is true)
744
* \param[in] p_nonce Nonce or IV to use
745
* \param[in] nonce_length Size of the `p_nonce` buffer in bytes
746
* \param[in] p_additional_data Additional data that has been
747
* authenticated but not encrypted
748
* \param[in] additional_data_length Size of `p_additional_data` in bytes
749
* \param[in] p_ciphertext Data that has been authenticated and
750
* encrypted.
751
* For algorithms where the encrypted data
752
* and the authentication tag are defined
753
* as separate inputs, the buffer must
754
* contain the encrypted data followed by
755
* the authentication tag.
756
* \param[in] ciphertext_length Size of `p_ciphertext` in bytes
757
* \param[out] p_plaintext Output buffer for the decrypted data
758
* \param[in] plaintext_size Size of the `p_plaintext` buffer in
759
* bytes
760
* \param[out] p_plaintext_length On success, the size of the output in
761
* the `p_plaintext` buffer
762
*
763
* \retval #PSA_SUCCESS
764
* Success.
765
*/
766
typedef psa_status_t (*psa_drv_se_aead_decrypt_t)(psa_drv_se_context_t *drv_context,
767
psa_key_slot_number_t key_slot,
768
psa_algorithm_t algorithm,
769
const uint8_t *p_nonce,
770
size_t nonce_length,
771
const uint8_t *p_additional_data,
772
size_t additional_data_length,
773
const uint8_t *p_ciphertext,
774
size_t ciphertext_length,
775
uint8_t *p_plaintext,
776
size_t plaintext_size,
777
size_t *p_plaintext_length);
778
779
/**
780
* \brief A struct containing all of the function pointers needed to implement
781
* secure element Authenticated Encryption with Additional Data operations
782
*
783
* PSA Crypto API implementations should populate instances of the table as
784
* appropriate upon startup.
785
*
786
* If one of the functions is not implemented, it should be set to NULL.
787
*/
788
typedef struct {
789
/** Function that performs the AEAD encrypt operation */
790
psa_drv_se_aead_encrypt_t MBEDTLS_PRIVATE(p_encrypt);
791
/** Function that performs the AEAD decrypt operation */
792
psa_drv_se_aead_decrypt_t MBEDTLS_PRIVATE(p_decrypt);
793
} psa_drv_se_aead_t;
794
/**@}*/
795
796
/** \defgroup se_key_management Secure Element Key Management
797
* Currently, key management is limited to importing keys in the clear,
798
* destroying keys, and exporting keys in the clear.
799
* Whether a key may be exported is determined by the key policies in place
800
* on the key slot.
801
*/
802
/**@{*/
803
804
/** An enumeration indicating how a key is created.
805
*/
806
typedef enum {
807
PSA_KEY_CREATION_IMPORT, /**< During psa_import_key() */
808
PSA_KEY_CREATION_GENERATE, /**< During psa_generate_key() */
809
PSA_KEY_CREATION_DERIVE, /**< During psa_key_derivation_output_key() */
810
PSA_KEY_CREATION_COPY, /**< During psa_copy_key() */
811
812
#ifndef __DOXYGEN_ONLY__
813
/** A key is being registered with mbedtls_psa_register_se_key().
814
*
815
* The core only passes this value to
816
* psa_drv_se_key_management_t::p_validate_slot_number, not to
817
* psa_drv_se_key_management_t::p_allocate. The call to
818
* `p_validate_slot_number` is not followed by any other call to the
819
* driver: the key is considered successfully registered if the call to
820
* `p_validate_slot_number` succeeds, or if `p_validate_slot_number` is
821
* null.
822
*
823
* With this creation method, the driver must return #PSA_SUCCESS if
824
* the given attributes are compatible with the existing key in the slot,
825
* and #PSA_ERROR_DOES_NOT_EXIST if the driver can determine that there
826
* is no key with the specified slot number.
827
*
828
* This is an Mbed TLS extension.
829
*/
830
PSA_KEY_CREATION_REGISTER,
831
#endif
832
} psa_key_creation_method_t;
833
834
/** \brief A function that allocates a slot for a key.
835
*
836
* To create a key in a specific slot in a secure element, the core
837
* first calls this function to determine a valid slot number,
838
* then calls a function to create the key material in that slot.
839
* In nominal conditions (that is, if no error occurs),
840
* the effect of a call to a key creation function in the PSA Cryptography
841
* API with a lifetime that places the key in a secure element is the
842
* following:
843
* -# The core calls psa_drv_se_key_management_t::p_allocate
844
* (or in some implementations
845
* psa_drv_se_key_management_t::p_validate_slot_number). The driver
846
* selects (or validates) a suitable slot number given the key attributes
847
* and the state of the secure element.
848
* -# The core calls a key creation function in the driver.
849
*
850
* The key creation functions in the PSA Cryptography API are:
851
* - psa_import_key(), which causes
852
* a call to `p_allocate` with \p method = #PSA_KEY_CREATION_IMPORT
853
* then a call to psa_drv_se_key_management_t::p_import.
854
* - psa_generate_key(), which causes
855
* a call to `p_allocate` with \p method = #PSA_KEY_CREATION_GENERATE
856
* then a call to psa_drv_se_key_management_t::p_import.
857
* - psa_key_derivation_output_key(), which causes
858
* a call to `p_allocate` with \p method = #PSA_KEY_CREATION_DERIVE
859
* then a call to psa_drv_se_key_derivation_t::p_derive.
860
* - psa_copy_key(), which causes
861
* a call to `p_allocate` with \p method = #PSA_KEY_CREATION_COPY
862
* then a call to psa_drv_se_key_management_t::p_export.
863
*
864
* In case of errors, other behaviors are possible.
865
* - If the PSA Cryptography subsystem dies after the first step,
866
* for example because the device has lost power abruptly,
867
* the second step may never happen, or may happen after a reset
868
* and re-initialization. Alternatively, after a reset and
869
* re-initialization, the core may call
870
* psa_drv_se_key_management_t::p_destroy on the slot number that
871
* was allocated (or validated) instead of calling a key creation function.
872
* - If an error occurs, the core may call
873
* psa_drv_se_key_management_t::p_destroy on the slot number that
874
* was allocated (or validated) instead of calling a key creation function.
875
*
876
* Errors and system resets also have an impact on the driver's persistent
877
* data. If a reset happens before the overall key creation process is
878
* completed (before or after the second step above), it is unspecified
879
* whether the persistent data after the reset is identical to what it
880
* was before or after the call to `p_allocate` (or `p_validate_slot_number`).
881
*
882
* \param[in,out] drv_context The driver context structure.
883
* \param[in,out] persistent_data A pointer to the persistent data
884
* that allows writing.
885
* \param[in] attributes Attributes of the key.
886
* \param method The way in which the key is being created.
887
* \param[out] key_slot Slot where the key will be stored.
888
* This must be a valid slot for a key of the
889
* chosen type. It must be unoccupied.
890
*
891
* \retval #PSA_SUCCESS
892
* Success.
893
* The core will record \c *key_slot as the key slot where the key
894
* is stored and will update the persistent data in storage.
895
* \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
896
* \retval #PSA_ERROR_INSUFFICIENT_STORAGE \emptydescription
897
*/
898
typedef psa_status_t (*psa_drv_se_allocate_key_t)(
899
psa_drv_se_context_t *drv_context,
900
void *persistent_data,
901
const psa_key_attributes_t *attributes,
902
psa_key_creation_method_t method,
903
psa_key_slot_number_t *key_slot);
904
905
/** \brief A function that determines whether a slot number is valid
906
* for a key.
907
*
908
* To create a key in a specific slot in a secure element, the core
909
* first calls this function to validate the choice of slot number,
910
* then calls a function to create the key material in that slot.
911
* See the documentation of #psa_drv_se_allocate_key_t for more details.
912
*
913
* As of the PSA Cryptography API specification version 1.0, there is no way
914
* for applications to trigger a call to this function. However some
915
* implementations offer the capability to create or declare a key in
916
* a specific slot via implementation-specific means, generally for the
917
* sake of initial device provisioning or onboarding. Such a mechanism may
918
* be added to a future version of the PSA Cryptography API specification.
919
*
920
* This function may update the driver's persistent data through
921
* \p persistent_data. The core will save the updated persistent data at the
922
* end of the key creation process. See the description of
923
* ::psa_drv_se_allocate_key_t for more information.
924
*
925
* \param[in,out] drv_context The driver context structure.
926
* \param[in,out] persistent_data A pointer to the persistent data
927
* that allows writing.
928
* \param[in] attributes Attributes of the key.
929
* \param method The way in which the key is being created.
930
* \param[in] key_slot Slot where the key is to be stored.
931
*
932
* \retval #PSA_SUCCESS
933
* The given slot number is valid for a key with the given
934
* attributes.
935
* \retval #PSA_ERROR_INVALID_ARGUMENT
936
* The given slot number is not valid for a key with the
937
* given attributes. This includes the case where the slot
938
* number is not valid at all.
939
* \retval #PSA_ERROR_ALREADY_EXISTS
940
* There is already a key with the specified slot number.
941
* Drivers may choose to return this error from the key
942
* creation function instead.
943
*/
944
typedef psa_status_t (*psa_drv_se_validate_slot_number_t)(
945
psa_drv_se_context_t *drv_context,
946
void *persistent_data,
947
const psa_key_attributes_t *attributes,
948
psa_key_creation_method_t method,
949
psa_key_slot_number_t key_slot);
950
951
/** \brief A function that imports a key into a secure element in binary format
952
*
953
* This function can support any output from psa_export_key(). Refer to the
954
* documentation of psa_export_key() for the format for each key type.
955
*
956
* \param[in,out] drv_context The driver context structure.
957
* \param key_slot Slot where the key will be stored.
958
* This must be a valid slot for a key of the
959
* chosen type. It must be unoccupied.
960
* \param[in] attributes The key attributes, including the lifetime,
961
* the key type and the usage policy.
962
* Drivers should not access the key size stored
963
* in the attributes: it may not match the
964
* data passed in \p data.
965
* Drivers can call psa_get_key_lifetime(),
966
* psa_get_key_type(),
967
* psa_get_key_usage_flags() and
968
* psa_get_key_algorithm() to access this
969
* information.
970
* \param[in] data Buffer containing the key data.
971
* \param[in] data_length Size of the \p data buffer in bytes.
972
* \param[out] bits On success, the key size in bits. The driver
973
* must determine this value after parsing the
974
* key according to the key type.
975
* This value is not used if the function fails.
976
*
977
* \retval #PSA_SUCCESS
978
* Success.
979
*/
980
typedef psa_status_t (*psa_drv_se_import_key_t)(
981
psa_drv_se_context_t *drv_context,
982
psa_key_slot_number_t key_slot,
983
const psa_key_attributes_t *attributes,
984
const uint8_t *data,
985
size_t data_length,
986
size_t *bits);
987
988
/**
989
* \brief A function that destroys a secure element key and restore the slot to
990
* its default state
991
*
992
* This function destroys the content of the key from a secure element.
993
* Implementations shall make a best effort to ensure that any previous content
994
* of the slot is unrecoverable.
995
*
996
* This function returns the specified slot to its default state.
997
*
998
* \param[in,out] drv_context The driver context structure.
999
* \param[in,out] persistent_data A pointer to the persistent data
1000
* that allows writing.
1001
* \param key_slot The key slot to erase.
1002
*
1003
* \retval #PSA_SUCCESS
1004
* The slot's content, if any, has been erased.
1005
*/
1006
typedef psa_status_t (*psa_drv_se_destroy_key_t)(
1007
psa_drv_se_context_t *drv_context,
1008
void *persistent_data,
1009
psa_key_slot_number_t key_slot);
1010
1011
/**
1012
* \brief A function that exports a secure element key in binary format
1013
*
1014
* The output of this function can be passed to psa_import_key() to
1015
* create an equivalent object.
1016
*
1017
* If a key is created with `psa_import_key()` and then exported with
1018
* this function, it is not guaranteed that the resulting data is
1019
* identical: the implementation may choose a different representation
1020
* of the same key if the format permits it.
1021
*
1022
* This function should generate output in the same format that
1023
* `psa_export_key()` does. Refer to the
1024
* documentation of `psa_export_key()` for the format for each key type.
1025
*
1026
* \param[in,out] drv_context The driver context structure.
1027
* \param[in] key Slot whose content is to be exported. This must
1028
* be an occupied key slot.
1029
* \param[out] p_data Buffer where the key data is to be written.
1030
* \param[in] data_size Size of the `p_data` buffer in bytes.
1031
* \param[out] p_data_length On success, the number of bytes
1032
* that make up the key data.
1033
*
1034
* \retval #PSA_SUCCESS \emptydescription
1035
* \retval #PSA_ERROR_DOES_NOT_EXIST \emptydescription
1036
* \retval #PSA_ERROR_NOT_PERMITTED \emptydescription
1037
* \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription
1038
* \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription
1039
* \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription
1040
* \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription
1041
*/
1042
typedef psa_status_t (*psa_drv_se_export_key_t)(psa_drv_se_context_t *drv_context,
1043
psa_key_slot_number_t key,
1044
uint8_t *p_data,
1045
size_t data_size,
1046
size_t *p_data_length);
1047
1048
/**
1049
* \brief A function that generates a symmetric or asymmetric key on a secure
1050
* element
1051
*
1052
* If the key type \c type recorded in \p attributes
1053
* is asymmetric (#PSA_KEY_TYPE_IS_ASYMMETRIC(\c type) = 1),
1054
* the driver may export the public key at the time of generation,
1055
* in the format documented for psa_export_public_key() by writing it
1056
* to the \p pubkey buffer.
1057
* This is optional, intended for secure elements that output the
1058
* public key at generation time and that cannot export the public key
1059
* later. Drivers that do not need this feature should leave
1060
* \p *pubkey_length set to 0 and should
1061
* implement the psa_drv_key_management_t::p_export_public function.
1062
* Some implementations do not support this feature, in which case
1063
* \p pubkey is \c NULL and \p pubkey_size is 0.
1064
*
1065
* \param[in,out] drv_context The driver context structure.
1066
* \param key_slot Slot where the key will be stored.
1067
* This must be a valid slot for a key of the
1068
* chosen type. It must be unoccupied.
1069
* \param[in] attributes The key attributes, including the lifetime,
1070
* the key type and size, and the usage policy.
1071
* Drivers can call psa_get_key_lifetime(),
1072
* psa_get_key_type(), psa_get_key_bits(),
1073
* psa_get_key_usage_flags() and
1074
* psa_get_key_algorithm() to access this
1075
* information.
1076
* \param[out] pubkey A buffer where the driver can write the
1077
* public key, when generating an asymmetric
1078
* key pair.
1079
* This is \c NULL when generating a symmetric
1080
* key or if the core does not support
1081
* exporting the public key at generation time.
1082
* \param pubkey_size The size of the `pubkey` buffer in bytes.
1083
* This is 0 when generating a symmetric
1084
* key or if the core does not support
1085
* exporting the public key at generation time.
1086
* \param[out] pubkey_length On entry, this is always 0.
1087
* On success, the number of bytes written to
1088
* \p pubkey. If this is 0 or unchanged on return,
1089
* the core will not read the \p pubkey buffer,
1090
* and will instead call the driver's
1091
* psa_drv_key_management_t::p_export_public
1092
* function to export the public key when needed.
1093
*/
1094
typedef psa_status_t (*psa_drv_se_generate_key_t)(
1095
psa_drv_se_context_t *drv_context,
1096
psa_key_slot_number_t key_slot,
1097
const psa_key_attributes_t *attributes,
1098
uint8_t *pubkey, size_t pubkey_size, size_t *pubkey_length);
1099
1100
/**
1101
* \brief A struct containing all of the function pointers needed to for secure
1102
* element key management
1103
*
1104
* PSA Crypto API implementations should populate instances of the table as
1105
* appropriate upon startup or at build time.
1106
*
1107
* If one of the functions is not implemented, it should be set to NULL.
1108
*/
1109
typedef struct {
1110
/** Function that allocates a slot for a key. */
1111
psa_drv_se_allocate_key_t MBEDTLS_PRIVATE(p_allocate);
1112
/** Function that checks the validity of a slot for a key. */
1113
psa_drv_se_validate_slot_number_t MBEDTLS_PRIVATE(p_validate_slot_number);
1114
/** Function that performs a key import operation */
1115
psa_drv_se_import_key_t MBEDTLS_PRIVATE(p_import);
1116
/** Function that performs a generation */
1117
psa_drv_se_generate_key_t MBEDTLS_PRIVATE(p_generate);
1118
/** Function that performs a key destroy operation */
1119
psa_drv_se_destroy_key_t MBEDTLS_PRIVATE(p_destroy);
1120
/** Function that performs a key export operation */
1121
psa_drv_se_export_key_t MBEDTLS_PRIVATE(p_export);
1122
/** Function that performs a public key export operation */
1123
psa_drv_se_export_key_t MBEDTLS_PRIVATE(p_export_public);
1124
} psa_drv_se_key_management_t;
1125
1126
/**@}*/
1127
1128
/** \defgroup driver_derivation Secure Element Key Derivation and Agreement
1129
* Key derivation is the process of generating new key material using an
1130
* existing key and additional parameters, iterating through a basic
1131
* cryptographic function, such as a hash.
1132
* Key agreement is a part of cryptographic protocols that allows two parties
1133
* to agree on the same key value, but starting from different original key
1134
* material.
1135
* The flows are similar, and the PSA Crypto Driver Model uses the same functions
1136
* for both of the flows.
1137
*
1138
* There are two different final functions for the flows,
1139
* `psa_drv_se_key_derivation_derive` and `psa_drv_se_key_derivation_export`.
1140
* `psa_drv_se_key_derivation_derive` is used when the key material should be
1141
* placed in a slot on the hardware and not exposed to the caller.
1142
* `psa_drv_se_key_derivation_export` is used when the key material should be
1143
* returned to the PSA Cryptographic API implementation.
1144
*
1145
* Different key derivation algorithms require a different number of inputs.
1146
* Instead of having an API that takes as input variable length arrays, which
1147
* can be problematic to manage on embedded platforms, the inputs are passed
1148
* to the driver via a function, `psa_drv_se_key_derivation_collateral`, that
1149
* is called multiple times with different `collateral_id`s. Thus, for a key
1150
* derivation algorithm that required 3 parameter inputs, the flow would look
1151
* something like:
1152
* ~~~~~~~~~~~~~{.c}
1153
* psa_drv_se_key_derivation_setup(kdf_algorithm, source_key, dest_key_size_bytes);
1154
* psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_0,
1155
* p_collateral_0,
1156
* collateral_0_size);
1157
* psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_1,
1158
* p_collateral_1,
1159
* collateral_1_size);
1160
* psa_drv_se_key_derivation_collateral(kdf_algorithm_collateral_id_2,
1161
* p_collateral_2,
1162
* collateral_2_size);
1163
* psa_drv_se_key_derivation_derive();
1164
* ~~~~~~~~~~~~~
1165
*
1166
* key agreement example:
1167
* ~~~~~~~~~~~~~{.c}
1168
* psa_drv_se_key_derivation_setup(alg, source_key. dest_key_size_bytes);
1169
* psa_drv_se_key_derivation_collateral(DHE_PUBKEY, p_pubkey, pubkey_size);
1170
* psa_drv_se_key_derivation_export(p_session_key,
1171
* session_key_size,
1172
* &session_key_length);
1173
* ~~~~~~~~~~~~~
1174
*/
1175
/**@{*/
1176
1177
/** \brief A function that Sets up a secure element key derivation operation by
1178
* specifying the algorithm and the source key sot
1179
*
1180
* \param[in,out] drv_context The driver context structure.
1181
* \param[in,out] op_context A hardware-specific structure containing any
1182
* context information for the implementation
1183
* \param[in] kdf_alg The algorithm to be used for the key derivation
1184
* \param[in] source_key The key to be used as the source material for
1185
* the key derivation
1186
*
1187
* \retval #PSA_SUCCESS \emptydescription
1188
*/
1189
typedef psa_status_t (*psa_drv_se_key_derivation_setup_t)(psa_drv_se_context_t *drv_context,
1190
void *op_context,
1191
psa_algorithm_t kdf_alg,
1192
psa_key_slot_number_t source_key);
1193
1194
/** \brief A function that provides collateral (parameters) needed for a secure
1195
* element key derivation or key agreement operation
1196
*
1197
* Since many key derivation algorithms require multiple parameters, it is
1198
* expected that this function may be called multiple times for the same
1199
* operation, each with a different algorithm-specific `collateral_id`
1200
*
1201
* \param[in,out] op_context A hardware-specific structure containing any
1202
* context information for the implementation
1203
* \param[in] collateral_id An ID for the collateral being provided
1204
* \param[in] p_collateral A buffer containing the collateral data
1205
* \param[in] collateral_size The size in bytes of the collateral
1206
*
1207
* \retval #PSA_SUCCESS \emptydescription
1208
*/
1209
typedef psa_status_t (*psa_drv_se_key_derivation_collateral_t)(void *op_context,
1210
uint32_t collateral_id,
1211
const uint8_t *p_collateral,
1212
size_t collateral_size);
1213
1214
/** \brief A function that performs the final secure element key derivation
1215
* step and place the generated key material in a slot
1216
*
1217
* \param[in,out] op_context A hardware-specific structure containing any
1218
* context information for the implementation
1219
* \param[in] dest_key The slot where the generated key material
1220
* should be placed
1221
*
1222
* \retval #PSA_SUCCESS \emptydescription
1223
*/
1224
typedef psa_status_t (*psa_drv_se_key_derivation_derive_t)(void *op_context,
1225
psa_key_slot_number_t dest_key);
1226
1227
/** \brief A function that performs the final step of a secure element key
1228
* agreement and place the generated key material in a buffer
1229
*
1230
* \param[out] p_output Buffer in which to place the generated key
1231
* material
1232
* \param[in] output_size The size in bytes of `p_output`
1233
* \param[out] p_output_length Upon success, contains the number of bytes of
1234
* key material placed in `p_output`
1235
*
1236
* \retval #PSA_SUCCESS \emptydescription
1237
*/
1238
typedef psa_status_t (*psa_drv_se_key_derivation_export_t)(void *op_context,
1239
uint8_t *p_output,
1240
size_t output_size,
1241
size_t *p_output_length);
1242
1243
/**
1244
* \brief A struct containing all of the function pointers needed to for secure
1245
* element key derivation and agreement
1246
*
1247
* PSA Crypto API implementations should populate instances of the table as
1248
* appropriate upon startup.
1249
*
1250
* If one of the functions is not implemented, it should be set to NULL.
1251
*/
1252
typedef struct {
1253
/** The driver-specific size of the key derivation context */
1254
size_t MBEDTLS_PRIVATE(context_size);
1255
/** Function that performs a key derivation setup */
1256
psa_drv_se_key_derivation_setup_t MBEDTLS_PRIVATE(p_setup);
1257
/** Function that sets key derivation collateral */
1258
psa_drv_se_key_derivation_collateral_t MBEDTLS_PRIVATE(p_collateral);
1259
/** Function that performs a final key derivation step */
1260
psa_drv_se_key_derivation_derive_t MBEDTLS_PRIVATE(p_derive);
1261
/** Function that performs a final key derivation or agreement and
1262
* exports the key */
1263
psa_drv_se_key_derivation_export_t MBEDTLS_PRIVATE(p_export);
1264
} psa_drv_se_key_derivation_t;
1265
1266
/**@}*/
1267
1268
/** \defgroup se_registration Secure element driver registration
1269
*/
1270
/**@{*/
1271
1272
/** A structure containing pointers to all the entry points of a
1273
* secure element driver.
1274
*
1275
* Future versions of this specification may add extra substructures at
1276
* the end of this structure.
1277
*/
1278
typedef struct {
1279
/** The version of the driver HAL that this driver implements.
1280
* This is a protection against loading driver binaries built against
1281
* a different version of this specification.
1282
* Use #PSA_DRV_SE_HAL_VERSION.
1283
*/
1284
uint32_t MBEDTLS_PRIVATE(hal_version);
1285
1286
/** The size of the driver's persistent data in bytes.
1287
*
1288
* This can be 0 if the driver does not need persistent data.
1289
*
1290
* See the documentation of psa_drv_se_context_t::persistent_data
1291
* for more information about why and how a driver can use
1292
* persistent data.
1293
*/
1294
size_t MBEDTLS_PRIVATE(persistent_data_size);
1295
1296
/** The driver initialization function.
1297
*
1298
* This function is called once during the initialization of the
1299
* PSA Cryptography subsystem, before any other function of the
1300
* driver is called. If this function returns a failure status,
1301
* the driver will be unusable, at least until the next system reset.
1302
*
1303
* If this field is \c NULL, it is equivalent to a function that does
1304
* nothing and returns #PSA_SUCCESS.
1305
*/
1306
psa_drv_se_init_t MBEDTLS_PRIVATE(p_init);
1307
1308
const psa_drv_se_key_management_t *MBEDTLS_PRIVATE(key_management);
1309
const psa_drv_se_mac_t *MBEDTLS_PRIVATE(mac);
1310
const psa_drv_se_cipher_t *MBEDTLS_PRIVATE(cipher);
1311
const psa_drv_se_aead_t *MBEDTLS_PRIVATE(aead);
1312
const psa_drv_se_asymmetric_t *MBEDTLS_PRIVATE(asymmetric);
1313
const psa_drv_se_key_derivation_t *MBEDTLS_PRIVATE(derivation);
1314
} psa_drv_se_t;
1315
1316
/** The current version of the secure element driver HAL.
1317
*/
1318
/* 0.0.0 patchlevel 5 */
1319
#define PSA_DRV_SE_HAL_VERSION 0x00000005
1320
1321
/** Register an external cryptoprocessor (secure element) driver.
1322
*
1323
* This function is only intended to be used by driver code, not by
1324
* application code. In implementations with separation between the
1325
* PSA cryptography module and applications, this function should
1326
* only be available to callers that run in the same memory space as
1327
* the cryptography module, and should not be exposed to applications
1328
* running in a different memory space.
1329
*
1330
* This function may be called before psa_crypto_init(). It is
1331
* implementation-defined whether this function may be called
1332
* after psa_crypto_init().
1333
*
1334
* \note Implementations store metadata about keys including the lifetime
1335
* value, which contains the driver's location indicator. Therefore,
1336
* from one instantiation of the PSA Cryptography
1337
* library to the next one, if there is a key in storage with a certain
1338
* lifetime value, you must always register the same driver (or an
1339
* updated version that communicates with the same secure element)
1340
* with the same location value.
1341
*
1342
* \param location The location value through which this driver will
1343
* be exposed to applications.
1344
* This driver will be used for all keys such that
1345
* `location == #PSA_KEY_LIFETIME_GET_LOCATION( lifetime )`.
1346
* The value #PSA_KEY_LOCATION_LOCAL_STORAGE is reserved
1347
* and may not be used for drivers. Implementations
1348
* may reserve other values.
1349
* \param[in] methods The method table of the driver. This structure must
1350
* remain valid for as long as the cryptography
1351
* module keeps running. It is typically a global
1352
* constant.
1353
*
1354
* \return #PSA_SUCCESS
1355
* The driver was successfully registered. Applications can now
1356
* use \p location to access keys through the methods passed to
1357
* this function.
1358
* \return #PSA_ERROR_BAD_STATE
1359
* This function was called after the initialization of the
1360
* cryptography module, and this implementation does not support
1361
* driver registration at this stage.
1362
* \return #PSA_ERROR_ALREADY_EXISTS
1363
* There is already a registered driver for this value of \p location.
1364
* \return #PSA_ERROR_INVALID_ARGUMENT
1365
* \p location is a reserved value.
1366
* \return #PSA_ERROR_NOT_SUPPORTED
1367
* `methods->hal_version` is not supported by this implementation.
1368
* \return #PSA_ERROR_INSUFFICIENT_MEMORY
1369
* \return #PSA_ERROR_NOT_PERMITTED
1370
* \return #PSA_ERROR_STORAGE_FAILURE
1371
* \return #PSA_ERROR_DATA_CORRUPT
1372
*/
1373
psa_status_t psa_register_se_driver(
1374
psa_key_location_t location,
1375
const psa_drv_se_t *methods);
1376
1377
/**@}*/
1378
1379
#ifdef __cplusplus
1380
}
1381
#endif
1382
1383
#endif /* PSA_CRYPTO_SE_DRIVER_H */
1384
1385