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