blob: 493f5efbad063445034c5cd5b159a03228946bc1 [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
Gilles Peskine92b30732018-03-03 21:29:30 +0100363 * of the same key if the format permits it.
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100364 *
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.
Gilles Peskine92b30732018-03-03 21:29:30 +0100373 * - For RSA key pairs (#PSA_KEY_TYPE_RSA_KEYPAIR), the format
Gilles Peskine308b91d2018-02-08 09:47:44 +0100374 * 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
Gilles Peskine92b30732018-03-03 21:29:30 +0100388 * \retval PSA_ERROR_NOT_PERMITTED
Gilles Peskine308b91d2018-02-08 09:47:44 +0100389 * \retval PSA_ERROR_COMMUNICATION_FAILURE
390 * \retval PSA_ERROR_HARDWARE_FAILURE
391 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +0100392 */
393psa_status_t psa_export_key(psa_key_slot_t key,
394 uint8_t *data,
395 size_t data_size,
396 size_t *data_length);
397
Gilles Peskine7698bcf2018-03-03 21:30:44 +0100398/**
399 * \brief Export a public key or the public part of a key pair in binary format.
400 *
401 * The output of this function can be passed to psa_import_key() to
402 * create an object that is equivalent to the public key.
403 *
404 * For standard key types, the output format is as follows:
405 *
406 * - For RSA keys (#PSA_KEY_TYPE_RSA_KEYPAIR or #PSA_KEY_TYPE_RSA_PUBLIC_KEY),
407 * the format is the DER representation defined by X.509.
408 *
409 * \param key Slot whose content is to be exported. This must
410 * be an occupied key slot.
411 * \param data Buffer where the key data is to be written.
412 * \param data_size Size of the \c data buffer in bytes.
413 * \param data_length On success, the number of bytes
414 * that make up the key data.
415 *
416 * \retval PSA_SUCCESS
417 * \retval PSA_ERROR_EMPTY_SLOT
418 * \retval PSA_ERROR_INVALID_ARGUMENT
419 * \retval PSA_ERROR_COMMUNICATION_FAILURE
420 * \retval PSA_ERROR_HARDWARE_FAILURE
421 * \retval PSA_ERROR_TAMPERING_DETECTED
422 */
423psa_status_t psa_export_public_key(psa_key_slot_t key,
424 uint8_t *data,
425 size_t data_size,
426 size_t *data_length);
427
428/**@}*/
429
430/** \defgroup policy Key policies
431 * @{
432 */
433
434/** \brief Encoding of permitted usage on a key. */
435typedef uint32_t psa_key_usage_t;
436
437#define PSA_KEY_USAGE_EXPORT ((psa_key_usage_t)0x00000001)
438
439#define PSA_KEY_USAGE_ENCRYPT ((psa_key_usage_t)0x00000100)
440#define PSA_KEY_USAGE_DECRYPT ((psa_key_usage_t)0x00000200)
441#define PSA_KEY_USAGE_SIGN ((psa_key_usage_t)0x00000400)
442#define PSA_KEY_USAGE_VERIFY ((psa_key_usage_t)0x00000800)
443
444/** The type of the key policy data structure.
445 *
446 * This is an implementation-defined \c struct. Applications should not
447 * make any assumptions about the content of this structure except
448 * as directed by the documentation of a specific implementation. */
449typedef struct psa_key_policy_s psa_key_policy_t;
450
451/** \brief Initialize a key policy structure to a default that forbids all
452 * usage of the key. */
453void psa_key_policy_init(psa_key_policy_t *policy);
454
455void psa_key_policy_set_usage(psa_key_policy_t *policy,
456 psa_key_usage_t usage,
457 psa_algorithm_t alg);
458
459psa_key_usage_t psa_key_policy_get_usage(psa_key_policy_t *policy);
460
461psa_algorithm_t psa_key_policy_get_algorithm(psa_key_policy_t *policy);
462
463/** \brief Set the usage policy on a key slot.
464 *
465 * This function must be called on an empty key slot, before importing,
466 * generating or creating a key in the slot. Changing the policy of an
467 * existing key is not permitted.
468 */
469psa_status_t psa_set_key_policy(psa_key_slot_t key,
470 const psa_key_policy_t *policy);
471
472psa_status_t psa_get_key_policy(psa_key_slot_t key,
473 psa_key_policy_t *policy);
Gilles Peskine20035e32018-02-03 22:44:14 +0100474
475/**@}*/
476
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100477/** \defgroup hash Message digests
478 * @{
479 */
480
Gilles Peskine308b91d2018-02-08 09:47:44 +0100481/** The type of the state data structure for multipart hash operations.
482 *
Gilles Peskine92b30732018-03-03 21:29:30 +0100483 * This is an implementation-defined \c struct. Applications should not
Gilles Peskine308b91d2018-02-08 09:47:44 +0100484 * make any assumptions about the content of this structure except
485 * as directed by the documentation of a specific implementation. */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100486typedef struct psa_hash_operation_s psa_hash_operation_t;
487
Gilles Peskine308b91d2018-02-08 09:47:44 +0100488/** The size of the output of psa_hash_finish(), in bytes.
489 *
490 * This is also the hash size that psa_hash_verify() expects.
491 *
492 * \param alg A hash algorithm (\c PSA_ALG_XXX value such that
493 * #PSA_ALG_IS_HASH(alg) is true).
494 *
495 * \return The hash size for the specified hash algorithm.
496 * If the hash algorithm is not recognized, return 0.
497 * An implementation may return either 0 or the correct size
498 * for a hash algorithm that it recognizes, but does not support.
499 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100500#define PSA_HASH_FINAL_SIZE(alg) \
501 ( \
502 (alg) == PSA_ALG_MD2 ? 16 : \
503 (alg) == PSA_ALG_MD4 ? 16 : \
504 (alg) == PSA_ALG_MD5 ? 16 : \
505 (alg) == PSA_ALG_SHA_256_128 ? 16 : \
506 (alg) == PSA_ALG_RIPEMD160 ? 20 : \
507 (alg) == PSA_ALG_SHA_1 ? 20 : \
508 (alg) == PSA_ALG_SHA_256_160 ? 20 : \
509 (alg) == PSA_ALG_SHA_224 ? 28 : \
510 (alg) == PSA_ALG_SHA_256 ? 32 : \
511 (alg) == PSA_ALG_SHA_384 ? 48 : \
512 (alg) == PSA_ALG_SHA_512 ? 64 : \
513 (alg) == PSA_ALG_SHA_512_224 ? 28 : \
514 (alg) == PSA_ALG_SHA_512_256 ? 32 : \
515 (alg) == PSA_ALG_SHA3_224 ? 28 : \
516 (alg) == PSA_ALG_SHA3_256 ? 32 : \
517 (alg) == PSA_ALG_SHA3_384 ? 48 : \
518 (alg) == PSA_ALG_SHA3_512 ? 64 : \
519 0)
520
Gilles Peskine308b91d2018-02-08 09:47:44 +0100521/** Start a multipart hash operation.
522 *
523 * The sequence of operations to calculate a hash (message digest)
524 * is as follows:
525 * -# Allocate an operation object which will be passed to all the functions
526 * listed here.
527 * -# Call psa_hash_start() to specify the algorithm.
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100528 * -# Call psa_hash_update() zero, one or more times, passing a fragment
Gilles Peskine308b91d2018-02-08 09:47:44 +0100529 * of the message each time. The hash that is calculated is the hash
530 * of the concatenation of these messages in order.
531 * -# To calculate the hash, call psa_hash_finish().
532 * To compare the hash with an expected value, call psa_hash_verify().
533 *
534 * The application may call psa_hash_abort() at any time after the operation
535 * has been initialized with psa_hash_start().
536 *
537 * After a successful call to psa_hash_start(), the application must
538 * eventually destroy the operation through one of the following means:
539 * - A failed call to psa_hash_update().
540 * - A call to psa_hash_final(), psa_hash_verify() or psa_hash_abort().
541 *
542 * \param operation
543 * \param alg The hash algorithm to compute (\c PSA_ALG_XXX value
544 * such that #PSA_ALG_IS_HASH(alg) is true).
545 *
546 * \retval PSA_SUCCESS
547 * Success.
548 * \retval PSA_ERROR_NOT_SUPPORTED
549 * \c alg is not supported or is not a hash algorithm.
550 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
551 * \retval PSA_ERROR_COMMUNICATION_FAILURE
552 * \retval PSA_ERROR_HARDWARE_FAILURE
553 * \retval PSA_ERROR_TAMPERING_DETECTED
554 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100555psa_status_t psa_hash_start(psa_hash_operation_t *operation,
556 psa_algorithm_t alg);
557
Gilles Peskine308b91d2018-02-08 09:47:44 +0100558/** Add a message fragment to a multipart hash operation.
559 *
560 * The application must call psa_hash_start() before calling this function.
561 *
562 * If this function returns an error status, the operation becomes inactive.
563 *
564 * \param operation Active hash operation.
565 * \param input Buffer containing the message fragment to hash.
566 * \param input_length Size of the \c input buffer in bytes.
567 *
568 * \retval PSA_SUCCESS
569 * Success.
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_update(psa_hash_operation_t *operation,
578 const uint8_t *input,
579 size_t input_length);
580
Gilles Peskine308b91d2018-02-08 09:47:44 +0100581/** Finish the calculation of the hash of a message.
582 *
583 * The application must call psa_hash_start() before calling this function.
584 * This function calculates the hash of the message formed by concatenating
585 * the inputs passed to preceding calls to psa_hash_update().
586 *
587 * When this function returns, the operation becomes inactive.
588 *
589 * \warning Applications should not call this function if they expect
590 * a specific value for the hash. Call psa_hash_verify() instead.
591 * Beware that comparing integrity or authenticity data such as
592 * hash values with a function such as \c memcmp is risky
593 * because the time taken by the comparison may leak information
594 * about the hashed data which could allow an attacker to guess
595 * a valid hash and thereby bypass security controls.
596 *
597 * \param operation Active hash operation.
598 * \param hash Buffer where the hash is to be written.
599 * \param hash_size Size of the \c hash buffer in bytes.
600 * \param hash_length On success, the number of bytes
601 * that make up the hash value. This is always
602 * #PSA_HASH_FINAL_SIZE(alg) where \c alg is the
603 * hash algorithm that is calculated.
604 *
605 * \retval PSA_SUCCESS
606 * Success.
607 * \retval PSA_ERROR_BAD_STATE
608 * The operation state is not valid (not started, or already completed).
609 * \retval PSA_ERROR_BUFFER_TOO_SMALL
610 * The size of the \c hash buffer is too small. You can determine a
611 * sufficient buffer size by calling #PSA_HASH_FINAL_SIZE(alg)
612 * where \c alg is the hash algorithm that is calculated.
613 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
614 * \retval PSA_ERROR_COMMUNICATION_FAILURE
615 * \retval PSA_ERROR_HARDWARE_FAILURE
616 * \retval PSA_ERROR_TAMPERING_DETECTED
617 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100618psa_status_t psa_hash_finish(psa_hash_operation_t *operation,
619 uint8_t *hash,
620 size_t hash_size,
621 size_t *hash_length);
622
Gilles Peskine308b91d2018-02-08 09:47:44 +0100623/** Finish the calculation of the hash of a message and compare it with
624 * an expected value.
625 *
626 * The application must call psa_hash_start() before calling this function.
627 * This function calculates the hash of the message formed by concatenating
628 * the inputs passed to preceding calls to psa_hash_update(). It then
629 * compares the calculated hash with the expected hash passed as a
630 * parameter to this function.
631 *
632 * When this function returns, the operation becomes inactive.
633 *
634 * \note Applications shall make the best effort to ensure that the
635 * comparison between the actual hash and the expected hash is performed
636 * in constant time.
637 *
638 * \param operation Active hash operation.
639 * \param hash Buffer containing the expected hash value.
640 * \param hash_length Size of the \c hash buffer in bytes.
641 *
642 * \retval PSA_SUCCESS
643 * The expected hash is identical to the actual hash of the message.
644 * \retval PSA_ERROR_INVALID_SIGNATURE
645 * The hash of the message was calculated successfully, but it
646 * differs from the expected hash.
647 * \retval PSA_ERROR_BAD_STATE
648 * The operation state is not valid (not started, or already completed).
649 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
650 * \retval PSA_ERROR_COMMUNICATION_FAILURE
651 * \retval PSA_ERROR_HARDWARE_FAILURE
652 * \retval PSA_ERROR_TAMPERING_DETECTED
653 */
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100654psa_status_t psa_hash_verify(psa_hash_operation_t *operation,
655 const uint8_t *hash,
656 size_t hash_length);
657
Gilles Peskine308b91d2018-02-08 09:47:44 +0100658/** Abort a hash operation.
659 *
660 * This function may be called at any time after psa_hash_start().
661 * Aborting an operation frees all associated resources except for the
662 * \c operation structure itself.
663 *
664 * Implementation should strive to be robust and handle inactive hash
665 * operations safely (do nothing and return #PSA_ERROR_BAD_STATE). However,
666 * application writers should beware that uninitialized memory may happen
667 * to be indistinguishable from an active hash operation, and the behavior
668 * of psa_hash_abort() is undefined in this case.
669 *
670 * \param operation Active hash operation.
671 *
672 * \retval PSA_SUCCESS
673 * \retval PSA_ERROR_BAD_STATE
674 * \c operation is not an active hash operation.
675 * \retval PSA_ERROR_COMMUNICATION_FAILURE
676 * \retval PSA_ERROR_HARDWARE_FAILURE
677 * \retval PSA_ERROR_TAMPERING_DETECTED
678 */
679psa_status_t psa_hash_abort(psa_hash_operation_t *operation);
Gilles Peskine9ef733f2018-02-07 21:05:37 +0100680
681/**@}*/
682
Gilles Peskine8c9def32018-02-08 10:02:12 +0100683/** \defgroup MAC Message authentication codes
684 * @{
685 */
686
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100687/** The type of the state data structure for multipart MAC operations.
688 *
Gilles Peskine92b30732018-03-03 21:29:30 +0100689 * This is an implementation-defined \c struct. Applications should not
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100690 * make any assumptions about the content of this structure except
691 * as directed by the documentation of a specific implementation. */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100692typedef struct psa_mac_operation_s psa_mac_operation_t;
693
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100694/** The size of the output of psa_mac_finish(), in bytes.
695 *
696 * This is also the MAC size that psa_mac_verify() expects.
697 *
698 * \param alg A MAC algorithm (\c PSA_ALG_XXX value such that
699 * #PSA_ALG_IS_MAC(alg) is true).
700 *
701 * \return The MAC size for the specified algorithm.
702 * If the MAC algorithm is not recognized, return 0.
703 * An implementation may return either 0 or the correct size
704 * for a MAC algorithm that it recognizes, but does not support.
705 */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100706#define PSA_MAC_FINAL_SIZE(key_type, key_bits, alg) \
707 (PSA_ALG_IS_HMAC(alg) ? PSA_HASH_FINAL_SIZE(PSA_ALG_HMAC_HASH(alg)) : \
708 PSA_ALG_IS_BLOCK_CIPHER_MAC(alg) ? PSA_BLOCK_CIPHER_BLOCK_SIZE(key_type) : \
709 0)
710
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100711/** Start a multipart MAC operation.
712 *
713 * The sequence of operations to calculate a MAC (message authentication code)
714 * is as follows:
715 * -# Allocate an operation object which will be passed to all the functions
716 * listed here.
717 * -# Call psa_mac_start() to specify the algorithm and key.
718 * The key remains associated with the operation even if the content
719 * of the key slot changes.
720 * -# Call psa_mac_update() zero, one or more times, passing a fragment
721 * of the message each time. The MAC that is calculated is the MAC
722 * of the concatenation of these messages in order.
723 * -# To calculate the MAC, call psa_mac_finish().
724 * To compare the MAC with an expected value, call psa_mac_verify().
725 *
726 * The application may call psa_mac_abort() at any time after the operation
727 * has been initialized with psa_mac_start().
728 *
729 * After a successful call to psa_mac_start(), the application must
730 * eventually destroy the operation through one of the following means:
731 * - A failed call to psa_mac_update().
732 * - A call to psa_mac_final(), psa_mac_verify() or psa_mac_abort().
733 *
734 * \param operation
735 * \param alg The MAC algorithm to compute (\c PSA_ALG_XXX value
736 * such that #PSA_ALG_IS_MAC(alg) is true).
737 *
738 * \retval PSA_SUCCESS
739 * Success.
740 * \retval PSA_ERROR_EMPTY_SLOT
Gilles Peskine92b30732018-03-03 21:29:30 +0100741 * \retval PSA_ERROR_NOT_PERMITTED
Gilles Peskine7e4acc52018-02-16 21:24:11 +0100742 * \retval PSA_ERROR_INVALID_ARGUMENT
743 * \c key is not compatible with \c alg.
744 * \retval PSA_ERROR_NOT_SUPPORTED
745 * \c alg is not supported or is not a MAC algorithm.
746 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
747 * \retval PSA_ERROR_COMMUNICATION_FAILURE
748 * \retval PSA_ERROR_HARDWARE_FAILURE
749 * \retval PSA_ERROR_TAMPERING_DETECTED
750 */
Gilles Peskine8c9def32018-02-08 10:02:12 +0100751psa_status_t psa_mac_start(psa_mac_operation_t *operation,
752 psa_key_slot_t key,
753 psa_algorithm_t alg);
754
755psa_status_t psa_mac_update(psa_mac_operation_t *operation,
756 const uint8_t *input,
757 size_t input_length);
758
759psa_status_t psa_mac_finish(psa_mac_operation_t *operation,
760 uint8_t *mac,
761 size_t mac_size,
762 size_t *mac_length);
763
764psa_status_t psa_mac_verify(psa_mac_operation_t *operation,
765 const uint8_t *mac,
766 size_t mac_length);
767
768psa_status_t psa_mac_abort(psa_mac_operation_t *operation);
769
770/**@}*/
771
Gilles Peskine428dc5a2018-03-03 21:27:18 +0100772/** \defgroup cipher Symmetric ciphers
773 * @{
774 */
775
776/** The type of the state data structure for multipart cipher operations.
777 *
778 * This is an implementation-defined \c struct. Applications should not
779 * make any assumptions about the content of this structure except
780 * as directed by the documentation of a specific implementation. */
781typedef struct psa_cipher_operation_s psa_cipher_operation_t;
782
783/** Set the key for a multipart symmetric encryption operation.
784 *
785 * The sequence of operations to encrypt a message with a symmetric cipher
786 * is as follows:
787 * -# Allocate an operation object which will be passed to all the functions
788 * listed here.
789 * -# Call psa_encrypt_setup() to specify the algorithm and key.
790 * The key remains associated with the operation even if the content
791 * of the key slot changes.
792 * -# Call either psa_encrypt_generate_iv() or psa_encrypt_set_iv() to
793 * generate or set the IV (initialization vector). You should use
794 * psa_encrypt_generate_iv() unless the protocol you are implementing
795 * requires a specific IV value.
796 * -# Call psa_cipher_update() zero, one or more times, passing a fragment
797 * of the message each time.
798 * -# Call psa_cipher_finish().
799 *
800 * The application may call psa_cipher_abort() at any time after the operation
801 * has been initialized with psa_encrypt_setup().
802 *
803 * After a successful call to psa_encrypt_setup(), the application must
804 * eventually destroy the operation through one of the following means:
805 * - A failed call to psa_encrypt_generate_iv(), psa_encrypt_set_iv()
806 * or psa_cipher_update().
807 * - A call to psa_cipher_final() or psa_cipher_abort().
808 *
809 * \param operation
810 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
811 * such that #PSA_ALG_IS_CIPHER(alg) is true).
812 *
813 * \retval PSA_SUCCESS
814 * Success.
815 * \retval PSA_ERROR_EMPTY_SLOT
816 * \retval PSA_ERROR_NOT_PERMITTED
817 * \retval PSA_ERROR_INVALID_ARGUMENT
818 * \c key is not compatible with \c alg.
819 * \retval PSA_ERROR_NOT_SUPPORTED
820 * \c alg is not supported or is not a cipher algorithm.
821 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
822 * \retval PSA_ERROR_COMMUNICATION_FAILURE
823 * \retval PSA_ERROR_HARDWARE_FAILURE
824 * \retval PSA_ERROR_TAMPERING_DETECTED
825 */
826psa_status_t psa_encrypt_setup(psa_cipher_operation_t *operation,
827 psa_key_slot_t key,
828 psa_algorithm_t alg);
829
830/** Set the key for a multipart symmetric decryption operation.
831 *
832 * The sequence of operations to decrypt a message with a symmetric cipher
833 * is as follows:
834 * -# Allocate an operation object which will be passed to all the functions
835 * listed here.
836 * -# Call psa_decrypt_setup() to specify the algorithm and key.
837 * The key remains associated with the operation even if the content
838 * of the key slot changes.
839 * -# Call psa_cipher_update() with the IV (initialization vector) for the
840 * decryption. If the IV is prepended to the ciphertext, you can call
841 * psa_cipher_update() on a buffer containing the IV followed by the
842 * beginning of the message.
843 * -# Call psa_cipher_update() zero, one or more times, passing a fragment
844 * of the message each time.
845 * -# Call psa_cipher_finish().
846 *
847 * The application may call psa_cipher_abort() at any time after the operation
848 * has been initialized with psa_encrypt_setup().
849 *
850 * After a successful call to psa_decrypt_setup(), the application must
851 * eventually destroy the operation through one of the following means:
852 * - A failed call to psa_cipher_update().
853 * - A call to psa_cipher_final() or psa_cipher_abort().
854 *
855 * \param operation
856 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
857 * such that #PSA_ALG_IS_CIPHER(alg) is true).
858 *
859 * \retval PSA_SUCCESS
860 * Success.
861 * \retval PSA_ERROR_EMPTY_SLOT
862 * \retval PSA_ERROR_NOT_PERMITTED
863 * \retval PSA_ERROR_INVALID_ARGUMENT
864 * \c key is not compatible with \c alg.
865 * \retval PSA_ERROR_NOT_SUPPORTED
866 * \c alg is not supported or is not a cipher algorithm.
867 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
868 * \retval PSA_ERROR_COMMUNICATION_FAILURE
869 * \retval PSA_ERROR_HARDWARE_FAILURE
870 * \retval PSA_ERROR_TAMPERING_DETECTED
871 */
872psa_status_t psa_decrypt_setup(psa_cipher_operation_t *operation,
873 psa_key_slot_t key,
874 psa_algorithm_t alg);
875
876psa_status_t psa_encrypt_generate_iv(psa_cipher_operation_t *operation,
877 unsigned char *iv,
878 size_t iv_size,
879 size_t *iv_length);
880
881psa_status_t psa_encrypt_set_iv(psa_cipher_operation_t *operation,
882 const unsigned char *iv,
883 size_t iv_length);
884
885psa_status_t psa_cipher_update(psa_cipher_operation_t *operation,
886 const uint8_t *input,
887 size_t input_length);
888
889psa_status_t psa_cipher_finish(psa_cipher_operation_t *operation,
890 uint8_t *mac,
891 size_t mac_size,
892 size_t *mac_length);
893
894psa_status_t psa_cipher_abort(psa_cipher_operation_t *operation);
895
896/**@}*/
897
Gilles Peskine3b555712018-03-03 21:27:57 +0100898/** \defgroup aead Authenticated encryption with associated data (AEAD)
899 * @{
900 */
901
902/** The type of the state data structure for multipart AEAD operations.
903 *
904 * This is an implementation-defined \c struct. Applications should not
905 * make any assumptions about the content of this structure except
906 * as directed by the documentation of a specific implementation. */
907typedef struct psa_aead_operation_s psa_aead_operation_t;
908
909/** Set the key for a multipart authenticated encryption operation.
910 *
911 * The sequence of operations to authenticate-and-encrypt a message
912 * is as follows:
913 * -# Allocate an operation object which will be passed to all the functions
914 * listed here.
915 * -# Call psa_aead_encrypt_setup() to specify the algorithm and key.
916 * The key remains associated with the operation even if the content
917 * of the key slot changes.
918 * -# Call either psa_aead_generate_iv() or psa_aead_set_iv() to
919 * generate or set the IV (initialization vector). You should use
920 * psa_encrypt_generate_iv() unless the protocol you are implementing
921 * requires a specific IV value.
922 * -# Call psa_aead_update_ad() to pass the associated data that is
923 * to be authenticated but not encrypted. You may omit this step if
924 * there is no associated data.
925 * -# Call psa_aead_update() zero, one or more times, passing a fragment
926 * of the data to encrypt each time.
927 * -# Call psa_aead_finish().
928 *
929 * The application may call psa_aead_abort() at any time after the operation
930 * has been initialized with psa_aead_encrypt_setup().
931 *
932 * After a successful call to psa_aead_setup(), the application must
933 * eventually destroy the operation through one of the following means:
934 * - A failed call to psa_aead_generate_iv(), psa_aead_set_iv(),
935 * psa_aead_update_ad() or psa_aead_update().
936 * - A call to psa_aead_final() or psa_aead_abort().
937 *
938 * \param operation
939 * \param alg The AEAD algorithm to compute (\c PSA_ALG_XXX value
940 * such that #PSA_ALG_IS_AEAD(alg) is true).
941 *
942 * \retval PSA_SUCCESS
943 * Success.
944 * \retval PSA_ERROR_EMPTY_SLOT
945 * \retval PSA_ERROR_NOT_PERMITTED
946 * \retval PSA_ERROR_INVALID_ARGUMENT
947 * \c key is not compatible with \c alg.
948 * \retval PSA_ERROR_NOT_SUPPORTED
949 * \c alg is not supported or is not an AEAD algorithm.
950 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
951 * \retval PSA_ERROR_COMMUNICATION_FAILURE
952 * \retval PSA_ERROR_HARDWARE_FAILURE
953 * \retval PSA_ERROR_TAMPERING_DETECTED
954 */
955psa_status_t psa_aead_encrypt_setup(psa_aead_operation_t *operation,
956 psa_key_slot_t key,
957 psa_algorithm_t alg);
958
959/** Set the key for a multipart authenticated decryption operation.
960 *
961 * The sequence of operations to authenticated and decrypt a message
962 * is as follows:
963 * -# Allocate an operation object which will be passed to all the functions
964 * listed here.
965 * -# Call psa_aead_decrypt_setup() to specify the algorithm and key.
966 * The key remains associated with the operation even if the content
967 * of the key slot changes.
968 * -# Call psa_aead_set_iv() to pass the initialization vector (IV)
969 * for the authenticated decryption.
970 * -# Call psa_aead_update_ad() to pass the associated data that is
971 * to be authenticated but not encrypted. You may omit this step if
972 * there is no associated data.
973 * -# Call psa_aead_update() zero, one or more times, passing a fragment
974 * of the data to decrypt each time.
975 * -# Call psa_aead_finish().
976 *
977 * The application may call psa_aead_abort() at any time after the operation
978 * has been initialized with psa_aead_decrypt_setup().
979 *
980 * After a successful call to psa_decrypt_setup(), the application must
981 * eventually destroy the operation through one of the following means:
982 * - A failed call to psa_aead_update().
983 * - A call to psa_cipher_final() or psa_cipher_abort().
984 *
985 * \param operation
986 * \param alg The cipher algorithm to compute (\c PSA_ALG_XXX value
987 * such that #PSA_ALG_IS_CIPHER(alg) is true).
988 *
989 * \retval PSA_SUCCESS
990 * Success.
991 * \retval PSA_ERROR_EMPTY_SLOT
992 * \retval PSA_ERROR_NOT_PERMITTED
993 * \retval PSA_ERROR_INVALID_ARGUMENT
994 * \c key is not compatible with \c alg.
995 * \retval PSA_ERROR_NOT_SUPPORTED
996 * \c alg is not supported or is not a cipher algorithm.
997 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
998 * \retval PSA_ERROR_COMMUNICATION_FAILURE
999 * \retval PSA_ERROR_HARDWARE_FAILURE
1000 * \retval PSA_ERROR_TAMPERING_DETECTED
1001 */
1002psa_status_t psa_aead_decrypt_setup(psa_aead_operation_t *operation,
1003 psa_key_slot_t key,
1004 psa_algorithm_t alg);
1005
1006psa_status_t psa_aead_generate_iv(psa_aead_operation_t *operation,
1007 unsigned char *iv,
1008 size_t iv_size,
1009 size_t *iv_length);
1010
1011psa_status_t psa_aead_set_iv(psa_aead_operation_t *operation,
1012 const unsigned char *iv,
1013 size_t iv_length);
1014
1015psa_status_t psa_aead_update_ad(psa_aead_operation_t *operation,
1016 const uint8_t *input,
1017 size_t input_length);
1018
1019psa_status_t psa_aead_update(psa_aead_operation_t *operation,
1020 const uint8_t *input,
1021 size_t input_length);
1022
1023psa_status_t psa_aead_finish(psa_aead_operation_t *operation,
1024 uint8_t *tag,
1025 size_t tag_size,
1026 size_t *tag_length);
1027
1028psa_status_t psa_aead_verify(psa_aead_operation_t *operation,
1029 uint8_t *tag,
1030 size_t tag_length);
1031
1032psa_status_t psa_aead_abort(psa_aead_operation_t *operation);
1033
1034/**@}*/
1035
Gilles Peskine20035e32018-02-03 22:44:14 +01001036/** \defgroup asymmetric Asymmetric cryptography
1037 * @{
1038 */
1039
1040/**
Gilles Peskine0189e752018-02-03 23:57:22 +01001041 * \brief Maximum ECDSA signature size for a given curve bit size
1042 *
1043 * \param curve_bits Curve size in bits
1044 * \return Maximum signature size in bytes
1045 *
1046 * \note This macro returns a compile-time constant if its argument is one.
1047 *
1048 * \warning This macro may evaluate its argument multiple times.
1049 */
1050/*
1051 * RFC 4492 page 20:
1052 *
1053 * Ecdsa-Sig-Value ::= SEQUENCE {
1054 * r INTEGER,
1055 * s INTEGER
1056 * }
1057 *
1058 * Size is at most
1059 * 1 (tag) + 1 (len) + 1 (initial 0) + curve_bytes for each of r and s,
1060 * twice that + 1 (tag) + 2 (len) for the sequence
1061 * (assuming curve_bytes is less than 126 for r and s,
1062 * and less than 124 (total len <= 255) for the sequence)
1063 */
1064#define PSA_ECDSA_SIGNATURE_SIZE(curve_bits) \
1065 ( /*T,L of SEQUENCE*/ ((curve_bits) >= 61 * 8 ? 3 : 2) + \
1066 /*T,L of r,s*/ 2 * (((curve_bits) >= 127 * 8 ? 3 : 2) + \
1067 /*V of r,s*/ ((curve_bits) + 8) / 8))
1068
1069
Gilles Peskine308b91d2018-02-08 09:47:44 +01001070/** Safe signature buffer size for psa_asymmetric_sign().
1071 *
1072 * This macro returns a safe buffer size for a signature using a key
1073 * of the specified type and size, with the specified algorithm.
1074 * Note that the actual size of the signature may be smaller
1075 * (some algorithms produce a variable-size signature).
1076 *
1077 * \warning This function may call its arguments multiple times or
1078 * zero times, so you should not pass arguments that contain
1079 * side effects.
1080 *
1081 * \param key_type An asymmetric key type (this may indifferently be a
1082 * key pair type or a public key type).
1083 * \param key_bits The size of the key in bits.
1084 * \param alg The signature algorithm.
1085 *
1086 * \return If the parameters are valid and supported, return
1087 * a buffer size in bytes that guarantees that
1088 * psa_asymmetric_sign() will not fail with
1089 * #PSA_ERROR_BUFFER_TOO_SMALL.
1090 * If the parameters are a valid combination that is not supported
1091 * by the implementation, this macro either shall return either a
1092 * sensible size or 0.
1093 * If the parameters are not valid, the
1094 * return value is unspecified.
1095 *
1096 */
Gilles Peskine0189e752018-02-03 23:57:22 +01001097#define PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(key_type, key_bits, alg) \
1098 (PSA_KEY_TYPE_IS_RSA(key_type) ? ((void)alg, BITS_TO_BYTES(key_bits)) : \
1099 PSA_KEY_TYPE_IS_ECC(key_type) ? PSA_ECDSA_SIGNATURE_SIZE(key_bits) : \
1100 0)
1101
1102/**
Gilles Peskine20035e32018-02-03 22:44:14 +01001103 * \brief Sign a hash or short message with a private key.
1104 *
Gilles Peskine308b91d2018-02-08 09:47:44 +01001105 * \param key Key slot containing an asymmetric key pair.
1106 * \param alg A signature algorithm that is compatible with
1107 * the type of \c key.
1108 * \param hash The message to sign.
1109 * \param hash_length Size of the \c hash buffer in bytes.
1110 * \param salt A salt or label, if supported by the signature
1111 * algorithm.
1112 * If the signature algorithm does not support a
1113 * salt, pass \c NULL.
1114 * If the signature algorithm supports an optional
1115 * salt and you do not want to pass a salt,
1116 * pass \c NULL.
1117 * \param salt_length Size of the \c salt buffer in bytes.
1118 * If \c salt is \c NULL, pass 0.
1119 * \param signature Buffer where the signature is to be written.
1120 * \param signature_size Size of the \c signature buffer in bytes.
1121 * \param signature_length On success, the number of bytes
1122 * that make up the returned signature value.
1123 * This is at most #PSA_HASH_FINAL_SIZE(alg)
1124 * (note that it may be less).
1125 *
1126 * \retval PSA_SUCCESS
1127 * \retval PSA_ERROR_BUFFER_TOO_SMALL
1128 * The size of the \c signature buffer is too small. You can
1129 * determine a sufficient buffer size by calling
1130 * #PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(key_type, key_bits, alg)
1131 * where \c key_type and \c key_bits are the type and bit-size
1132 * respectively of \c key.
1133 * \retval PSA_ERROR_NOT_SUPPORTED
1134 * \retval PSA_ERROR_INVALID_ARGUMENT
1135 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
1136 * \retval PSA_ERROR_COMMUNICATION_FAILURE
1137 * \retval PSA_ERROR_HARDWARE_FAILURE
1138 * \retval PSA_ERROR_TAMPERING_DETECTED
1139 * \retval PSA_ERROR_INSUFFICIENT_ENTROPY
Gilles Peskine20035e32018-02-03 22:44:14 +01001140 */
1141psa_status_t psa_asymmetric_sign(psa_key_slot_t key,
1142 psa_algorithm_t alg,
1143 const uint8_t *hash,
1144 size_t hash_length,
1145 const uint8_t *salt,
1146 size_t salt_length,
1147 uint8_t *signature,
1148 size_t signature_size,
1149 size_t *signature_length);
1150
1151/**
1152 * \brief Verify the signature a hash or short message using a public key.
1153 *
Gilles Peskine308b91d2018-02-08 09:47:44 +01001154 * \param key Key slot containing a public key or an
1155 * asymmetric key pair.
1156 * \param alg A signature algorithm that is compatible with
1157 * the type of \c key.
1158 * \param hash The message whose signature is to be verified.
1159 * \param hash_length Size of the \c hash buffer in bytes.
1160 * \param salt A salt or label, if supported by the signature
1161 * algorithm.
1162 * If the signature algorithm does not support a
1163 * salt, pass \c NULL.
1164 * If the signature algorithm supports an optional
1165 * salt and you do not want to pass a salt,
1166 * pass \c NULL.
1167 * \param salt_length Size of the \c salt buffer in bytes.
1168 * If \c salt is \c NULL, pass 0.
1169 * \param signature Buffer containing the signature to verify.
1170 * \param signature_size Size of the \c signature buffer in bytes.
1171 *
1172 * \retval PSA_SUCCESS
1173 * The signature is valid.
1174 * \retval PSA_ERROR_INVALID_SIGNATURE
1175 * The calculation was perfomed successfully, but the passed
1176 * signature is not a valid signature.
1177 * \retval PSA_ERROR_NOT_SUPPORTED
1178 * \retval PSA_ERROR_INVALID_ARGUMENT
1179 * \retval PSA_ERROR_INSUFFICIENT_MEMORY
1180 * \retval PSA_ERROR_COMMUNICATION_FAILURE
1181 * \retval PSA_ERROR_HARDWARE_FAILURE
1182 * \retval PSA_ERROR_TAMPERING_DETECTED
Gilles Peskine20035e32018-02-03 22:44:14 +01001183 */
1184psa_status_t psa_asymmetric_verify(psa_key_slot_t key,
1185 psa_algorithm_t alg,
1186 const uint8_t *hash,
1187 size_t hash_length,
1188 const uint8_t *salt,
1189 size_t salt_length,
1190 uint8_t *signature,
1191 size_t signature_size);
1192
Gilles Peskine2f9c4dc2018-01-28 13:16:24 +01001193/**@}*/
1194
Gilles Peskinee59236f2018-01-27 23:32:46 +01001195#ifdef __cplusplus
1196}
1197#endif
1198
Gilles Peskine9ef733f2018-02-07 21:05:37 +01001199/* The file "crypto_struct.h" contains definitions for
1200 * implementation-specific structs that are declared above. */
1201#include "crypto_struct.h"
1202
1203/* The file "crypto_extra.h" contains vendor-specific definitions. This
1204 * can include vendor-defined algorithms, extra functions, etc. */
Gilles Peskinee59236f2018-01-27 23:32:46 +01001205#include "crypto_extra.h"
1206
1207#endif /* PSA_CRYPTO_H */