xref: /optee_os/core/drivers/crypto/caam/cipher/local.h (revision eafbaf2cd62c926d8a5f87c70cb62be134ced19c)
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