net/virtio-user: fix crash when detaching device
[dpdk.git] / lib / librte_cryptodev / rte_crypto_sym.h
index 9d678b2..3a40844 100644 (file)
@@ -105,9 +105,31 @@ enum rte_crypto_cipher_algorithm {
        RTE_CRYPTO_CIPHER_ZUC_EEA3,
        /**< ZUC algorithm in EEA3 mode */
 
+       RTE_CRYPTO_CIPHER_DES_CBC,
+       /**< DES algorithm in CBC mode */
+
+       RTE_CRYPTO_CIPHER_AES_DOCSISBPI,
+       /**< AES algorithm using modes required by
+        * DOCSIS Baseline Privacy Plus Spec.
+        * Chained mbufs are not supported in this mode, i.e. rte_mbuf.next
+        * for m_src and m_dst in the rte_crypto_sym_op must be NULL.
+        */
+
+       RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
+       /**< DES algorithm using modes required by
+        * DOCSIS Baseline Privacy Plus Spec.
+        * Chained mbufs are not supported in this mode, i.e. rte_mbuf.next
+        * for m_src and m_dst in the rte_crypto_sym_op must be NULL.
+        */
+
        RTE_CRYPTO_CIPHER_LIST_END
+
 };
 
+/** Cipher algorithm name strings */
+extern const char *
+rte_crypto_cipher_algorithm_strings[];
+
 /** Symmetric Cipher Direction */
 enum rte_crypto_cipher_operation {
        RTE_CRYPTO_CIPHER_OP_ENCRYPT,
@@ -116,6 +138,10 @@ enum rte_crypto_cipher_operation {
        /**< Decrypt cipher operation */
 };
 
+/** Cipher operation name strings */
+extern const char *
+rte_crypto_cipher_operation_strings[];
+
 /**
  * Symmetric Cipher Setup Data.
  *
@@ -241,12 +267,20 @@ enum rte_crypto_auth_algorithm {
        RTE_CRYPTO_AUTH_LIST_END
 };
 
+/** Authentication algorithm name strings */
+extern const char *
+rte_crypto_auth_algorithm_strings[];
+
 /** Symmetric Authentication / Hash Operations */
 enum rte_crypto_auth_operation {
        RTE_CRYPTO_AUTH_OP_VERIFY,      /**< Verify authentication digest */
        RTE_CRYPTO_AUTH_OP_GENERATE     /**< Generate authentication digest */
 };
 
+/** Authentication operation name strings */
+extern const char *
+rte_crypto_auth_operation_strings[];
+
 /**
  * Authentication / Hash transform data.
  *
@@ -276,17 +310,16 @@ struct rte_crypto_auth_xform {
         * this specifies the length of the digest to be compared for the
         * session.
         *
+        * It is the caller's responsibility to ensure that the
+        * digest length is compliant with the hash algorithm being used.
         * If the value is less than the maximum length allowed by the hash,
-        * the result shall be truncated.  If the value is greater than the
-        * maximum length allowed by the hash then an error will be generated
-        * by *rte_cryptodev_sym_session_create* or by the
-        * *rte_cryptodev_sym_enqueue_burst* if using session-less APIs.
+        * the result shall be truncated.
         */
 
        uint32_t add_auth_data_length;
        /**< The length of the additional authenticated data (AAD) in bytes.
-        * The maximum permitted value is 240 bytes, unless otherwise specified
-        * below.
+        * The maximum permitted value is 65535 (2^16 - 1) bytes, unless
+        * otherwise specified below.
         *
         * This field must be specified when the hash algorithm is one of the
         * following:
@@ -366,6 +399,25 @@ struct rte_cryptodev_sym_session;
  * it must have a valid *rte_mbuf* structure attached, via m_src parameter,
  * which contains the source data which the crypto operation is to be performed
  * on.
+ * While the mbuf is in use by a crypto operation no part of the mbuf should be
+ * changed by the application as the device may read or write to any part of the
+ * mbuf. In the case of hardware crypto devices some or all of the mbuf
+ * may be DMAed in and out of the device, so writing over the original data,
+ * though only the part specified by the rte_crypto_sym_op for transformation
+ * will be changed.
+ * Out-of-place (OOP) operation, where the source mbuf is different to the
+ * destination mbuf, is a special case. Data will be copied from m_src to m_dst.
+ * The part copied includes all the parts of the source mbuf that will be
+ * operated on, based on the cipher.data.offset+cipher.data.length and
+ * auth.data.offset+auth.data.length values in the rte_crypto_sym_op. The part
+ * indicated by the cipher parameters will be transformed, any extra data around
+ * this indicated by the auth parameters will be copied unchanged from source to
+ * destination mbuf.
+ * Also in OOP operation the cipher.data.offset and auth.data.offset apply to
+ * both source and destination mbufs. As these offsets are relative to the
+ * data_off parameter in each mbuf this can result in the data written to the
+ * destination buffer being at a different alignment, relative to buffer start,
+ * to the data in the source buffer.
  */
 struct rte_crypto_sym_op {
        struct rte_mbuf *m_src; /**< source mbuf */
@@ -391,8 +443,9 @@ struct rte_crypto_sym_op {
                          * this location.
                          *
                          * @note
-                         * For SNOW 3G @ RTE_CRYPTO_CIPHER_SNOW3G_UEA2
-                         * and KASUMI @ RTE_CRYPTO_CIPHER_KASUMI_F8,
+                         * For SNOW 3G @ RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
+                         * KASUMI @ RTE_CRYPTO_CIPHER_KASUMI_F8
+                         * and ZUC @ RTE_CRYPTO_CIPHER_ZUC_EEA3,
                          * this field should be in bits.
                          */
 
@@ -416,8 +469,9 @@ struct rte_crypto_sym_op {
                          * field should be set to 0.
                          *
                          * @note
-                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UEA2
-                         * and KASUMI @ RTE_CRYPTO_CIPHER_KASUMI_F8,
+                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UEA2,
+                         * KASUMI @ RTE_CRYPTO_CIPHER_KASUMI_F8
+                         * and ZUC @ RTE_CRYPTO_CIPHER_ZUC_EEA3,
                          * this field should be in bits.
                          */
                } data; /**< Data offsets and length for ciphering */
@@ -490,8 +544,9 @@ struct rte_crypto_sym_op {
                          * used instead
                          *
                          * @note
-                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UIA2
-                         * and KASUMI @ RTE_CRYPTO_AUTH_KASUMI_F9,
+                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UIA2,
+                         * KASUMI @ RTE_CRYPTO_AUTH_KASUMI_F9
+                         * and ZUC @ RTE_CRYPTO_AUTH_ZUC_EIA3,
                          * this field should be in bits.
                          */
 
@@ -510,16 +565,16 @@ struct rte_crypto_sym_op {
                          * Auth.aad.length is used instead.
                          *
                          * @note
-                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UIA2
-                         * and KASUMI @ RTE_CRYPTO_AUTH_KASUMI_F9,
+                         * For SNOW 3G @ RTE_CRYPTO_AUTH_SNOW3G_UIA2,
+                         * KASUMI @ RTE_CRYPTO_AUTH_KASUMI_F9
+                         * and ZUC @ RTE_CRYPTO_AUTH_ZUC_EIA3,
                          * this field should be in bits.
                          */
                } data; /**< Data offsets and length for authentication */
 
                struct {
                        uint8_t *data;
-                       /**< If this member of this structure is set this is a
-                        * pointer to the location where the digest result
+                       /**< This points to the location where the digest result
                         * should be inserted (in the case of digest generation)
                         * or where the purported digest exists (in the case of
                         * digest verification).
@@ -537,18 +592,13 @@ struct rte_crypto_sym_op {
                         * @note
                         * For GCM (@ref RTE_CRYPTO_AUTH_AES_GCM), for
                         * "digest result" read "authentication tag T".
-                        *
-                        * If this member is not set the digest result is
-                        * understood to be in the destination buffer for
-                        * digest generation, and in the source buffer for
-                        * digest verification. The location of the digest
-                        * result in this case is immediately following the
-                        * region over which the digest is computed.
                         */
                        phys_addr_t phys_addr;
                        /**< Physical address of digest */
                        uint16_t length;
-                       /**< Length of digest */
+                       /**< Length of digest. This must be the same value as
+                        * @ref rte_crypto_auth_xform.digest_length.
+                        */
                } digest; /**< Digest parameters */
 
                struct {
@@ -563,7 +613,7 @@ struct rte_crypto_sym_op {
                         * set up for the session in the @ref
                         * rte_crypto_auth_xform structure as part of the @ref
                         * rte_cryptodev_sym_session_create function call.
-                        * This length must not exceed 240 bytes.
+                        * This length must not exceed 65535 (2^16-1) bytes.
                         *
                         * Specifically for CCM (@ref RTE_CRYPTO_AUTH_AES_CCM),
                         * the caller should setup this field as follows:
@@ -596,7 +646,10 @@ struct rte_crypto_sym_op {
                         * operation, this field is used to pass plaintext.
                         */
                        phys_addr_t phys_addr;  /**< physical address */
-                       uint16_t length;        /**< Length of digest */
+                       uint16_t length;
+                       /**< Length of additional authenticated data (AAD)
+                        * in bytes
+                        */
                } aad;
                /**< Additional authentication parameters */
        } auth;