1 #ifndef _VIRTIO_CRYPTO_H
2 #define _VIRTIO_CRYPTO_H
3 /* This header is BSD licensed so anyone can use the definitions to implement
4  * compatible drivers/servers.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. Neither the name of IBM nor the names of its contributors
15  *    may be used to endorse or promote products derived from this software
16  *    without specific prior written permission.
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
27  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  */
30 #include "standard-headers/linux/types.h"
31 #include "standard-headers/linux/virtio_types.h"
32 #include "standard-headers/linux/virtio_ids.h"
33 #include "standard-headers/linux/virtio_config.h"
34 
35 
36 #define VIRTIO_CRYPTO_SERVICE_CIPHER 0
37 #define VIRTIO_CRYPTO_SERVICE_HASH   1
38 #define VIRTIO_CRYPTO_SERVICE_MAC    2
39 #define VIRTIO_CRYPTO_SERVICE_AEAD   3
40 #define VIRTIO_CRYPTO_SERVICE_AKCIPHER 4
41 
42 #define VIRTIO_CRYPTO_OPCODE(service, op)   (((service) << 8) | (op))
43 
44 struct virtio_crypto_ctrl_header {
45 #define VIRTIO_CRYPTO_CIPHER_CREATE_SESSION \
46 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_CIPHER, 0x02)
47 #define VIRTIO_CRYPTO_CIPHER_DESTROY_SESSION \
48 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_CIPHER, 0x03)
49 #define VIRTIO_CRYPTO_HASH_CREATE_SESSION \
50 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_HASH, 0x02)
51 #define VIRTIO_CRYPTO_HASH_DESTROY_SESSION \
52 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_HASH, 0x03)
53 #define VIRTIO_CRYPTO_MAC_CREATE_SESSION \
54 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_MAC, 0x02)
55 #define VIRTIO_CRYPTO_MAC_DESTROY_SESSION \
56 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_MAC, 0x03)
57 #define VIRTIO_CRYPTO_AEAD_CREATE_SESSION \
58 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AEAD, 0x02)
59 #define VIRTIO_CRYPTO_AEAD_DESTROY_SESSION \
60 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AEAD, 0x03)
61 #define VIRTIO_CRYPTO_AKCIPHER_CREATE_SESSION \
62 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x04)
63 #define VIRTIO_CRYPTO_AKCIPHER_DESTROY_SESSION \
64 	   VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x05)
65 	uint32_t opcode;
66 	uint32_t algo;
67 	uint32_t flag;
68 	/* data virtqueue id */
69 	uint32_t queue_id;
70 };
71 
72 struct virtio_crypto_cipher_session_para {
73 #define VIRTIO_CRYPTO_NO_CIPHER                 0
74 #define VIRTIO_CRYPTO_CIPHER_ARC4               1
75 #define VIRTIO_CRYPTO_CIPHER_AES_ECB            2
76 #define VIRTIO_CRYPTO_CIPHER_AES_CBC            3
77 #define VIRTIO_CRYPTO_CIPHER_AES_CTR            4
78 #define VIRTIO_CRYPTO_CIPHER_DES_ECB            5
79 #define VIRTIO_CRYPTO_CIPHER_DES_CBC            6
80 #define VIRTIO_CRYPTO_CIPHER_3DES_ECB           7
81 #define VIRTIO_CRYPTO_CIPHER_3DES_CBC           8
82 #define VIRTIO_CRYPTO_CIPHER_3DES_CTR           9
83 #define VIRTIO_CRYPTO_CIPHER_KASUMI_F8          10
84 #define VIRTIO_CRYPTO_CIPHER_SNOW3G_UEA2        11
85 #define VIRTIO_CRYPTO_CIPHER_AES_F8             12
86 #define VIRTIO_CRYPTO_CIPHER_AES_XTS            13
87 #define VIRTIO_CRYPTO_CIPHER_ZUC_EEA3           14
88 	uint32_t algo;
89 	/* length of key */
90 	uint32_t keylen;
91 
92 #define VIRTIO_CRYPTO_OP_ENCRYPT  1
93 #define VIRTIO_CRYPTO_OP_DECRYPT  2
94 	/* encrypt or decrypt */
95 	uint32_t op;
96 	uint32_t padding;
97 };
98 
99 struct virtio_crypto_session_input {
100 	/* Device-writable part */
101 	uint64_t session_id;
102 	uint32_t status;
103 	uint32_t padding;
104 };
105 
106 struct virtio_crypto_cipher_session_req {
107 	struct virtio_crypto_cipher_session_para para;
108 	uint8_t padding[32];
109 };
110 
111 struct virtio_crypto_hash_session_para {
112 #define VIRTIO_CRYPTO_NO_HASH            0
113 #define VIRTIO_CRYPTO_HASH_MD5           1
114 #define VIRTIO_CRYPTO_HASH_SHA1          2
115 #define VIRTIO_CRYPTO_HASH_SHA_224       3
116 #define VIRTIO_CRYPTO_HASH_SHA_256       4
117 #define VIRTIO_CRYPTO_HASH_SHA_384       5
118 #define VIRTIO_CRYPTO_HASH_SHA_512       6
119 #define VIRTIO_CRYPTO_HASH_SHA3_224      7
120 #define VIRTIO_CRYPTO_HASH_SHA3_256      8
121 #define VIRTIO_CRYPTO_HASH_SHA3_384      9
122 #define VIRTIO_CRYPTO_HASH_SHA3_512      10
123 #define VIRTIO_CRYPTO_HASH_SHA3_SHAKE128      11
124 #define VIRTIO_CRYPTO_HASH_SHA3_SHAKE256      12
125 	uint32_t algo;
126 	/* hash result length */
127 	uint32_t hash_result_len;
128 	uint8_t padding[8];
129 };
130 
131 struct virtio_crypto_hash_create_session_req {
132 	struct virtio_crypto_hash_session_para para;
133 	uint8_t padding[40];
134 };
135 
136 struct virtio_crypto_mac_session_para {
137 #define VIRTIO_CRYPTO_NO_MAC                       0
138 #define VIRTIO_CRYPTO_MAC_HMAC_MD5                 1
139 #define VIRTIO_CRYPTO_MAC_HMAC_SHA1                2
140 #define VIRTIO_CRYPTO_MAC_HMAC_SHA_224             3
141 #define VIRTIO_CRYPTO_MAC_HMAC_SHA_256             4
142 #define VIRTIO_CRYPTO_MAC_HMAC_SHA_384             5
143 #define VIRTIO_CRYPTO_MAC_HMAC_SHA_512             6
144 #define VIRTIO_CRYPTO_MAC_CMAC_3DES                25
145 #define VIRTIO_CRYPTO_MAC_CMAC_AES                 26
146 #define VIRTIO_CRYPTO_MAC_KASUMI_F9                27
147 #define VIRTIO_CRYPTO_MAC_SNOW3G_UIA2              28
148 #define VIRTIO_CRYPTO_MAC_GMAC_AES                 41
149 #define VIRTIO_CRYPTO_MAC_GMAC_TWOFISH             42
150 #define VIRTIO_CRYPTO_MAC_CBCMAC_AES               49
151 #define VIRTIO_CRYPTO_MAC_CBCMAC_KASUMI_F9         50
152 #define VIRTIO_CRYPTO_MAC_XCBC_AES                 53
153 	uint32_t algo;
154 	/* hash result length */
155 	uint32_t hash_result_len;
156 	/* length of authenticated key */
157 	uint32_t auth_key_len;
158 	uint32_t padding;
159 };
160 
161 struct virtio_crypto_mac_create_session_req {
162 	struct virtio_crypto_mac_session_para para;
163 	uint8_t padding[40];
164 };
165 
166 struct virtio_crypto_aead_session_para {
167 #define VIRTIO_CRYPTO_NO_AEAD     0
168 #define VIRTIO_CRYPTO_AEAD_GCM    1
169 #define VIRTIO_CRYPTO_AEAD_CCM    2
170 #define VIRTIO_CRYPTO_AEAD_CHACHA20_POLY1305  3
171 	uint32_t algo;
172 	/* length of key */
173 	uint32_t key_len;
174 	/* hash result length */
175 	uint32_t hash_result_len;
176 	/* length of the additional authenticated data (AAD) in bytes */
177 	uint32_t aad_len;
178 	/* encrypt or decrypt, See above VIRTIO_CRYPTO_OP_* */
179 	uint32_t op;
180 	uint32_t padding;
181 };
182 
183 struct virtio_crypto_aead_create_session_req {
184 	struct virtio_crypto_aead_session_para para;
185 	uint8_t padding[32];
186 };
187 
188 struct virtio_crypto_rsa_session_para {
189 #define VIRTIO_CRYPTO_RSA_RAW_PADDING   0
190 #define VIRTIO_CRYPTO_RSA_PKCS1_PADDING 1
191 	uint32_t padding_algo;
192 
193 #define VIRTIO_CRYPTO_RSA_NO_HASH   0
194 #define VIRTIO_CRYPTO_RSA_MD2       1
195 #define VIRTIO_CRYPTO_RSA_MD3       2
196 #define VIRTIO_CRYPTO_RSA_MD4       3
197 #define VIRTIO_CRYPTO_RSA_MD5       4
198 #define VIRTIO_CRYPTO_RSA_SHA1      5
199 #define VIRTIO_CRYPTO_RSA_SHA256    6
200 #define VIRTIO_CRYPTO_RSA_SHA384    7
201 #define VIRTIO_CRYPTO_RSA_SHA512    8
202 #define VIRTIO_CRYPTO_RSA_SHA224    9
203 	uint32_t hash_algo;
204 };
205 
206 struct virtio_crypto_ecdsa_session_para {
207 #define VIRTIO_CRYPTO_CURVE_UNKNOWN   0
208 #define VIRTIO_CRYPTO_CURVE_NIST_P192 1
209 #define VIRTIO_CRYPTO_CURVE_NIST_P224 2
210 #define VIRTIO_CRYPTO_CURVE_NIST_P256 3
211 #define VIRTIO_CRYPTO_CURVE_NIST_P384 4
212 #define VIRTIO_CRYPTO_CURVE_NIST_P521 5
213 	uint32_t curve_id;
214 	uint32_t padding;
215 };
216 
217 struct virtio_crypto_akcipher_session_para {
218 #define VIRTIO_CRYPTO_NO_AKCIPHER    0
219 #define VIRTIO_CRYPTO_AKCIPHER_RSA   1
220 #define VIRTIO_CRYPTO_AKCIPHER_DSA   2
221 #define VIRTIO_CRYPTO_AKCIPHER_ECDSA 3
222 	uint32_t algo;
223 
224 #define VIRTIO_CRYPTO_AKCIPHER_KEY_TYPE_PUBLIC  1
225 #define VIRTIO_CRYPTO_AKCIPHER_KEY_TYPE_PRIVATE 2
226 	uint32_t keytype;
227 	uint32_t keylen;
228 
229 	union {
230 		struct virtio_crypto_rsa_session_para rsa;
231 		struct virtio_crypto_ecdsa_session_para ecdsa;
232 	} u;
233 };
234 
235 struct virtio_crypto_akcipher_create_session_req {
236 	struct virtio_crypto_akcipher_session_para para;
237 	uint8_t padding[36];
238 };
239 
240 struct virtio_crypto_alg_chain_session_para {
241 #define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER  1
242 #define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH  2
243 	uint32_t alg_chain_order;
244 /* Plain hash */
245 #define VIRTIO_CRYPTO_SYM_HASH_MODE_PLAIN    1
246 /* Authenticated hash (mac) */
247 #define VIRTIO_CRYPTO_SYM_HASH_MODE_AUTH     2
248 /* Nested hash */
249 #define VIRTIO_CRYPTO_SYM_HASH_MODE_NESTED   3
250 	uint32_t hash_mode;
251 	struct virtio_crypto_cipher_session_para cipher_param;
252 	union {
253 		struct virtio_crypto_hash_session_para hash_param;
254 		struct virtio_crypto_mac_session_para mac_param;
255 		uint8_t padding[16];
256 	} u;
257 	/* length of the additional authenticated data (AAD) in bytes */
258 	uint32_t aad_len;
259 	uint32_t padding;
260 };
261 
262 struct virtio_crypto_alg_chain_session_req {
263 	struct virtio_crypto_alg_chain_session_para para;
264 };
265 
266 struct virtio_crypto_sym_create_session_req {
267 	union {
268 		struct virtio_crypto_cipher_session_req cipher;
269 		struct virtio_crypto_alg_chain_session_req chain;
270 		uint8_t padding[48];
271 	} u;
272 
273 	/* Device-readable part */
274 
275 /* No operation */
276 #define VIRTIO_CRYPTO_SYM_OP_NONE  0
277 /* Cipher only operation on the data */
278 #define VIRTIO_CRYPTO_SYM_OP_CIPHER  1
279 /*
280  * Chain any cipher with any hash or mac operation. The order
281  * depends on the value of alg_chain_order param
282  */
283 #define VIRTIO_CRYPTO_SYM_OP_ALGORITHM_CHAINING  2
284 	uint32_t op_type;
285 	uint32_t padding;
286 };
287 
288 struct virtio_crypto_destroy_session_req {
289 	/* Device-readable part */
290 	uint64_t  session_id;
291 	uint8_t padding[48];
292 };
293 
294 /* The request of the control virtqueue's packet */
295 struct virtio_crypto_op_ctrl_req {
296 	struct virtio_crypto_ctrl_header header;
297 
298 	union {
299 		struct virtio_crypto_sym_create_session_req
300 			sym_create_session;
301 		struct virtio_crypto_hash_create_session_req
302 			hash_create_session;
303 		struct virtio_crypto_mac_create_session_req
304 			mac_create_session;
305 		struct virtio_crypto_aead_create_session_req
306 			aead_create_session;
307 		struct virtio_crypto_akcipher_create_session_req
308 			akcipher_create_session;
309 		struct virtio_crypto_destroy_session_req
310 			destroy_session;
311 		uint8_t padding[56];
312 	} u;
313 };
314 
315 struct virtio_crypto_op_header {
316 #define VIRTIO_CRYPTO_CIPHER_ENCRYPT \
317 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_CIPHER, 0x00)
318 #define VIRTIO_CRYPTO_CIPHER_DECRYPT \
319 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_CIPHER, 0x01)
320 #define VIRTIO_CRYPTO_HASH \
321 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_HASH, 0x00)
322 #define VIRTIO_CRYPTO_MAC \
323 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_MAC, 0x00)
324 #define VIRTIO_CRYPTO_AEAD_ENCRYPT \
325 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AEAD, 0x00)
326 #define VIRTIO_CRYPTO_AEAD_DECRYPT \
327 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AEAD, 0x01)
328 #define VIRTIO_CRYPTO_AKCIPHER_ENCRYPT \
329 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x00)
330 #define VIRTIO_CRYPTO_AKCIPHER_DECRYPT \
331 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x01)
332 #define VIRTIO_CRYPTO_AKCIPHER_SIGN \
333 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x02)
334 #define VIRTIO_CRYPTO_AKCIPHER_VERIFY \
335 	VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_SERVICE_AKCIPHER, 0x03)
336 	uint32_t opcode;
337 	/* algo should be service-specific algorithms */
338 	uint32_t algo;
339 	/* session_id should be service-specific algorithms */
340 	uint64_t session_id;
341 	/* control flag to control the request */
342 	uint32_t flag;
343 	uint32_t padding;
344 };
345 
346 struct virtio_crypto_cipher_para {
347 	/*
348 	 * Byte Length of valid IV/Counter
349 	 *
350 	 * For block ciphers in CBC or F8 mode, or for Kasumi in F8 mode, or for
351 	 *   SNOW3G in UEA2 mode, this is the length of the IV (which
352 	 *   must be the same as the block length of the cipher).
353 	 * For block ciphers in CTR mode, this is the length of the counter
354 	 *   (which must be the same as the block length of the cipher).
355 	 * For AES-XTS, this is the 128bit tweak, i, from IEEE Std 1619-2007.
356 	 *
357 	 * The IV/Counter will be updated after every partial cryptographic
358 	 * operation.
359 	 */
360 	uint32_t iv_len;
361 	/* length of source data */
362 	uint32_t src_data_len;
363 	/* length of dst data */
364 	uint32_t dst_data_len;
365 	uint32_t padding;
366 };
367 
368 struct virtio_crypto_hash_para {
369 	/* length of source data */
370 	uint32_t src_data_len;
371 	/* hash result length */
372 	uint32_t hash_result_len;
373 };
374 
375 struct virtio_crypto_mac_para {
376 	struct virtio_crypto_hash_para hash;
377 };
378 
379 struct virtio_crypto_aead_para {
380 	/*
381 	 * Byte Length of valid IV data pointed to by the below iv_addr
382 	 * parameter.
383 	 *
384 	 * For GCM mode, this is either 12 (for 96-bit IVs) or 16, in which
385 	 *   case iv_addr points to J0.
386 	 * For CCM mode, this is the length of the nonce, which can be in the
387 	 *   range 7 to 13 inclusive.
388 	 */
389 	uint32_t iv_len;
390 	/* length of additional auth data */
391 	uint32_t aad_len;
392 	/* length of source data */
393 	uint32_t src_data_len;
394 	/* length of dst data */
395 	uint32_t dst_data_len;
396 };
397 
398 struct virtio_crypto_cipher_data_req {
399 	/* Device-readable part */
400 	struct virtio_crypto_cipher_para para;
401 	uint8_t padding[24];
402 };
403 
404 struct virtio_crypto_hash_data_req {
405 	/* Device-readable part */
406 	struct virtio_crypto_hash_para para;
407 	uint8_t padding[40];
408 };
409 
410 struct virtio_crypto_mac_data_req {
411 	/* Device-readable part */
412 	struct virtio_crypto_mac_para para;
413 	uint8_t padding[40];
414 };
415 
416 struct virtio_crypto_alg_chain_data_para {
417 	uint32_t iv_len;
418 	/* Length of source data */
419 	uint32_t src_data_len;
420 	/* Length of destination data */
421 	uint32_t dst_data_len;
422 	/* Starting point for cipher processing in source data */
423 	uint32_t cipher_start_src_offset;
424 	/* Length of the source data that the cipher will be computed on */
425 	uint32_t len_to_cipher;
426 	/* Starting point for hash processing in source data */
427 	uint32_t hash_start_src_offset;
428 	/* Length of the source data that the hash will be computed on */
429 	uint32_t len_to_hash;
430 	/* Length of the additional auth data */
431 	uint32_t aad_len;
432 	/* Length of the hash result */
433 	uint32_t hash_result_len;
434 	uint32_t reserved;
435 };
436 
437 struct virtio_crypto_alg_chain_data_req {
438 	/* Device-readable part */
439 	struct virtio_crypto_alg_chain_data_para para;
440 };
441 
442 struct virtio_crypto_sym_data_req {
443 	union {
444 		struct virtio_crypto_cipher_data_req cipher;
445 		struct virtio_crypto_alg_chain_data_req chain;
446 		uint8_t padding[40];
447 	} u;
448 
449 	/* See above VIRTIO_CRYPTO_SYM_OP_* */
450 	uint32_t op_type;
451 	uint32_t padding;
452 };
453 
454 struct virtio_crypto_aead_data_req {
455 	/* Device-readable part */
456 	struct virtio_crypto_aead_para para;
457 	uint8_t padding[32];
458 };
459 
460 struct virtio_crypto_akcipher_para {
461 	uint32_t src_data_len;
462 	uint32_t dst_data_len;
463 };
464 
465 struct virtio_crypto_akcipher_data_req {
466 	struct virtio_crypto_akcipher_para para;
467 	uint8_t padding[40];
468 };
469 
470 /* The request of the data virtqueue's packet */
471 struct virtio_crypto_op_data_req {
472 	struct virtio_crypto_op_header header;
473 
474 	union {
475 		struct virtio_crypto_sym_data_req  sym_req;
476 		struct virtio_crypto_hash_data_req hash_req;
477 		struct virtio_crypto_mac_data_req mac_req;
478 		struct virtio_crypto_aead_data_req aead_req;
479 		struct virtio_crypto_akcipher_data_req akcipher_req;
480 		uint8_t padding[48];
481 	} u;
482 };
483 
484 #define VIRTIO_CRYPTO_OK        0
485 #define VIRTIO_CRYPTO_ERR       1
486 #define VIRTIO_CRYPTO_BADMSG    2
487 #define VIRTIO_CRYPTO_NOTSUPP   3
488 #define VIRTIO_CRYPTO_INVSESS   4 /* Invalid session id */
489 #define VIRTIO_CRYPTO_NOSPC     5 /* no free session ID */
490 #define VIRTIO_CRYPTO_KEY_REJECTED 6 /* Signature verification failed */
491 
492 /* The accelerator hardware is ready */
493 #define VIRTIO_CRYPTO_S_HW_READY  (1 << 0)
494 
495 struct virtio_crypto_config {
496 	/* See VIRTIO_CRYPTO_OP_* above */
497 	uint32_t  status;
498 
499 	/*
500 	 * Maximum number of data queue
501 	 */
502 	uint32_t  max_dataqueues;
503 
504 	/*
505 	 * Specifies the services mask which the device support,
506 	 * see VIRTIO_CRYPTO_SERVICE_* above
507 	 */
508 	uint32_t crypto_services;
509 
510 	/* Detailed algorithms mask */
511 	uint32_t cipher_algo_l;
512 	uint32_t cipher_algo_h;
513 	uint32_t hash_algo;
514 	uint32_t mac_algo_l;
515 	uint32_t mac_algo_h;
516 	uint32_t aead_algo;
517 	/* Maximum length of cipher key */
518 	uint32_t max_cipher_key_len;
519 	/* Maximum length of authenticated key */
520 	uint32_t max_auth_key_len;
521 	uint32_t akcipher_algo;
522 	/* Maximum size of each crypto request's content */
523 	uint64_t max_size;
524 };
525 
526 struct virtio_crypto_inhdr {
527 	/* See VIRTIO_CRYPTO_* above */
528 	uint8_t status;
529 };
530 #endif
531