1d81734caSHemant Agrawal /* SPDX-License-Identifier: BSD-3-Clause 2c3e85bdcSAkhil Goyal * 3d81734caSHemant Agrawal * Copyright 2016 NXP 4c3e85bdcSAkhil Goyal * 5c3e85bdcSAkhil Goyal */ 6c3e85bdcSAkhil Goyal 7c3e85bdcSAkhil Goyal #ifndef _DPAA_SEC_H_ 8c3e85bdcSAkhil Goyal #define _DPAA_SEC_H_ 9c3e85bdcSAkhil Goyal 1069cb2eebSAshish Jain #define CRYPTODEV_NAME_DPAA_SEC_PMD crypto_dpaa_sec 1169cb2eebSAshish Jain /**< NXP DPAA - SEC PMD device name */ 1269cb2eebSAshish Jain 134e694fe5SAkhil Goyal #define MAX_DPAA_CORES 4 14c3e85bdcSAkhil Goyal #define NUM_POOL_CHANNELS 4 159a984458SAkhil Goyal #define DPAA_SEC_BURST 7 16c3e85bdcSAkhil Goyal #define DPAA_SEC_ALG_UNSUPPORT (-1) 17c3e85bdcSAkhil Goyal #define TDES_CBC_IV_LEN 8 18c3e85bdcSAkhil Goyal #define AES_CBC_IV_LEN 16 19c3e85bdcSAkhil Goyal #define AES_CTR_IV_LEN 16 20c3e85bdcSAkhil Goyal #define AES_GCM_IV_LEN 12 21c3e85bdcSAkhil Goyal 225ab35d2eSAkhil Goyal #define DPAA_IPv6_DEFAULT_VTC_FLOW 0x60000000 235ab35d2eSAkhil Goyal 24c3e85bdcSAkhil Goyal /* Minimum job descriptor consists of a oneword job descriptor HEADER and 25c3e85bdcSAkhil Goyal * a pointer to the shared descriptor. 26c3e85bdcSAkhil Goyal */ 27c3e85bdcSAkhil Goyal #define MIN_JOB_DESC_SIZE (CAAM_CMD_SZ + CAAM_PTR_SZ) 28c3e85bdcSAkhil Goyal /* CTX_POOL_NUM_BUFS is set as per the ipsec-secgw application */ 29c3e85bdcSAkhil Goyal #define CTX_POOL_NUM_BUFS 32000 30c3e85bdcSAkhil Goyal #define CTX_POOL_BUF_SIZE sizeof(struct dpaa_sec_op_ctx) 31c3e85bdcSAkhil Goyal #define CTX_POOL_CACHE_SIZE 512 324e694fe5SAkhil Goyal #define RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS 1024 33c3e85bdcSAkhil Goyal 34c3e85bdcSAkhil Goyal #define DIR_ENC 1 35c3e85bdcSAkhil Goyal #define DIR_DEC 0 36c3e85bdcSAkhil Goyal 37c3e85bdcSAkhil Goyal enum dpaa_sec_op_type { 38c3e85bdcSAkhil Goyal DPAA_SEC_NONE, /*!< No Cipher operations*/ 39c3e85bdcSAkhil Goyal DPAA_SEC_CIPHER,/*!< CIPHER operations */ 40c3e85bdcSAkhil Goyal DPAA_SEC_AUTH, /*!< Authentication Operations */ 41c3e85bdcSAkhil Goyal DPAA_SEC_AEAD, /*!< Authenticated Encryption with associated data */ 42c3e85bdcSAkhil Goyal DPAA_SEC_IPSEC, /*!< IPSEC protocol operations*/ 43c3e85bdcSAkhil Goyal DPAA_SEC_PDCP, /*!< PDCP protocol operations*/ 44c3e85bdcSAkhil Goyal DPAA_SEC_PKC, /*!< Public Key Cryptographic Operations */ 45c3e85bdcSAkhil Goyal DPAA_SEC_MAX 46c3e85bdcSAkhil Goyal }; 47c3e85bdcSAkhil Goyal 48c3e85bdcSAkhil Goyal 49c3e85bdcSAkhil Goyal #define DPAA_SEC_MAX_DESC_SIZE 64 50c3e85bdcSAkhil Goyal /* code or cmd block to caam */ 51c3e85bdcSAkhil Goyal struct sec_cdb { 52c3e85bdcSAkhil Goyal struct { 53c3e85bdcSAkhil Goyal union { 54c3e85bdcSAkhil Goyal uint32_t word; 55c3e85bdcSAkhil Goyal struct { 56c3e85bdcSAkhil Goyal #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 57c3e85bdcSAkhil Goyal uint16_t rsvd63_48; 58c3e85bdcSAkhil Goyal unsigned int rsvd47_39:9; 59c3e85bdcSAkhil Goyal unsigned int idlen:7; 60c3e85bdcSAkhil Goyal #else 61c3e85bdcSAkhil Goyal unsigned int idlen:7; 62c3e85bdcSAkhil Goyal unsigned int rsvd47_39:9; 63c3e85bdcSAkhil Goyal uint16_t rsvd63_48; 64c3e85bdcSAkhil Goyal #endif 65c3e85bdcSAkhil Goyal } field; 66c3e85bdcSAkhil Goyal } __packed hi; 67c3e85bdcSAkhil Goyal 68c3e85bdcSAkhil Goyal union { 69c3e85bdcSAkhil Goyal uint32_t word; 70c3e85bdcSAkhil Goyal struct { 71c3e85bdcSAkhil Goyal #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 72c3e85bdcSAkhil Goyal unsigned int rsvd31_30:2; 73c3e85bdcSAkhil Goyal unsigned int fsgt:1; 74c3e85bdcSAkhil Goyal unsigned int lng:1; 75c3e85bdcSAkhil Goyal unsigned int offset:2; 76c3e85bdcSAkhil Goyal unsigned int abs:1; 77c3e85bdcSAkhil Goyal unsigned int add_buf:1; 78c3e85bdcSAkhil Goyal uint8_t pool_id; 79c3e85bdcSAkhil Goyal uint16_t pool_buffer_size; 80c3e85bdcSAkhil Goyal #else 81c3e85bdcSAkhil Goyal uint16_t pool_buffer_size; 82c3e85bdcSAkhil Goyal uint8_t pool_id; 83c3e85bdcSAkhil Goyal unsigned int add_buf:1; 84c3e85bdcSAkhil Goyal unsigned int abs:1; 85c3e85bdcSAkhil Goyal unsigned int offset:2; 86c3e85bdcSAkhil Goyal unsigned int lng:1; 87c3e85bdcSAkhil Goyal unsigned int fsgt:1; 88c3e85bdcSAkhil Goyal unsigned int rsvd31_30:2; 89c3e85bdcSAkhil Goyal #endif 90c3e85bdcSAkhil Goyal } field; 91c3e85bdcSAkhil Goyal } __packed lo; 92c3e85bdcSAkhil Goyal } __packed sh_hdr; 93c3e85bdcSAkhil Goyal 94c3e85bdcSAkhil Goyal uint32_t sh_desc[DPAA_SEC_MAX_DESC_SIZE]; 95c3e85bdcSAkhil Goyal }; 96c3e85bdcSAkhil Goyal 97a1173d55SHemant Agrawal /*! 98a1173d55SHemant Agrawal * The structure is to be filled by user as a part of 99a1173d55SHemant Agrawal * dpaa_sec_proto_ctxt for PDCP Protocol 100a1173d55SHemant Agrawal */ 101a1173d55SHemant Agrawal struct sec_pdcp_ctxt { 102a1173d55SHemant Agrawal enum rte_security_pdcp_domain domain; /*!< Data/Control mode*/ 103a1173d55SHemant Agrawal int8_t bearer; /*!< PDCP bearer ID */ 104a1173d55SHemant Agrawal int8_t pkt_dir;/*!< PDCP Frame Direction 0:UL 1:DL*/ 105a1173d55SHemant Agrawal int8_t hfn_ovd;/*!< Overwrite HFN per packet*/ 106*6a0c9d36SAkhil Goyal uint8_t sn_size; /*!< Sequence number size, 5/7/12/15/18 */ 107*6a0c9d36SAkhil Goyal uint32_t hfn_ovd_offset;/*!< offset from rte_crypto_op at which 108*6a0c9d36SAkhil Goyal * per packet hfn is stored 109*6a0c9d36SAkhil Goyal */ 110a1173d55SHemant Agrawal uint32_t hfn; /*!< Hyper Frame Number */ 111a1173d55SHemant Agrawal uint32_t hfn_threshold; /*!< HFN Threashold for key renegotiation */ 112a1173d55SHemant Agrawal }; 113a1173d55SHemant Agrawal 114e79416d1SHemant Agrawal typedef struct dpaa_sec_session_entry { 115e79416d1SHemant Agrawal uint8_t dir; /*!< Operation Direction */ 116e79416d1SHemant Agrawal enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/ 117e79416d1SHemant Agrawal enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/ 1181f14d500SAkhil Goyal enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/ 1191f14d500SAkhil Goyal enum rte_security_session_protocol proto_alg; /*!< Security Algorithm*/ 120e79416d1SHemant Agrawal union { 121e79416d1SHemant Agrawal struct { 122e79416d1SHemant Agrawal uint8_t *data; /**< pointer to key data */ 123e79416d1SHemant Agrawal size_t length; /**< key length in bytes */ 124e79416d1SHemant Agrawal } aead_key; 125e79416d1SHemant Agrawal struct { 126e79416d1SHemant Agrawal struct { 127e79416d1SHemant Agrawal uint8_t *data; /**< pointer to key data */ 128e79416d1SHemant Agrawal size_t length; /**< key length in bytes */ 129e79416d1SHemant Agrawal } cipher_key; 130e79416d1SHemant Agrawal struct { 131e79416d1SHemant Agrawal uint8_t *data; /**< pointer to key data */ 132e79416d1SHemant Agrawal size_t length; /**< key length in bytes */ 133e79416d1SHemant Agrawal } auth_key; 134e79416d1SHemant Agrawal }; 135e79416d1SHemant Agrawal }; 136a1173d55SHemant Agrawal union { 137a1173d55SHemant Agrawal struct { 138e79416d1SHemant Agrawal struct { 139e79416d1SHemant Agrawal uint16_t length; 140e79416d1SHemant Agrawal uint16_t offset; 141e79416d1SHemant Agrawal } iv; /**< Initialisation vector parameters */ 142a1173d55SHemant Agrawal uint16_t auth_only_len; 143a1173d55SHemant Agrawal /*!< Length of data for Auth only */ 144e79416d1SHemant Agrawal uint32_t digest_length; 145a1173d55SHemant Agrawal struct ipsec_decap_pdb decap_pdb; 1461f14d500SAkhil Goyal struct ipsec_encap_pdb encap_pdb; 1475ab35d2eSAkhil Goyal union { 1481f14d500SAkhil Goyal struct ip ip4_hdr; 1495ab35d2eSAkhil Goyal struct rte_ipv6_hdr ip6_hdr; 1505ab35d2eSAkhil Goyal }; 151a1173d55SHemant Agrawal }; 152a1173d55SHemant Agrawal struct sec_pdcp_ctxt pdcp; 153a1173d55SHemant Agrawal }; 1544e694fe5SAkhil Goyal struct dpaa_sec_qp *qp[MAX_DPAA_CORES]; 1554e694fe5SAkhil Goyal struct qman_fq *inq[MAX_DPAA_CORES]; 156e79416d1SHemant Agrawal struct sec_cdb cdb; /**< cmd block associated with qp */ 157e79416d1SHemant Agrawal struct rte_mempool *ctx_pool; /* session mempool for dpaa_sec_op_ctx */ 158e79416d1SHemant Agrawal } dpaa_sec_session; 159e79416d1SHemant Agrawal 160c3e85bdcSAkhil Goyal struct dpaa_sec_qp { 161c3e85bdcSAkhil Goyal struct dpaa_sec_dev_private *internals; 162c3e85bdcSAkhil Goyal struct qman_fq outq; 163c3e85bdcSAkhil Goyal int rx_pkts; 164c3e85bdcSAkhil Goyal int rx_errs; 165c3e85bdcSAkhil Goyal int tx_pkts; 166c3e85bdcSAkhil Goyal int tx_errs; 167c3e85bdcSAkhil Goyal }; 168c3e85bdcSAkhil Goyal 169551a42a9SHemant Agrawal #define RTE_DPAA_MAX_NB_SEC_QPS 2 1704e694fe5SAkhil Goyal #define RTE_DPAA_MAX_RX_QUEUE (MAX_DPAA_CORES * RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS) 1719a984458SAkhil Goyal #define DPAA_MAX_DEQUEUE_NUM_FRAMES 63 172e79416d1SHemant Agrawal 173c3e85bdcSAkhil Goyal /* internal sec queue interface */ 174c3e85bdcSAkhil Goyal struct dpaa_sec_dev_private { 175c3e85bdcSAkhil Goyal void *sec_hw; 176c3e85bdcSAkhil Goyal struct rte_mempool *ctx_pool; /* per dev mempool for dpaa_sec_op_ctx */ 177e79416d1SHemant Agrawal struct dpaa_sec_qp qps[RTE_DPAA_MAX_NB_SEC_QPS]; /* i/o queue for sec */ 178e79416d1SHemant Agrawal struct qman_fq inq[RTE_DPAA_MAX_RX_QUEUE]; 179e79416d1SHemant Agrawal unsigned char inq_attach[RTE_DPAA_MAX_RX_QUEUE]; 180c3e85bdcSAkhil Goyal unsigned int max_nb_queue_pairs; 181c3e85bdcSAkhil Goyal unsigned int max_nb_sessions; 1823b617ee7SAkhil Goyal rte_spinlock_t lock; 183c3e85bdcSAkhil Goyal }; 184c3e85bdcSAkhil Goyal 185c3e85bdcSAkhil Goyal #define MAX_SG_ENTRIES 16 186c3e85bdcSAkhil Goyal #define SG_CACHELINE_0 0 187c3e85bdcSAkhil Goyal #define SG_CACHELINE_1 4 188c3e85bdcSAkhil Goyal #define SG_CACHELINE_2 8 189c3e85bdcSAkhil Goyal #define SG_CACHELINE_3 12 190c3e85bdcSAkhil Goyal struct dpaa_sec_job { 191c3e85bdcSAkhil Goyal /* sg[0] output, sg[1] input, others are possible sub frames */ 192c3e85bdcSAkhil Goyal struct qm_sg_entry sg[MAX_SG_ENTRIES]; 193c3e85bdcSAkhil Goyal }; 194c3e85bdcSAkhil Goyal 195c3e85bdcSAkhil Goyal #define DPAA_MAX_NB_MAX_DIGEST 32 196c3e85bdcSAkhil Goyal struct dpaa_sec_op_ctx { 197c3e85bdcSAkhil Goyal struct dpaa_sec_job job; 198c3e85bdcSAkhil Goyal struct rte_crypto_op *op; 199c3e85bdcSAkhil Goyal struct rte_mempool *ctx_pool; /* mempool pointer for dpaa_sec_op_ctx */ 200c3e85bdcSAkhil Goyal uint32_t fd_status; 201fcf67029SHemant Agrawal int64_t vtop_offset; 202c3e85bdcSAkhil Goyal uint8_t digest[DPAA_MAX_NB_MAX_DIGEST]; 203c3e85bdcSAkhil Goyal }; 204c3e85bdcSAkhil Goyal 205c3e85bdcSAkhil Goyal static const struct rte_cryptodev_capabilities dpaa_sec_capabilities[] = { 206c3e85bdcSAkhil Goyal { /* MD5 HMAC */ 207c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 208c3e85bdcSAkhil Goyal {.sym = { 209c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 210c3e85bdcSAkhil Goyal {.auth = { 211c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_MD5_HMAC, 212c3e85bdcSAkhil Goyal .block_size = 64, 213c3e85bdcSAkhil Goyal .key_size = { 214c3e85bdcSAkhil Goyal .min = 1, 215c3e85bdcSAkhil Goyal .max = 64, 216c3e85bdcSAkhil Goyal .increment = 1 217c3e85bdcSAkhil Goyal }, 218c3e85bdcSAkhil Goyal .digest_size = { 2196c9c2e46SHemant Agrawal .min = 1, 220c3e85bdcSAkhil Goyal .max = 16, 2216c9c2e46SHemant Agrawal .increment = 1 222c3e85bdcSAkhil Goyal }, 2236c9c2e46SHemant Agrawal .iv_size = { 0 } 224c3e85bdcSAkhil Goyal }, } 225c3e85bdcSAkhil Goyal }, } 226c3e85bdcSAkhil Goyal }, 227c3e85bdcSAkhil Goyal { /* SHA1 HMAC */ 228c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 229c3e85bdcSAkhil Goyal {.sym = { 230c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 231c3e85bdcSAkhil Goyal {.auth = { 232c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 233c3e85bdcSAkhil Goyal .block_size = 64, 234c3e85bdcSAkhil Goyal .key_size = { 235c3e85bdcSAkhil Goyal .min = 1, 236c3e85bdcSAkhil Goyal .max = 64, 237c3e85bdcSAkhil Goyal .increment = 1 238c3e85bdcSAkhil Goyal }, 239c3e85bdcSAkhil Goyal .digest_size = { 2406c9c2e46SHemant Agrawal .min = 1, 241c3e85bdcSAkhil Goyal .max = 20, 2426c9c2e46SHemant Agrawal .increment = 1 243c3e85bdcSAkhil Goyal }, 2446c9c2e46SHemant Agrawal .iv_size = { 0 } 245c3e85bdcSAkhil Goyal }, } 246c3e85bdcSAkhil Goyal }, } 247c3e85bdcSAkhil Goyal }, 248c3e85bdcSAkhil Goyal { /* SHA224 HMAC */ 249c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 250c3e85bdcSAkhil Goyal {.sym = { 251c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 252c3e85bdcSAkhil Goyal {.auth = { 253c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_SHA224_HMAC, 254c3e85bdcSAkhil Goyal .block_size = 64, 255c3e85bdcSAkhil Goyal .key_size = { 256c3e85bdcSAkhil Goyal .min = 1, 257c3e85bdcSAkhil Goyal .max = 64, 258c3e85bdcSAkhil Goyal .increment = 1 259c3e85bdcSAkhil Goyal }, 260c3e85bdcSAkhil Goyal .digest_size = { 2616c9c2e46SHemant Agrawal .min = 1, 262c3e85bdcSAkhil Goyal .max = 28, 2636c9c2e46SHemant Agrawal .increment = 1 264c3e85bdcSAkhil Goyal }, 2656c9c2e46SHemant Agrawal .iv_size = { 0 } 266c3e85bdcSAkhil Goyal }, } 267c3e85bdcSAkhil Goyal }, } 268c3e85bdcSAkhil Goyal }, 269c3e85bdcSAkhil Goyal { /* SHA256 HMAC */ 270c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 271c3e85bdcSAkhil Goyal {.sym = { 272c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 273c3e85bdcSAkhil Goyal {.auth = { 274c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_SHA256_HMAC, 275c3e85bdcSAkhil Goyal .block_size = 64, 276c3e85bdcSAkhil Goyal .key_size = { 277c3e85bdcSAkhil Goyal .min = 1, 278c3e85bdcSAkhil Goyal .max = 64, 279c3e85bdcSAkhil Goyal .increment = 1 280c3e85bdcSAkhil Goyal }, 281c3e85bdcSAkhil Goyal .digest_size = { 2826c9c2e46SHemant Agrawal .min = 1, 283c3e85bdcSAkhil Goyal .max = 32, 2846c9c2e46SHemant Agrawal .increment = 1 285c3e85bdcSAkhil Goyal }, 2866c9c2e46SHemant Agrawal .iv_size = { 0 } 287c3e85bdcSAkhil Goyal }, } 288c3e85bdcSAkhil Goyal }, } 289c3e85bdcSAkhil Goyal }, 290c3e85bdcSAkhil Goyal { /* SHA384 HMAC */ 291c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 292c3e85bdcSAkhil Goyal {.sym = { 293c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 294c3e85bdcSAkhil Goyal {.auth = { 295c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_SHA384_HMAC, 296c3e85bdcSAkhil Goyal .block_size = 128, 297c3e85bdcSAkhil Goyal .key_size = { 298c3e85bdcSAkhil Goyal .min = 1, 299c3e85bdcSAkhil Goyal .max = 128, 300c3e85bdcSAkhil Goyal .increment = 1 301c3e85bdcSAkhil Goyal }, 302c3e85bdcSAkhil Goyal .digest_size = { 3036c9c2e46SHemant Agrawal .min = 1, 304c3e85bdcSAkhil Goyal .max = 48, 3056c9c2e46SHemant Agrawal .increment = 1 306c3e85bdcSAkhil Goyal }, 3076c9c2e46SHemant Agrawal .iv_size = { 0 } 308c3e85bdcSAkhil Goyal }, } 309c3e85bdcSAkhil Goyal }, } 310c3e85bdcSAkhil Goyal }, 311c3e85bdcSAkhil Goyal { /* SHA512 HMAC */ 312c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 313c3e85bdcSAkhil Goyal {.sym = { 314c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 315c3e85bdcSAkhil Goyal {.auth = { 316c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AUTH_SHA512_HMAC, 317c3e85bdcSAkhil Goyal .block_size = 128, 318c3e85bdcSAkhil Goyal .key_size = { 319c3e85bdcSAkhil Goyal .min = 1, 320c3e85bdcSAkhil Goyal .max = 128, 321c3e85bdcSAkhil Goyal .increment = 1 322c3e85bdcSAkhil Goyal }, 323c3e85bdcSAkhil Goyal .digest_size = { 3246c9c2e46SHemant Agrawal .min = 1, 325c3e85bdcSAkhil Goyal .max = 64, 3266c9c2e46SHemant Agrawal .increment = 1 327c3e85bdcSAkhil Goyal }, 3286c9c2e46SHemant Agrawal .iv_size = { 0 } 329c3e85bdcSAkhil Goyal }, } 330c3e85bdcSAkhil Goyal }, } 331c3e85bdcSAkhil Goyal }, 332c3e85bdcSAkhil Goyal { /* AES GCM */ 333c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 334c3e85bdcSAkhil Goyal {.sym = { 335c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD, 336c25a37d7SHemant Agrawal {.aead = { 337c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_AEAD_AES_GCM, 338c3e85bdcSAkhil Goyal .block_size = 16, 339c3e85bdcSAkhil Goyal .key_size = { 340c3e85bdcSAkhil Goyal .min = 16, 341c3e85bdcSAkhil Goyal .max = 32, 342c3e85bdcSAkhil Goyal .increment = 8 343c3e85bdcSAkhil Goyal }, 344c3e85bdcSAkhil Goyal .digest_size = { 345c3e85bdcSAkhil Goyal .min = 8, 346c3e85bdcSAkhil Goyal .max = 16, 347c3e85bdcSAkhil Goyal .increment = 4 348c3e85bdcSAkhil Goyal }, 349c3e85bdcSAkhil Goyal .aad_size = { 350c3e85bdcSAkhil Goyal .min = 0, 351c3e85bdcSAkhil Goyal .max = 240, 352c3e85bdcSAkhil Goyal .increment = 1 353c3e85bdcSAkhil Goyal }, 354c3e85bdcSAkhil Goyal .iv_size = { 355c3e85bdcSAkhil Goyal .min = 12, 356c3e85bdcSAkhil Goyal .max = 12, 357c3e85bdcSAkhil Goyal .increment = 0 358c3e85bdcSAkhil Goyal }, 359c3e85bdcSAkhil Goyal }, } 360c3e85bdcSAkhil Goyal }, } 361c3e85bdcSAkhil Goyal }, 362c3e85bdcSAkhil Goyal { /* AES CBC */ 363c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 364c3e85bdcSAkhil Goyal {.sym = { 365c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 366c3e85bdcSAkhil Goyal {.cipher = { 367c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_CIPHER_AES_CBC, 368c3e85bdcSAkhil Goyal .block_size = 16, 369c3e85bdcSAkhil Goyal .key_size = { 370c3e85bdcSAkhil Goyal .min = 16, 371c3e85bdcSAkhil Goyal .max = 32, 372c3e85bdcSAkhil Goyal .increment = 8 373c3e85bdcSAkhil Goyal }, 374c3e85bdcSAkhil Goyal .iv_size = { 375c3e85bdcSAkhil Goyal .min = 16, 376c3e85bdcSAkhil Goyal .max = 16, 377c3e85bdcSAkhil Goyal .increment = 0 378c3e85bdcSAkhil Goyal } 379c3e85bdcSAkhil Goyal }, } 380c3e85bdcSAkhil Goyal }, } 381c3e85bdcSAkhil Goyal }, 382c3e85bdcSAkhil Goyal { /* AES CTR */ 383c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 384c3e85bdcSAkhil Goyal {.sym = { 385c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 386c3e85bdcSAkhil Goyal {.cipher = { 387c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_CIPHER_AES_CTR, 388c3e85bdcSAkhil Goyal .block_size = 16, 389c3e85bdcSAkhil Goyal .key_size = { 390c3e85bdcSAkhil Goyal .min = 16, 391c3e85bdcSAkhil Goyal .max = 32, 392c3e85bdcSAkhil Goyal .increment = 8 393c3e85bdcSAkhil Goyal }, 394c3e85bdcSAkhil Goyal .iv_size = { 395c3e85bdcSAkhil Goyal .min = 16, 396c3e85bdcSAkhil Goyal .max = 16, 397c3e85bdcSAkhil Goyal .increment = 0 398a1173d55SHemant Agrawal }, 399c3e85bdcSAkhil Goyal }, } 400c3e85bdcSAkhil Goyal }, } 401c3e85bdcSAkhil Goyal }, 402c3e85bdcSAkhil Goyal { /* 3DES CBC */ 403c3e85bdcSAkhil Goyal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 404c3e85bdcSAkhil Goyal {.sym = { 405c3e85bdcSAkhil Goyal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 406c3e85bdcSAkhil Goyal {.cipher = { 407c3e85bdcSAkhil Goyal .algo = RTE_CRYPTO_CIPHER_3DES_CBC, 408c3e85bdcSAkhil Goyal .block_size = 8, 409c3e85bdcSAkhil Goyal .key_size = { 410c3e85bdcSAkhil Goyal .min = 16, 411c3e85bdcSAkhil Goyal .max = 24, 412c3e85bdcSAkhil Goyal .increment = 8 413c3e85bdcSAkhil Goyal }, 414c3e85bdcSAkhil Goyal .iv_size = { 415c3e85bdcSAkhil Goyal .min = 8, 416c3e85bdcSAkhil Goyal .max = 8, 417c3e85bdcSAkhil Goyal .increment = 0 418c3e85bdcSAkhil Goyal } 419c3e85bdcSAkhil Goyal }, } 420c3e85bdcSAkhil Goyal }, } 421c3e85bdcSAkhil Goyal }, 422c3e85bdcSAkhil Goyal 423c3e85bdcSAkhil Goyal RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 424c3e85bdcSAkhil Goyal }; 425c3e85bdcSAkhil Goyal 426a1173d55SHemant Agrawal static const struct rte_cryptodev_capabilities dpaa_pdcp_capabilities[] = { 427a1173d55SHemant Agrawal { /* SNOW 3G (UIA2) */ 428a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 429a1173d55SHemant Agrawal {.sym = { 430a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 431a1173d55SHemant Agrawal {.auth = { 432a1173d55SHemant Agrawal .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2, 433a1173d55SHemant Agrawal .block_size = 16, 434a1173d55SHemant Agrawal .key_size = { 435a1173d55SHemant Agrawal .min = 16, 436a1173d55SHemant Agrawal .max = 16, 437a1173d55SHemant Agrawal .increment = 0 438a1173d55SHemant Agrawal }, 439a1173d55SHemant Agrawal .digest_size = { 440a1173d55SHemant Agrawal .min = 4, 441a1173d55SHemant Agrawal .max = 4, 442a1173d55SHemant Agrawal .increment = 0 443a1173d55SHemant Agrawal }, 444a1173d55SHemant Agrawal .iv_size = { 445a1173d55SHemant Agrawal .min = 16, 446a1173d55SHemant Agrawal .max = 16, 447a1173d55SHemant Agrawal .increment = 0 448a1173d55SHemant Agrawal } 449a1173d55SHemant Agrawal }, } 450a1173d55SHemant Agrawal }, } 451a1173d55SHemant Agrawal }, 452a1173d55SHemant Agrawal { /* SNOW 3G (UEA2) */ 453a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 454a1173d55SHemant Agrawal {.sym = { 455a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 456a1173d55SHemant Agrawal {.cipher = { 457a1173d55SHemant Agrawal .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 458a1173d55SHemant Agrawal .block_size = 16, 459a1173d55SHemant Agrawal .key_size = { 460a1173d55SHemant Agrawal .min = 16, 461a1173d55SHemant Agrawal .max = 16, 462a1173d55SHemant Agrawal .increment = 0 463a1173d55SHemant Agrawal }, 464a1173d55SHemant Agrawal .iv_size = { 465a1173d55SHemant Agrawal .min = 16, 466a1173d55SHemant Agrawal .max = 16, 467a1173d55SHemant Agrawal .increment = 0 468a1173d55SHemant Agrawal } 469a1173d55SHemant Agrawal }, } 470a1173d55SHemant Agrawal }, } 471a1173d55SHemant Agrawal }, 472a1173d55SHemant Agrawal { /* AES CTR */ 473a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 474a1173d55SHemant Agrawal {.sym = { 475a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 476a1173d55SHemant Agrawal {.cipher = { 477a1173d55SHemant Agrawal .algo = RTE_CRYPTO_CIPHER_AES_CTR, 478a1173d55SHemant Agrawal .block_size = 16, 479a1173d55SHemant Agrawal .key_size = { 480a1173d55SHemant Agrawal .min = 16, 481a1173d55SHemant Agrawal .max = 32, 482a1173d55SHemant Agrawal .increment = 8 483a1173d55SHemant Agrawal }, 484a1173d55SHemant Agrawal .iv_size = { 485a1173d55SHemant Agrawal .min = 16, 486a1173d55SHemant Agrawal .max = 16, 487a1173d55SHemant Agrawal .increment = 0 488a1173d55SHemant Agrawal } 489a1173d55SHemant Agrawal }, } 490a1173d55SHemant Agrawal }, } 491a1173d55SHemant Agrawal }, 492a1173d55SHemant Agrawal { /* NULL (AUTH) */ 493a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 494a1173d55SHemant Agrawal {.sym = { 495a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 496a1173d55SHemant Agrawal {.auth = { 497a1173d55SHemant Agrawal .algo = RTE_CRYPTO_AUTH_NULL, 498a1173d55SHemant Agrawal .block_size = 1, 499a1173d55SHemant Agrawal .key_size = { 500a1173d55SHemant Agrawal .min = 0, 501a1173d55SHemant Agrawal .max = 0, 502a1173d55SHemant Agrawal .increment = 0 503a1173d55SHemant Agrawal }, 504a1173d55SHemant Agrawal .digest_size = { 505a1173d55SHemant Agrawal .min = 0, 506a1173d55SHemant Agrawal .max = 0, 507a1173d55SHemant Agrawal .increment = 0 508a1173d55SHemant Agrawal }, 509a1173d55SHemant Agrawal .iv_size = { 0 } 510a1173d55SHemant Agrawal }, }, 511a1173d55SHemant Agrawal }, }, 512a1173d55SHemant Agrawal }, 513a1173d55SHemant Agrawal { /* NULL (CIPHER) */ 514a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 515a1173d55SHemant Agrawal {.sym = { 516a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 517a1173d55SHemant Agrawal {.cipher = { 518a1173d55SHemant Agrawal .algo = RTE_CRYPTO_CIPHER_NULL, 519a1173d55SHemant Agrawal .block_size = 1, 520a1173d55SHemant Agrawal .key_size = { 521a1173d55SHemant Agrawal .min = 0, 522a1173d55SHemant Agrawal .max = 0, 523a1173d55SHemant Agrawal .increment = 0 524a1173d55SHemant Agrawal }, 525a1173d55SHemant Agrawal .iv_size = { 526a1173d55SHemant Agrawal .min = 0, 527a1173d55SHemant Agrawal .max = 0, 528a1173d55SHemant Agrawal .increment = 0 529a1173d55SHemant Agrawal } 530a1173d55SHemant Agrawal }, }, 531a1173d55SHemant Agrawal }, } 532a1173d55SHemant Agrawal }, 533a1173d55SHemant Agrawal { /* ZUC (EEA3) */ 534a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 535a1173d55SHemant Agrawal {.sym = { 536a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER, 537a1173d55SHemant Agrawal {.cipher = { 538a1173d55SHemant Agrawal .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3, 539a1173d55SHemant Agrawal .block_size = 16, 540a1173d55SHemant Agrawal .key_size = { 541a1173d55SHemant Agrawal .min = 16, 542a1173d55SHemant Agrawal .max = 16, 543a1173d55SHemant Agrawal .increment = 0 544a1173d55SHemant Agrawal }, 545a1173d55SHemant Agrawal .iv_size = { 546a1173d55SHemant Agrawal .min = 16, 547a1173d55SHemant Agrawal .max = 16, 548a1173d55SHemant Agrawal .increment = 0 549a1173d55SHemant Agrawal } 550a1173d55SHemant Agrawal }, } 551a1173d55SHemant Agrawal }, } 552a1173d55SHemant Agrawal }, 553a1173d55SHemant Agrawal { /* ZUC (EIA3) */ 554a1173d55SHemant Agrawal .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 555a1173d55SHemant Agrawal {.sym = { 556a1173d55SHemant Agrawal .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 557a1173d55SHemant Agrawal {.auth = { 558a1173d55SHemant Agrawal .algo = RTE_CRYPTO_AUTH_ZUC_EIA3, 559a1173d55SHemant Agrawal .block_size = 16, 560a1173d55SHemant Agrawal .key_size = { 561a1173d55SHemant Agrawal .min = 16, 562a1173d55SHemant Agrawal .max = 16, 563a1173d55SHemant Agrawal .increment = 0 564a1173d55SHemant Agrawal }, 565a1173d55SHemant Agrawal .digest_size = { 566a1173d55SHemant Agrawal .min = 4, 567a1173d55SHemant Agrawal .max = 4, 568a1173d55SHemant Agrawal .increment = 0 569a1173d55SHemant Agrawal }, 570a1173d55SHemant Agrawal .iv_size = { 571a1173d55SHemant Agrawal .min = 16, 572a1173d55SHemant Agrawal .max = 16, 573a1173d55SHemant Agrawal .increment = 0 574a1173d55SHemant Agrawal } 575a1173d55SHemant Agrawal }, } 576a1173d55SHemant Agrawal }, } 577a1173d55SHemant Agrawal }, 578a1173d55SHemant Agrawal 579a1173d55SHemant Agrawal RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 580a1173d55SHemant Agrawal }; 581a1173d55SHemant Agrawal 5821f14d500SAkhil Goyal static const struct rte_security_capability dpaa_sec_security_cap[] = { 5831f14d500SAkhil Goyal { /* IPsec Lookaside Protocol offload ESP Transport Egress */ 5841f14d500SAkhil Goyal .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 5851f14d500SAkhil Goyal .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 5861f14d500SAkhil Goyal .ipsec = { 5871f14d500SAkhil Goyal .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, 5881f14d500SAkhil Goyal .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, 5891f14d500SAkhil Goyal .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS, 5901f14d500SAkhil Goyal .options = { 0 } 5911f14d500SAkhil Goyal }, 5921f14d500SAkhil Goyal .crypto_capabilities = dpaa_sec_capabilities 5931f14d500SAkhil Goyal }, 5941f14d500SAkhil Goyal { /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */ 5951f14d500SAkhil Goyal .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 5961f14d500SAkhil Goyal .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 5971f14d500SAkhil Goyal .ipsec = { 5981f14d500SAkhil Goyal .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP, 5991f14d500SAkhil Goyal .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL, 6001f14d500SAkhil Goyal .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS, 6011f14d500SAkhil Goyal .options = { 0 } 6021f14d500SAkhil Goyal }, 6031f14d500SAkhil Goyal .crypto_capabilities = dpaa_sec_capabilities 6041f14d500SAkhil Goyal }, 605a1173d55SHemant Agrawal { /* PDCP Lookaside Protocol offload Data */ 606a1173d55SHemant Agrawal .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 607a1173d55SHemant Agrawal .protocol = RTE_SECURITY_PROTOCOL_PDCP, 608a1173d55SHemant Agrawal .pdcp = { 609a1173d55SHemant Agrawal .domain = RTE_SECURITY_PDCP_MODE_DATA, 610a1173d55SHemant Agrawal }, 611a1173d55SHemant Agrawal .crypto_capabilities = dpaa_pdcp_capabilities 612a1173d55SHemant Agrawal }, 613a1173d55SHemant Agrawal { /* PDCP Lookaside Protocol offload Control */ 614a1173d55SHemant Agrawal .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 615a1173d55SHemant Agrawal .protocol = RTE_SECURITY_PROTOCOL_PDCP, 616a1173d55SHemant Agrawal .pdcp = { 617a1173d55SHemant Agrawal .domain = RTE_SECURITY_PDCP_MODE_CONTROL, 618a1173d55SHemant Agrawal }, 619a1173d55SHemant Agrawal .crypto_capabilities = dpaa_pdcp_capabilities 620a1173d55SHemant Agrawal }, 6211f14d500SAkhil Goyal { 6221f14d500SAkhil Goyal .action = RTE_SECURITY_ACTION_TYPE_NONE 6231f14d500SAkhil Goyal } 6241f14d500SAkhil Goyal }; 6251f14d500SAkhil Goyal 6261f14d500SAkhil Goyal /** 6271f14d500SAkhil Goyal * Checksum 6281f14d500SAkhil Goyal * 6291f14d500SAkhil Goyal * @param buffer calculate chksum for buffer 6301f14d500SAkhil Goyal * @param len buffer length 6311f14d500SAkhil Goyal * 6321f14d500SAkhil Goyal * @return checksum value in host cpu order 6331f14d500SAkhil Goyal */ 6341f14d500SAkhil Goyal static inline uint16_t 6351f14d500SAkhil Goyal calc_chksum(void *buffer, int len) 6361f14d500SAkhil Goyal { 6371f14d500SAkhil Goyal uint16_t *buf = (uint16_t *)buffer; 6381f14d500SAkhil Goyal uint32_t sum = 0; 6391f14d500SAkhil Goyal uint16_t result; 6401f14d500SAkhil Goyal 6411f14d500SAkhil Goyal for (sum = 0; len > 1; len -= 2) 6421f14d500SAkhil Goyal sum += *buf++; 6431f14d500SAkhil Goyal 6441f14d500SAkhil Goyal if (len == 1) 6451f14d500SAkhil Goyal sum += *(unsigned char *)buf; 6461f14d500SAkhil Goyal 6471f14d500SAkhil Goyal sum = (sum >> 16) + (sum & 0xFFFF); 6481f14d500SAkhil Goyal sum += (sum >> 16); 6491f14d500SAkhil Goyal result = ~sum; 6501f14d500SAkhil Goyal 6511f14d500SAkhil Goyal return result; 6521f14d500SAkhil Goyal } 6531f14d500SAkhil Goyal 654c3e85bdcSAkhil Goyal #endif /* _DPAA_SEC_H_ */ 655