PSA Cryptography API Specification
- Introduction
- Design goals
- Functionality overview
- Sample architectures
- Library conventions
- Implementation considerations
- Usage considerations
- Implementation-specific definitions
- Library initialization
- Key attributes
psa_key_attributes_t(type)PSA_KEY_ATTRIBUTES_INIT(macro)psa_key_attributes_init(function)psa_set_key_id(function)psa_set_key_lifetime(function)psa_get_key_id(function)psa_get_key_lifetime(function)psa_set_key_usage_flags(function)psa_get_key_usage_flags(function)psa_set_key_algorithm(function)psa_get_key_algorithm(function)psa_set_key_type(function)psa_set_key_bits(function)psa_get_key_type(function)psa_get_key_bits(function)psa_get_key_attributes(function)psa_reset_key_attributes(function)
- Key management
- Key import and export
- Message digests
psa_hash_operation_t(type)PSA_HASH_OPERATION_INIT(macro)psa_hash_compute(function)psa_hash_compare(function)psa_hash_operation_init(function)psa_hash_setup(function)psa_hash_update(function)psa_hash_finish(function)psa_hash_verify(function)psa_hash_abort(function)psa_hash_clone(function)
- Message authentication codes
psa_mac_operation_t(type)PSA_MAC_OPERATION_INIT(macro)psa_mac_compute(function)psa_mac_verify(function)psa_mac_operation_init(function)psa_mac_sign_setup(function)psa_mac_verify_setup(function)psa_mac_update(function)psa_mac_sign_finish(function)psa_mac_verify_finish(function)psa_mac_abort(function)
- Symmetric ciphers
psa_cipher_operation_t(type)PSA_CIPHER_OPERATION_INIT(macro)psa_cipher_encrypt(function)psa_cipher_decrypt(function)psa_cipher_operation_init(function)psa_cipher_encrypt_setup(function)psa_cipher_decrypt_setup(function)psa_cipher_generate_iv(function)psa_cipher_set_iv(function)psa_cipher_update(function)psa_cipher_finish(function)psa_cipher_abort(function)
- Authenticated encryption with associated data (AEAD)
psa_aead_operation_t(type)PSA_AEAD_OPERATION_INIT(macro)psa_aead_encrypt(function)psa_aead_decrypt(function)psa_aead_operation_init(function)psa_aead_encrypt_setup(function)psa_aead_decrypt_setup(function)psa_aead_generate_nonce(function)psa_aead_set_nonce(function)psa_aead_set_lengths(function)psa_aead_update_ad(function)psa_aead_update(function)psa_aead_finish(function)psa_aead_verify(function)psa_aead_abort(function)
- Asymmetric cryptography
- Key derivation and pseudorandom generation
psa_key_derivation_operation_t(type)PSA_KEY_DERIVATION_OPERATION_INIT(macro)PSA_KEY_DERIVATION_UNLIMITED_CAPACITY(macro)psa_key_derivation_operation_init(function)psa_key_derivation_setup(function)psa_key_derivation_get_capacity(function)psa_key_derivation_set_capacity(function)psa_key_derivation_input_bytes(function)psa_key_derivation_input_key(function)psa_key_derivation_key_agreement(function)psa_key_derivation_output_bytes(function)psa_key_derivation_output_key(function)psa_key_derivation_abort(function)psa_raw_key_agreement(function)
- Random generation
- Error codes
psa_status_t(type)PSA_SUCCESS(macro)PSA_ERROR_GENERIC_ERROR(macro)PSA_ERROR_NOT_SUPPORTED(macro)PSA_ERROR_NOT_PERMITTED(macro)PSA_ERROR_BUFFER_TOO_SMALL(macro)PSA_ERROR_ALREADY_EXISTS(macro)PSA_ERROR_DOES_NOT_EXIST(macro)PSA_ERROR_BAD_STATE(macro)PSA_ERROR_INVALID_ARGUMENT(macro)PSA_ERROR_INSUFFICIENT_MEMORY(macro)PSA_ERROR_INSUFFICIENT_STORAGE(macro)PSA_ERROR_COMMUNICATION_FAILURE(macro)PSA_ERROR_STORAGE_FAILURE(macro)PSA_ERROR_HARDWARE_FAILURE(macro)PSA_ERROR_CORRUPTION_DETECTED(macro)PSA_ERROR_INSUFFICIENT_ENTROPY(macro)PSA_ERROR_INVALID_SIGNATURE(macro)PSA_ERROR_INVALID_PADDING(macro)PSA_ERROR_INSUFFICIENT_DATA(macro)PSA_ERROR_INVALID_HANDLE(macro)
- Key and algorithm types
psa_key_type_t(type)psa_ecc_curve_t(type)psa_dh_group_t(type)psa_algorithm_t(type)PSA_KEY_TYPE_NONE(macro)PSA_KEY_TYPE_VENDOR_FLAG(macro)PSA_KEY_TYPE_CATEGORY_MASK(macro)PSA_KEY_TYPE_CATEGORY_SYMMETRIC(macro)PSA_KEY_TYPE_CATEGORY_RAW(macro)PSA_KEY_TYPE_CATEGORY_PUBLIC_KEY(macro)PSA_KEY_TYPE_CATEGORY_KEY_PAIR(macro)PSA_KEY_TYPE_CATEGORY_FLAG_PAIR(macro)PSA_KEY_TYPE_IS_VENDOR_DEFINED(macro)PSA_KEY_TYPE_IS_UNSTRUCTURED(macro)PSA_KEY_TYPE_IS_ASYMMETRIC(macro)PSA_KEY_TYPE_IS_PUBLIC_KEY(macro)PSA_KEY_TYPE_IS_KEY_PAIR(macro)PSA_KEY_TYPE_KEY_PAIR_OF_PUBLIC_KEY(macro)PSA_KEY_TYPE_PUBLIC_KEY_OF_KEY_PAIR(macro)PSA_KEY_TYPE_RAW_DATA(macro)PSA_KEY_TYPE_HMAC(macro)PSA_KEY_TYPE_DERIVE(macro)PSA_KEY_TYPE_AES(macro)PSA_KEY_TYPE_DES(macro)PSA_KEY_TYPE_CAMELLIA(macro)PSA_KEY_TYPE_ARC4(macro)PSA_KEY_TYPE_CHACHA20(macro)PSA_KEY_TYPE_RSA_PUBLIC_KEY(macro)PSA_KEY_TYPE_RSA_KEY_PAIR(macro)PSA_KEY_TYPE_IS_RSA(macro)PSA_KEY_TYPE_ECC_PUBLIC_KEY_BASE(macro)PSA_KEY_TYPE_ECC_KEY_PAIR_BASE(macro)PSA_KEY_TYPE_ECC_CURVE_MASK(macro)PSA_KEY_TYPE_ECC_KEY_PAIR(macro)PSA_KEY_TYPE_ECC_PUBLIC_KEY(macro)PSA_KEY_TYPE_IS_ECC(macro)PSA_KEY_TYPE_IS_ECC_KEY_PAIR(macro)PSA_KEY_TYPE_IS_ECC_PUBLIC_KEY(macro)PSA_KEY_TYPE_GET_CURVE(macro)PSA_ECC_CURVE_SECT163K1(macro)PSA_ECC_CURVE_SECT163R1(macro)PSA_ECC_CURVE_SECT163R2(macro)PSA_ECC_CURVE_SECT193R1(macro)PSA_ECC_CURVE_SECT193R2(macro)PSA_ECC_CURVE_SECT233K1(macro)PSA_ECC_CURVE_SECT233R1(macro)PSA_ECC_CURVE_SECT239K1(macro)PSA_ECC_CURVE_SECT283K1(macro)PSA_ECC_CURVE_SECT283R1(macro)PSA_ECC_CURVE_SECT409K1(macro)PSA_ECC_CURVE_SECT409R1(macro)PSA_ECC_CURVE_SECT571K1(macro)PSA_ECC_CURVE_SECT571R1(macro)PSA_ECC_CURVE_SECP160K1(macro)PSA_ECC_CURVE_SECP160R1(macro)PSA_ECC_CURVE_SECP160R2(macro)PSA_ECC_CURVE_SECP192K1(macro)PSA_ECC_CURVE_SECP192R1(macro)PSA_ECC_CURVE_SECP224K1(macro)PSA_ECC_CURVE_SECP224R1(macro)PSA_ECC_CURVE_SECP256K1(macro)PSA_ECC_CURVE_SECP256R1(macro)PSA_ECC_CURVE_SECP384R1(macro)PSA_ECC_CURVE_SECP521R1(macro)PSA_ECC_CURVE_BRAINPOOL_P256R1(macro)PSA_ECC_CURVE_BRAINPOOL_P384R1(macro)PSA_ECC_CURVE_BRAINPOOL_P512R1(macro)PSA_ECC_CURVE_CURVE25519(macro)PSA_ECC_CURVE_CURVE448(macro)PSA_KEY_TYPE_DH_PUBLIC_KEY_BASE(macro)PSA_KEY_TYPE_DH_KEY_PAIR_BASE(macro)PSA_KEY_TYPE_DH_GROUP_MASK(macro)PSA_KEY_TYPE_DH_KEY_PAIR(macro)PSA_KEY_TYPE_DH_PUBLIC_KEY(macro)PSA_KEY_TYPE_IS_DH(macro)PSA_KEY_TYPE_IS_DH_KEY_PAIR(macro)PSA_KEY_TYPE_IS_DH_PUBLIC_KEY(macro)PSA_KEY_TYPE_GET_GROUP(macro)PSA_DH_GROUP_FFDHE2048(macro)PSA_DH_GROUP_FFDHE3072(macro)PSA_DH_GROUP_FFDHE4096(macro)PSA_DH_GROUP_FFDHE6144(macro)PSA_DH_GROUP_FFDHE8192(macro)PSA_BLOCK_CIPHER_BLOCK_SIZE(macro)PSA_ALG_VENDOR_FLAG(macro)PSA_ALG_CATEGORY_MASK(macro)PSA_ALG_CATEGORY_HASH(macro)PSA_ALG_CATEGORY_MAC(macro)PSA_ALG_CATEGORY_CIPHER(macro)PSA_ALG_CATEGORY_AEAD(macro)PSA_ALG_CATEGORY_SIGN(macro)PSA_ALG_CATEGORY_ASYMMETRIC_ENCRYPTION(macro)PSA_ALG_CATEGORY_KEY_DERIVATION(macro)PSA_ALG_CATEGORY_KEY_AGREEMENT(macro)PSA_ALG_IS_VENDOR_DEFINED(macro)PSA_ALG_IS_HASH(macro)PSA_ALG_IS_MAC(macro)PSA_ALG_IS_CIPHER(macro)PSA_ALG_IS_AEAD(macro)PSA_ALG_IS_SIGN(macro)PSA_ALG_IS_ASYMMETRIC_ENCRYPTION(macro)PSA_ALG_IS_KEY_AGREEMENT(macro)PSA_ALG_IS_KEY_DERIVATION(macro)PSA_ALG_HASH_MASK(macro)PSA_ALG_MD2(macro)PSA_ALG_MD4(macro)PSA_ALG_MD5(macro)PSA_ALG_RIPEMD160(macro)PSA_ALG_SHA_1(macro)PSA_ALG_SHA_224(macro)PSA_ALG_SHA_256(macro)PSA_ALG_SHA_384(macro)PSA_ALG_SHA_512(macro)PSA_ALG_SHA_512_224(macro)PSA_ALG_SHA_512_256(macro)PSA_ALG_SHA3_224(macro)PSA_ALG_SHA3_256(macro)PSA_ALG_SHA3_384(macro)PSA_ALG_SHA3_512(macro)PSA_ALG_ANY_HASH(macro)PSA_ALG_MAC_SUBCATEGORY_MASK(macro)PSA_ALG_HMAC_BASE(macro)PSA_ALG_HMAC(macro)PSA_ALG_HMAC_GET_HASH(macro)PSA_ALG_IS_HMAC(macro)PSA_ALG_MAC_TRUNCATION_MASK(macro)PSA_MAC_TRUNCATION_OFFSET(macro)PSA_ALG_TRUNCATED_MAC(macro)PSA_ALG_FULL_LENGTH_MAC(macro)PSA_MAC_TRUNCATED_LENGTH(macro)PSA_ALG_CIPHER_MAC_BASE(macro)PSA_ALG_CBC_MAC(macro)PSA_ALG_CMAC(macro)PSA_ALG_GMAC(macro)PSA_ALG_IS_BLOCK_CIPHER_MAC(macro)PSA_ALG_CIPHER_STREAM_FLAG(macro)PSA_ALG_CIPHER_FROM_BLOCK_FLAG(macro)PSA_ALG_IS_STREAM_CIPHER(macro)PSA_ALG_ARC4(macro)PSA_ALG_CHACHA20(macro)PSA_ALG_CTR(macro)PSA_ALG_CFB(macro)PSA_ALG_OFB(macro)PSA_ALG_XTS(macro)PSA_ALG_CBC_NO_PADDING(macro)PSA_ALG_CBC_PKCS7(macro)PSA_ALG_AEAD_FROM_BLOCK_FLAG(macro)PSA_ALG_IS_AEAD_ON_BLOCK_CIPHER(macro)PSA_ALG_CCM(macro)PSA_ALG_GCM(macro)PSA_ALG_CHACHA20_POLY1305(macro)PSA_ALG_AEAD_TAG_LENGTH_MASK(macro)PSA_AEAD_TAG_LENGTH_OFFSET(macro)PSA_ALG_AEAD_WITH_TAG_LENGTH(macro)PSA_ALG_AEAD_WITH_DEFAULT_TAG_LENGTH(macro)PSA__ALG_AEAD_WITH_DEFAULT_TAG_LENGTH__CASE(macro)PSA_ALG_RSA_PKCS1V15_SIGN_BASE(macro)PSA_ALG_RSA_PKCS1V15_SIGN(macro)PSA_ALG_RSA_PKCS1V15_SIGN_RAW(macro)PSA_ALG_IS_RSA_PKCS1V15_SIGN(macro)PSA_ALG_RSA_PSS_BASE(macro)PSA_ALG_RSA_PSS(macro)PSA_ALG_IS_RSA_PSS(macro)PSA_ALG_ECDSA_BASE(macro)PSA_ALG_ECDSA(macro)PSA_ALG_ECDSA_ANY(macro)PSA_ALG_DETERMINISTIC_ECDSA_BASE(macro)PSA_ALG_DETERMINISTIC_ECDSA(macro)PSA_ALG_IS_ECDSA(macro)PSA_ALG_ECDSA_IS_DETERMINISTIC(macro)PSA_ALG_IS_DETERMINISTIC_ECDSA(macro)PSA_ALG_IS_RANDOMIZED_ECDSA(macro)PSA_ALG_IS_HASH_AND_SIGN(macro)PSA_ALG_SIGN_GET_HASH(macro)PSA_ALG_RSA_PKCS1V15_CRYPT(macro)PSA_ALG_RSA_OAEP_BASE(macro)PSA_ALG_RSA_OAEP(macro)PSA_ALG_IS_RSA_OAEP(macro)PSA_ALG_RSA_OAEP_GET_HASH(macro)PSA_ALG_HKDF_BASE(macro)PSA_ALG_HKDF(macro)PSA_ALG_IS_HKDF(macro)PSA_ALG_HKDF_GET_HASH(macro)PSA_ALG_TLS12_PRF_BASE(macro)PSA_ALG_TLS12_PRF(macro)PSA_ALG_IS_TLS12_PRF(macro)PSA_ALG_TLS12_PRF_GET_HASH(macro)PSA_ALG_TLS12_PSK_TO_MS_BASE(macro)PSA_ALG_TLS12_PSK_TO_MS(macro)PSA_ALG_IS_TLS12_PSK_TO_MS(macro)PSA_ALG_TLS12_PSK_TO_MS_GET_HASH(macro)PSA_ALG_KEY_DERIVATION_MASK(macro)PSA_ALG_KEY_AGREEMENT_MASK(macro)PSA_ALG_KEY_AGREEMENT(macro)PSA_ALG_KEY_AGREEMENT_GET_KDF(macro)PSA_ALG_KEY_AGREEMENT_GET_BASE(macro)PSA_ALG_IS_RAW_KEY_AGREEMENT(macro)PSA_ALG_IS_KEY_DERIVATION_OR_AGREEMENT(macro)PSA_ALG_FFDH(macro)PSA_ALG_IS_FFDH(macro)PSA_ALG_ECDH(macro)PSA_ALG_IS_ECDH(macro)PSA_ALG_IS_WILDCARD(macro)
- Key lifetimes
- Key policies
- Key derivation
- Other definitions
PSA_BITS_TO_BYTES(macro)PSA_BYTES_TO_BITS(macro)PSA_ROUND_UP_TO_MULTIPLE(macro)PSA_HASH_SIZE(macro)PSA_HASH_MAX_SIZE(macro)PSA_HMAC_MAX_HASH_BLOCK_SIZE(macro)PSA_MAC_MAX_SIZE(macro)PSA_AEAD_TAG_LENGTH(macro)PSA_VENDOR_RSA_MAX_KEY_BITS(macro)PSA_VENDOR_ECC_MAX_CURVE_BITS(macro)PSA_ECC_CURVE_BITS(macro)PSA_ALG_TLS12_PSK_TO_MS_MAX_PSK_LEN(macro)PSA_ASYMMETRIC_SIGNATURE_MAX_SIZE(macro)PSA_MAX_BLOCK_CIPHER_BLOCK_SIZE(macro)PSA_MAC_FINAL_SIZE(macro)PSA_AEAD_ENCRYPT_OUTPUT_SIZE(macro)PSA_AEAD_DECRYPT_OUTPUT_SIZE(macro)PSA_AEAD_UPDATE_OUTPUT_SIZE(macro)PSA_AEAD_FINISH_OUTPUT_SIZE(macro)PSA_AEAD_VERIFY_OUTPUT_SIZE(macro)PSA_RSA_MINIMUM_PADDING_SIZE(macro)PSA_ECDSA_SIGNATURE_SIZE(macro)PSA_ASYMMETRIC_SIGN_OUTPUT_SIZE(macro)PSA_ASYMMETRIC_ENCRYPT_OUTPUT_SIZE(macro)PSA_ASYMMETRIC_DECRYPT_OUTPUT_SIZE(macro)PSA_KEY_EXPORT_ASN1_INTEGER_MAX_SIZE(macro)PSA_KEY_EXPORT_RSA_PUBLIC_KEY_MAX_SIZE(macro)PSA_KEY_EXPORT_RSA_KEY_PAIR_MAX_SIZE(macro)PSA_KEY_EXPORT_DSA_PUBLIC_KEY_MAX_SIZE(macro)PSA_KEY_EXPORT_DSA_KEY_PAIR_MAX_SIZE(macro)PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(macro)PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(macro)PSA_KEY_EXPORT_MAX_SIZE(macro)
Document history
| Date | Changes |
|---|---|
| 2019-01-21 | Release 1.0 beta 1 |
| 2019-02-08 |
|
| 2019-02-08 | Document formatting improvements |
| 2019-02-22 | Release 1.0 beta 2 |
| 2019-03-12 | Specify psa_generator_import_key for most key types. |
| 2019-04-09 | Change the value of error codes, and some names, to align with other PSA specifications. The name changes are:
|
| 2019-05-02 | Change the way keys are created to avoid “half-filled” handles that contained key metadata, but no key material. Now, to create a key, first fill in a data structure containing its attributes, then pass this structure to a function that both allocates resources for the key and fills in the key material. This affects the following functions:
|
| 2019-05-14 |
|
| 2019-05-16 |
|
| 2019-05-16 | Avoid the unusual terminology “generator”: call them “key derivation operations” instead. Rename a number of functions and other identifiers related to for clarity and consistency:
|
| 2019-05-16 |
|
| 2019-05-21 | Convert TLS1.2 KDF descriptions to multistep key derivation. |
| 2019-05-22 | Release 1.0 beta 3 |
Planned changes for version 1.0
Here is a summary of the changes we are currently planning to make to this specification for version 1.0.
- Add missing macros to calculate output buffer sizes, IV/nonce sizes, and maximum supported data sizes.
- Remove the definition of most macros, to give implementations free choice regarding how these macros are implemented, as long as the implementation meets the English-language specification.
- Remove certain auxiliary macros that are not directly useful to applications, but are currently used as building blocks to define other macros.
- Correct lists of documented error codes for several functions, and clarify error conditions for many functions.
- Constrain whether and when an application may have the same persistent key open multiple times.
- Constrain the permitted implementation behavior when calling a function on an operation object in a state where this function does not make sense, and when a key is destroyed while in use.
- Declare identifiers for additional cryptographic algorithms.
- Forbid zero-length keys.
- Use a standard import/export format for EC keys on Montgomery curves.
- Mandate certain checks when importing some types of asymmetric keys.
- Clarifications and improvements to the description of some API elements and to the structure of the document.