19940809bc72ab0147c532317ad41f2b6625708b
[dpdk.git] / drivers / crypto / armv8 / armv8_pmd_private.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4
5 #ifndef _ARMV8_PMD_PRIVATE_H_
6 #define _ARMV8_PMD_PRIVATE_H_
7
8 #include "AArch64cryptolib.h"
9
10 #define CRYPTODEV_NAME_ARMV8_PMD        crypto_armv8
11 /**< ARMv8 Crypto PMD device name */
12
13 #define ARMV8_CRYPTO_LOG_ERR(fmt, args...) \
14         RTE_LOG(ERR, CRYPTODEV, "[%s] %s() line %u: " fmt "\n",  \
15                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
16                         __func__, __LINE__, ## args)
17
18 #define ARMV8_CRYPTO_LOG_INFO(fmt, args...) \
19         RTE_LOG(INFO, CRYPTODEV, "[%s] %s() line %u: " fmt "\n", \
20                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
21                         __func__, __LINE__, ## args)
22
23 #define ARMV8_CRYPTO_LOG_DBG(fmt, args...) \
24         RTE_LOG(DEBUG, CRYPTODEV, "[%s] %s() line %u: " fmt "\n", \
25                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
26                         __func__, __LINE__, ## args)
27
28 #define ARMV8_CRYPTO_ASSERT(con)                                \
29 do {                                                            \
30         if (!(con)) {                                           \
31                 rte_panic("condition failed, line %u",          \
32                         __LINE__);                              \
33         }                                                       \
34 } while (0)
35
36 #define NBBY            8               /* Number of bits in a byte */
37 #define BYTE_LENGTH(x)  ((x) / NBBY)    /* Number of bytes in x (round down) */
38
39 /* Maximum length for digest (SHA-256 needs 32 bytes) */
40 #define DIGEST_LENGTH_MAX 32
41
42 /** ARMv8 operation order mode enumerator */
43 enum armv8_crypto_chain_order {
44         ARMV8_CRYPTO_CHAIN_CIPHER_AUTH,
45         ARMV8_CRYPTO_CHAIN_AUTH_CIPHER,
46         ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED,
47         ARMV8_CRYPTO_CHAIN_LIST_END = ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED
48 };
49
50 /** ARMv8 cipher operation enumerator */
51 enum armv8_crypto_cipher_operation {
52         ARMV8_CRYPTO_CIPHER_OP_ENCRYPT = RTE_CRYPTO_CIPHER_OP_ENCRYPT,
53         ARMV8_CRYPTO_CIPHER_OP_DECRYPT = RTE_CRYPTO_CIPHER_OP_DECRYPT,
54         ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED,
55         ARMV8_CRYPTO_CIPHER_OP_LIST_END = ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED
56 };
57
58 enum armv8_crypto_cipher_keylen {
59         ARMV8_CRYPTO_CIPHER_KEYLEN_128,
60         ARMV8_CRYPTO_CIPHER_KEYLEN_192,
61         ARMV8_CRYPTO_CIPHER_KEYLEN_256,
62         ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED,
63         ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END =
64                 ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED
65 };
66
67 /** ARMv8 auth mode enumerator */
68 enum armv8_crypto_auth_mode {
69         ARMV8_CRYPTO_AUTH_AS_AUTH,
70         ARMV8_CRYPTO_AUTH_AS_HMAC,
71         ARMV8_CRYPTO_AUTH_AS_CIPHER,
72         ARMV8_CRYPTO_AUTH_NOT_SUPPORTED,
73         ARMV8_CRYPTO_AUTH_LIST_END = ARMV8_CRYPTO_AUTH_NOT_SUPPORTED
74 };
75
76 #define CRYPTO_ORDER_MAX                ARMV8_CRYPTO_CHAIN_LIST_END
77 #define CRYPTO_CIPHER_OP_MAX            ARMV8_CRYPTO_CIPHER_OP_LIST_END
78 #define CRYPTO_CIPHER_KEYLEN_MAX        ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END
79 #define CRYPTO_CIPHER_MAX               RTE_CRYPTO_CIPHER_LIST_END
80 #define CRYPTO_AUTH_MAX                 RTE_CRYPTO_AUTH_LIST_END
81
82 #define HMAC_IPAD_VALUE                 (0x36)
83 #define HMAC_OPAD_VALUE                 (0x5C)
84
85 #define SHA256_AUTH_KEY_LENGTH          (BYTE_LENGTH(256))
86 #define SHA256_BLOCK_SIZE               (BYTE_LENGTH(512))
87
88 #define SHA1_AUTH_KEY_LENGTH            (BYTE_LENGTH(160))
89 #define SHA1_BLOCK_SIZE                 (BYTE_LENGTH(512))
90
91 #define SHA_AUTH_KEY_MAX                SHA256_AUTH_KEY_LENGTH
92 #define SHA_BLOCK_MAX                   SHA256_BLOCK_SIZE
93
94 typedef int (*crypto_func_t)(uint8_t *, uint8_t *, uint64_t,
95                                 uint8_t *, uint8_t *, uint64_t,
96                                 armv8_cipher_digest_t *);
97
98 typedef void (*crypto_key_sched_t)(uint8_t *, const uint8_t *);
99
100 /** private data structure for each ARMv8 crypto device */
101 struct armv8_crypto_private {
102         unsigned int max_nb_qpairs;
103         /**< Max number of queue pairs */
104 };
105
106 /** ARMv8 crypto queue pair */
107 struct armv8_crypto_qp {
108         uint16_t id;
109         /**< Queue Pair Identifier */
110         struct rte_ring *processed_ops;
111         /**< Ring for placing process packets */
112         struct rte_mempool *sess_mp;
113         /**< Session Mempool */
114         struct rte_mempool *sess_mp_priv;
115        /**< Session Private Data Mempool */
116         struct rte_cryptodev_stats stats;
117         /**< Queue pair statistics */
118         char name[RTE_CRYPTODEV_NAME_MAX_LEN];
119         /**< Unique Queue Pair Name */
120         uint8_t temp_digest[DIGEST_LENGTH_MAX];
121         /**< Buffer used to store the digest generated
122          * by the driver when verifying a digest provided
123          * by the user (using authentication verify operation)
124          */
125 } __rte_cache_aligned;
126
127 /** ARMv8 crypto private session structure */
128 struct armv8_crypto_session {
129         enum armv8_crypto_chain_order chain_order;
130         /**< chain order mode */
131         crypto_func_t crypto_func;
132         /**< cryptographic function to use for this session */
133
134         /** Cipher Parameters */
135         struct {
136                 enum rte_crypto_cipher_operation direction;
137                 /**< cipher operation direction */
138                 enum rte_crypto_cipher_algorithm algo;
139                 /**< cipher algorithm */
140                 struct {
141                         uint16_t length;
142                         uint16_t offset;
143                 } iv;
144                 /**< IV parameters */
145
146                 struct {
147                         uint8_t data[256];
148                         /**< key data */
149                         size_t length;
150                         /**< key length in bytes */
151                 } key;
152
153                 crypto_key_sched_t key_sched;
154                 /**< Key schedule function */
155         } cipher;
156
157         /** Authentication Parameters */
158         struct {
159                 enum rte_crypto_auth_operation operation;
160                 /**< auth operation generate or verify */
161                 enum armv8_crypto_auth_mode mode;
162                 /**< auth operation mode */
163
164                 union {
165                         struct {
166                                 /* Add data if needed */
167                         } auth;
168
169                         struct {
170                                 uint8_t i_key_pad[SHA_BLOCK_MAX]
171                                                         __rte_cache_aligned;
172                                 /**< inner pad (max supported block length) */
173                                 uint8_t o_key_pad[SHA_BLOCK_MAX]
174                                                         __rte_cache_aligned;
175                                 /**< outer pad (max supported block length) */
176                                 uint8_t key[SHA_BLOCK_MAX];
177                                 /**< HMAC key (max supported block length)*/
178                         } hmac;
179                 };
180                 uint16_t digest_length;
181                 /* Digest length */
182         } auth;
183
184 } __rte_cache_aligned;
185
186 /** Set and validate ARMv8 crypto session parameters */
187 extern int armv8_crypto_set_session_parameters(
188                 struct armv8_crypto_session *sess,
189                 const struct rte_crypto_sym_xform *xform);
190
191 /** device specific operations function pointer structure */
192 extern struct rte_cryptodev_ops *rte_armv8_crypto_pmd_ops;
193
194 #endif /* _ARMV8_PMD_PRIVATE_H_ */