[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v4] virtio-crypto specification
From: |
Gonglei (Arei) |
Subject: |
Re: [Qemu-devel] [RFC v4] virtio-crypto specification |
Date: |
Fri, 8 Jul 2016 07:27:59 +0000 |
Ping...
I'd like to know what's the process of a new virtio device can be merged?
Anybody can tell me? Thanks a lot.
Taking Virtio-gpu as an example, the virtio-gpu had been merged in Linux kernel
And Qemu communities, but the corresponding virtio-gpu spec hadn't been merged
yet. Why was that? Am I missing some rules? Thanks.
Regards,
-Gonglei
> -----Original Message-----
> From: Gonglei (Arei)
> Sent: Sunday, June 26, 2016 5:35 PM
> To: address@hidden; address@hidden; Gonglei (Arei)
> Cc: Hanweidong (Randy); Stefan Hajnoczi; Cornelia Huck; address@hidden;
> Lingli Deng; Jani Kokkonen; Luonengjun; Huangpeng (Peter); Zhoujian (jay,
> Euler); chenshanxi 00222737; 'Ola address@hidden'; Varun Sethi
> Subject: [RFC v4] virtio-crypto specification
>
> Hi all,
>
> This is the specification (version 4) about a new virtio crypto device.
>
> 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
> <address@hidden>
>
> 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)
> 1.4.1 Device Requirements: Device configuration layout
> The device MUST set max_virtqueues to between 1 and 65535 inclusive.
>
> The device SHOULD set status according to the status of the hardware-backed
> implementation.
>
> The device MUST set algorithms according to the algorithms which the device
> offered.
> 1.4.2 Driver Requirements: Device configuration layout
> The driver MUST read the ready status from the bottom bit of status to check
> whether the hardware-backed implementation is ready or not.
> The driver MUST read the algorithms to discover the algorithms which the
> device supports.
> 1.5 Device Initialization
> A driver would perform a typical initialization routine like so:
> 1. Identify and initialize data virtqueue, up to max_virtqueues.
> 2. Identify the control virtqueue.
> 3. Identify the ready status of hardware-backend comes from the bottom bit of
> status.
> 4. Read the supported algorithms from bits of algorithms.
> 1.6 Device Operation
> 1.6.1 Session operation
> The symmetric algorithms have the concept of sessions. A session is a handle
> which describes the
> cryptographic parameters to be applied to a number of buffers. The data within
> a session handle includes the following:
> •1. The operation (cipher, hash or both, and if both, the order in which the
> algorithms should be applied).
> •2. The cipher setup data, including the cipher algorithm and mode, the key
> and its length, and the direction (encrypt or decrypt).
> •3. The hash setup data, including the hash algorithm, mode (plain, nested or
> authenticated), and digest result length (to allow for truncation).
> Authenticated mode can refer to HMAC, which requires that the key and
> its length are also specified. It is also used for GCM and CCM authenticated
> encryption, in which case the AAD length is also specified.
> For nested mode, the inner and outer prefix data and length are
> specified, as well as the outer hash algorithm.
>
> The controlq virtqueue is used to control session operations, including
> creation
> or close. The request is preceded by a header:
> struct virtio_crypto_sym_ctlhdr {
> /* control type */
> u8 type;
> };
> Two bits are currently defined for the control header type:
> #define VIRTIO_CRYPTO_CTRL_CREATE_SESSION 1
> #define VIRTIO_CRYPTO_CTRL_CLOSE_SESSION 2
>
> 1.6.1.1 Session creation operation
> A request of creating a session including the following information:
> struct virtio_crypto_sym_session_creation {
> struct virtio_crypto_sym_ctlhdr ctlhdr; /* OUT */
> struct virtio_crypto_sym_session_op session_op; /* OUT */
> struct virtio_crypto_sym_session_op_inhdr inhdr; /* IN */
> };
> The details of specific structure, including struct
> virtio_crypto_sym_session_op
> and struct virtio_crypto_sym_session_op_inhdr are defined by the following
> sections.
> 1.6.1.1.1 Driver Requirements: Session creation operation
> The driver MUST set the control type with
> VIRTIO_CRYPTO_CTRL_CREATE_SESSION before the request is preceded by an
> operation header when executing session creation:
> typedef struct virtio_crypto_sym_session_op {
> /**< No operation */
> #define VIRTIO_CRYPTO_SYM_OP_NONE 0
> /**< Cipher only operation on the data */
> #define VIRTIO_CRYPTO_SYM_OP_CIPHER 1
> /**< Hash only operation on the data */
> #define VIRTIO_CRYPTO_SYM_OP_HASH 2
> /**< Chain any cipher with any hash operation */
> #define VIRTIO_CRYPTO_SYM_OP_ALGORITHM_CHAINING 3
> u8 op_type; /* Operation type */
> virtio_crypto_sym_cipher_t cipher_setup_data;
> virtio_crypto_sym_hash_t hash_setup_data;
> /* Perform the hash operation followed by the cipher operation */
> #define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER
> 1
> /* Perform the cipher operation followed by the hash operation */
> #define VIRTIO_CRYPTO_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH
> 2
> u8 alg_chain_order;
> } virtio_crypto_sym_session_op_t;
> And the structures definition details are:
> typedef struct virtio_crypto_sym_hash_auth_mode {
> /* length of authenticated key */
> le32 auth_key_len;
> /* The length of the additional authenticated data (AAD) in bytes */
> le32 aad_len;
> } virtio_crypto_sym_hash_auth_mode_t;
>
> typedef struct virtio_crypto_sym_cipher {
> /* Option to not do any cryptography */
> #define VIRTIO_CRYPTO_NO_CIPHER 0
> #define VIRTIO_CRYPTO_CIPHER_DES 1
> #define VIRTIO_CRYPTO_CIPHER_DES_CBC 2
> #define VIRTIO_CRYPTO_CIPHER_DES3 3
> #define VIRTIO_CRYPTO_CIPHER_DES3_CBC 4
> #define VIRTIO_CRYPTO_CIPHER_AES 5
> #define VIRTIO_CRYPTO_CIPHER_AES_CBC 6
> #define VIRTIO_CRYPTO_CIPHER_KASUMI_F8 7
> le32 alg; /* cipher algorithm type (ie. aes-cbc ) */
> /* length of key */
> le32 keylen;
> #define VIRTIO_CRYPTO_DECRYPT 0
> #define VIRTIO_CRYPTO_ENCRYPT 1
> u8 op; /* encrypt or decrypt */
> } virtio_crypto_sym_cipher_t;
>
> typedef struct virtio_crypto_sym_hash {
> /* Option to not do any hash */
> #define VIRTIO_CRYPTO_NO_HASH 0
> #define VIRTIO_CRYPTO_HASH_MD5 1
> #define VIRTIO_CRYPTO_HASH_SHA1 2
> #define VIRTIO_CRYPTO_HASH_SHA1_96 3
> #define VIRTIO_CRYPTO_HASH_SHA224 4
> #define VIRTIO_CRYPTO_HASH_SHA256 5
> #define VIRTIO_CRYPTO_HASH_SHA384 6
> #define VIRTIO_CRYPTO_HASH_SHA512 7
> #define VIRTIO_CRYPTO_HASH_AES_XCBC 8
> #define VIRTIO_CRYPTO_HASH_AES_XCBC_96 9
> #define VIRTIO_CRYPTO_HASH_KASUMI_F9 10
> le32 hash_alg; /* hash algorithm type */
> #define VIRTIO_CRYPTO_SYM_HASH_MODE_PLAIN 1
> #define VIRTIO_CRYPTO_SYM_HASH_MODE_AUTH 2
> #define VIRTIO_CRYPTO_SYM_HASH_MODE_NESTED 3
> u8 hash_mode; /* mode of hash operation, including
> authenticated/plain/nested hash */
> /* hash result length */
> le32 hash_result_len;
> virtio_crypto_sym_hash_auth_mode_t auth_mode_setup_data;
> } virtio_crypto_sym_hash_t;
> The driver MUST set the control type with
> VIRTIO_CRYPTO_CTRL_CLOSE_SESSION and pass the session_id to the device
> when executing session close.
> 1.6.1.1.2 Device Requirements: Session creation operation
> The device MUST return a session identifier to the driver when the device
> finishes the processing of session close. The session creation request MUST
> end by a tailer:
> typedef struct virtio_crypto_sym_session_op_inhdr {
> u8 status;
> le64 session_id;
> } virtio_crypto_sym_session_op_inhdr_t;
> Both status and session_id are written by the device: either
> VIRTIO_CRYPTO_CTRL_OK for success, VIRTIO_CRYPTO_CTRL_ERR for
> creation failed or device error.
> #define VIRTIO_CRYPTO_CTRL_OK 0
> #define VIRTIO_CRYPTO_CTRL_ERR 1
> 1.6.1.2 Session closing operation
> A request of closing a session including the following information:
> struct virtio_crypto_sym_session_creation {
> struct virtio_crypto_sym_ctlhdr ctlhdr; /* OUT */
> le64 session_id; /* OUT */
> u8 status; /* IN */
> };
> 1.6.1.2.1 Driver Requirements: Session closing operation
> The driver MUST set the control type with
> VIRTIO_CRYPTO_CTRL_CLOSE_SESSION, and the session_id MUST be a valid
> value which assigned by the device when a session was created.
> 1.6.1.2.2 Device Requirements: Session closing operation
> Status is written by the device: either VIRTIO_CRYPTO_CTRL_OK for success,
> VIRTIO_CRYPTO_CTRL_ERR for creation failed or device error.
> #define VIRTIO_CRYPTO_CTRL_OK 0
> #define VIRTIO_CRYPTO_CTRL_ERR 1
> 1.6.2 Encryption operation
> 1.6.2.1 Driver Requirements: Encryption operation
> The encryption and decryption requests and the corresponding results are
> transmitted by placing them in dataq. The symmetric algorithms requests are
> preceded by a header:
> struct virtio_crypto_sym_op_hdr {
> /* the backend returned session identifier */
> le64 session_id;
> /* length of initial vector */
> le32 iv_len;
> /* iv offset in the whole crypto data memory */
> le32 iv_offset;
> /* length of additional auth data */
> le32 auth_len;
> /* additional auth data offset in the whole crypto data memory */
> le32 additional_auth_offset;
> /* cipher start source offest */
> le32 cipher_start_src_offset;
> le32 len_to_cipher;
> /* hash start source offest */
> le32 hash_start_src_offset;
> le32 len_to_hash;
> /* length of source data */
> le32 source_len;
> } ;
> The encryption request MUST end by a tailer:
> typedef struct virtio_crypto_sym_op_inhdr {
> u8 status;
> } virtio_crypto_sym _op_inhdr_t;
> The specific content of symmetric algorithms requests SHOULD be same as
> below:
> struct virtio_crypto_sym_op_data {
> struct virtio_crypto_sym_op_hdr hdr_info;
> le64 iv_addr; /* iv guest address */
> le64 auth_data_addr; /* associated data guest address */
> le64 src_data_addr; /* source data guest address */
> le64 dst_data_addr; /* destination data guest address */
> le64 digest_result_addr; /* digest result guest address */
> le64 inhdr_addr; /* in-header guest address */
> };
> In this way, each data request only occupies one entry of the Vring descriptor
> table, which improves the throughput of data transferring.
> 1.6.2.2 Device Requirements: Encryption operation
> The struct virtio_crypto_sym_op_inhdr’s status byte is written by the device:
> either VIRTIO_CRYPTO_S_OK for success, VIRTIO_CRYPTO_S_ERR for device or
> driver error, VIRTIO_CRYPTO_S_BADMSG for verification failed when decrypt
> AEAD algorithms:
> #define VIRTIO_CRYPTO_S_OK 0
> #define VIRTIO_CRYPTO_S_ERR 1
> #define VIRTIO_CRYPTO_S_BADMSG 2
>
> 1.6.2.3 Steps of encryption Operation
> Step1: Create a session:
> 1. The driver fills out the context message, including algorithm name, key,
> keylen etc;
> 2. The driver sends a context message to the backend device by controlq;
> 3. The device creates a session using the message transmitted by controlq;
> 4. Return the session id to the driver.
> Step 2: Execute the detail encryption operation:
> 1. The driver fills out the encrypt requests;
> 2. Put the requests into dataq and kick the virtqueue;
> 3. The device executes the encryption operation according the requests'
> arguments;
> 4. The device returns the encryption result to the driver by dataq;
> 5. The driver callback handle the result and over.
>
> Note: the driver MAY support both synchronous and asynchronous encryption.
> Then the performance is poor in synchronous operation because frequent
> context switching and virtualization overhead. The driver SHOULD by
> preference use asynchronous encryption.
> 1.6.3 Decryption Operation
> The decryption process is the same with encryption.
> 1.6.3.1 Device Requirements: Decryption operation
> The device MUST verify and return the verify result to the driver. If the
> verify
> result is not correct, VIRTIO_CRYPTO_S_BADMSG (bad message) MUST be
> returned the driver.
>
> Regards,
> -Gonglei
>
>
>
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification,
Gonglei (Arei) <=
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Zeng, Xin, 2016/07/22
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Gonglei (Arei), 2016/07/21
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Zeng, Xin, 2016/07/22
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Gonglei (Arei), 2016/07/24
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Zeng, Xin, 2016/07/25
- Re: [Qemu-devel] [RFC v4] virtio-crypto specification, Gonglei (Arei), 2016/07/25