> -----Original Message----- > From: Zeng, Xin [mailto:xin.z...@intel.com] > Sent: Monday, July 25, 2016 2:20 PM > To: Gonglei (Arei); virtio-...@lists.oasis-open.org; qemu-devel@nongnu.org > Cc: Hanweidong (Randy); Stefan Hajnoczi; Cornelia Huck; m...@redhat.com; > Lingli Deng; Jani Kokkonen; Luonengjun; Huangpeng (Peter); Zhoujian (jay, > Euler); chenshanxi 00222737; 'Ola liljed...@arm.com'; Varun Sethi > Subject: RE: [RFC v4] virtio-crypto specification > > > > On Monday, July 25, 2016 9:38 AM Gonglei (Arei) wrote: > > > > Hi Xin, > > > > > > > -----Original Message----- > > > From: Zeng, Xin [mailto:xin.z...@intel.com] > > > Sent: Friday, July 22, 2016 1:31 PM > > > To: Gonglei (Arei); virtio-...@lists.oasis-open.org; > > > qemu-devel@nongnu.org > > > Cc: Hanweidong (Randy); Stefan Hajnoczi; Cornelia Huck; > > > m...@redhat.com; Lingli Deng; Jani Kokkonen; Luonengjun; Huangpeng > > > (Peter); Zhoujian (jay, Euler); chenshanxi 00222737; 'Ola > > > liljed...@arm.com'; Varun Sethi > > > Subject: RE: [RFC v4] virtio-crypto specification > > > > > > On Friday, July 22, 2016 10:53 AM Gonglei (Arei) wrote: > > > > > > > > Hi Xin, > > > > > > > > Thank you so much for your great comments. > > > > I agree with you almostly except some trivial detals. > > > > Please see my below replies. > > > > > > > > And I'll submit V5 next week, and you can finish the asym algos > > > > parts if you like. > > > > Let's co-work to finish the virtio-crypto spec, shall we? > > > > > > > > > > That's great. > > > > > > > Regards, > > > > -Gonglei > > > > > > > > > > > > > -----Original Message----- > > > > > From: Zeng, Xin [mailto:xin.z...@intel.com] > > > > > Sent: Friday, July 22, 2016 8:48 AM > > > > > To: Gonglei (Arei); virtio-...@lists.oasis-open.org; qemu- > > > > de...@nongnu.org > > > > > Cc: Hanweidong (Randy); Stefan Hajnoczi; Cornelia Huck; > > > > > m...@redhat.com; Lingli Deng; Jani Kokkonen; Luonengjun; Huangpeng > > > > > (Peter); Zhoujian (jay, Euler); chenshanxi 00222737; 'Ola > > > > > liljed...@arm.com'; Varun Sethi > > > > > Subject: RE: [RFC v4] virtio-crypto specification > > > > > > > > > > On Sunday, June 26, 2016 5:35 PM, Gonglei (Arei) Wrote: > > > > > > Hi all, > > > > > > > > > > > > This is the specification (version 4) about a new virtio crypto > > > > > > device. > > > > > > > > > > > > > > > > In general, our comments around this proposal are listed below: > > > > > 1. Suggest to introduce crypto services into virtio crypto device. > > > > > The > > > > services > > > > > currently defined are CIPHER, MAC, HASH, AEAD, KDF, ASYM, > > PRIMITIVE. > > > > > > > > Yes, I agree, whether DRBG/NDRBG are included in PRIMITIVE service > > > > or not? > > > > If not, we'd better add another separate service. > > > > > > Yes, I think we can add these two into PRIMITIVE services. > > > > > > > > > > > > 2. Suggest to define a unified crypto request format that is > > > > > consisted of general header + service specific request, Where > > > > > 'general header' is for all crypto request, 'service specific > > > > > request' is composed of operation parameter + input data + output > > data in generally. > > > > > operation parameter is algorithm-specific parameters, input data > > > > > is the data should be operated , output data is the "operation > > > > > result + result buffer". > > > > > > > > > It makes sense. Good. > > > > > > > > > #define VIRTIO_CRYPTO_OPCODE(service, op) (((service)<<8) | (op)) > > > > > struct virtio_crypto_op_header { > > > > > #define VIRTIO_CRYPTO_CIPHER_ENCRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_CIPHER, 0x00) #define > > > > > VIRTIO_CRYPTO_CIPHER_DECRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_CIPHER, 0x01) #define > > > > > VIRTIO_CRYPTO_HASH > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_HASH, 0x00) #define > > > > > VIRTIO_CRYPTO_MAC > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_MAC, 0x00) > > > > > #define VIRTIO_CRYPTO_KDF > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_KDF, 0x00) > > #define > > > > > VIRTIO_CRYPTO_ASYM_KEY_GEN > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x00) #define > > > > > VIRTIO_CRYPTO_ASYM_KEY_EXCHG > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x01) #define > > > > > VIRTIO_CRYPTO_ASYM_SIGN > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x02) #define > > > > > VIRTIO_CRYPTO_ASYM_VERIFY > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x03) #define > > > > > VIRTIO_CRYPTO_ASYM_ENCRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x04) #define > > > > > VIRTIO_CRYPTO_ASYM_DECRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_ASYM, 0x05) #define > > > > > VIRTIO_CRYPTO_AEAD_ENCRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_AEAD, 0x00) #define > > > > > VIRTIO_CRYPTO_AEAD_DECRYPT > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_AEAD, 0x01) #define > > > > > VIRTIO_CRYPTO_PRIMITIVE > > > > > VIRTIO_CRYPTO_OPCODE(VIRTIO_CRYPTO_S_PRIMITIVE, 0x00) > > > > > u32 opcode; > > > > > u8 algo; /*service-specific algorithms*/ > > > > > u8 flag; /*control flag*/ > > > > > > > > We'd better add a U64 session_id property here for service-specific > > > > algorithms. > > > > > > > > > > Can we put session_id into parameter filed inside service-specific > > > request? > > > For ASYM service, it doesn't need session_id. > > > And for HASH service, it might not need a session_id as well. > > > > > I don't think so, the function of session_id property is the same with algo > > property here, It's also service-specific algorithms. We don't know which > > session_id we could use if we put the field inside request for chain- > > algorithms (chain cipher and mac). > > I do think alg is necessary for all crypto services, but some services use a > session > to maintain the algorithm information, and some don't because they needn't > session, e.g, asymmetric serves. > Anyway, I think it's ok to maintain this field in this header, but we should > clarify > how to fill this header clearly. :) > Sure.
> > > > For HASH service, I think we'd better keep corresponding with the mac hand > > cipher, using session for operation, which have the same functions and APIs > > too. > > > > > > > }; > > > > > > > > > > Take rsa_sign_request as example, > > > > > A rsa sign service specific request is defined as: > > > > > struct virtio_crypto_asym_rsa_sign_req{ > > > > > struct virtio_crypto_rsa_sign_para parameter; > > > > > struct virtio_crypto_rsa_sign_input idata; > > > > > struct virtio_crypto_rsa_sign_output odata; }; > > > > > > > > > > A complete crypto service request is defined as: > > > > > struct virtio_crypto_op_data_req { > > > > > struct virtio_crypto_op_header header; > > > > > union { > > > > > struct virtio_crypto_asym_rsa_sign_req > > > > > rsa_sign_req; > > > > > /*other service request*/ > > > > > }u; > > > > > }; > > > > > > > > > I wanted to do this in fact. ;) > > > > > > > > > More detailed comments are embedded below: > > > > > > > > > > > Changes from v3: > > > > > > - Don't use enum is the spec but macros in specific structures. > > > > > > [Michael > > > & > > > > > > Stefan] > > > > > > - Add two complete structures for session creation and closing, so > > that > > > > > > the spec is clear on how to lay out the request. [Stefan] > > > > > > - Definite the crypto operation request with assigned > > > > > > structure, in this > > > > way, > > > > > > each data request only occupies *one entry* of the Vring > > > > > > descriptor > > > > table, > > > > > > which *improves* the *throughput* of data transferring. > > > > > > > > > > > > Changes from v2: > > > > > > - Reserve virtio device ID 20 for crypto device. [Cornelia] > > > > > > - Drop all feature bits, those capabilities are offered by the > > > > > > device all the time. [Stefan & Cornelia] > > > > > > - Add a new section 1.4.2 for driver requirements. [Stefan] > > > > > > - Use definite type definition instead of enum type in some > > structure. > > > > > > [Stefan] > > > > > > - Add virtio_crypto_cipher_alg definition. [Stefan] > > > > > > - Add a "Device requirements" section as using MUST. [Stefan] > > > > > > - Some grammar nits fixes and typo fixes. [Stefan & Cornelia] > > > > > > - Add one VIRTIO_CRYPTO_S_STARTED status for the driver as the > > > > > > flag > > > of > > > > > > virtio-crypto device started and can work now. > > > > > > > > > > > > Great thanks for Stefan and Cornelia! > > > > > > > > > > > > Changes from v1: > > > > > > - Drop the feature bit definition for each algorithm, and using > > > > > > config > > > > space > > > > > > instead [Cornelia] > > > > > > - Add multiqueue support and add corresponding feature bit > > > > > > - Update Encryption process and header definition > > > > > > - Add session operation process and add corresponding header > > > > description > > > > > > - Other better description in order to fit for virtio spec > > > > > > [Michael] > > > > > > - Some other trivial fixes. > > > > > > > > > > > > If you have any comments, please let me know, thanks :) > > > > > > > > > > > > > > > > > > Virtio-crypto device Spec > > > > > > Signed-off-by: > > > > > > Gonglei <arei.gong...@huawei.com> > > > > > > > > > > > > 1 Crypto Device > > > > > > The virtio crypto device is a virtual crypto device (ie. > > > > > > hardware crypto accelerator card). The encryption and decryption > > > > > > requests of are placed > > > > in > > > > > > the data queue, and handled by the real hardware crypto > > > > > > accelerators > > > > finally. > > > > > > The second queue is the control queue, which is used to create > > > > > > or > > > > destroy > > > > > > session for symmetric algorithms, and to control some advanced > > > > > > features > > > > in > > > > > > the future. > > > > > > 1.1 Device ID > > > > > > 20 > > > > > > 1.2 Virtqueues > > > > > > 0 dataq > > > > > > … > > > > > > N-1 dataq > > > > > > N controlq > > > > > > N is set by max_virtqueues (max_virtqueues >= 1). > > > > > > 1.3 Feature bits > > > > > > There are no feature bits (yet). > > > > > > 1.4 Device configuration layout > > > > > > Three driver-read-only configuration fields are currently > > > > > > defined. One > > > > read- > > > > > > only bit (for the device) is currently defined for the status field: > > > > > > VIRTIO_CRYPTO_S_HW_READY. One read-only bit (for the driver) is > > > > currently > > > > > > defined for the status field: VIRTIO_CRYPTO_S_STARTED. > > > > > > #define VIRTIO_CRYPTO_S_HW_READY (1 << 0) #define > > > > > > VIRTIO_CRYPTO_S_STARTED (1 << 1) > > > > > > > > > > > > The following driver-read-only field, max_virtqueues specifies > > > > > > the > > > > maximum > > > > > > number of data virtqueues (dataq1. . .dataqN) . > > > > > > struct virtio_crypto_config { > > > > > > le16 status; > > > > > > le16 max_virtqueues; > > > > > > le32 algorithms; > > > > > > }; > > > > > > > > > > > > The last driver-read-only field, algorithms specifies the > > > > > > algorithms which > > > > the > > > > > > device offered. Two read-only bits (for the driver) are > > > > > > currently defined > > > > for > > > > > > the algorithms field: VIRTIO_CRYPTO_ALG_SYM and > > > > > > VIRTIO_CRYPTO_ALG_ASYM. > > > > > > #define VIRTIO_CRYPTO_ALG_SYM (1 << 0) #define > > > > > > VIRTIO_CRYPTO_ALG_ASYM (1 << 1) > > > > > > > > > > Suggest to change the virtio_crypto_config structure to following > > > structure > > > > to > > > > > define detail algorithms that the device supports in device > > > > > configuration > > > > field. > > > > > struct virtio_crypto_config { > > > > > le32 version; > > > > > le16 status; > > > > > le16 max_dataqueues; > > > > > #define VIRTIO_CRYPTO_S_CIPHER 0 /*cipher services*/ #define > > > > > VIRTIO_CRYPTO_S_HASH 1 /*hash service*/ #define > > > > > VIRTIO_CRYPTO_S_MAC 2 /*MAC(Message Authentication Codes) > > > > > service*/ #define VIRTIO_CRYPTO_S_AEAD 3 /* AEAD(Authenticated > > > > > Encryption > > > > with > > > > > Associated Data) service*/ > > > > > #define VIRTIO_CRYPTO_S_KDF 4 /*KDF(Key Derivation Functions) > > > > service*/ > > > > > #define VIRTIO_CRYPTO_S_ASYM 5 /*asymmetric service*/ #define > > > > > VIRTIO_CRYPTO_S_PRIMITIVE 6 /*Essential mathematics > > > > computing > > > > > service*/ > > > > > > > > I'd like to use s/ VIRTIO_CRYPTO_S_/ VIRTIO_CRYPTO_SERIVCE_/g, > > > > avoiding to conflict with VIRTIO_CRYPTO_SATAUS_ which all virtio > > > > spec always used. > > > > > > That's OK. > > > > > > > > > > > > le32 crypto_servcies; /*overall services mask*/ > > > > > /*detailed algorithms mask*/ > > > > > le32 cipher_algo_l; > > > > > le32 cipher_algo_h; > > > > > le32 hash_algo; > > > > > le32 mac_algo_l; > > > > > le32 mac_algo_h; > > > > > le32 asym_algo; > > > > > le32 kdf_algo; > > > > > le32 aead_algo; > > > > > le32 primitive_algo; > > > > > }; > > > > > > > > > > 15 bits are defined for cipher algorithms currently. > > > > > #define VIRTIO_CRYPTO_CIPHER_ARC4 0 > > > > > #define VIRTIO_CRYPTO_CIPHER_AES_ECB 1 > > > > > #define VIRTIO_CRYPTO_CIPHER_AES_CBC 2 > > > > > #define VIRTIO_CRYPTO_CIPHER_AES_CTR 3 > > > > > #define VIRTIO_CRYPTO_CIPHER_DES_ECB 6 > > > > > #define VIRTIO_CRYPTO_CIPHER_DES_CBC 7 > > > > > #define VIRTIO_CRYPTO_CIPHER_3DES_ECB 8 > > > > > #define VIRTIO_CRYPTO_CIPHER_3DES_CBC 9 > > > > > #define VIRTIO_CRYPTO_CIPHER_3DES_CTR 9 > > > > > #define VIRTIO_CRYPTO_CIPHER_KASUMI_F8 10 > > > > > #define VIRTIO_CRYPTO_CIPHER_SNOW3G_UEA2 11 > > > > > #define VIRTIO_CRYPTO_CIPHER_AES_F8 12 > > > > > #define VIRTIO_CRYPTO_CIPHER_AES_XTS 13 > > > > > #define VIRTIO_CRYPTO_CIPHER_ZUC_EEA3 14 > > > > > > > > > > 12 bits are defined for Hash algorithms currently. > > > > > #define VIRTIO_CRYPTO_HASH_MD5 0 > > > > > #define VIRTIO_CRYPTO_HASH_SHA1 1 > > > > > #define VIRTIO_CRYPTO_HASH_SHA_224 2 > > > > > #define VIRTIO_CRYPTO_HASH_SHA_256 3 > > > > > #define VIRTIO_CRYPTO_HASH_SHA_384 4 > > > > > #define VIRTIO_CRYPTO_HASH_SHA_512 5 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_224 6 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_256 7 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_384 8 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_512 9 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_SHAKE128 10 > > > > > #define VIRTIO_CRYPTO_HASH_SHA3_SHAKE256 11 > > > > > > > > > > 15 bits are defined for MAC algorithms currently > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_MD5 0 > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_SHA1 1 > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_SHA_224 2 > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_SHA_256 3 > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_SHA_384 4 > > > > > #define VIRTIO_CRYPTO_MAC_HMAC_SHA_512 5 > > > > > #define VIRTIO_CRYPTO_MAC_CMAC_3DES 24 > > > > > > > > Why not 6 here? I'd like to keep increasing steadily, we can extend > > > > the value when some other algorithms are supported. > > > > > > The intension is to keep the same kind of algorithms into continuous > > > bits as possible as. > > > > > It's okay for your intension, but we can't predict how many HMACs or CMACs > > we will support, maybe 30, 40 in the future. So I think the reserve maybe > > not > > fit your initial purpose. It's better keeping increasing steadily IMHO. > > > > Why not try to make it as possible as? I don't see any harm here. > Ok, let's make it. Regards, Gonglei