1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2021 Intel Corporation
5 #ifndef _PMD_AESNI_MB_PRIV_H_
6 #define _PMD_AESNI_MB_PRIV_H_
8 #include <intel-ipsec-mb.h>
10 #if defined(RTE_LIB_SECURITY)
11 #define AESNI_MB_DOCSIS_SEC_ENABLED 1
12 #include <rte_security.h>
13 #include <rte_security_driver.h>
14 #include <rte_ether.h>
17 #include "ipsec_mb_private.h"
19 #define AES_CCM_DIGEST_MIN_LEN 4
20 #define AES_CCM_DIGEST_MAX_LEN 16
21 #define HMAC_MAX_BLOCK_SIZE 128
22 #define HMAC_IPAD_VALUE (0x36)
23 #define HMAC_OPAD_VALUE (0x5C)
25 static const struct rte_cryptodev_capabilities aesni_mb_capabilities[] = {
27 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
29 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
31 .algo = RTE_CRYPTO_AUTH_MD5_HMAC,
48 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
50 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
52 .algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
69 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
71 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
73 .algo = RTE_CRYPTO_AUTH_SHA1,
90 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
92 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
94 .algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
111 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
113 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
115 .algo = RTE_CRYPTO_AUTH_SHA224,
132 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
134 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
136 .algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
153 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
155 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
157 .algo = RTE_CRYPTO_AUTH_SHA256,
174 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
176 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
178 .algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
195 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
197 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
199 .algo = RTE_CRYPTO_AUTH_SHA384,
216 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
218 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
220 .algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
237 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
239 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
241 .algo = RTE_CRYPTO_AUTH_SHA512,
257 { /* AES XCBC HMAC */
258 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
260 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
262 .algo = RTE_CRYPTO_AUTH_AES_XCBC_MAC,
279 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
281 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
283 .algo = RTE_CRYPTO_AUTH_NULL,
299 { /* NULL (CIPHER) */
300 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
302 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
304 .algo = RTE_CRYPTO_CIPHER_NULL,
316 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
318 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
320 .algo = RTE_CRYPTO_CIPHER_AES_CBC,
336 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
338 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
340 .algo = RTE_CRYPTO_CIPHER_AES_CTR,
355 { /* AES DOCSIS BPI */
356 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
358 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
360 .algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI,
376 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
378 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
380 .algo = RTE_CRYPTO_CIPHER_DES_CBC,
396 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
398 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
400 .algo = RTE_CRYPTO_CIPHER_3DES_CBC,
415 { /* DES DOCSIS BPI */
416 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
418 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
420 .algo = RTE_CRYPTO_CIPHER_DES_DOCSISBPI,
436 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
438 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
440 .algo = RTE_CRYPTO_AEAD_AES_CCM,
466 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
468 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
470 .algo = RTE_CRYPTO_AUTH_AES_CMAC,
487 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
489 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
491 .algo = RTE_CRYPTO_AEAD_AES_GCM,
516 { /* AES GMAC (AUTH) */
517 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
519 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
521 .algo = RTE_CRYPTO_AUTH_AES_GMAC,
542 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
544 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
546 .algo = RTE_CRYPTO_CIPHER_AES_ECB,
558 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
560 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
562 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
583 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
585 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
587 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
602 { /* SNOW 3G (UIA2) */
603 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
605 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
607 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
627 { /* SNOW 3G (UEA2) */
628 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
630 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
632 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
648 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
650 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
652 .algo = RTE_CRYPTO_AUTH_KASUMI_F9,
669 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
671 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
673 .algo = RTE_CRYPTO_CIPHER_KASUMI_F8,
688 { /* CHACHA20-POLY1305 */
689 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
691 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
693 .algo = RTE_CRYPTO_AEAD_CHACHA20_POLY1305,
718 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
721 uint8_t pmd_driver_id_aesni_mb;
723 struct aesni_mb_qp_data {
724 uint8_t temp_digests[IMB_MAX_JOBS][DIGEST_LENGTH_MAX];
725 /* *< Buffers used to store the digest generated
726 * by the driver when verifying a digest provided
727 * by the user (using authentication verify operation)
730 struct gcm_context_data gcm_sgl_ctx;
731 struct chacha20_poly1305_context_data chacha_sgl_ctx;
735 /* Maximum length for digest */
736 #define DIGEST_LENGTH_MAX 64
737 static const unsigned int auth_blocksize[] = {
740 [IMB_AUTH_HMAC_SHA_1] = 64,
741 [IMB_AUTH_HMAC_SHA_224] = 64,
742 [IMB_AUTH_HMAC_SHA_256] = 64,
743 [IMB_AUTH_HMAC_SHA_384] = 128,
744 [IMB_AUTH_HMAC_SHA_512] = 128,
745 [IMB_AUTH_AES_XCBC] = 16,
746 [IMB_AUTH_AES_CCM] = 16,
747 [IMB_AUTH_AES_CMAC] = 16,
748 [IMB_AUTH_AES_GMAC] = 16,
749 [IMB_AUTH_SHA_1] = 64,
750 [IMB_AUTH_SHA_224] = 64,
751 [IMB_AUTH_SHA_256] = 64,
752 [IMB_AUTH_SHA_384] = 128,
753 [IMB_AUTH_SHA_512] = 128,
754 [IMB_AUTH_ZUC_EIA3_BITLEN] = 16,
755 [IMB_AUTH_SNOW3G_UIA2_BITLEN] = 16,
756 [IMB_AUTH_KASUMI_UIA1] = 16
760 * Get the blocksize in bytes for a specified authentication algorithm
762 * @Note: this function will not return a valid value for a non-valid
763 * authentication algorithm
765 static inline unsigned int
766 get_auth_algo_blocksize(IMB_HASH_ALG algo)
768 return auth_blocksize[algo];
771 static const unsigned int auth_truncated_digest_byte_lengths[] = {
773 [IMB_AUTH_HMAC_SHA_1] = 12,
774 [IMB_AUTH_HMAC_SHA_224] = 14,
775 [IMB_AUTH_HMAC_SHA_256] = 16,
776 [IMB_AUTH_HMAC_SHA_384] = 24,
777 [IMB_AUTH_HMAC_SHA_512] = 32,
778 [IMB_AUTH_AES_XCBC] = 12,
779 [IMB_AUTH_AES_CMAC] = 12,
780 [IMB_AUTH_AES_CCM] = 8,
782 [IMB_AUTH_AES_GMAC] = 12,
783 [IMB_AUTH_SHA_1] = 20,
784 [IMB_AUTH_SHA_224] = 28,
785 [IMB_AUTH_SHA_256] = 32,
786 [IMB_AUTH_SHA_384] = 48,
787 [IMB_AUTH_SHA_512] = 64,
788 [IMB_AUTH_ZUC_EIA3_BITLEN] = 4,
789 [IMB_AUTH_SNOW3G_UIA2_BITLEN] = 4,
790 [IMB_AUTH_KASUMI_UIA1] = 4
794 * Get the IPsec specified truncated length in bytes of the HMAC digest for a
795 * specified authentication algorithm
797 * @Note: this function will not return a valid value for a non-valid
798 * authentication algorithm
800 static inline unsigned int
801 get_truncated_digest_byte_length(IMB_HASH_ALG algo)
803 return auth_truncated_digest_byte_lengths[algo];
806 static const unsigned int auth_digest_byte_lengths[] = {
808 [IMB_AUTH_HMAC_SHA_1] = 20,
809 [IMB_AUTH_HMAC_SHA_224] = 28,
810 [IMB_AUTH_HMAC_SHA_256] = 32,
811 [IMB_AUTH_HMAC_SHA_384] = 48,
812 [IMB_AUTH_HMAC_SHA_512] = 64,
813 [IMB_AUTH_AES_XCBC] = 16,
814 [IMB_AUTH_AES_CMAC] = 16,
815 [IMB_AUTH_AES_CCM] = 16,
816 [IMB_AUTH_AES_GMAC] = 16,
818 [IMB_AUTH_SHA_1] = 20,
819 [IMB_AUTH_SHA_224] = 28,
820 [IMB_AUTH_SHA_256] = 32,
821 [IMB_AUTH_SHA_384] = 48,
822 [IMB_AUTH_SHA_512] = 64,
823 [IMB_AUTH_ZUC_EIA3_BITLEN] = 4,
824 [IMB_AUTH_SNOW3G_UIA2_BITLEN] = 4,
825 [IMB_AUTH_KASUMI_UIA1] = 4
826 /**< Vector mode dependent pointer table of the multi-buffer APIs */
831 * Get the full digest size in bytes for a specified authentication algorithm
832 * (if available in the Multi-buffer library)
834 * @Note: this function will not return a valid value for a non-valid
835 * authentication algorithm
837 static inline unsigned int
838 get_digest_byte_length(IMB_HASH_ALG algo)
840 return auth_digest_byte_lengths[algo];
843 /** AES-NI multi-buffer private session structure */
844 struct aesni_mb_session {
845 IMB_CIPHER_MODE cipher_mode;
846 IMB_CIPHER_DIRECTION cipher_direction;
847 IMB_HASH_ALG hash_alg;
848 IMB_CHAIN_ORDER chain_order;
849 /* common job fields */
861 /* * Cipher Parameters
864 /* * Cipher direction - encrypt / decrypt */
865 IMB_CIPHER_DIRECTION direction;
866 /* * Cipher mode - CBC / Counter */
867 IMB_CIPHER_MODE mode;
869 uint64_t key_length_in_bytes;
873 uint32_t encode[60] __rte_aligned(16);
875 uint32_t decode[60] __rte_aligned(16);
878 /* *< Expanded AES keys - Allocating space to
879 * contain the maximum expanded key size which
880 * is 240 bytes for 256 bit AES, calculate by:
881 * ((key size (bytes)) *
882 * ((number of rounds) + 1))
885 const void *ks_ptr[3];
888 /* *< Expanded 3DES keys */
890 struct gcm_key_data gcm_key;
891 /* *< Expanded GCM key */
892 uint8_t zuc_cipher_key[32];
893 /* *< ZUC cipher key */
894 snow3g_key_schedule_t pKeySched_snow3g_cipher;
895 /* *< SNOW3G scheduled cipher key */
896 kasumi_key_sched_t pKeySched_kasumi_cipher;
897 /* *< KASUMI scheduled cipher key */
901 /* *< Authentication Parameters */
903 IMB_HASH_ALG algo; /* *< Authentication Algorithm */
904 enum rte_crypto_auth_operation operation;
905 /* *< auth operation generate or verify */
908 uint8_t inner[128] __rte_aligned(16);
910 uint8_t outer[128] __rte_aligned(16);
913 /* *< HMAC Authentication pads -
914 * allocating space for the maximum pad
915 * size supported which is 128 bytes for
920 uint32_t k1_expanded[44] __rte_aligned(16);
921 /* *< k1 (expanded key). */
922 uint8_t k2[16] __rte_aligned(16);
924 uint8_t k3[16] __rte_aligned(16);
929 uint32_t expkey[60] __rte_aligned(16);
930 /* *< k1 (expanded key). */
931 uint32_t skey1[4] __rte_aligned(16);
933 uint32_t skey2[4] __rte_aligned(16);
936 /* *< Expanded XCBC authentication keys */
937 uint8_t zuc_auth_key[32];
938 /* *< ZUC authentication key */
939 snow3g_key_schedule_t pKeySched_snow3g_auth;
940 /* *< SNOW3G scheduled authentication key */
941 kasumi_key_sched_t pKeySched_kasumi_auth;
942 /* *< KASUMI scheduled authentication key */
944 /* * Generated digest size by the Multi-buffer library */
945 uint16_t gen_digest_len;
946 /* * Requested digest size from Cryptodev */
947 uint16_t req_digest_len;
951 /* * AAD data length */
954 } __rte_cache_aligned;
956 typedef void (*hash_one_block_t)(const void *data, void *digest);
957 typedef void (*aes_keyexp_t)(const void *key, void *enc_exp_keys,
960 #ifdef AESNI_MB_DOCSIS_SEC_ENABLED
961 static const struct rte_cryptodev_capabilities
962 aesni_mb_pmd_security_crypto_cap[] = {
963 { /* AES DOCSIS BPI */
964 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
966 .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
968 .algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI,
984 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
987 static const struct rte_security_capability aesni_mb_pmd_security_cap[] = {
988 { /* DOCSIS Uplink */
989 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
990 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
992 .direction = RTE_SECURITY_DOCSIS_UPLINK
994 .crypto_capabilities = aesni_mb_pmd_security_crypto_cap
996 { /* DOCSIS Downlink */
997 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
998 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
1000 .direction = RTE_SECURITY_DOCSIS_DOWNLINK
1002 .crypto_capabilities = aesni_mb_pmd_security_crypto_cap
1005 .action = RTE_SECURITY_ACTION_TYPE_NONE
1010 #endif /* _PMD_AESNI_MB_PRIV_H_ */