531 lines · c
1#ifndef _VIRTIO_CRYPTO_H2#define _VIRTIO_CRYPTO_H3/* This header is BSD licensed so anyone can use the definitions to implement4 * compatible drivers/servers.5 *6 * Redistribution and use in source and binary forms, with or without7 * modification, are permitted provided that the following conditions8 * are met:9 * 1. Redistributions of source code must retain the above copyright10 * notice, this list of conditions and the following disclaimer.11 * 2. Redistributions in binary form must reproduce the above copyright12 * notice, this list of conditions and the following disclaimer in the13 * documentation and/or other materials provided with the distribution.14 * 3. Neither the name of IBM nor the names of its contributors15 * may be used to endorse or promote products derived from this software16 * without specific prior written permission.17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT27 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF28 * SUCH DAMAGE.29 */30#include <linux/types.h>31#include <linux/virtio_types.h>32#include <linux/virtio_ids.h>33#include <linux/virtio_config.h>34 35 36#define VIRTIO_CRYPTO_SERVICE_CIPHER 037#define VIRTIO_CRYPTO_SERVICE_HASH 138#define VIRTIO_CRYPTO_SERVICE_MAC 239#define VIRTIO_CRYPTO_SERVICE_AEAD 340#define VIRTIO_CRYPTO_SERVICE_AKCIPHER 441 42#define VIRTIO_CRYPTO_OPCODE(service, op) (((service) << 8) | (op))43 44struct 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 __le32 opcode;66 __le32 algo;67 __le32 flag;68 /* data virtqueue id */69 __le32 queue_id;70};71 72struct virtio_crypto_cipher_session_para {73#define VIRTIO_CRYPTO_NO_CIPHER 074#define VIRTIO_CRYPTO_CIPHER_ARC4 175#define VIRTIO_CRYPTO_CIPHER_AES_ECB 276#define VIRTIO_CRYPTO_CIPHER_AES_CBC 377#define VIRTIO_CRYPTO_CIPHER_AES_CTR 478#define VIRTIO_CRYPTO_CIPHER_DES_ECB 579#define VIRTIO_CRYPTO_CIPHER_DES_CBC 680#define VIRTIO_CRYPTO_CIPHER_3DES_ECB 781#define VIRTIO_CRYPTO_CIPHER_3DES_CBC 882#define VIRTIO_CRYPTO_CIPHER_3DES_CTR 983#define VIRTIO_CRYPTO_CIPHER_KASUMI_F8 1084#define VIRTIO_CRYPTO_CIPHER_SNOW3G_UEA2 1185#define VIRTIO_CRYPTO_CIPHER_AES_F8 1286#define VIRTIO_CRYPTO_CIPHER_AES_XTS 1387#define VIRTIO_CRYPTO_CIPHER_ZUC_EEA3 1488 __le32 algo;89 /* length of key */90 __le32 keylen;91 92#define VIRTIO_CRYPTO_OP_ENCRYPT 193#define VIRTIO_CRYPTO_OP_DECRYPT 294 /* encrypt or decrypt */95 __le32 op;96 __le32 padding;97};98 99struct virtio_crypto_session_input {100 /* Device-writable part */101 __le64 session_id;102 __le32 status;103 __le32 padding;104};105 106struct virtio_crypto_cipher_session_req {107 struct virtio_crypto_cipher_session_para para;108 __u8 padding[32];109};110 111struct virtio_crypto_hash_session_para {112#define VIRTIO_CRYPTO_NO_HASH 0113#define VIRTIO_CRYPTO_HASH_MD5 1114#define VIRTIO_CRYPTO_HASH_SHA1 2115#define VIRTIO_CRYPTO_HASH_SHA_224 3116#define VIRTIO_CRYPTO_HASH_SHA_256 4117#define VIRTIO_CRYPTO_HASH_SHA_384 5118#define VIRTIO_CRYPTO_HASH_SHA_512 6119#define VIRTIO_CRYPTO_HASH_SHA3_224 7120#define VIRTIO_CRYPTO_HASH_SHA3_256 8121#define VIRTIO_CRYPTO_HASH_SHA3_384 9122#define VIRTIO_CRYPTO_HASH_SHA3_512 10123#define VIRTIO_CRYPTO_HASH_SHA3_SHAKE128 11124#define VIRTIO_CRYPTO_HASH_SHA3_SHAKE256 12125 __le32 algo;126 /* hash result length */127 __le32 hash_result_len;128 __u8 padding[8];129};130 131struct virtio_crypto_hash_create_session_req {132 struct virtio_crypto_hash_session_para para;133 __u8 padding[40];134};135 136struct virtio_crypto_mac_session_para {137#define VIRTIO_CRYPTO_NO_MAC 0138#define VIRTIO_CRYPTO_MAC_HMAC_MD5 1139#define VIRTIO_CRYPTO_MAC_HMAC_SHA1 2140#define VIRTIO_CRYPTO_MAC_HMAC_SHA_224 3141#define VIRTIO_CRYPTO_MAC_HMAC_SHA_256 4142#define VIRTIO_CRYPTO_MAC_HMAC_SHA_384 5143#define VIRTIO_CRYPTO_MAC_HMAC_SHA_512 6144#define VIRTIO_CRYPTO_MAC_CMAC_3DES 25145#define VIRTIO_CRYPTO_MAC_CMAC_AES 26146#define VIRTIO_CRYPTO_MAC_KASUMI_F9 27147#define VIRTIO_CRYPTO_MAC_SNOW3G_UIA2 28148#define VIRTIO_CRYPTO_MAC_GMAC_AES 41149#define VIRTIO_CRYPTO_MAC_GMAC_TWOFISH 42150#define VIRTIO_CRYPTO_MAC_CBCMAC_AES 49151#define VIRTIO_CRYPTO_MAC_CBCMAC_KASUMI_F9 50152#define VIRTIO_CRYPTO_MAC_XCBC_AES 53153 __le32 algo;154 /* hash result length */155 __le32 hash_result_len;156 /* length of authenticated key */157 __le32 auth_key_len;158 __le32 padding;159};160 161struct virtio_crypto_mac_create_session_req {162 struct virtio_crypto_mac_session_para para;163 __u8 padding[40];164};165 166struct virtio_crypto_aead_session_para {167#define VIRTIO_CRYPTO_NO_AEAD 0168#define VIRTIO_CRYPTO_AEAD_GCM 1169#define VIRTIO_CRYPTO_AEAD_CCM 2170#define VIRTIO_CRYPTO_AEAD_CHACHA20_POLY1305 3171 __le32 algo;172 /* length of key */173 __le32 key_len;174 /* hash result length */175 __le32 hash_result_len;176 /* length of the additional authenticated data (AAD) in bytes */177 __le32 aad_len;178 /* encrypt or decrypt, See above VIRTIO_CRYPTO_OP_* */179 __le32 op;180 __le32 padding;181};182 183struct virtio_crypto_aead_create_session_req {184 struct virtio_crypto_aead_session_para para;185 __u8 padding[32];186};187 188struct virtio_crypto_rsa_session_para {189#define VIRTIO_CRYPTO_RSA_RAW_PADDING 0190#define VIRTIO_CRYPTO_RSA_PKCS1_PADDING 1191 __le32 padding_algo;192 193#define VIRTIO_CRYPTO_RSA_NO_HASH 0194#define VIRTIO_CRYPTO_RSA_MD2 1195#define VIRTIO_CRYPTO_RSA_MD3 2196#define VIRTIO_CRYPTO_RSA_MD4 3197#define VIRTIO_CRYPTO_RSA_MD5 4198#define VIRTIO_CRYPTO_RSA_SHA1 5199#define VIRTIO_CRYPTO_RSA_SHA256 6200#define VIRTIO_CRYPTO_RSA_SHA384 7201#define VIRTIO_CRYPTO_RSA_SHA512 8202#define VIRTIO_CRYPTO_RSA_SHA224 9203 __le32 hash_algo;204};205 206struct virtio_crypto_ecdsa_session_para {207#define VIRTIO_CRYPTO_CURVE_UNKNOWN 0208#define VIRTIO_CRYPTO_CURVE_NIST_P192 1209#define VIRTIO_CRYPTO_CURVE_NIST_P224 2210#define VIRTIO_CRYPTO_CURVE_NIST_P256 3211#define VIRTIO_CRYPTO_CURVE_NIST_P384 4212#define VIRTIO_CRYPTO_CURVE_NIST_P521 5213 __le32 curve_id;214 __le32 padding;215};216 217struct virtio_crypto_akcipher_session_para {218#define VIRTIO_CRYPTO_NO_AKCIPHER 0219#define VIRTIO_CRYPTO_AKCIPHER_RSA 1220#define VIRTIO_CRYPTO_AKCIPHER_DSA 2221#define VIRTIO_CRYPTO_AKCIPHER_ECDSA 3222 __le32 algo;223 224#define VIRTIO_CRYPTO_AKCIPHER_KEY_TYPE_PUBLIC 1225#define VIRTIO_CRYPTO_AKCIPHER_KEY_TYPE_PRIVATE 2226 __le32 keytype;227 __le32 keylen;228 229 union {230 struct virtio_crypto_rsa_session_para rsa;231 struct virtio_crypto_ecdsa_session_para ecdsa;232 } u;233};234 235struct virtio_crypto_akcipher_create_session_req {236 struct virtio_crypto_akcipher_session_para para;237 __u8 padding[36];238};239 240struct virtio_crypto_alg_chain_session_para {241#define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER 1242#define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH 2243 __le32 alg_chain_order;244/* Plain hash */245#define VIRTIO_CRYPTO_SYM_HASH_MODE_PLAIN 1246/* Authenticated hash (mac) */247#define VIRTIO_CRYPTO_SYM_HASH_MODE_AUTH 2248/* Nested hash */249#define VIRTIO_CRYPTO_SYM_HASH_MODE_NESTED 3250 __le32 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 __u8 padding[16];256 } u;257 /* length of the additional authenticated data (AAD) in bytes */258 __le32 aad_len;259 __le32 padding;260};261 262struct virtio_crypto_alg_chain_session_req {263 struct virtio_crypto_alg_chain_session_para para;264};265 266struct 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 __u8 padding[48];271 } u;272 273 /* Device-readable part */274 275/* No operation */276#define VIRTIO_CRYPTO_SYM_OP_NONE 0277/* Cipher only operation on the data */278#define VIRTIO_CRYPTO_SYM_OP_CIPHER 1279/*280 * Chain any cipher with any hash or mac operation. The order281 * depends on the value of alg_chain_order param282 */283#define VIRTIO_CRYPTO_SYM_OP_ALGORITHM_CHAINING 2284 __le32 op_type;285 __le32 padding;286};287 288struct virtio_crypto_destroy_session_req {289 /* Device-readable part */290 __le64 session_id;291 __u8 padding[48];292};293 294/* The request of the control virtqueue's packet */295struct virtio_crypto_op_ctrl_req {296 struct virtio_crypto_ctrl_header header;297 298 union {299 struct virtio_crypto_sym_create_session_req300 sym_create_session;301 struct virtio_crypto_hash_create_session_req302 hash_create_session;303 struct virtio_crypto_mac_create_session_req304 mac_create_session;305 struct virtio_crypto_aead_create_session_req306 aead_create_session;307 struct virtio_crypto_akcipher_create_session_req308 akcipher_create_session;309 struct virtio_crypto_destroy_session_req310 destroy_session;311 __u8 padding[56];312 } u;313};314 315struct 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 __le32 opcode;337 /* algo should be service-specific algorithms */338 __le32 algo;339 /* session_id should be service-specific algorithms */340 __le64 session_id;341 /* control flag to control the request */342 __le32 flag;343 __le32 padding;344};345 346struct virtio_crypto_cipher_para {347 /*348 * Byte Length of valid IV/Counter349 *350 * For block ciphers in CBC or F8 mode, or for Kasumi in F8 mode, or for351 * SNOW3G in UEA2 mode, this is the length of the IV (which352 * must be the same as the block length of the cipher).353 * For block ciphers in CTR mode, this is the length of the counter354 * (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 cryptographic358 * operation.359 */360 __le32 iv_len;361 /* length of source data */362 __le32 src_data_len;363 /* length of dst data */364 __le32 dst_data_len;365 __le32 padding;366};367 368struct virtio_crypto_hash_para {369 /* length of source data */370 __le32 src_data_len;371 /* hash result length */372 __le32 hash_result_len;373};374 375struct virtio_crypto_mac_para {376 struct virtio_crypto_hash_para hash;377};378 379struct virtio_crypto_aead_para {380 /*381 * Byte Length of valid IV data pointed to by the below iv_addr382 * parameter.383 *384 * For GCM mode, this is either 12 (for 96-bit IVs) or 16, in which385 * case iv_addr points to J0.386 * For CCM mode, this is the length of the nonce, which can be in the387 * range 7 to 13 inclusive.388 */389 __le32 iv_len;390 /* length of additional auth data */391 __le32 aad_len;392 /* length of source data */393 __le32 src_data_len;394 /* length of dst data */395 __le32 dst_data_len;396};397 398struct virtio_crypto_cipher_data_req {399 /* Device-readable part */400 struct virtio_crypto_cipher_para para;401 __u8 padding[24];402};403 404struct virtio_crypto_hash_data_req {405 /* Device-readable part */406 struct virtio_crypto_hash_para para;407 __u8 padding[40];408};409 410struct virtio_crypto_mac_data_req {411 /* Device-readable part */412 struct virtio_crypto_mac_para para;413 __u8 padding[40];414};415 416struct virtio_crypto_alg_chain_data_para {417 __le32 iv_len;418 /* Length of source data */419 __le32 src_data_len;420 /* Length of destination data */421 __le32 dst_data_len;422 /* Starting point for cipher processing in source data */423 __le32 cipher_start_src_offset;424 /* Length of the source data that the cipher will be computed on */425 __le32 len_to_cipher;426 /* Starting point for hash processing in source data */427 __le32 hash_start_src_offset;428 /* Length of the source data that the hash will be computed on */429 __le32 len_to_hash;430 /* Length of the additional auth data */431 __le32 aad_len;432 /* Length of the hash result */433 __le32 hash_result_len;434 __le32 reserved;435};436 437struct virtio_crypto_alg_chain_data_req {438 /* Device-readable part */439 struct virtio_crypto_alg_chain_data_para para;440};441 442struct 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 __u8 padding[40];447 } u;448 449 /* See above VIRTIO_CRYPTO_SYM_OP_* */450 __le32 op_type;451 __le32 padding;452};453 454struct virtio_crypto_aead_data_req {455 /* Device-readable part */456 struct virtio_crypto_aead_para para;457 __u8 padding[32];458};459 460struct virtio_crypto_akcipher_para {461 __le32 src_data_len;462 __le32 dst_data_len;463};464 465struct virtio_crypto_akcipher_data_req {466 struct virtio_crypto_akcipher_para para;467 __u8 padding[40];468};469 470/* The request of the data virtqueue's packet */471struct 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 __u8 padding[48];481 } u;482};483 484#define VIRTIO_CRYPTO_OK 0485#define VIRTIO_CRYPTO_ERR 1486#define VIRTIO_CRYPTO_BADMSG 2487#define VIRTIO_CRYPTO_NOTSUPP 3488#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 495struct virtio_crypto_config {496 /* See VIRTIO_CRYPTO_OP_* above */497 __le32 status;498 499 /*500 * Maximum number of data queue501 */502 __le32 max_dataqueues;503 504 /*505 * Specifies the services mask which the device support,506 * see VIRTIO_CRYPTO_SERVICE_* above507 */508 __le32 crypto_services;509 510 /* Detailed algorithms mask */511 __le32 cipher_algo_l;512 __le32 cipher_algo_h;513 __le32 hash_algo;514 __le32 mac_algo_l;515 __le32 mac_algo_h;516 __le32 aead_algo;517 /* Maximum length of cipher key */518 __le32 max_cipher_key_len;519 /* Maximum length of authenticated key */520 __le32 max_auth_key_len;521 __le32 akcipher_algo;522 /* Maximum size of each crypto request's content */523 __le64 max_size;524};525 526struct virtio_crypto_inhdr {527 /* See VIRTIO_CRYPTO_* above */528 __u8 status;529};530#endif531