xref: /openbmc/qemu/include/system/cryptodev.h (revision 65cb7129f4160c7e07a0da107f888ec73ae96776)
1*32cad1ffSPhilippe Mathieu-Daudé /*
2*32cad1ffSPhilippe Mathieu-Daudé  * QEMU Crypto Device Implementation
3*32cad1ffSPhilippe Mathieu-Daudé  *
4*32cad1ffSPhilippe Mathieu-Daudé  * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
5*32cad1ffSPhilippe Mathieu-Daudé  *
6*32cad1ffSPhilippe Mathieu-Daudé  * Authors:
7*32cad1ffSPhilippe Mathieu-Daudé  *    Gonglei <arei.gonglei@huawei.com>
8*32cad1ffSPhilippe Mathieu-Daudé  *
9*32cad1ffSPhilippe Mathieu-Daudé  * This library is free software; you can redistribute it and/or
10*32cad1ffSPhilippe Mathieu-Daudé  * modify it under the terms of the GNU Lesser General Public
11*32cad1ffSPhilippe Mathieu-Daudé  * License as published by the Free Software Foundation; either
12*32cad1ffSPhilippe Mathieu-Daudé  * version 2.1 of the License, or (at your option) any later version.
13*32cad1ffSPhilippe Mathieu-Daudé  *
14*32cad1ffSPhilippe Mathieu-Daudé  * This library is distributed in the hope that it will be useful,
15*32cad1ffSPhilippe Mathieu-Daudé  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*32cad1ffSPhilippe Mathieu-Daudé  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17*32cad1ffSPhilippe Mathieu-Daudé  * Lesser General Public License for more details.
18*32cad1ffSPhilippe Mathieu-Daudé  *
19*32cad1ffSPhilippe Mathieu-Daudé  * You should have received a copy of the GNU Lesser General Public
20*32cad1ffSPhilippe Mathieu-Daudé  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21*32cad1ffSPhilippe Mathieu-Daudé  *
22*32cad1ffSPhilippe Mathieu-Daudé  */
23*32cad1ffSPhilippe Mathieu-Daudé #ifndef CRYPTODEV_H
24*32cad1ffSPhilippe Mathieu-Daudé #define CRYPTODEV_H
25*32cad1ffSPhilippe Mathieu-Daudé 
26*32cad1ffSPhilippe Mathieu-Daudé #include "qemu/queue.h"
27*32cad1ffSPhilippe Mathieu-Daudé #include "qemu/throttle.h"
28*32cad1ffSPhilippe Mathieu-Daudé #include "qom/object.h"
29*32cad1ffSPhilippe Mathieu-Daudé #include "qapi/qapi-types-cryptodev.h"
30*32cad1ffSPhilippe Mathieu-Daudé 
31*32cad1ffSPhilippe Mathieu-Daudé /**
32*32cad1ffSPhilippe Mathieu-Daudé  * CryptoDevBackend:
33*32cad1ffSPhilippe Mathieu-Daudé  *
34*32cad1ffSPhilippe Mathieu-Daudé  * The CryptoDevBackend object is an interface
35*32cad1ffSPhilippe Mathieu-Daudé  * for different cryptodev backends, which provides crypto
36*32cad1ffSPhilippe Mathieu-Daudé  * operation wrapper.
37*32cad1ffSPhilippe Mathieu-Daudé  *
38*32cad1ffSPhilippe Mathieu-Daudé  */
39*32cad1ffSPhilippe Mathieu-Daudé 
40*32cad1ffSPhilippe Mathieu-Daudé #define TYPE_CRYPTODEV_BACKEND "cryptodev-backend"
41*32cad1ffSPhilippe Mathieu-Daudé 
42*32cad1ffSPhilippe Mathieu-Daudé OBJECT_DECLARE_TYPE(CryptoDevBackend, CryptoDevBackendClass,
43*32cad1ffSPhilippe Mathieu-Daudé                     CRYPTODEV_BACKEND)
44*32cad1ffSPhilippe Mathieu-Daudé 
45*32cad1ffSPhilippe Mathieu-Daudé 
46*32cad1ffSPhilippe Mathieu-Daudé #define MAX_CRYPTO_QUEUE_NUM  64
47*32cad1ffSPhilippe Mathieu-Daudé 
48*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendConf CryptoDevBackendConf;
49*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendPeers CryptoDevBackendPeers;
50*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendClient
51*32cad1ffSPhilippe Mathieu-Daudé                      CryptoDevBackendClient;
52*32cad1ffSPhilippe Mathieu-Daudé 
53*32cad1ffSPhilippe Mathieu-Daudé /**
54*32cad1ffSPhilippe Mathieu-Daudé  * CryptoDevBackendSymSessionInfo:
55*32cad1ffSPhilippe Mathieu-Daudé  *
56*32cad1ffSPhilippe Mathieu-Daudé  * @cipher_alg: algorithm type of CIPHER
57*32cad1ffSPhilippe Mathieu-Daudé  * @key_len: byte length of cipher key
58*32cad1ffSPhilippe Mathieu-Daudé  * @hash_alg: algorithm type of HASH/MAC
59*32cad1ffSPhilippe Mathieu-Daudé  * @hash_result_len: byte length of HASH operation result
60*32cad1ffSPhilippe Mathieu-Daudé  * @auth_key_len: byte length of authenticated key
61*32cad1ffSPhilippe Mathieu-Daudé  * @add_len: byte length of additional authenticated data
62*32cad1ffSPhilippe Mathieu-Daudé  * @op_type: operation type (refer to virtio_crypto.h)
63*32cad1ffSPhilippe Mathieu-Daudé  * @direction: encryption or direction for CIPHER
64*32cad1ffSPhilippe Mathieu-Daudé  * @hash_mode: HASH mode for HASH operation (refer to virtio_crypto.h)
65*32cad1ffSPhilippe Mathieu-Daudé  * @alg_chain_order: order of algorithm chaining (CIPHER then HASH,
66*32cad1ffSPhilippe Mathieu-Daudé  *                   or HASH then CIPHER)
67*32cad1ffSPhilippe Mathieu-Daudé  * @cipher_key: point to a key of CIPHER
68*32cad1ffSPhilippe Mathieu-Daudé  * @auth_key: point to an authenticated key of MAC
69*32cad1ffSPhilippe Mathieu-Daudé  *
70*32cad1ffSPhilippe Mathieu-Daudé  */
71*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendSymSessionInfo {
72*32cad1ffSPhilippe Mathieu-Daudé     /* corresponding with virtio crypto spec */
73*32cad1ffSPhilippe Mathieu-Daudé     uint32_t cipher_alg;
74*32cad1ffSPhilippe Mathieu-Daudé     uint32_t key_len;
75*32cad1ffSPhilippe Mathieu-Daudé     uint32_t hash_alg;
76*32cad1ffSPhilippe Mathieu-Daudé     uint32_t hash_result_len;
77*32cad1ffSPhilippe Mathieu-Daudé     uint32_t auth_key_len;
78*32cad1ffSPhilippe Mathieu-Daudé     uint32_t add_len;
79*32cad1ffSPhilippe Mathieu-Daudé     uint8_t op_type;
80*32cad1ffSPhilippe Mathieu-Daudé     uint8_t direction;
81*32cad1ffSPhilippe Mathieu-Daudé     uint8_t hash_mode;
82*32cad1ffSPhilippe Mathieu-Daudé     uint8_t alg_chain_order;
83*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *cipher_key;
84*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *auth_key;
85*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendSymSessionInfo;
86*32cad1ffSPhilippe Mathieu-Daudé 
87*32cad1ffSPhilippe Mathieu-Daudé /**
88*32cad1ffSPhilippe Mathieu-Daudé  * CryptoDevBackendAsymSessionInfo:
89*32cad1ffSPhilippe Mathieu-Daudé  */
90*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendRsaPara {
91*32cad1ffSPhilippe Mathieu-Daudé     uint32_t padding_algo;
92*32cad1ffSPhilippe Mathieu-Daudé     uint32_t hash_algo;
93*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendRsaPara;
94*32cad1ffSPhilippe Mathieu-Daudé 
95*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendAsymSessionInfo {
96*32cad1ffSPhilippe Mathieu-Daudé     /* corresponding with virtio crypto spec */
97*32cad1ffSPhilippe Mathieu-Daudé     uint32_t algo;
98*32cad1ffSPhilippe Mathieu-Daudé     uint32_t keytype;
99*32cad1ffSPhilippe Mathieu-Daudé     uint32_t keylen;
100*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *key;
101*32cad1ffSPhilippe Mathieu-Daudé     union {
102*32cad1ffSPhilippe Mathieu-Daudé         CryptoDevBackendRsaPara rsa;
103*32cad1ffSPhilippe Mathieu-Daudé     } u;
104*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendAsymSessionInfo;
105*32cad1ffSPhilippe Mathieu-Daudé 
106*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendSessionInfo {
107*32cad1ffSPhilippe Mathieu-Daudé     uint32_t op_code;
108*32cad1ffSPhilippe Mathieu-Daudé     union {
109*32cad1ffSPhilippe Mathieu-Daudé         CryptoDevBackendSymSessionInfo sym_sess_info;
110*32cad1ffSPhilippe Mathieu-Daudé         CryptoDevBackendAsymSessionInfo asym_sess_info;
111*32cad1ffSPhilippe Mathieu-Daudé     } u;
112*32cad1ffSPhilippe Mathieu-Daudé     uint64_t session_id;
113*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendSessionInfo;
114*32cad1ffSPhilippe Mathieu-Daudé 
115*32cad1ffSPhilippe Mathieu-Daudé /**
116*32cad1ffSPhilippe Mathieu-Daudé  * CryptoDevBackendSymOpInfo:
117*32cad1ffSPhilippe Mathieu-Daudé  *
118*32cad1ffSPhilippe Mathieu-Daudé  * @aad_len: byte length of additional authenticated data
119*32cad1ffSPhilippe Mathieu-Daudé  * @iv_len: byte length of initialization vector or counter
120*32cad1ffSPhilippe Mathieu-Daudé  * @src_len: byte length of source data
121*32cad1ffSPhilippe Mathieu-Daudé  * @dst_len: byte length of destination data
122*32cad1ffSPhilippe Mathieu-Daudé  * @digest_result_len: byte length of hash digest result
123*32cad1ffSPhilippe Mathieu-Daudé  * @hash_start_src_offset: Starting point for hash processing, specified
124*32cad1ffSPhilippe Mathieu-Daudé  *  as number of bytes from start of packet in source data, only used for
125*32cad1ffSPhilippe Mathieu-Daudé  *  algorithm chain
126*32cad1ffSPhilippe Mathieu-Daudé  * @cipher_start_src_offset: Starting point for cipher processing, specified
127*32cad1ffSPhilippe Mathieu-Daudé  *  as number of bytes from start of packet in source data, only used for
128*32cad1ffSPhilippe Mathieu-Daudé  *  algorithm chain
129*32cad1ffSPhilippe Mathieu-Daudé  * @len_to_hash: byte length of source data on which the hash
130*32cad1ffSPhilippe Mathieu-Daudé  *  operation will be computed, only used for algorithm chain
131*32cad1ffSPhilippe Mathieu-Daudé  * @len_to_cipher: byte length of source data on which the cipher
132*32cad1ffSPhilippe Mathieu-Daudé  *  operation will be computed, only used for algorithm chain
133*32cad1ffSPhilippe Mathieu-Daudé  * @op_type: operation type (refer to virtio_crypto.h)
134*32cad1ffSPhilippe Mathieu-Daudé  * @iv: point to the initialization vector or counter
135*32cad1ffSPhilippe Mathieu-Daudé  * @src: point to the source data
136*32cad1ffSPhilippe Mathieu-Daudé  * @dst: point to the destination data
137*32cad1ffSPhilippe Mathieu-Daudé  * @aad_data: point to the additional authenticated data
138*32cad1ffSPhilippe Mathieu-Daudé  * @digest_result: point to the digest result data
139*32cad1ffSPhilippe Mathieu-Daudé  * @data[0]: point to the extensional memory by one memory allocation
140*32cad1ffSPhilippe Mathieu-Daudé  *
141*32cad1ffSPhilippe Mathieu-Daudé  */
142*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendSymOpInfo {
143*32cad1ffSPhilippe Mathieu-Daudé     uint32_t aad_len;
144*32cad1ffSPhilippe Mathieu-Daudé     uint32_t iv_len;
145*32cad1ffSPhilippe Mathieu-Daudé     uint32_t src_len;
146*32cad1ffSPhilippe Mathieu-Daudé     uint32_t dst_len;
147*32cad1ffSPhilippe Mathieu-Daudé     uint32_t digest_result_len;
148*32cad1ffSPhilippe Mathieu-Daudé     uint32_t hash_start_src_offset;
149*32cad1ffSPhilippe Mathieu-Daudé     uint32_t cipher_start_src_offset;
150*32cad1ffSPhilippe Mathieu-Daudé     uint32_t len_to_hash;
151*32cad1ffSPhilippe Mathieu-Daudé     uint32_t len_to_cipher;
152*32cad1ffSPhilippe Mathieu-Daudé     uint8_t op_type;
153*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *iv;
154*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *src;
155*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *dst;
156*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *aad_data;
157*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *digest_result;
158*32cad1ffSPhilippe Mathieu-Daudé     uint8_t data[];
159*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendSymOpInfo;
160*32cad1ffSPhilippe Mathieu-Daudé 
161*32cad1ffSPhilippe Mathieu-Daudé 
162*32cad1ffSPhilippe Mathieu-Daudé /**
163*32cad1ffSPhilippe Mathieu-Daudé  * CryptoDevBackendAsymOpInfo:
164*32cad1ffSPhilippe Mathieu-Daudé  *
165*32cad1ffSPhilippe Mathieu-Daudé  * @src_len: byte length of source data
166*32cad1ffSPhilippe Mathieu-Daudé  * @dst_len: byte length of destination data
167*32cad1ffSPhilippe Mathieu-Daudé  * @src: point to the source data
168*32cad1ffSPhilippe Mathieu-Daudé  * @dst: point to the destination data
169*32cad1ffSPhilippe Mathieu-Daudé  *
170*32cad1ffSPhilippe Mathieu-Daudé  */
171*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendAsymOpInfo {
172*32cad1ffSPhilippe Mathieu-Daudé     uint32_t src_len;
173*32cad1ffSPhilippe Mathieu-Daudé     uint32_t dst_len;
174*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *src;
175*32cad1ffSPhilippe Mathieu-Daudé     uint8_t *dst;
176*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendAsymOpInfo;
177*32cad1ffSPhilippe Mathieu-Daudé 
178*32cad1ffSPhilippe Mathieu-Daudé typedef void (*CryptoDevCompletionFunc) (void *opaque, int ret);
179*32cad1ffSPhilippe Mathieu-Daudé 
180*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptoDevBackendOpInfo {
181*32cad1ffSPhilippe Mathieu-Daudé     QCryptodevBackendAlgoType algtype;
182*32cad1ffSPhilippe Mathieu-Daudé     uint32_t op_code;
183*32cad1ffSPhilippe Mathieu-Daudé     uint32_t queue_index;
184*32cad1ffSPhilippe Mathieu-Daudé     CryptoDevCompletionFunc cb;
185*32cad1ffSPhilippe Mathieu-Daudé     void *opaque; /* argument for cb */
186*32cad1ffSPhilippe Mathieu-Daudé     uint64_t session_id;
187*32cad1ffSPhilippe Mathieu-Daudé     union {
188*32cad1ffSPhilippe Mathieu-Daudé         CryptoDevBackendSymOpInfo *sym_op_info;
189*32cad1ffSPhilippe Mathieu-Daudé         CryptoDevBackendAsymOpInfo *asym_op_info;
190*32cad1ffSPhilippe Mathieu-Daudé     } u;
191*32cad1ffSPhilippe Mathieu-Daudé     QTAILQ_ENTRY(CryptoDevBackendOpInfo) next;
192*32cad1ffSPhilippe Mathieu-Daudé } CryptoDevBackendOpInfo;
193*32cad1ffSPhilippe Mathieu-Daudé 
194*32cad1ffSPhilippe Mathieu-Daudé struct CryptoDevBackendClass {
195*32cad1ffSPhilippe Mathieu-Daudé     ObjectClass parent_class;
196*32cad1ffSPhilippe Mathieu-Daudé 
197*32cad1ffSPhilippe Mathieu-Daudé     void (*init)(CryptoDevBackend *backend, Error **errp);
198*32cad1ffSPhilippe Mathieu-Daudé     void (*cleanup)(CryptoDevBackend *backend, Error **errp);
199*32cad1ffSPhilippe Mathieu-Daudé 
200*32cad1ffSPhilippe Mathieu-Daudé     int (*create_session)(CryptoDevBackend *backend,
201*32cad1ffSPhilippe Mathieu-Daudé                           CryptoDevBackendSessionInfo *sess_info,
202*32cad1ffSPhilippe Mathieu-Daudé                           uint32_t queue_index,
203*32cad1ffSPhilippe Mathieu-Daudé                           CryptoDevCompletionFunc cb,
204*32cad1ffSPhilippe Mathieu-Daudé                           void *opaque);
205*32cad1ffSPhilippe Mathieu-Daudé 
206*32cad1ffSPhilippe Mathieu-Daudé     int (*close_session)(CryptoDevBackend *backend,
207*32cad1ffSPhilippe Mathieu-Daudé                          uint64_t session_id,
208*32cad1ffSPhilippe Mathieu-Daudé                          uint32_t queue_index,
209*32cad1ffSPhilippe Mathieu-Daudé                          CryptoDevCompletionFunc cb,
210*32cad1ffSPhilippe Mathieu-Daudé                          void *opaque);
211*32cad1ffSPhilippe Mathieu-Daudé 
212*32cad1ffSPhilippe Mathieu-Daudé     int (*do_op)(CryptoDevBackend *backend,
213*32cad1ffSPhilippe Mathieu-Daudé                  CryptoDevBackendOpInfo *op_info);
214*32cad1ffSPhilippe Mathieu-Daudé };
215*32cad1ffSPhilippe Mathieu-Daudé 
216*32cad1ffSPhilippe Mathieu-Daudé struct CryptoDevBackendClient {
217*32cad1ffSPhilippe Mathieu-Daudé     QCryptodevBackendType type;
218*32cad1ffSPhilippe Mathieu-Daudé     char *info_str;
219*32cad1ffSPhilippe Mathieu-Daudé     unsigned int queue_index;
220*32cad1ffSPhilippe Mathieu-Daudé     int vring_enable;
221*32cad1ffSPhilippe Mathieu-Daudé     QTAILQ_ENTRY(CryptoDevBackendClient) next;
222*32cad1ffSPhilippe Mathieu-Daudé };
223*32cad1ffSPhilippe Mathieu-Daudé 
224*32cad1ffSPhilippe Mathieu-Daudé struct CryptoDevBackendPeers {
225*32cad1ffSPhilippe Mathieu-Daudé     CryptoDevBackendClient *ccs[MAX_CRYPTO_QUEUE_NUM];
226*32cad1ffSPhilippe Mathieu-Daudé     uint32_t queues;
227*32cad1ffSPhilippe Mathieu-Daudé };
228*32cad1ffSPhilippe Mathieu-Daudé 
229*32cad1ffSPhilippe Mathieu-Daudé struct CryptoDevBackendConf {
230*32cad1ffSPhilippe Mathieu-Daudé     CryptoDevBackendPeers peers;
231*32cad1ffSPhilippe Mathieu-Daudé 
232*32cad1ffSPhilippe Mathieu-Daudé     /* Supported service mask */
233*32cad1ffSPhilippe Mathieu-Daudé     uint32_t crypto_services;
234*32cad1ffSPhilippe Mathieu-Daudé 
235*32cad1ffSPhilippe Mathieu-Daudé     /* Detailed algorithms mask */
236*32cad1ffSPhilippe Mathieu-Daudé     uint32_t cipher_algo_l;
237*32cad1ffSPhilippe Mathieu-Daudé     uint32_t cipher_algo_h;
238*32cad1ffSPhilippe Mathieu-Daudé     uint32_t hash_algo;
239*32cad1ffSPhilippe Mathieu-Daudé     uint32_t mac_algo_l;
240*32cad1ffSPhilippe Mathieu-Daudé     uint32_t mac_algo_h;
241*32cad1ffSPhilippe Mathieu-Daudé     uint32_t aead_algo;
242*32cad1ffSPhilippe Mathieu-Daudé     uint32_t akcipher_algo;
243*32cad1ffSPhilippe Mathieu-Daudé     /* Maximum length of cipher key */
244*32cad1ffSPhilippe Mathieu-Daudé     uint32_t max_cipher_key_len;
245*32cad1ffSPhilippe Mathieu-Daudé     /* Maximum length of authenticated key */
246*32cad1ffSPhilippe Mathieu-Daudé     uint32_t max_auth_key_len;
247*32cad1ffSPhilippe Mathieu-Daudé     /* Maximum size of each crypto request's content */
248*32cad1ffSPhilippe Mathieu-Daudé     uint64_t max_size;
249*32cad1ffSPhilippe Mathieu-Daudé };
250*32cad1ffSPhilippe Mathieu-Daudé 
251*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptodevBackendSymStat {
252*32cad1ffSPhilippe Mathieu-Daudé     int64_t encrypt_ops;
253*32cad1ffSPhilippe Mathieu-Daudé     int64_t decrypt_ops;
254*32cad1ffSPhilippe Mathieu-Daudé     int64_t encrypt_bytes;
255*32cad1ffSPhilippe Mathieu-Daudé     int64_t decrypt_bytes;
256*32cad1ffSPhilippe Mathieu-Daudé } CryptodevBackendSymStat;
257*32cad1ffSPhilippe Mathieu-Daudé 
258*32cad1ffSPhilippe Mathieu-Daudé typedef struct CryptodevBackendAsymStat {
259*32cad1ffSPhilippe Mathieu-Daudé     int64_t encrypt_ops;
260*32cad1ffSPhilippe Mathieu-Daudé     int64_t decrypt_ops;
261*32cad1ffSPhilippe Mathieu-Daudé     int64_t sign_ops;
262*32cad1ffSPhilippe Mathieu-Daudé     int64_t verify_ops;
263*32cad1ffSPhilippe Mathieu-Daudé     int64_t encrypt_bytes;
264*32cad1ffSPhilippe Mathieu-Daudé     int64_t decrypt_bytes;
265*32cad1ffSPhilippe Mathieu-Daudé     int64_t sign_bytes;
266*32cad1ffSPhilippe Mathieu-Daudé     int64_t verify_bytes;
267*32cad1ffSPhilippe Mathieu-Daudé } CryptodevBackendAsymStat;
268*32cad1ffSPhilippe Mathieu-Daudé 
269*32cad1ffSPhilippe Mathieu-Daudé struct CryptoDevBackend {
270*32cad1ffSPhilippe Mathieu-Daudé     Object parent_obj;
271*32cad1ffSPhilippe Mathieu-Daudé 
272*32cad1ffSPhilippe Mathieu-Daudé     bool ready;
273*32cad1ffSPhilippe Mathieu-Daudé     /* Tag the cryptodev backend is used by virtio-crypto or not */
274*32cad1ffSPhilippe Mathieu-Daudé     bool is_used;
275*32cad1ffSPhilippe Mathieu-Daudé     CryptoDevBackendConf conf;
276*32cad1ffSPhilippe Mathieu-Daudé     CryptodevBackendSymStat *sym_stat;
277*32cad1ffSPhilippe Mathieu-Daudé     CryptodevBackendAsymStat *asym_stat;
278*32cad1ffSPhilippe Mathieu-Daudé 
279*32cad1ffSPhilippe Mathieu-Daudé     ThrottleState ts;
280*32cad1ffSPhilippe Mathieu-Daudé     ThrottleTimers tt;
281*32cad1ffSPhilippe Mathieu-Daudé     ThrottleConfig tc;
282*32cad1ffSPhilippe Mathieu-Daudé     QTAILQ_HEAD(, CryptoDevBackendOpInfo) opinfos;
283*32cad1ffSPhilippe Mathieu-Daudé };
284*32cad1ffSPhilippe Mathieu-Daudé 
285*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevSymStatInc(be, op, bytes) do { \
286*32cad1ffSPhilippe Mathieu-Daudé    be->sym_stat->op##_bytes += (bytes); \
287*32cad1ffSPhilippe Mathieu-Daudé    be->sym_stat->op##_ops += 1; \
288*32cad1ffSPhilippe Mathieu-Daudé } while (/*CONSTCOND*/0)
289*32cad1ffSPhilippe Mathieu-Daudé 
290*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevSymStatIncEncrypt(be, bytes) \
291*32cad1ffSPhilippe Mathieu-Daudé             CryptodevSymStatInc(be, encrypt, bytes)
292*32cad1ffSPhilippe Mathieu-Daudé 
293*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevSymStatIncDecrypt(be, bytes) \
294*32cad1ffSPhilippe Mathieu-Daudé             CryptodevSymStatInc(be, decrypt, bytes)
295*32cad1ffSPhilippe Mathieu-Daudé 
296*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevAsymStatInc(be, op, bytes) do { \
297*32cad1ffSPhilippe Mathieu-Daudé     be->asym_stat->op##_bytes += (bytes); \
298*32cad1ffSPhilippe Mathieu-Daudé     be->asym_stat->op##_ops += 1; \
299*32cad1ffSPhilippe Mathieu-Daudé } while (/*CONSTCOND*/0)
300*32cad1ffSPhilippe Mathieu-Daudé 
301*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevAsymStatIncEncrypt(be, bytes) \
302*32cad1ffSPhilippe Mathieu-Daudé             CryptodevAsymStatInc(be, encrypt, bytes)
303*32cad1ffSPhilippe Mathieu-Daudé 
304*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevAsymStatIncDecrypt(be, bytes) \
305*32cad1ffSPhilippe Mathieu-Daudé             CryptodevAsymStatInc(be, decrypt, bytes)
306*32cad1ffSPhilippe Mathieu-Daudé 
307*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevAsymStatIncSign(be, bytes) \
308*32cad1ffSPhilippe Mathieu-Daudé             CryptodevAsymStatInc(be, sign, bytes)
309*32cad1ffSPhilippe Mathieu-Daudé 
310*32cad1ffSPhilippe Mathieu-Daudé #define CryptodevAsymStatIncVerify(be, bytes) \
311*32cad1ffSPhilippe Mathieu-Daudé             CryptodevAsymStatInc(be, verify, bytes)
312*32cad1ffSPhilippe Mathieu-Daudé 
313*32cad1ffSPhilippe Mathieu-Daudé 
314*32cad1ffSPhilippe Mathieu-Daudé /**
315*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_new_client:
316*32cad1ffSPhilippe Mathieu-Daudé  *
317*32cad1ffSPhilippe Mathieu-Daudé  * Creates a new cryptodev backend client object.
318*32cad1ffSPhilippe Mathieu-Daudé  *
319*32cad1ffSPhilippe Mathieu-Daudé  * The returned object must be released with
320*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_free_client() when no
321*32cad1ffSPhilippe Mathieu-Daudé  * longer required
322*32cad1ffSPhilippe Mathieu-Daudé  *
323*32cad1ffSPhilippe Mathieu-Daudé  * Returns: a new cryptodev backend client object
324*32cad1ffSPhilippe Mathieu-Daudé  */
325*32cad1ffSPhilippe Mathieu-Daudé CryptoDevBackendClient *cryptodev_backend_new_client(void);
326*32cad1ffSPhilippe Mathieu-Daudé 
327*32cad1ffSPhilippe Mathieu-Daudé /**
328*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_free_client:
329*32cad1ffSPhilippe Mathieu-Daudé  * @cc: the cryptodev backend client object
330*32cad1ffSPhilippe Mathieu-Daudé  *
331*32cad1ffSPhilippe Mathieu-Daudé  * Release the memory associated with @cc that
332*32cad1ffSPhilippe Mathieu-Daudé  * was previously allocated by cryptodev_backend_new_client()
333*32cad1ffSPhilippe Mathieu-Daudé  */
334*32cad1ffSPhilippe Mathieu-Daudé void cryptodev_backend_free_client(
335*32cad1ffSPhilippe Mathieu-Daudé                   CryptoDevBackendClient *cc);
336*32cad1ffSPhilippe Mathieu-Daudé 
337*32cad1ffSPhilippe Mathieu-Daudé /**
338*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_cleanup:
339*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
340*32cad1ffSPhilippe Mathieu-Daudé  * @errp: pointer to a NULL-initialized error object
341*32cad1ffSPhilippe Mathieu-Daudé  *
342*32cad1ffSPhilippe Mathieu-Daudé  * Clean the resource associated with @backend that realizaed
343*32cad1ffSPhilippe Mathieu-Daudé  * by the specific backend's init() callback
344*32cad1ffSPhilippe Mathieu-Daudé  */
345*32cad1ffSPhilippe Mathieu-Daudé void cryptodev_backend_cleanup(
346*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevBackend *backend,
347*32cad1ffSPhilippe Mathieu-Daudé            Error **errp);
348*32cad1ffSPhilippe Mathieu-Daudé 
349*32cad1ffSPhilippe Mathieu-Daudé /**
350*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_create_session:
351*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
352*32cad1ffSPhilippe Mathieu-Daudé  * @sess_info: parameters needed by session creating
353*32cad1ffSPhilippe Mathieu-Daudé  * @queue_index: queue index of cryptodev backend client
354*32cad1ffSPhilippe Mathieu-Daudé  * @errp: pointer to a NULL-initialized error object
355*32cad1ffSPhilippe Mathieu-Daudé  * @cb: callback when session create is compeleted
356*32cad1ffSPhilippe Mathieu-Daudé  * @opaque: parameter passed to callback
357*32cad1ffSPhilippe Mathieu-Daudé  *
358*32cad1ffSPhilippe Mathieu-Daudé  * Create a session for symmetric/asymmetric algorithms
359*32cad1ffSPhilippe Mathieu-Daudé  *
360*32cad1ffSPhilippe Mathieu-Daudé  * Returns: 0 for success and cb will be called when creation is completed,
361*32cad1ffSPhilippe Mathieu-Daudé  * negative value for error, and cb will not be called.
362*32cad1ffSPhilippe Mathieu-Daudé  */
363*32cad1ffSPhilippe Mathieu-Daudé int cryptodev_backend_create_session(
364*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevBackend *backend,
365*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevBackendSessionInfo *sess_info,
366*32cad1ffSPhilippe Mathieu-Daudé            uint32_t queue_index,
367*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevCompletionFunc cb,
368*32cad1ffSPhilippe Mathieu-Daudé            void *opaque);
369*32cad1ffSPhilippe Mathieu-Daudé 
370*32cad1ffSPhilippe Mathieu-Daudé /**
371*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_close_session:
372*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
373*32cad1ffSPhilippe Mathieu-Daudé  * @session_id: the session id
374*32cad1ffSPhilippe Mathieu-Daudé  * @queue_index: queue index of cryptodev backend client
375*32cad1ffSPhilippe Mathieu-Daudé  * @errp: pointer to a NULL-initialized error object
376*32cad1ffSPhilippe Mathieu-Daudé  * @cb: callback when session create is compeleted
377*32cad1ffSPhilippe Mathieu-Daudé  * @opaque: parameter passed to callback
378*32cad1ffSPhilippe Mathieu-Daudé  *
379*32cad1ffSPhilippe Mathieu-Daudé  * Close a session for which was previously
380*32cad1ffSPhilippe Mathieu-Daudé  * created by cryptodev_backend_create_session()
381*32cad1ffSPhilippe Mathieu-Daudé  *
382*32cad1ffSPhilippe Mathieu-Daudé  * Returns: 0 for success and cb will be called when creation is completed,
383*32cad1ffSPhilippe Mathieu-Daudé  * negative value for error, and cb will not be called.
384*32cad1ffSPhilippe Mathieu-Daudé  */
385*32cad1ffSPhilippe Mathieu-Daudé int cryptodev_backend_close_session(
386*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevBackend *backend,
387*32cad1ffSPhilippe Mathieu-Daudé            uint64_t session_id,
388*32cad1ffSPhilippe Mathieu-Daudé            uint32_t queue_index,
389*32cad1ffSPhilippe Mathieu-Daudé            CryptoDevCompletionFunc cb,
390*32cad1ffSPhilippe Mathieu-Daudé            void *opaque);
391*32cad1ffSPhilippe Mathieu-Daudé 
392*32cad1ffSPhilippe Mathieu-Daudé /**
393*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_crypto_operation:
394*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
395*32cad1ffSPhilippe Mathieu-Daudé  * @op_info: pointer to a CryptoDevBackendOpInfo object
396*32cad1ffSPhilippe Mathieu-Daudé  *
397*32cad1ffSPhilippe Mathieu-Daudé  * Do crypto operation, such as encryption, decryption, signature and
398*32cad1ffSPhilippe Mathieu-Daudé  * verification
399*32cad1ffSPhilippe Mathieu-Daudé  *
400*32cad1ffSPhilippe Mathieu-Daudé  * Returns: 0 for success and cb will be called when creation is completed,
401*32cad1ffSPhilippe Mathieu-Daudé  * negative value for error, and cb will not be called.
402*32cad1ffSPhilippe Mathieu-Daudé  */
403*32cad1ffSPhilippe Mathieu-Daudé int cryptodev_backend_crypto_operation(
404*32cad1ffSPhilippe Mathieu-Daudé                  CryptoDevBackend *backend,
405*32cad1ffSPhilippe Mathieu-Daudé                  CryptoDevBackendOpInfo *op_info);
406*32cad1ffSPhilippe Mathieu-Daudé 
407*32cad1ffSPhilippe Mathieu-Daudé /**
408*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_set_used:
409*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
410*32cad1ffSPhilippe Mathieu-Daudé  * @used: true or false
411*32cad1ffSPhilippe Mathieu-Daudé  *
412*32cad1ffSPhilippe Mathieu-Daudé  * Set the cryptodev backend is used by virtio-crypto or not
413*32cad1ffSPhilippe Mathieu-Daudé  */
414*32cad1ffSPhilippe Mathieu-Daudé void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used);
415*32cad1ffSPhilippe Mathieu-Daudé 
416*32cad1ffSPhilippe Mathieu-Daudé /**
417*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_is_used:
418*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
419*32cad1ffSPhilippe Mathieu-Daudé  *
420*32cad1ffSPhilippe Mathieu-Daudé  * Return the status that the cryptodev backend is used
421*32cad1ffSPhilippe Mathieu-Daudé  * by virtio-crypto or not
422*32cad1ffSPhilippe Mathieu-Daudé  *
423*32cad1ffSPhilippe Mathieu-Daudé  * Returns: true on used, or false on not used
424*32cad1ffSPhilippe Mathieu-Daudé  */
425*32cad1ffSPhilippe Mathieu-Daudé bool cryptodev_backend_is_used(CryptoDevBackend *backend);
426*32cad1ffSPhilippe Mathieu-Daudé 
427*32cad1ffSPhilippe Mathieu-Daudé /**
428*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_set_ready:
429*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
430*32cad1ffSPhilippe Mathieu-Daudé  * @ready: true or false
431*32cad1ffSPhilippe Mathieu-Daudé  *
432*32cad1ffSPhilippe Mathieu-Daudé  * Set the cryptodev backend is ready or not, which is called
433*32cad1ffSPhilippe Mathieu-Daudé  * by the children of the cryptodev banckend interface.
434*32cad1ffSPhilippe Mathieu-Daudé  */
435*32cad1ffSPhilippe Mathieu-Daudé void cryptodev_backend_set_ready(CryptoDevBackend *backend, bool ready);
436*32cad1ffSPhilippe Mathieu-Daudé 
437*32cad1ffSPhilippe Mathieu-Daudé /**
438*32cad1ffSPhilippe Mathieu-Daudé  * cryptodev_backend_is_ready:
439*32cad1ffSPhilippe Mathieu-Daudé  * @backend: the cryptodev backend object
440*32cad1ffSPhilippe Mathieu-Daudé  *
441*32cad1ffSPhilippe Mathieu-Daudé  * Return the status that the cryptodev backend is ready or not
442*32cad1ffSPhilippe Mathieu-Daudé  *
443*32cad1ffSPhilippe Mathieu-Daudé  * Returns: true on ready, or false on not ready
444*32cad1ffSPhilippe Mathieu-Daudé  */
445*32cad1ffSPhilippe Mathieu-Daudé bool cryptodev_backend_is_ready(CryptoDevBackend *backend);
446*32cad1ffSPhilippe Mathieu-Daudé 
447*32cad1ffSPhilippe Mathieu-Daudé #endif /* CRYPTODEV_H */
448