1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2016-2021 Intel Corporation 3 */ 4 5 #ifndef _PMD_AESNI_GCM_PRIV_H_ 6 #define _PMD_AESNI_GCM_PRIV_H_ 7 8 #include "ipsec_mb_private.h" 9 10 #define AESNI_GCM_IV_LENGTH 12 11 12 static const struct rte_cryptodev_capabilities aesni_gcm_capabilities[] = { 13 { /* AES GMAC (AUTH) */ 14 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 15 {.sym = { 16 .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH, 17 {.auth = { 18 .algo = RTE_CRYPTO_AUTH_AES_GMAC, 19 .block_size = 16, 20 .key_size = { 21 .min = 16, 22 .max = 32, 23 .increment = 8 24 }, 25 .digest_size = { 26 .min = 1, 27 .max = 16, 28 .increment = 1 29 }, 30 .iv_size = { 31 .min = AESNI_GCM_IV_LENGTH, 32 .max = AESNI_GCM_IV_LENGTH, 33 .increment = 0 34 } 35 }, } 36 }, } 37 }, 38 { /* AES GCM */ 39 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC, 40 {.sym = { 41 .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD, 42 {.aead = { 43 .algo = RTE_CRYPTO_AEAD_AES_GCM, 44 .block_size = 16, 45 .key_size = { 46 .min = 16, 47 .max = 32, 48 .increment = 8 49 }, 50 .digest_size = { 51 .min = 1, 52 .max = 16, 53 .increment = 1 54 }, 55 .aad_size = { 56 .min = 0, 57 .max = 65535, 58 .increment = 1 59 }, 60 .iv_size = { 61 .min = AESNI_GCM_IV_LENGTH, 62 .max = AESNI_GCM_IV_LENGTH, 63 .increment = 0 64 } 65 }, } 66 }, } 67 }, 68 RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() 69 }; 70 71 uint8_t pmd_driver_id_aesni_gcm; 72 73 enum aesni_gcm_key_length { 74 GCM_KEY_128 = 0, 75 GCM_KEY_192, 76 GCM_KEY_256, 77 GCM_NUM_KEY_TYPES 78 }; 79 80 typedef void (*aesni_gcm_t)(const struct gcm_key_data *gcm_key_data, 81 struct gcm_context_data *gcm_ctx_data, 82 uint8_t *out, const uint8_t *in, 83 uint64_t plaintext_len, const uint8_t *iv, 84 const uint8_t *aad, uint64_t aad_len, 85 uint8_t *auth_tag, uint64_t auth_tag_len); 86 87 typedef void (*aesni_gcm_pre_t)(const void *key, 88 struct gcm_key_data *gcm_data); 89 90 typedef void (*aesni_gcm_init_t)(const struct gcm_key_data *gcm_key_data, 91 struct gcm_context_data *gcm_ctx_data, 92 const uint8_t *iv, uint8_t const *aad, 93 uint64_t aad_len); 94 95 typedef void (*aesni_gcm_update_t)(const struct gcm_key_data *gcm_key_data, 96 struct gcm_context_data *gcm_ctx_data, 97 uint8_t *out, const uint8_t *in, 98 uint64_t plaintext_len); 99 100 typedef void (*aesni_gcm_finalize_t)(const struct gcm_key_data *gcm_key_data, 101 struct gcm_context_data *gcm_ctx_data, 102 uint8_t *auth_tag, uint64_t auth_tag_len); 103 104 typedef void (*aesni_gmac_init_t)(const struct gcm_key_data *gcm_key_data, 105 struct gcm_context_data *gcm_ctx_data, 106 const uint8_t *iv, const uint64_t iv_len); 107 108 typedef void (*aesni_gmac_update_t)(const struct gcm_key_data *gcm_key_data, 109 struct gcm_context_data *gcm_ctx_data, 110 const uint8_t *in, 111 const uint64_t plaintext_len); 112 113 typedef void (*aesni_gmac_finalize_t)(const struct gcm_key_data *gcm_key_data, 114 struct gcm_context_data *gcm_ctx_data, 115 uint8_t *auth_tag, 116 const uint64_t auth_tag_len); 117 118 /** GCM operation handlers */ 119 struct aesni_gcm_ops { 120 aesni_gcm_t enc; 121 aesni_gcm_t dec; 122 aesni_gcm_pre_t pre; 123 aesni_gcm_init_t init; 124 aesni_gcm_update_t update_enc; 125 aesni_gcm_update_t update_dec; 126 aesni_gcm_finalize_t finalize_enc; 127 aesni_gcm_finalize_t finalize_dec; 128 aesni_gmac_init_t gmac_init; 129 aesni_gmac_update_t gmac_update; 130 aesni_gmac_finalize_t gmac_finalize; 131 }; 132 133 RTE_DEFINE_PER_LCORE(struct aesni_gcm_ops, gcm_ops[GCM_NUM_KEY_TYPES]); 134 135 struct aesni_gcm_qp_data { 136 struct gcm_context_data gcm_ctx_data; 137 uint8_t temp_digest[DIGEST_LENGTH_MAX]; 138 /* *< Buffers used to store the digest generated 139 * by the driver when verifying a digest provided 140 * by the user (using authentication verify operation) 141 */ 142 struct aesni_gcm_ops ops[GCM_NUM_KEY_TYPES]; 143 /**< Operation Handlers */ 144 }; 145 146 /** AESNI GCM private session structure */ 147 struct aesni_gcm_session { 148 struct { 149 uint16_t length; 150 uint16_t offset; 151 } iv; 152 /**< IV parameters */ 153 uint16_t aad_length; 154 /**< AAD length */ 155 uint16_t req_digest_length; 156 /**< Requested digest length */ 157 uint16_t gen_digest_length; 158 /**< Generated digest length */ 159 enum ipsec_mb_operation op; 160 /**< GCM operation type */ 161 struct gcm_key_data gdata_key; 162 /**< GCM parameters */ 163 enum aesni_gcm_key_length key_length; 164 /** Key Length */ 165 }; 166 167 #endif /* _PMD_AESNI_GCM_PRIV_H_ */ 168