/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (c) 2019, Linaro Limited */ #ifndef __CRYPTO_CRYPTO_IMPL_H #define __CRYPTO_CRYPTO_IMPL_H #include /* * The crypto context used by the crypto_hash_*() functions is defined by * struct crypto_hash_ctx. */ struct crypto_hash_ctx { const struct crypto_hash_ops *ops; }; struct crypto_hash_ops { TEE_Result (*init)(struct crypto_hash_ctx *ctx); TEE_Result (*update)(struct crypto_hash_ctx *ctx, const uint8_t *data, size_t len); TEE_Result (*final)(struct crypto_hash_ctx *ctx, uint8_t *digest, size_t len); void (*free_ctx)(struct crypto_hash_ctx *ctx); void (*copy_state)(struct crypto_hash_ctx *dst_ctx, struct crypto_hash_ctx *src_ctx); }; #define CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(name, type) \ static inline TEE_Result \ crypto_##name##_alloc_ctx(struct crypto_##type##_ctx **ctx __unused) \ { return TEE_ERROR_NOT_IMPLEMENTED; } #if defined(CFG_CRYPTO_MD5) TEE_Result crypto_md5_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(md5, hash) #endif #if defined(CFG_CRYPTO_SHA1) TEE_Result crypto_sha1_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha1, hash) #endif #if defined(CFG_CRYPTO_SHA224) TEE_Result crypto_sha224_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha224, hash) #endif #if defined(CFG_CRYPTO_SHA256) TEE_Result crypto_sha256_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha256, hash) #endif #if defined(CFG_CRYPTO_SHA384) TEE_Result crypto_sha384_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha384, hash) #endif #if defined(CFG_CRYPTO_SHA512) TEE_Result crypto_sha512_alloc_ctx(struct crypto_hash_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(sha512, hash) #endif /* * The crypto context used by the crypto_mac_*() functions is defined by * struct crypto_mac_ctx. */ struct crypto_mac_ctx { const struct crypto_mac_ops *ops; }; struct crypto_mac_ops { TEE_Result (*init)(struct crypto_mac_ctx *ctx, const uint8_t *key, size_t len); TEE_Result (*update)(struct crypto_mac_ctx *ctx, const uint8_t *data, size_t len); TEE_Result (*final)(struct crypto_mac_ctx *ctx, uint8_t *digest, size_t len); void (*free_ctx)(struct crypto_mac_ctx *ctx); void (*copy_state)(struct crypto_mac_ctx *dst_ctx, struct crypto_mac_ctx *src_ctx); }; #if defined(CFG_CRYPTO_HMAC) TEE_Result crypto_hmac_md5_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_hmac_sha1_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_hmac_sha224_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_hmac_sha256_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_hmac_sha384_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_hmac_sha512_alloc_ctx(struct crypto_mac_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_md5, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha1, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha224, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha256, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha384, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(hmac_sha512, mac) #endif #if defined(CFG_CRYPTO_CBC_MAC) TEE_Result crypto_aes_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_aes_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_des_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_des_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_des3_cbc_mac_nopad_alloc_ctx(struct crypto_mac_ctx **ctx); TEE_Result crypto_des3_cbc_mac_pkcs5_alloc_ctx(struct crypto_mac_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc_mac_nopad, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc_mac_pkcs5, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc_mac_nopad, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc_mac_pkcs5, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc_mac_nopad, mac) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc_mac_pkcs5, mac) #endif #if defined(CFG_CRYPTO_CMAC) TEE_Result crypto_aes_cmac_alloc_ctx(struct crypto_mac_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cmac, mac) #endif /* * The crypto context used by the crypto_cipher_*() functions is defined by * struct crypto_cipher_ctx. */ struct crypto_cipher_ctx { const struct crypto_cipher_ops *ops; }; struct crypto_cipher_ops { TEE_Result (*init)(struct crypto_cipher_ctx *ctx, TEE_OperationMode mode, const uint8_t *key1, size_t key1_len, const uint8_t *key2, size_t key2_len, const uint8_t *iv, size_t iv_len); TEE_Result (*update)(struct crypto_cipher_ctx *ctx, bool last_block, const uint8_t *data, size_t len, uint8_t *dst); void (*final)(struct crypto_cipher_ctx *ctx); void (*free_ctx)(struct crypto_cipher_ctx *ctx); void (*copy_state)(struct crypto_cipher_ctx *dst_ctx, struct crypto_cipher_ctx *src_ctx); }; #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_ECB) TEE_Result crypto_aes_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_ecb, cipher) #endif #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CBC) TEE_Result crypto_aes_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cbc, cipher) #endif #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CTR) TEE_Result crypto_aes_ctr_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_ctr, cipher) #endif #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_CTS) TEE_Result crypto_aes_cts_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_cts, cipher) #endif #if defined(CFG_CRYPTO_AES) && defined(CFG_CRYPTO_XTS) TEE_Result crypto_aes_xts_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(aes_xts, cipher) #endif #if defined(CFG_CRYPTO_DES) && defined(CFG_CRYPTO_ECB) TEE_Result crypto_des_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx); TEE_Result crypto_des3_ecb_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_ecb, cipher) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_ecb, cipher) #endif #if defined(CFG_CRYPTO_DES) && defined(CFG_CRYPTO_CBC) TEE_Result crypto_des_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx); TEE_Result crypto_des3_cbc_alloc_ctx(struct crypto_cipher_ctx **ctx); #else CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des_cbc, cipher) CRYPTO_ALLOC_CTX_NOT_IMPLEMENTED(des3_cbc, cipher) #endif /* * The crypto context used by the crypto_authen_*() functions below is * defined by struct crypto_authenc_ctx. */ struct crypto_authenc_ctx { const struct crypto_authenc_ops *ops; }; struct crypto_authenc_ops { TEE_Result (*init)(struct crypto_authenc_ctx *ctx, TEE_OperationMode mode, const uint8_t *key, size_t key_len, const uint8_t *nonce, size_t nonce_len, size_t tag_len, size_t aad_len, size_t payload_len); TEE_Result (*update_aad)(struct crypto_authenc_ctx *ctx, const uint8_t *data, size_t len); TEE_Result (*update_payload)(struct crypto_authenc_ctx *ctx, TEE_OperationMode mode, const uint8_t *src_data, size_t len, uint8_t *dst_data); TEE_Result (*enc_final)(struct crypto_authenc_ctx *ctx, const uint8_t *src_data, size_t len, uint8_t *dst_data, uint8_t *dst_tag, size_t *dst_tag_len); TEE_Result (*dec_final)(struct crypto_authenc_ctx *ctx, const uint8_t *src_data, size_t len, uint8_t *dst_data, const uint8_t *tag, size_t tag_len); void (*final)(struct crypto_authenc_ctx *ctx); void (*free_ctx)(struct crypto_authenc_ctx *ctx); void (*copy_state)(struct crypto_authenc_ctx *dst_ctx, struct crypto_authenc_ctx *src_ctx); }; TEE_Result crypto_aes_ccm_alloc_ctx(struct crypto_authenc_ctx **ctx); TEE_Result crypto_aes_gcm_alloc_ctx(struct crypto_authenc_ctx **ctx); #ifdef CFG_CRYPTO_DRV_HASH TEE_Result drvcrypt_hash_alloc_ctx(struct crypto_hash_ctx **ctx, uint32_t algo); #else static inline TEE_Result drvcrypt_hash_alloc_ctx(struct crypto_hash_ctx **ctx __unused, uint32_t algo __unused) { return TEE_ERROR_NOT_IMPLEMENTED; } #endif #endif /*__CRYPTO_CRYPTO_IMPL_H*/