blob: c833d72209c0b0c6885b0a095a6bd5bf638c7b72 [file] [log] [blame]
Gilles Peskinee59236f2018-01-27 23:32:46 +01001/**
2 * \file psa/crypto.h
3 * \brief Platform Security Architecture cryptography module
4 */
5
6#ifndef PSA_CRYPTO_H
7#define PSA_CRYPTO_H
8
9#include "crypto_platform.h"
10
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010011#include <stddef.h>
12
Gilles Peskine62a7e7e2018-02-07 21:54:47 +010013#ifdef __DOXYGEN_ONLY__
14/** \defgroup platform Implementation-specific definitions
15 * @{
16 */
17
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010018/** \brief Key slot number.
19 *
20 * This type represents key slots. It must be an unsigned integral
Gilles Peskine308b91d2018-02-08 09:47:44 +010021 * type. The choice of type is implementation-dependent.
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +010022 * 0 is not a valid key slot number. The meaning of other values is
23 * implementation dependent.
24 *
25 * At any given point in time, each key slot either contains a
26 * cryptographic object, or is empty. Key slots are persistent:
27 * once set, the cryptographic object remains in the key slot until
28 * explicitly destroyed.
29 */
30typedef _unsigned_integral_type_ psa_key_slot_t;
31
Gilles Peskine62a7e7e2018-02-07 21:54:47 +010032/**@}*/
33#endif
34
Gilles Peskinee59236f2018-01-27 23:32:46 +010035#ifdef __cplusplus
36extern "C" {
37#endif
38
39/** \defgroup basic Basic definitions
40 * @{
41 */
42
43/**
44 * \brief Function return status.
45 *
46 * Zero indicates success, anything else indicates an error.
47 */
48typedef enum {
49 /** The action was completed successfully. */
50 PSA_SUCCESS = 0,
51 /** The requested operation or a parameter is not supported
52 by this implementation. */
53 PSA_ERROR_NOT_SUPPORTED,
54 /** The requested action is denied by a policy. */
55 PSA_ERROR_NOT_PERMITTED,
56 /** An output buffer is too small. */
57 PSA_ERROR_BUFFER_TOO_SMALL,
58 /** A slot is occupied, but must be empty to carry out the
59 requested action. */
60 PSA_ERROR_OCCUPIED_SLOT,
61 /** A slot is empty, but must be occupied to carry out the
62 requested action. */
63 PSA_ERROR_EMPTY_SLOT,
64 /** The requested action cannot be performed in the current state. */
65 PSA_ERROR_BAD_STATE,
66 /** The parameters passed to the function are invalid. */
67 PSA_ERROR_INVALID_ARGUMENT,
68 /** There is not enough runtime memory. */
69 PSA_ERROR_INSUFFICIENT_MEMORY,
70 /** There is not enough persistent storage. */
71 PSA_ERROR_INSUFFICIENT_STORAGE,
72 /** There was a communication failure inside the implementation. */
73 PSA_ERROR_COMMUNICATION_FAILURE,
Gilles Peskinea5905292018-02-07 20:59:33 +010074 /** There was a storage failure that may have led to data loss. */
75 PSA_ERROR_STORAGE_FAILURE,
Gilles Peskinee59236f2018-01-27 23:32:46 +010076 /** A hardware failure was detected. */
77 PSA_ERROR_HARDWARE_FAILURE,
78 /** A tampering attempt was detected. */
79 PSA_ERROR_TAMPERING_DETECTED,
80 /** There is not enough entropy to generate random data needed
81 for the requested action. */
82 PSA_ERROR_INSUFFICIENT_ENTROPY,
Gilles Peskinea5905292018-02-07 20:59:33 +010083 /** The signature, MAC or hash is incorrect. */
Gilles Peskinee59236f2018-01-27 23:32:46 +010084 PSA_ERROR_INVALID_SIGNATURE,
Gilles Peskinea5905292018-02-07 20:59:33 +010085 /** The decrypted padding is incorrect. */
86 PSA_ERROR_INVALID_PADDING,
Gilles Peskinee59236f2018-01-27 23:32:46 +010087 /** An error occurred that does not correspond to any defined
88 failure cause. */
89 PSA_ERROR_UNKNOWN_ERROR,
90} psa_status_t;
91
92/**
93 * \brief Library initialization.
94 *
95 * Applications must call this function before calling any other
96 * function in this module.
97 *
98 * Applications may call this function more than once. Once a call
99 * succeeds, subsequent calls are guaranteed to succeed.
100 *
Gilles Peskine308b91d2018-02-08 09:47:44 +0100101 * \retval PSA_SUCCESS
102 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
103 * \retval PSA_ERROR_COMMUNICATION_FAILURE
104 * \retval PSA_ERROR_HARDWARE_FAILURE
105 * \retval PSA_ERROR_TAMPERING_DETECTED
106 * \retval PSA_ERROR_INSUFFICIENT_ENTROPY
Gilles Peskinee59236f2018-01-27 23:32:46 +0100107 */
108psa_status_t psa_crypto_init(void);
109
Gilles Peskine0189e752018-02-03 23:57:22 +0100110#define BITS_TO_BYTES(bits) (((bits) + 7) / 8)
111#define BYTES_TO_BITS(bytes) ((bytes) * 8)
112
Gilles Peskinee59236f2018-01-27 23:32:46 +0100113/**@}*/
114
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100115/** \defgroup crypto_types Key and algorithm types
116 * @{
117 */
118
Gilles Peskine308b91d2018-02-08 09:47:44 +0100119/** \brief Encoding of a key type.
120 */
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100121typedef uint32_t psa_key_type_t;
122
Gilles Peskine98f0a242018-02-06 18:57:29 +0100123#define PSA_KEY_TYPE_NONE ((psa_key_type_t)0x00000000)
124#define PSA_KEY_TYPE_VENDOR_FLAG ((psa_key_type_t)0x80000000)
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100125
Gilles Peskine98f0a242018-02-06 18:57:29 +0100126#define PSA_KEY_TYPE_CATEGORY_MASK ((psa_key_type_t)0x7e000000)
127#define PSA_KEY_TYPE_RAW_DATA ((psa_key_type_t)0x02000000)
128#define PSA_KEY_TYPE_CATEGORY_SYMMETRIC ((psa_key_type_t)0x04000000)
129#define PSA_KEY_TYPE_CATEGORY_ASYMMETRIC ((psa_key_type_t)0x06000000)
130#define PSA_KEY_TYPE_PAIR_FLAG ((psa_key_type_t)0x01000000)
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100131
Gilles Peskine98f0a242018-02-06 18:57:29 +0100132#define PSA_KEY_TYPE_HMAC ((psa_key_type_t)0x02000001)
133#define PSA_KEY_TYPE_AES ((psa_key_type_t)0x04000001)
134#define PSA_KEY_TYPE_DES ((psa_key_type_t)0x04000002)
135#define PSA_KEY_TYPE_CAMELLIA ((psa_key_type_t)0x04000003)
136#define PSA_KEY_TYPE_ARC4 ((psa_key_type_t)0x04000004)
137
Gilles Peskine308b91d2018-02-08 09:47:44 +0100138/** RSA public key. */
Gilles Peskine98f0a242018-02-06 18:57:29 +0100139#define PSA_KEY_TYPE_RSA_PUBLIC_KEY ((psa_key_type_t)0x06010000)
Gilles Peskine308b91d2018-02-08 09:47:44 +0100140/** RSA key pair (private and public key). */
Gilles Peskine98f0a242018-02-06 18:57:29 +0100141#define PSA_KEY_TYPE_RSA_KEYPAIR ((psa_key_type_t)0x07010000)
142#define PSA_KEY_TYPE_ECC_BASE ((psa_key_type_t)0x06030000)
143#define PSA_KEY_TYPE_ECC_CURVE_MASK ((psa_key_type_t)0x0000ffff)
144
145#define PSA_KEY_TYPE_IS_VENDOR_DEFINED(type) \
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100146 (((type) & PSA_KEY_TYPE_VENDOR_FLAG) != 0)
Gilles Peskine8c9def32018-02-08 10:02:12 +0100147#define PSA_KEY_TYPE_IS_RAW_BYTES(type) \
148 (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_RAW_DATA || \
149 ((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_SYMMETRIC)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100150#define PSA_KEY_TYPE_IS_ASYMMETRIC(type) \
151 (((type) & PSA_KEY_TYPE_CATEGORY_MASK) == PSA_KEY_TYPE_CATEGORY_ASYMMETRIC)
152#define PSA_KEY_TYPE_IS_PUBLIC_KEY(type) \
153 (((type) & (PSA_KEY_TYPE_CATEGORY_MASK | PSA_KEY_TYPE_PAIR_FLAG) == \
154 PSA_KEY_TYPE_CATEGORY_ASYMMETRIC))
155#define PSA_KEY_TYPE_IS_KEYPAIR(type) \
156 (((type) & (PSA_KEY_TYPE_CATEGORY_MASK | PSA_KEY_TYPE_PAIR_FLAG)) == \
157 (PSA_KEY_TYPE_CATEGORY_ASYMMETRIC | PSA_KEY_TYPE_PAIR_FLAG))
Gilles Peskine0189e752018-02-03 23:57:22 +0100158#define PSA_KEY_TYPE_IS_RSA(type) \
Gilles Peskine98f0a242018-02-06 18:57:29 +0100159 (((type) & ~PSA_KEY_TYPE_PAIR_FLAG) == PSA_KEY_TYPE_RSA_PUBLIC_KEY)
Gilles Peskinec66ea6a2018-02-03 22:43:28 +0100160#define PSA_KEY_TYPE_IS_ECC(type) \
Gilles Peskine98f0a242018-02-06 18:57:29 +0100161 (((type) & ~PSA_KEY_TYPE_ECC_CURVE_MASK) == PSA_KEY_TYPE_ECC_BASE)
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100162
Gilles Peskine8c9def32018-02-08 10:02:12 +0100163#define PSA_BLOCK_CIPHER_BLOCK_SIZE(key_type) \
164 ( \
165 (type) == PSA_KEY_TYPE_AES ? 16 : \
166 (type) == PSA_KEY_TYPE_DES ? 8 : \
167 (type) == PSA_KEY_TYPE_CAMELLIA ? 16 : \
168 0)
169
Gilles Peskine308b91d2018-02-08 09:47:44 +0100170/** \brief Encoding of a cryptographic algorithm.
171 *
172 * For algorithms that can be applied to multiple key types, this type
173 * does not encode the key type. For example, for symmetric ciphers
174 * based on a block cipher, #psa_algorithm_t encodes the block cipher
175 * mode and the padding mode while the block cipher itself is encoded
176 * via #psa_key_type_t.
177 */
Gilles Peskine20035e32018-02-03 22:44:14 +0100178typedef uint32_t psa_algorithm_t;
179
Gilles Peskine98f0a242018-02-06 18:57:29 +0100180#define PSA_ALG_VENDOR_FLAG ((psa_algorithm_t)0x80000000)
181#define PSA_ALG_CATEGORY_MASK ((psa_algorithm_t)0x7f000000)
182#define PSA_ALG_CATEGORY_HASH ((psa_algorithm_t)0x01000000)
183#define PSA_ALG_CATEGORY_MAC ((psa_algorithm_t)0x02000000)
184#define PSA_ALG_CATEGORY_CIPHER ((psa_algorithm_t)0x04000000)
185#define PSA_ALG_CATEGORY_AEAD ((psa_algorithm_t)0x06000000)
186#define PSA_ALG_CATEGORY_SIGN ((psa_algorithm_t)0x10000000)
187#define PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION ((psa_algorithm_t)0x12000000)
188#define PSA_ALG_CATEGORY_KEY_AGREEMENT ((psa_algorithm_t)0x22000000)
189#define PSA_ALG_CATEGORY_KEY_DERIVATION ((psa_algorithm_t)0x30000000)
Gilles Peskine20035e32018-02-03 22:44:14 +0100190
Gilles Peskine98f0a242018-02-06 18:57:29 +0100191#define PSA_ALG_IS_VENDOR_DEFINED(alg) \
192 (((alg) & PSA_ALG_VENDOR_FLAG) != 0)
Gilles Peskine308b91d2018-02-08 09:47:44 +0100193/** Whether the specified algorithm is a hash algorithm.
194 *
195 * \param alg An algorithm identifier (\c PSA_ALG_XXX value)
196 *
197 * \return 1 if \c alg is a hash algorithm, 0 otherwise.
198 * This macro may return either 0 or 1 if \c alg is not a valid
199 * algorithm identifier. */
Gilles Peskine98f0a242018-02-06 18:57:29 +0100200#define PSA_ALG_IS_HASH(alg) \
201 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_HASH)
202#define PSA_ALG_IS_MAC(alg) \
203 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_MAC)
204#define PSA_ALG_IS_CIPHER(alg) \
205 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_CIPHER)
206#define PSA_ALG_IS_AEAD(alg) \
207 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_AEAD)
208#define PSA_ALG_IS_SIGN(alg) \
209 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_SIGN)
210#define PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(alg) \
211 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION)
212#define PSA_ALG_IS_KEY_AGREEMENT(alg) \
213 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_AGREEMENT)
214#define PSA_ALG_IS_KEY_DERIVATION(alg) \
215 (((alg) & PSA_ALG_CATEGORY_MASK) == PSA_ALG_CATEGORY_KEY_DERIVATION)
216
217#define PSA_ALG_HASH_MASK ((psa_algorithm_t)0x000000ff)
218#define PSA_ALG_MD2 ((psa_algorithm_t)0x01000001)
219#define PSA_ALG_MD4 ((psa_algorithm_t)0x01000002)
220#define PSA_ALG_MD5 ((psa_algorithm_t)0x01000003)
221#define PSA_ALG_SHA_256_128 ((psa_algorithm_t)0x01000004)
222#define PSA_ALG_RIPEMD160 ((psa_algorithm_t)0x01000005)
223#define PSA_ALG_SHA_1 ((psa_algorithm_t)0x01000006)
224#define PSA_ALG_SHA_256_160 ((psa_algorithm_t)0x01000007)
225#define PSA_ALG_SHA_224 ((psa_algorithm_t)0x01000008)
226#define PSA_ALG_SHA_256 ((psa_algorithm_t)0x01000009)
227#define PSA_ALG_SHA_384 ((psa_algorithm_t)0x0100000a)
228#define PSA_ALG_SHA_512 ((psa_algorithm_t)0x0100000b)
229#define PSA_ALG_SHA_512_224 ((psa_algorithm_t)0x0100000c)
230#define PSA_ALG_SHA_512_256 ((psa_algorithm_t)0x0100000d)
231#define PSA_ALG_SHA3_224 ((psa_algorithm_t)0x01000010)
232#define PSA_ALG_SHA3_256 ((psa_algorithm_t)0x01000011)
233#define PSA_ALG_SHA3_384 ((psa_algorithm_t)0x01000012)
234#define PSA_ALG_SHA3_512 ((psa_algorithm_t)0x01000013)
235
Gilles Peskine8c9def32018-02-08 10:02:12 +0100236#define PSA_ALG_MAC_SUBCATEGORY_MASK ((psa_algorithm_t)0x00c00000)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100237#define PSA_ALG_HMAC_BASE ((psa_algorithm_t)0x02800000)
238#define PSA_ALG_HMAC(hash_alg) \
Gilles Peskine8c9def32018-02-08 10:02:12 +0100239 (PSA_ALG_HMAC_BASE | ((hash_alg) & PSA_ALG_HASH_MASK))
240#define PSA_ALG_HMAC_HASH(hmac_alg) \
241 (PSA_ALG_CATEGORY_HASH | ((hmac_alg) & PSA_ALG_HASH_MASK))
242#define PSA_ALG_IS_HMAC(alg) \
243 (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \
244 PSA_ALG_HMAC_BASE)
245#define PSA_ALG_CIPHER_MAC_BASE ((psa_algorithm_t)0x02c00000)
246#define PSA_ALG_CBC_MAC ((psa_algorithm_t)0x02c00001)
247#define PSA_ALG_CMAC ((psa_algorithm_t)0x02c00002)
248#define PSA_ALG_GMAC ((psa_algorithm_t)0x02c00003)
249#define PSA_ALG_IS_CIPHER_MAC(alg) \
250 (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_MAC_SUBCATEGORY_MASK)) == \
251 PSA_ALG_CIPHER_MAC_BASE)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100252
Gilles Peskine8c9def32018-02-08 10:02:12 +0100253#define PSA_ALG_CIPHER_SUBCATEGORY_MASK ((psa_algorithm_t)0x00c00000)
Gilles Peskine428dc5a2018-03-03 21:27:18 +0100254#define PSA_ALG_BLOCK_CIPHER_BASE ((psa_algorithm_t)0x04000000)
Gilles Peskine8c9def32018-02-08 10:02:12 +0100255#define PSA_ALG_BLOCK_CIPHER_MODE_MASK ((psa_algorithm_t)0x000000ff)
Gilles Peskine428dc5a2018-03-03 21:27:18 +0100256#define PSA_ALG_BLOCK_CIPHER_PADDING_MASK ((psa_algorithm_t)0x003f0000)
257#define PSA_ALG_BLOCK_CIPHER_PAD_NONE ((psa_algorithm_t)0x00000000)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100258#define PSA_ALG_BLOCK_CIPHER_PAD_PKCS7 ((psa_algorithm_t)0x00010000)
Gilles Peskine8c9def32018-02-08 10:02:12 +0100259#define PSA_ALG_IS_BLOCK_CIPHER(alg) \
260 (((alg) & (PSA_ALG_CATEGORY_MASK | PSA_ALG_CIPHER_SUBCATEGORY_MASK)) == \
261 PSA_ALG_BLOCK_CIPHER_BASE)
262
Gilles Peskine98f0a242018-02-06 18:57:29 +0100263#define PSA_ALG_CBC_BASE ((psa_algorithm_t)0x04000001)
Gilles Peskine8c9def32018-02-08 10:02:12 +0100264#define PSA_ALG_CFB_BASE ((psa_algorithm_t)0x04000002)
265#define PSA_ALG_OFB_BASE ((psa_algorithm_t)0x04000003)
266#define PSA_ALG_XTS_BASE ((psa_algorithm_t)0x04000004)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100267#define PSA_ALG_STREAM_CIPHER ((psa_algorithm_t)0x04800000)
268#define PSA_ALG_CTR ((psa_algorithm_t)0x04800001)
Gilles Peskine8c9def32018-02-08 10:02:12 +0100269#define PSA_ALG_ARC4 ((psa_algorithm_t)0x04800002)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100270
Gilles Peskine8c9def32018-02-08 10:02:12 +0100271#define PSA_ALG_CCM ((psa_algorithm_t)0x06000001)
272#define PSA_ALG_GCM ((psa_algorithm_t)0x06000002)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100273
274#define PSA_ALG_RSA_PKCS1V15_RAW ((psa_algorithm_t)0x10010000)
275#define PSA_ALG_RSA_PSS_MGF1 ((psa_algorithm_t)0x10020000)
276#define PSA_ALG_RSA_OAEP ((psa_algorithm_t)0x12020000)
277#define PSA_ALG_RSA_PKCS1V15(hash_alg) \
278 (PSA_ALG_RSA_PKCS1V15_RAW | ((hash_alg) & PSA_ALG_HASH_MASK))
279#define PSA_ALG_IS_RSA_PKCS1V15(alg) \
Gilles Peskine20035e32018-02-03 22:44:14 +0100280 (((alg) & 0x7fffff00) == PSA_ALG_RSA_PKCS1V15_RAW)
Gilles Peskine98f0a242018-02-06 18:57:29 +0100281#define PSA_ALG_RSA_GET_HASH(alg) \
282 (((alg) & PSA_ALG_HASH_MASK) | PSA_ALG_CATEGORY_HASH)
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100283
284/**@}*/
285
286/** \defgroup key_management Key management
287 * @{
288 */
289
290/**
291 * \brief Import a key in binary format.
292 *
293 * This function supports any output from psa_export_key().
294 *
Gilles Peskine308b91d2018-02-08 09:47:44 +0100295 * \param key Slot where the key will be stored. This must be a
296 * valid slot for a key of the chosen type. It must
297 * be unoccupied.
298 * \param type Key type (a \c PSA_KEY_TYPE_XXX value).
299 * \param data Buffer containing the key data.
300 * \param data_length Size of the \c data buffer in bytes.
301 *
302 * \retval PSA_SUCCESS
303 * Success.
304 * \retval PSA_ERROR_NOT_SUPPORTED
305 * The key type or key size is not supported.
306 * \retval PSA_ERROR_INVALID_ARGUMENT
307 * The key slot is invalid,
308 * or the key data is not correctly formatted.
309 * \retval PSA_ERROR_OCCUPIED_SLOT
310 There is already a key in the specified slot.
311 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
312 * \retval PSA_ERROR_COMMUNICATION_FAILURE
313 * \retval PSA_ERROR_HARDWARE_FAILURE
314 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100315 */
316psa_status_t psa_import_key(psa_key_slot_t key,
317 psa_key_type_t type,
318 const uint8_t *data,
319 size_t data_length);
320
321/**
322 * \brief Destroy a key.
323 *
Gilles Peskine308b91d2018-02-08 09:47:44 +0100324 * \retval PSA_SUCCESS
325 * \retval PSA_ERROR_EMPTY_SLOT
326 * \retval PSA_ERROR_COMMUNICATION_FAILURE
327 * \retval PSA_ERROR_HARDWARE_FAILURE
328 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100329 */
330psa_status_t psa_destroy_key(psa_key_slot_t key);
331
332/**
333 * \brief Get basic metadata about a key.
334 *
Gilles Peskine308b91d2018-02-08 09:47:44 +0100335 * \param key Slot whose content is queried. This must
336 * be an occupied key slot.
337 * \param type On success, the key type (a \c PSA_KEY_TYPE_XXX value).
338 * This may be a null pointer, in which case the key type
339 * is not written.
340 * \param bits On success, the key size in bits.
341 * This may be a null pointer, in which case the key type
342 * is not written.
343 *
344 * \retval PSA_SUCCESS
345 * \retval PSA_ERROR_EMPTY_SLOT
346 * \retval PSA_ERROR_COMMUNICATION_FAILURE
347 * \retval PSA_ERROR_HARDWARE_FAILURE
348 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100349 */
350psa_status_t psa_get_key_information(psa_key_slot_t key,
351 psa_key_type_t *type,
352 size_t *bits);
353
354/**
355 * \brief Export a key in binary format.
356 *
357 * The output of this function can be passed to psa_import_key() to
358 * create an equivalent object.
359 *
360 * If a key is created with psa_import_key() and then exported with
361 * this function, it is not guaranteed that the resulting data is
362 * identical: the implementation may choose a different representation
363 * of the same key.
364 *
Gilles Peskine308b91d2018-02-08 09:47:44 +0100365 * For standard key types, the output format is as follows:
366 *
367 * - For symmetric keys (including MAC keys), the format is the
368 * raw bytes of the key.
369 * - For DES, the key data consists of 8 bytes. The parity bits must be
370 * correct.
371 * - For Triple-DES, the format is the concatenation of the
372 * two or three DES keys.
373 * - For RSA key pairs keys (#PSA_KEY_TYPE_RSA_KEYPAIR), the format
374 * is the non-encrypted DER representation defined by PKCS\#8 (RFC 5208)
375 * as PrivateKeyInfo.
376 * - For RSA public keys (#PSA_KEY_TYPE_RSA_PUBLIC_KEY), the format
377 * is the DER representation defined by X.509.
378 *
379 * \param key Slot whose content is to be exported. This must
380 * be an occupied key slot.
381 * \param data Buffer where the key data is to be written.
382 * \param data_size Size of the \c data buffer in bytes.
383 * \param data_length On success, the number of bytes
384 * that make up the key data.
385 *
386 * \retval PSA_SUCCESS
387 * \retval PSA_ERROR_EMPTY_SLOT
388 * \retval PSA_ERROR_COMMUNICATION_FAILURE
389 * \retval PSA_ERROR_HARDWARE_FAILURE
390 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100391 */
392psa_status_t psa_export_key(psa_key_slot_t key,
393 uint8_t *data,
394 size_t data_size,
395 size_t *data_length);
396
Gilles Peskine20035e32018-02-03 22:44:14 +0100397
398/**@}*/
399
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100400/** \defgroup hash Message digests
401 * @{
402 */
403
Gilles Peskine308b91d2018-02-08 09:47:44 +0100404/** The type of the state data structure for multipart hash operations.
405 *
406 * This is an implementation-define \c struct. Applications should not
407 * make any assumptions about the content of this structure except
408 * as directed by the documentation of a specific implementation. */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100409typedef struct psa_hash_operation_s psa_hash_operation_t;
410
Gilles Peskine308b91d2018-02-08 09:47:44 +0100411/** The size of the output of psa_hash_finish(), in bytes.
412 *
413 * This is also the hash size that psa_hash_verify() expects.
414 *
415 * \param alg A hash algorithm (\c PSA_ALG_XXX value such that
416 * #PSA_ALG_IS_HASH(alg) is true).
417 *
418 * \return The hash size for the specified hash algorithm.
419 * If the hash algorithm is not recognized, return 0.
420 * An implementation may return either 0 or the correct size
421 * for a hash algorithm that it recognizes, but does not support.
422 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100423#define PSA_HASH_FINAL_SIZE(alg) \
424 ( \
425 (alg) == PSA_ALG_MD2 ? 16 : \
426 (alg) == PSA_ALG_MD4 ? 16 : \
427 (alg) == PSA_ALG_MD5 ? 16 : \
428 (alg) == PSA_ALG_SHA_256_128 ? 16 : \
429 (alg) == PSA_ALG_RIPEMD160 ? 20 : \
430 (alg) == PSA_ALG_SHA_1 ? 20 : \
431 (alg) == PSA_ALG_SHA_256_160 ? 20 : \
432 (alg) == PSA_ALG_SHA_224 ? 28 : \
433 (alg) == PSA_ALG_SHA_256 ? 32 : \
434 (alg) == PSA_ALG_SHA_384 ? 48 : \
435 (alg) == PSA_ALG_SHA_512 ? 64 : \
436 (alg) == PSA_ALG_SHA_512_224 ? 28 : \
437 (alg) == PSA_ALG_SHA_512_256 ? 32 : \
438 (alg) == PSA_ALG_SHA3_224 ? 28 : \
439 (alg) == PSA_ALG_SHA3_256 ? 32 : \
440 (alg) == PSA_ALG_SHA3_384 ? 48 : \
441 (alg) == PSA_ALG_SHA3_512 ? 64 : \
442 0)
443
Gilles Peskine308b91d2018-02-08 09:47:44 +0100444/** Start a multipart hash operation.
445 *
446 * The sequence of operations to calculate a hash (message digest)
447 * is as follows:
448 * -# Allocate an operation object which will be passed to all the functions
449 * listed here.
450 * -# Call psa_hash_start() to specify the algorithm.
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100451 * -# Call psa_hash_update() zero, one or more times, passing a fragment
Gilles Peskine308b91d2018-02-08 09:47:44 +0100452 * of the message each time. The hash that is calculated is the hash
453 * of the concatenation of these messages in order.
454 * -# To calculate the hash, call psa_hash_finish().
455 * To compare the hash with an expected value, call psa_hash_verify().
456 *
457 * The application may call psa_hash_abort() at any time after the operation
458 * has been initialized with psa_hash_start().
459 *
460 * After a successful call to psa_hash_start(), the application must
461 * eventually destroy the operation through one of the following means:
462 * - A failed call to psa_hash_update().
463 * - A call to psa_hash_final(), psa_hash_verify() or psa_hash_abort().
464 *
465 * \param operation
466 * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value
467 * such that #PSA_ALG_IS_HASH(alg) is true).
468 *
469 * \retval PSA_SUCCESS
470 * Success.
471 * \retval PSA_ERROR_NOT_SUPPORTED
472 * \c alg is not supported or is not a hash algorithm.
473 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
474 * \retval PSA_ERROR_COMMUNICATION_FAILURE
475 * \retval PSA_ERROR_HARDWARE_FAILURE
476 * \retval PSA_ERROR_TAMPERING_DETECTED
477 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100478psa_status_t psa_hash_start(psa_hash_operation_t *operation,
479 psa_algorithm_t alg);
480
Gilles Peskine308b91d2018-02-08 09:47:44 +0100481/** Add a message fragment to a multipart hash operation.
482 *
483 * The application must call psa_hash_start() before calling this function.
484 *
485 * If this function returns an error status, the operation becomes inactive.
486 *
487 * \param operation Active hash operation.
488 * \param input Buffer containing the message fragment to hash.
489 * \param input_length Size of the \c input buffer in bytes.
490 *
491 * \retval PSA_SUCCESS
492 * Success.
493 * \retval PSA_ERROR_BAD_STATE
494 * The operation state is not valid (not started, or already completed).
495 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
496 * \retval PSA_ERROR_COMMUNICATION_FAILURE
497 * \retval PSA_ERROR_HARDWARE_FAILURE
498 * \retval PSA_ERROR_TAMPERING_DETECTED
499 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100500psa_status_t psa_hash_update(psa_hash_operation_t *operation,
501 const uint8_t *input,
502 size_t input_length);
503
Gilles Peskine308b91d2018-02-08 09:47:44 +0100504/** Finish the calculation of the hash of a message.
505 *
506 * The application must call psa_hash_start() before calling this function.
507 * This function calculates the hash of the message formed by concatenating
508 * the inputs passed to preceding calls to psa_hash_update().
509 *
510 * When this function returns, the operation becomes inactive.
511 *
512 * \warning Applications should not call this function if they expect
513 * a specific value for the hash. Call psa_hash_verify() instead.
514 * Beware that comparing integrity or authenticity data such as
515 * hash values with a function such as \c memcmp is risky
516 * because the time taken by the comparison may leak information
517 * about the hashed data which could allow an attacker to guess
518 * a valid hash and thereby bypass security controls.
519 *
520 * \param operation Active hash operation.
521 * \param hash Buffer where the hash is to be written.
522 * \param hash_size Size of the \c hash buffer in bytes.
523 * \param hash_length On success, the number of bytes
524 * that make up the hash value. This is always
525 * #PSA_HASH_FINAL_SIZE(alg) where \c alg is the
526 * hash algorithm that is calculated.
527 *
528 * \retval PSA_SUCCESS
529 * Success.
530 * \retval PSA_ERROR_BAD_STATE
531 * The operation state is not valid (not started, or already completed).
532 * \retval PSA_ERROR_BUFFER_TOO_SMALL
533 * The size of the \c hash buffer is too small. You can determine a
534 * sufficient buffer size by calling #PSA_HASH_FINAL_SIZE(alg)
535 * where \c alg is the hash algorithm that is calculated.
536 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
537 * \retval PSA_ERROR_COMMUNICATION_FAILURE
538 * \retval PSA_ERROR_HARDWARE_FAILURE
539 * \retval PSA_ERROR_TAMPERING_DETECTED
540 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100541psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
542 uint8_t *hash,
543 size_t hash_size,
544 size_t *hash_length);
545
Gilles Peskine308b91d2018-02-08 09:47:44 +0100546/** Finish the calculation of the hash of a message and compare it with
547 * an expected value.
548 *
549 * The application must call psa_hash_start() before calling this function.
550 * This function calculates the hash of the message formed by concatenating
551 * the inputs passed to preceding calls to psa_hash_update(). It then
552 * compares the calculated hash with the expected hash passed as a
553 * parameter to this function.
554 *
555 * When this function returns, the operation becomes inactive.
556 *
557 * \note Applications shall make the best effort to ensure that the
558 * comparison between the actual hash and the expected hash is performed
559 * in constant time.
560 *
561 * \param operation Active hash operation.
562 * \param hash Buffer containing the expected hash value.
563 * \param hash_length Size of the \c hash buffer in bytes.
564 *
565 * \retval PSA_SUCCESS
566 * The expected hash is identical to the actual hash of the message.
567 * \retval PSA_ERROR_INVALID_SIGNATURE
568 * The hash of the message was calculated successfully, but it
569 * differs from the expected hash.
570 * \retval PSA_ERROR_BAD_STATE
571 * The operation state is not valid (not started, or already completed).
572 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
573 * \retval PSA_ERROR_COMMUNICATION_FAILURE
574 * \retval PSA_ERROR_HARDWARE_FAILURE
575 * \retval PSA_ERROR_TAMPERING_DETECTED
576 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100577psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
578 const uint8_t *hash,
579 size_t hash_length);
580
Gilles Peskine308b91d2018-02-08 09:47:44 +0100581/** Abort a hash operation.
582 *
583 * This function may be called at any time after psa_hash_start().
584 * Aborting an operation frees all associated resources except for the
585 * \c operation structure itself.
586 *
587 * Implementation should strive to be robust and handle inactive hash
588 * operations safely (do nothing and return #PSA_ERROR_BAD_STATE). However,
589 * application writers should beware that uninitialized memory may happen
590 * to be indistinguishable from an active hash operation, and the behavior
591 * of psa_hash_abort() is undefined in this case.
592 *
593 * \param operation Active hash operation.
594 *
595 * \retval PSA_SUCCESS
596 * \retval PSA_ERROR_BAD_STATE
597 * \c operation is not an active hash operation.
598 * \retval PSA_ERROR_COMMUNICATION_FAILURE
599 * \retval PSA_ERROR_HARDWARE_FAILURE
600 * \retval PSA_ERROR_TAMPERING_DETECTED
601 */
602psa_status_t psa_hash_abort(psa_hash_operation_t *operation);
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100603
604/**@}*/
605
Gilles Peskine8c9def32018-02-08 10:02:12 +0100606/** \defgroup MAC Message authentication codes
607 * @{
608 */
609
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100610/** The type of the state data structure for multipart MAC operations.
611 *
612 * This is an implementation-define \c struct. Applications should not
613 * make any assumptions about the content of this structure except
614 * as directed by the documentation of a specific implementation. */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100615typedef struct psa_mac_operation_s psa_mac_operation_t;
616
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100617/** The size of the output of psa_mac_finish(), in bytes.
618 *
619 * This is also the MAC size that psa_mac_verify() expects.
620 *
621 * \param alg A MAC algorithm (\c PSA_ALG_XXX value such that
622 * #PSA_ALG_IS_MAC(alg) is true).
623 *
624 * \return The MAC size for the specified algorithm.
625 * If the MAC algorithm is not recognized, return 0.
626 * An implementation may return either 0 or the correct size
627 * for a MAC algorithm that it recognizes, but does not support.
628 */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100629#define PSA_MAC_FINAL_SIZE(key_type, key_bits, alg) \
630 (PSA_ALG_IS_HMAC(alg) ? PSA_HASH_FINAL_SIZE(PSA_ALG_HMAC_HASH(alg)) : \
631 PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_SIZE(key_type) : \
632 0)
633
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100634/** Start a multipart MAC operation.
635 *
636 * The sequence of operations to calculate a MAC (message authentication code)
637 * is as follows:
638 * -# Allocate an operation object which will be passed to all the functions
639 * listed here.
640 * -# Call psa_mac_start() to specify the algorithm and key.
641 * The key remains associated with the operation even if the content
642 * of the key slot changes.
643 * -# Call psa_mac_update() zero, one or more times, passing a fragment
644 * of the message each time. The MAC that is calculated is the MAC
645 * of the concatenation of these messages in order.
646 * -# To calculate the MAC, call psa_mac_finish().
647 * To compare the MAC with an expected value, call psa_mac_verify().
648 *
649 * The application may call psa_mac_abort() at any time after the operation
650 * has been initialized with psa_mac_start().
651 *
652 * After a successful call to psa_mac_start(), the application must
653 * eventually destroy the operation through one of the following means:
654 * - A failed call to psa_mac_update().
655 * - A call to psa_mac_final(), psa_mac_verify() or psa_mac_abort().
656 *
657 * \param operation
658 * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value
659 * such that #PSA_ALG_IS_MAC(alg) is true).
660 *
661 * \retval PSA_SUCCESS
662 * Success.
663 * \retval PSA_ERROR_EMPTY_SLOT
664 * \retval PSA_ERROR_INVALID_ARGUMENT
665 * \c key is not compatible with \c alg.
666 * \retval PSA_ERROR_NOT_SUPPORTED
667 * \c alg is not supported or is not a MAC algorithm.
668 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
669 * \retval PSA_ERROR_COMMUNICATION_FAILURE
670 * \retval PSA_ERROR_HARDWARE_FAILURE
671 * \retval PSA_ERROR_TAMPERING_DETECTED
672 */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100673psa_status_t psa_mac_start(psa_mac_operation_t *operation,
674 psa_key_slot_t key,
675 psa_algorithm_t alg);
676
677psa_status_t psa_mac_update(psa_mac_operation_t *operation,
678 const uint8_t *input,
679 size_t input_length);
680
681psa_status_t psa_mac_finish(psa_mac_operation_t *operation,
682 uint8_t *mac,
683 size_t mac_size,
684 size_t *mac_length);
685
686psa_status_t psa_mac_verify(psa_mac_operation_t *operation,
687 const uint8_t *mac,
688 size_t mac_length);
689
690psa_status_t psa_mac_abort(psa_mac_operation_t *operation);
691
692/**@}*/
693
Gilles Peskine428dc5a2018-03-03 21:27:18 +0100694/** \defgroup cipher Symmetric ciphers
695 * @{
696 */
697
698/** The type of the state data structure for multipart cipher operations.
699 *
700 * This is an implementation-defined \c struct. Applications should not
701 * make any assumptions about the content of this structure except
702 * as directed by the documentation of a specific implementation. */
703typedef struct psa_cipher_operation_s psa_cipher_operation_t;
704
705/** Set the key for a multipart symmetric encryption operation.
706 *
707 * The sequence of operations to encrypt a message with a symmetric cipher
708 * is as follows:
709 * -# Allocate an operation object which will be passed to all the functions
710 * listed here.
711 * -# Call psa_encrypt_setup() to specify the algorithm and key.
712 * The key remains associated with the operation even if the content
713 * of the key slot changes.
714 * -# Call either psa_encrypt_generate_iv() or psa_encrypt_set_iv() to
715 * generate or set the IV (initialization vector). You should use
716 * psa_encrypt_generate_iv() unless the protocol you are implementing
717 * requires a specific IV value.
718 * -# Call psa_cipher_update() zero, one or more times, passing a fragment
719 * of the message each time.
720 * -# Call psa_cipher_finish().
721 *
722 * The application may call psa_cipher_abort() at any time after the operation
723 * has been initialized with psa_encrypt_setup().
724 *
725 * After a successful call to psa_encrypt_setup(), the application must
726 * eventually destroy the operation through one of the following means:
727 * - A failed call to psa_encrypt_generate_iv(), psa_encrypt_set_iv()
728 * or psa_cipher_update().
729 * - A call to psa_cipher_final() or psa_cipher_abort().
730 *
731 * \param operation
732 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
733 * such that #PSA_ALG_IS_CIPHER(alg) is true).
734 *
735 * \retval PSA_SUCCESS
736 * Success.
737 * \retval PSA_ERROR_EMPTY_SLOT
738 * \retval PSA_ERROR_NOT_PERMITTED
739 * \retval PSA_ERROR_INVALID_ARGUMENT
740 * \c key is not compatible with \c alg.
741 * \retval PSA_ERROR_NOT_SUPPORTED
742 * \c alg is not supported or is not a cipher algorithm.
743 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
744 * \retval PSA_ERROR_COMMUNICATION_FAILURE
745 * \retval PSA_ERROR_HARDWARE_FAILURE
746 * \retval PSA_ERROR_TAMPERING_DETECTED
747 */
748psa_status_t psa_encrypt_setup(psa_cipher_operation_t *operation,
749 psa_key_slot_t key,
750 psa_algorithm_t alg);
751
752/** Set the key for a multipart symmetric decryption operation.
753 *
754 * The sequence of operations to decrypt a message with a symmetric cipher
755 * is as follows:
756 * -# Allocate an operation object which will be passed to all the functions
757 * listed here.
758 * -# Call psa_decrypt_setup() to specify the algorithm and key.
759 * The key remains associated with the operation even if the content
760 * of the key slot changes.
761 * -# Call psa_cipher_update() with the IV (initialization vector) for the
762 * decryption. If the IV is prepended to the ciphertext, you can call
763 * psa_cipher_update() on a buffer containing the IV followed by the
764 * beginning of the message.
765 * -# Call psa_cipher_update() zero, one or more times, passing a fragment
766 * of the message each time.
767 * -# Call psa_cipher_finish().
768 *
769 * The application may call psa_cipher_abort() at any time after the operation
770 * has been initialized with psa_encrypt_setup().
771 *
772 * After a successful call to psa_decrypt_setup(), the application must
773 * eventually destroy the operation through one of the following means:
774 * - A failed call to psa_cipher_update().
775 * - A call to psa_cipher_final() or psa_cipher_abort().
776 *
777 * \param operation
778 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
779 * such that #PSA_ALG_IS_CIPHER(alg) is true).
780 *
781 * \retval PSA_SUCCESS
782 * Success.
783 * \retval PSA_ERROR_EMPTY_SLOT
784 * \retval PSA_ERROR_NOT_PERMITTED
785 * \retval PSA_ERROR_INVALID_ARGUMENT
786 * \c key is not compatible with \c alg.
787 * \retval PSA_ERROR_NOT_SUPPORTED
788 * \c alg is not supported or is not a cipher algorithm.
789 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
790 * \retval PSA_ERROR_COMMUNICATION_FAILURE
791 * \retval PSA_ERROR_HARDWARE_FAILURE
792 * \retval PSA_ERROR_TAMPERING_DETECTED
793 */
794psa_status_t psa_decrypt_setup(psa_cipher_operation_t *operation,
795 psa_key_slot_t key,
796 psa_algorithm_t alg);
797
798psa_status_t psa_encrypt_generate_iv(psa_cipher_operation_t *operation,
799 unsigned char *iv,
800 size_t iv_size,
801 size_t *iv_length);
802
803psa_status_t psa_encrypt_set_iv(psa_cipher_operation_t *operation,
804 const unsigned char *iv,
805 size_t iv_length);
806
807psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
808 const uint8_t *input,
809 size_t input_length);
810
811psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
812 uint8_t *mac,
813 size_t mac_size,
814 size_t *mac_length);
815
816psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation);
817
818/**@}*/
819
Gilles Peskine3b555712018-03-03 21:27:57 +0100820/** \defgroup aead Authenticated encryption with associated data (AEAD)
821 * @{
822 */
823
824/** The type of the state data structure for multipart AEAD operations.
825 *
826 * This is an implementation-defined \c struct. Applications should not
827 * make any assumptions about the content of this structure except
828 * as directed by the documentation of a specific implementation. */
829typedef struct psa_aead_operation_s psa_aead_operation_t;
830
831/** Set the key for a multipart authenticated encryption operation.
832 *
833 * The sequence of operations to authenticate-and-encrypt a message
834 * is as follows:
835 * -# Allocate an operation object which will be passed to all the functions
836 * listed here.
837 * -# Call psa_aead_encrypt_setup() to specify the algorithm and key.
838 * The key remains associated with the operation even if the content
839 * of the key slot changes.
840 * -# Call either psa_aead_generate_iv() or psa_aead_set_iv() to
841 * generate or set the IV (initialization vector). You should use
842 * psa_encrypt_generate_iv() unless the protocol you are implementing
843 * requires a specific IV value.
844 * -# Call psa_aead_update_ad() to pass the associated data that is
845 * to be authenticated but not encrypted. You may omit this step if
846 * there is no associated data.
847 * -# Call psa_aead_update() zero, one or more times, passing a fragment
848 * of the data to encrypt each time.
849 * -# Call psa_aead_finish().
850 *
851 * The application may call psa_aead_abort() at any time after the operation
852 * has been initialized with psa_aead_encrypt_setup().
853 *
854 * After a successful call to psa_aead_setup(), the application must
855 * eventually destroy the operation through one of the following means:
856 * - A failed call to psa_aead_generate_iv(), psa_aead_set_iv(),
857 * psa_aead_update_ad() or psa_aead_update().
858 * - A call to psa_aead_final() or psa_aead_abort().
859 *
860 * \param operation
861 * \param alg The AEAD algorithm to compute (\c PSA_ALG_XXX value
862 * such that #PSA_ALG_IS_AEAD(alg) is true).
863 *
864 * \retval PSA_SUCCESS
865 * Success.
866 * \retval PSA_ERROR_EMPTY_SLOT
867 * \retval PSA_ERROR_NOT_PERMITTED
868 * \retval PSA_ERROR_INVALID_ARGUMENT
869 * \c key is not compatible with \c alg.
870 * \retval PSA_ERROR_NOT_SUPPORTED
871 * \c alg is not supported or is not an AEAD algorithm.
872 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
873 * \retval PSA_ERROR_COMMUNICATION_FAILURE
874 * \retval PSA_ERROR_HARDWARE_FAILURE
875 * \retval PSA_ERROR_TAMPERING_DETECTED
876 */
877psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
878 psa_key_slot_t key,
879 psa_algorithm_t alg);
880
881/** Set the key for a multipart authenticated decryption operation.
882 *
883 * The sequence of operations to authenticated and decrypt a message
884 * is as follows:
885 * -# Allocate an operation object which will be passed to all the functions
886 * listed here.
887 * -# Call psa_aead_decrypt_setup() to specify the algorithm and key.
888 * The key remains associated with the operation even if the content
889 * of the key slot changes.
890 * -# Call psa_aead_set_iv() to pass the initialization vector (IV)
891 * for the authenticated decryption.
892 * -# Call psa_aead_update_ad() to pass the associated data that is
893 * to be authenticated but not encrypted. You may omit this step if
894 * there is no associated data.
895 * -# Call psa_aead_update() zero, one or more times, passing a fragment
896 * of the data to decrypt each time.
897 * -# Call psa_aead_finish().
898 *
899 * The application may call psa_aead_abort() at any time after the operation
900 * has been initialized with psa_aead_decrypt_setup().
901 *
902 * After a successful call to psa_decrypt_setup(), the application must
903 * eventually destroy the operation through one of the following means:
904 * - A failed call to psa_aead_update().
905 * - A call to psa_cipher_final() or psa_cipher_abort().
906 *
907 * \param operation
908 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
909 * such that #PSA_ALG_IS_CIPHER(alg) is true).
910 *
911 * \retval PSA_SUCCESS
912 * Success.
913 * \retval PSA_ERROR_EMPTY_SLOT
914 * \retval PSA_ERROR_NOT_PERMITTED
915 * \retval PSA_ERROR_INVALID_ARGUMENT
916 * \c key is not compatible with \c alg.
917 * \retval PSA_ERROR_NOT_SUPPORTED
918 * \c alg is not supported or is not a cipher algorithm.
919 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
920 * \retval PSA_ERROR_COMMUNICATION_FAILURE
921 * \retval PSA_ERROR_HARDWARE_FAILURE
922 * \retval PSA_ERROR_TAMPERING_DETECTED
923 */
924psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
925 psa_key_slot_t key,
926 psa_algorithm_t alg);
927
928psa_status_t psa_aead_generate_iv(psa_aead_operation_t *operation,
929 unsigned char *iv,
930 size_t iv_size,
931 size_t *iv_length);
932
933psa_status_t psa_aead_set_iv(psa_aead_operation_t *operation,
934 const unsigned char *iv,
935 size_t iv_length);
936
937psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
938 const uint8_t *input,
939 size_t input_length);
940
941psa_status_t psa_aead_update(psa_aead_operation_t *operation,
942 const uint8_t *input,
943 size_t input_length);
944
945psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
946 uint8_t *tag,
947 size_t tag_size,
948 size_t *tag_length);
949
950psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
951 uint8_t *tag,
952 size_t tag_length);
953
954psa_status_t psa_aead_abort(psa_aead_operation_t *operation);
955
956/**@}*/
957
Gilles Peskine20035e32018-02-03 22:44:14 +0100958/** \defgroup asymmetric Asymmetric cryptography
959 * @{
960 */
961
962/**
Gilles Peskine0189e752018-02-03 23:57:22 +0100963 * \brief Maximum ECDSA signature size for a given curve bit size
964 *
965 * \param curve_bits Curve size in bits
966 * \return Maximum signature size in bytes
967 *
968 * \note This macro returns a compile-time constant if its argument is one.
969 *
970 * \warning This macro may evaluate its argument multiple times.
971 */
972/*
973 * RFC 4492 page 20:
974 *
975 * Ecdsa-Sig-Value ::= SEQUENCE {
976 * r INTEGER,
977 * s INTEGER
978 * }
979 *
980 * Size is at most
981 * 1 (tag) + 1 (len) + 1 (initial 0) + curve_bytes for each of r and s,
982 * twice that + 1 (tag) + 2 (len) for the sequence
983 * (assuming curve_bytes is less than 126 for r and s,
984 * and less than 124 (total len <= 255) for the sequence)
985 */
986#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
987 ( /*T,L of SEQUENCE*/ ((curve_bits) >= 61 * 8 ? 3 : 2) + \
988 /*T,L of r,s*/ 2 * (((curve_bits) >= 127 * 8 ? 3 : 2) + \
989 /*V of r,s*/ ((curve_bits) + 8) / 8))
990
991
Gilles Peskine308b91d2018-02-08 09:47:44 +0100992/** Safe signature buffer size for psa_asymmetric_sign().
993 *
994 * This macro returns a safe buffer size for a signature using a key
995 * of the specified type and size, with the specified algorithm.
996 * Note that the actual size of the signature may be smaller
997 * (some algorithms produce a variable-size signature).
998 *
999 * \warning This function may call its arguments multiple times or
1000 * zero times, so you should not pass arguments that contain
1001 * side effects.
1002 *
1003 * \param key_type An asymmetric key type (this may indifferently be a
1004 * key pair type or a public key type).
1005 * \param key_bits The size of the key in bits.
1006 * \param alg The signature algorithm.
1007 *
1008 * \return If the parameters are valid and supported, return
1009 * a buffer size in bytes that guarantees that
1010 * psa_asymmetric_sign() will not fail with
1011 * #PSA_ERROR_BUFFER_TOO_SMALL.
1012 * If the parameters are a valid combination that is not supported
1013 * by the implementation, this macro either shall return either a
1014 * sensible size or 0.
1015 * If the parameters are not valid, the
1016 * return value is unspecified.
1017 *
1018 */
Gilles Peskine0189e752018-02-03 23:57:22 +01001019#define PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
1020 (PSA_KEY_TYPE_IS_RSA(key_type) ? ((void)alg, BITS_TO_BYTES(key_bits)) : \
1021 PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \
1022 0)
1023
1024/**
Gilles Peskine20035e32018-02-03 22:44:14 +01001025 * \brief Sign a hash or short message with a private key.
1026 *
Gilles Peskine308b91d2018-02-08 09:47:44 +01001027 * \param key Key slot containing an asymmetric key pair.
1028 * \param alg A signature algorithm that is compatible with
1029 * the type of \c key.
1030 * \param hash The message to sign.
1031 * \param hash_length Size of the \c hash buffer in bytes.
1032 * \param salt A salt or label, if supported by the signature
1033 * algorithm.
1034 * If the signature algorithm does not support a
1035 * salt, pass \c NULL.
1036 * If the signature algorithm supports an optional
1037 * salt and you do not want to pass a salt,
1038 * pass \c NULL.
1039 * \param salt_length Size of the \c salt buffer in bytes.
1040 * If \c salt is \c NULL, pass 0.
1041 * \param signature Buffer where the signature is to be written.
1042 * \param signature_size Size of the \c signature buffer in bytes.
1043 * \param signature_length On success, the number of bytes
1044 * that make up the returned signature value.
1045 * This is at most #PSA_HASH_FINAL_SIZE(alg)
1046 * (note that it may be less).
1047 *
1048 * \retval PSA_SUCCESS
1049 * \retval PSA_ERROR_BUFFER_TOO_SMALL
1050 * The size of the \c signature buffer is too small. You can
1051 * determine a sufficient buffer size by calling
1052 * #PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(key_type, key_bits, alg)
1053 * where \c key_type and \c key_bits are the type and bit-size
1054 * respectively of \c key.
1055 * \retval PSA_ERROR_NOT_SUPPORTED
1056 * \retval PSA_ERROR_INVALID_ARGUMENT
1057 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
1058 * \retval PSA_ERROR_COMMUNICATION_FAILURE
1059 * \retval PSA_ERROR_HARDWARE_FAILURE
1060 * \retval PSA_ERROR_TAMPERING_DETECTED
1061 * \retval PSA_ERROR_INSUFFICIENT_ENTROPY
Gilles Peskine20035e32018-02-03 22:44:14 +01001062 */
1063psa_status_t psa_asymmetric_sign(psa_key_slot_t key,
1064 psa_algorithm_t alg,
1065 const uint8_t *hash,
1066 size_t hash_length,
1067 const uint8_t *salt,
1068 size_t salt_length,
1069 uint8_t *signature,
1070 size_t signature_size,
1071 size_t *signature_length);
1072
1073/**
1074 * \brief Verify the signature a hash or short message using a public key.
1075 *
Gilles Peskine308b91d2018-02-08 09:47:44 +01001076 * \param key Key slot containing a public key or an
1077 * asymmetric key pair.
1078 * \param alg A signature algorithm that is compatible with
1079 * the type of \c key.
1080 * \param hash The message whose signature is to be verified.
1081 * \param hash_length Size of the \c hash buffer in bytes.
1082 * \param salt A salt or label, if supported by the signature
1083 * algorithm.
1084 * If the signature algorithm does not support a
1085 * salt, pass \c NULL.
1086 * If the signature algorithm supports an optional
1087 * salt and you do not want to pass a salt,
1088 * pass \c NULL.
1089 * \param salt_length Size of the \c salt buffer in bytes.
1090 * If \c salt is \c NULL, pass 0.
1091 * \param signature Buffer containing the signature to verify.
1092 * \param signature_size Size of the \c signature buffer in bytes.
1093 *
1094 * \retval PSA_SUCCESS
1095 * The signature is valid.
1096 * \retval PSA_ERROR_INVALID_SIGNATURE
1097 * The calculation was perfomed successfully, but the passed
1098 * signature is not a valid signature.
1099 * \retval PSA_ERROR_NOT_SUPPORTED
1100 * \retval PSA_ERROR_INVALID_ARGUMENT
1101 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
1102 * \retval PSA_ERROR_COMMUNICATION_FAILURE
1103 * \retval PSA_ERROR_HARDWARE_FAILURE
1104 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine20035e32018-02-03 22:44:14 +01001105 */
1106psa_status_t psa_asymmetric_verify(psa_key_slot_t key,
1107 psa_algorithm_t alg,
1108 const uint8_t *hash,
1109 size_t hash_length,
1110 const uint8_t *salt,
1111 size_t salt_length,
1112 uint8_t *signature,
1113 size_t signature_size);
1114
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001115/**@}*/
1116
Gilles Peskinee59236f2018-01-27 23:32:46 +01001117#ifdef __cplusplus
1118}
1119#endif
1120
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001121/* The file "crypto_struct.h" contains definitions for
1122 * implementation-specific structs that are declared above. */
1123#include "crypto_struct.h"
1124
1125/* The file "crypto_extra.h" contains vendor-specific definitions. This
1126 * can include vendor-defined algorithms, extra functions, etc. */
Gilles Peskinee59236f2018-01-27 23:32:46 +01001127#include "crypto_extra.h"
1128
1129#endif /* PSA_CRYPTO_H */