1dfb57b8bSCedric Neveux /* SPDX-License-Identifier: BSD-2-Clause */ 2dfb57b8bSCedric Neveux /* 3*eafbaf2cSCedric Neveux * Copyright 2018-2021 NXP 4dfb57b8bSCedric Neveux * 5dfb57b8bSCedric Neveux * CAAM Cipher Local header. 6dfb57b8bSCedric Neveux */ 7dfb57b8bSCedric Neveux #ifndef __LOCAL_H__ 8dfb57b8bSCedric Neveux #define __LOCAL_H__ 9dfb57b8bSCedric Neveux 10*eafbaf2cSCedric Neveux #include <caam_utils_dmaobj.h> 11dfb57b8bSCedric Neveux #include <drvcrypt.h> 12dfb57b8bSCedric Neveux #include <drvcrypt_cipher.h> 13dfb57b8bSCedric Neveux 14dfb57b8bSCedric Neveux /* 15829cbb61SClement Faure * Definition of the maximum number of CAAM Job descriptor entries 16829cbb61SClement Faure */ 17829cbb61SClement Faure #ifdef CFG_CAAM_64BIT 18829cbb61SClement Faure #define MAX_DESC_ENTRIES 22 19829cbb61SClement Faure #else 20829cbb61SClement Faure #define MAX_DESC_ENTRIES 16 21829cbb61SClement Faure #endif 22829cbb61SClement Faure 23829cbb61SClement Faure /* 24dfb57b8bSCedric Neveux * Definition of flags tagging which key(s) is required 25dfb57b8bSCedric Neveux */ 26dfb57b8bSCedric Neveux #define NEED_KEY1 BIT(0) 27dfb57b8bSCedric Neveux #define NEED_KEY2 BIT(1) 28dfb57b8bSCedric Neveux #define NEED_IV BIT(2) 29dfb57b8bSCedric Neveux #define NEED_TWEAK BIT(3) 30dfb57b8bSCedric Neveux 31dfb57b8bSCedric Neveux /* 32dfb57b8bSCedric Neveux * Cipher Algorithm definition 33dfb57b8bSCedric Neveux */ 34dfb57b8bSCedric Neveux struct cipheralg { 35dfb57b8bSCedric Neveux uint32_t type; /* Algo type for operation */ 36dfb57b8bSCedric Neveux uint8_t size_block; /* Computing block size */ 37dfb57b8bSCedric Neveux uint8_t size_ctx; /* CAAM Context Register size */ 38dfb57b8bSCedric Neveux uint8_t ctx_offset; /* CAAM Context Register offset */ 39dfb57b8bSCedric Neveux uint8_t require_key; /* Tag defining key(s) required */ 40dfb57b8bSCedric Neveux struct caamdefkey def_key; /* Key size accepted */ 41dfb57b8bSCedric Neveux 42dfb57b8bSCedric Neveux TEE_Result (*update)(struct drvcrypt_cipher_update *dupdate); 43dfb57b8bSCedric Neveux }; 44dfb57b8bSCedric Neveux 45dfb57b8bSCedric Neveux /* 46dfb57b8bSCedric Neveux * Full Cipher data SW context 47dfb57b8bSCedric Neveux */ 48dfb57b8bSCedric Neveux struct cipherdata { 49dfb57b8bSCedric Neveux uint32_t *descriptor; /* Job descriptor */ 50dfb57b8bSCedric Neveux bool encrypt; /* Encrypt direction */ 51dfb57b8bSCedric Neveux struct caambuf key1; /* First Key */ 52dfb57b8bSCedric Neveux struct caambuf key2; /* Second Key */ 53dfb57b8bSCedric Neveux struct caambuf tweak; /* XTS Tweak */ 54dfb57b8bSCedric Neveux struct caambuf ctx; /* CAAM Context Register */ 55dfb57b8bSCedric Neveux struct caamblock blockbuf; /* Temporary Block buffer */ 56dfb57b8bSCedric Neveux const struct cipheralg *alg; /* Reference to the algo constants */ 571453ab03SClement Faure 581453ab03SClement Faure /* Additionnal Data for the MAC */ 591453ab03SClement Faure unsigned int mode; /* MAC TEE_CHAIN_MODE* */ 601453ab03SClement Faure size_t countdata; /* MAC Number of input data */ 61dfb57b8bSCedric Neveux }; 62dfb57b8bSCedric Neveux 63dfb57b8bSCedric Neveux /* 649625d308SClement Faure * Cipher additionnal data block 659625d308SClement Faure */ 669625d308SClement Faure enum caam_cipher_block { 679625d308SClement Faure CIPHER_BLOCK_NONE = 0, 689625d308SClement Faure CIPHER_BLOCK_IN, 699625d308SClement Faure CIPHER_BLOCK_OUT, 709625d308SClement Faure CIPHER_BLOCK_BOTH, 719625d308SClement Faure }; 729625d308SClement Faure 739625d308SClement Faure /* 74dfb57b8bSCedric Neveux * Update of the cipher operation of complete block except 75dfb57b8bSCedric Neveux * if last block. Last block can be partial block. 76dfb57b8bSCedric Neveux * 77dfb57b8bSCedric Neveux * @ctx Cipher context 78dfb57b8bSCedric Neveux * @savectx Save or not the context 79dfb57b8bSCedric Neveux * @keyid Id of the key to be used during operation 80dfb57b8bSCedric Neveux * @encrypt Encrypt or decrypt direction 81dfb57b8bSCedric Neveux * @src Source data to encrypt/decrypt 82dfb57b8bSCedric Neveux * @dst [out] Destination data encrypted/decrypted 83dfb57b8bSCedric Neveux */ 84dfb57b8bSCedric Neveux enum caam_status caam_cipher_block(struct cipherdata *ctx, bool savectx, 85dfb57b8bSCedric Neveux uint8_t keyid, bool encrypt, 86*eafbaf2cSCedric Neveux struct caamdmaobj *src, 87*eafbaf2cSCedric Neveux struct caamdmaobj *dst); 88dfb57b8bSCedric Neveux 89dfb57b8bSCedric Neveux /* 90dfb57b8bSCedric Neveux * Update of the cipher operation in xts mode. 91dfb57b8bSCedric Neveux * 92dfb57b8bSCedric Neveux * @dupdate Data update object 93dfb57b8bSCedric Neveux */ 94dfb57b8bSCedric Neveux TEE_Result caam_cipher_update_xts(struct drvcrypt_cipher_update *dupdate); 95dfb57b8bSCedric Neveux 96dfe189b3SClement Faure /* 97dfe189b3SClement Faure * Initialization of the cipher operation 98dfe189b3SClement Faure * 99dfe189b3SClement Faure * @dinit Data initialization object 100dfe189b3SClement Faure */ 101dfe189b3SClement Faure TEE_Result caam_cipher_initialize(struct drvcrypt_cipher_init *dinit); 102dfe189b3SClement Faure 103dfe189b3SClement Faure /* 104dfe189b3SClement Faure * Free software context 105dfe189b3SClement Faure * 106dfe189b3SClement Faure * @ctx Caller context variable 107dfe189b3SClement Faure */ 108dfe189b3SClement Faure void caam_cipher_free(void *ctx); 109dfe189b3SClement Faure 110dfe189b3SClement Faure /* 111dfe189b3SClement Faure * Copy software Context 112dfe189b3SClement Faure * 113dfe189b3SClement Faure * @dst_ctx [out] Reference the context destination 114dfe189b3SClement Faure * @src_ctx Reference the context source 115dfe189b3SClement Faure */ 116dfe189b3SClement Faure void caam_cipher_copy_state(void *dst_ctx, void *src_ctx); 117dfe189b3SClement Faure 118dfb57b8bSCedric Neveux #endif /* __LOCAL_H__ */ 119