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