1746825e5SPiotr Bronowski /* SPDX-License-Identifier: BSD-3-Clause 2746825e5SPiotr Bronowski * Copyright(c) 2016-2021 Intel Corporation 3746825e5SPiotr Bronowski */ 4746825e5SPiotr Bronowski 5746825e5SPiotr Bronowski #ifndef _PMD_AESNI_GCM_PRIV_H_ 6746825e5SPiotr Bronowski #define _PMD_AESNI_GCM_PRIV_H_ 7746825e5SPiotr Bronowski 8746825e5SPiotr Bronowski #include "ipsec_mb_private.h" 9746825e5SPiotr Bronowski 10746825e5SPiotr Bronowski #define AESNI_GCM_IV_LENGTH 12 11746825e5SPiotr Bronowski 12746825e5SPiotr Bronowski static const struct rte_cryptodev_capabilities aesni_gcm_capabilities[] = { 13746825e5SPiotr Bronowski { /* AES GMAC (AUTH) */ 14746825e5SPiotr Bronowski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 15746825e5SPiotr Bronowski {.sym = { 16746825e5SPiotr Bronowski .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 17746825e5SPiotr Bronowski {.auth = { 18746825e5SPiotr Bronowski .algo = RTE_CRYPTO_AUTH_AES_GMAC, 19746825e5SPiotr Bronowski .block_size = 16, 20746825e5SPiotr Bronowski .key_size = { 21746825e5SPiotr Bronowski .min = 16, 22746825e5SPiotr Bronowski .max = 32, 23746825e5SPiotr Bronowski .increment = 8 24746825e5SPiotr Bronowski }, 25746825e5SPiotr Bronowski .digest_size = { 26746825e5SPiotr Bronowski .min = 1, 27746825e5SPiotr Bronowski .max = 16, 28746825e5SPiotr Bronowski .increment = 1 29746825e5SPiotr Bronowski }, 30746825e5SPiotr Bronowski .iv_size = { 31746825e5SPiotr Bronowski .min = AESNI_GCM_IV_LENGTH, 32746825e5SPiotr Bronowski .max = AESNI_GCM_IV_LENGTH, 33746825e5SPiotr Bronowski .increment = 0 34746825e5SPiotr Bronowski } 35746825e5SPiotr Bronowski }, } 36746825e5SPiotr Bronowski }, } 37746825e5SPiotr Bronowski }, 38746825e5SPiotr Bronowski { /* AES GCM */ 39746825e5SPiotr Bronowski .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 40746825e5SPiotr Bronowski {.sym = { 41746825e5SPiotr Bronowski .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD, 42746825e5SPiotr Bronowski {.aead = { 43746825e5SPiotr Bronowski .algo = RTE_CRYPTO_AEAD_AES_GCM, 44746825e5SPiotr Bronowski .block_size = 16, 45746825e5SPiotr Bronowski .key_size = { 46746825e5SPiotr Bronowski .min = 16, 47746825e5SPiotr Bronowski .max = 32, 48746825e5SPiotr Bronowski .increment = 8 49746825e5SPiotr Bronowski }, 50746825e5SPiotr Bronowski .digest_size = { 51746825e5SPiotr Bronowski .min = 1, 52746825e5SPiotr Bronowski .max = 16, 53746825e5SPiotr Bronowski .increment = 1 54746825e5SPiotr Bronowski }, 55746825e5SPiotr Bronowski .aad_size = { 56746825e5SPiotr Bronowski .min = 0, 57746825e5SPiotr Bronowski .max = 65535, 58746825e5SPiotr Bronowski .increment = 1 59746825e5SPiotr Bronowski }, 60746825e5SPiotr Bronowski .iv_size = { 61746825e5SPiotr Bronowski .min = AESNI_GCM_IV_LENGTH, 62746825e5SPiotr Bronowski .max = AESNI_GCM_IV_LENGTH, 63746825e5SPiotr Bronowski .increment = 0 64746825e5SPiotr Bronowski } 65746825e5SPiotr Bronowski }, } 66746825e5SPiotr Bronowski }, } 67746825e5SPiotr Bronowski }, 68746825e5SPiotr Bronowski RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 69746825e5SPiotr Bronowski }; 70746825e5SPiotr Bronowski 71746825e5SPiotr Bronowski uint8_t pmd_driver_id_aesni_gcm; 72746825e5SPiotr Bronowski 73746825e5SPiotr Bronowski enum aesni_gcm_key_length { 74746825e5SPiotr Bronowski GCM_KEY_128 = 0, 75746825e5SPiotr Bronowski GCM_KEY_192, 76746825e5SPiotr Bronowski GCM_KEY_256, 77746825e5SPiotr Bronowski GCM_NUM_KEY_TYPES 78746825e5SPiotr Bronowski }; 79746825e5SPiotr Bronowski 80746825e5SPiotr Bronowski typedef void (*aesni_gcm_t)(const struct gcm_key_data *gcm_key_data, 81746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 82746825e5SPiotr Bronowski uint8_t *out, const uint8_t *in, 83746825e5SPiotr Bronowski uint64_t plaintext_len, const uint8_t *iv, 84746825e5SPiotr Bronowski const uint8_t *aad, uint64_t aad_len, 85746825e5SPiotr Bronowski uint8_t *auth_tag, uint64_t auth_tag_len); 86746825e5SPiotr Bronowski 87746825e5SPiotr Bronowski typedef void (*aesni_gcm_pre_t)(const void *key, 88746825e5SPiotr Bronowski struct gcm_key_data *gcm_data); 89746825e5SPiotr Bronowski 90746825e5SPiotr Bronowski typedef void (*aesni_gcm_init_t)(const struct gcm_key_data *gcm_key_data, 91746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 92746825e5SPiotr Bronowski const uint8_t *iv, uint8_t const *aad, 93746825e5SPiotr Bronowski uint64_t aad_len); 94746825e5SPiotr Bronowski 95746825e5SPiotr Bronowski typedef void (*aesni_gcm_update_t)(const struct gcm_key_data *gcm_key_data, 96746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 97746825e5SPiotr Bronowski uint8_t *out, const uint8_t *in, 98746825e5SPiotr Bronowski uint64_t plaintext_len); 99746825e5SPiotr Bronowski 100746825e5SPiotr Bronowski typedef void (*aesni_gcm_finalize_t)(const struct gcm_key_data *gcm_key_data, 101746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 102746825e5SPiotr Bronowski uint8_t *auth_tag, uint64_t auth_tag_len); 103746825e5SPiotr Bronowski 104746825e5SPiotr Bronowski typedef void (*aesni_gmac_init_t)(const struct gcm_key_data *gcm_key_data, 105746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 106746825e5SPiotr Bronowski const uint8_t *iv, const uint64_t iv_len); 107746825e5SPiotr Bronowski 108746825e5SPiotr Bronowski typedef void (*aesni_gmac_update_t)(const struct gcm_key_data *gcm_key_data, 109746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 110746825e5SPiotr Bronowski const uint8_t *in, 111746825e5SPiotr Bronowski const uint64_t plaintext_len); 112746825e5SPiotr Bronowski 113746825e5SPiotr Bronowski typedef void (*aesni_gmac_finalize_t)(const struct gcm_key_data *gcm_key_data, 114746825e5SPiotr Bronowski struct gcm_context_data *gcm_ctx_data, 115746825e5SPiotr Bronowski uint8_t *auth_tag, 116746825e5SPiotr Bronowski const uint64_t auth_tag_len); 117746825e5SPiotr Bronowski 118746825e5SPiotr Bronowski /** GCM operation handlers */ 119746825e5SPiotr Bronowski struct aesni_gcm_ops { 120746825e5SPiotr Bronowski aesni_gcm_t enc; 121746825e5SPiotr Bronowski aesni_gcm_t dec; 122746825e5SPiotr Bronowski aesni_gcm_pre_t pre; 123746825e5SPiotr Bronowski aesni_gcm_init_t init; 124746825e5SPiotr Bronowski aesni_gcm_update_t update_enc; 125746825e5SPiotr Bronowski aesni_gcm_update_t update_dec; 126746825e5SPiotr Bronowski aesni_gcm_finalize_t finalize_enc; 127746825e5SPiotr Bronowski aesni_gcm_finalize_t finalize_dec; 128746825e5SPiotr Bronowski aesni_gmac_init_t gmac_init; 129746825e5SPiotr Bronowski aesni_gmac_update_t gmac_update; 130746825e5SPiotr Bronowski aesni_gmac_finalize_t gmac_finalize; 131746825e5SPiotr Bronowski }; 132746825e5SPiotr Bronowski 133*e578789dSTyler Retzlaff RTE_DEFINE_PER_LCORE(struct aesni_gcm_ops, gcm_ops[GCM_NUM_KEY_TYPES]); 134746825e5SPiotr Bronowski 135746825e5SPiotr Bronowski struct aesni_gcm_qp_data { 136746825e5SPiotr Bronowski struct gcm_context_data gcm_ctx_data; 137746825e5SPiotr Bronowski uint8_t temp_digest[DIGEST_LENGTH_MAX]; 138746825e5SPiotr Bronowski /* *< Buffers used to store the digest generated 139746825e5SPiotr Bronowski * by the driver when verifying a digest provided 140746825e5SPiotr Bronowski * by the user (using authentication verify operation) 141746825e5SPiotr Bronowski */ 142746825e5SPiotr Bronowski struct aesni_gcm_ops ops[GCM_NUM_KEY_TYPES]; 143746825e5SPiotr Bronowski /**< Operation Handlers */ 144746825e5SPiotr Bronowski }; 145746825e5SPiotr Bronowski 146746825e5SPiotr Bronowski /** AESNI GCM private session structure */ 147746825e5SPiotr Bronowski struct aesni_gcm_session { 148746825e5SPiotr Bronowski struct { 149746825e5SPiotr Bronowski uint16_t length; 150746825e5SPiotr Bronowski uint16_t offset; 151746825e5SPiotr Bronowski } iv; 152746825e5SPiotr Bronowski /**< IV parameters */ 153746825e5SPiotr Bronowski uint16_t aad_length; 154746825e5SPiotr Bronowski /**< AAD length */ 155746825e5SPiotr Bronowski uint16_t req_digest_length; 156746825e5SPiotr Bronowski /**< Requested digest length */ 157746825e5SPiotr Bronowski uint16_t gen_digest_length; 158746825e5SPiotr Bronowski /**< Generated digest length */ 159746825e5SPiotr Bronowski enum ipsec_mb_operation op; 160746825e5SPiotr Bronowski /**< GCM operation type */ 161746825e5SPiotr Bronowski struct gcm_key_data gdata_key; 162746825e5SPiotr Bronowski /**< GCM parameters */ 163746825e5SPiotr Bronowski enum aesni_gcm_key_length key_length; 164746825e5SPiotr Bronowski /** Key Length */ 165746825e5SPiotr Bronowski }; 166746825e5SPiotr Bronowski 167746825e5SPiotr Bronowski #endif /* _PMD_AESNI_GCM_PRIV_H_ */ 168