162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * caam - Freescale FSL CAAM support for crypto API 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2008-2011 Freescale Semiconductor, Inc. 662306a36Sopenharmony_ci * Copyright 2016-2019, 2023 NXP 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Based on talitos crypto API driver. 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008): 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * --------------- --------------- 1362306a36Sopenharmony_ci * | JobDesc #1 |-------------------->| ShareDesc | 1462306a36Sopenharmony_ci * | *(packet 1) | | (PDB) | 1562306a36Sopenharmony_ci * --------------- |------------->| (hashKey) | 1662306a36Sopenharmony_ci * . | | (cipherKey) | 1762306a36Sopenharmony_ci * . | |-------->| (operation) | 1862306a36Sopenharmony_ci * --------------- | | --------------- 1962306a36Sopenharmony_ci * | JobDesc #2 |------| | 2062306a36Sopenharmony_ci * | *(packet 2) | | 2162306a36Sopenharmony_ci * --------------- | 2262306a36Sopenharmony_ci * . | 2362306a36Sopenharmony_ci * . | 2462306a36Sopenharmony_ci * --------------- | 2562306a36Sopenharmony_ci * | JobDesc #3 |------------ 2662306a36Sopenharmony_ci * | *(packet 3) | 2762306a36Sopenharmony_ci * --------------- 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * The SharedDesc never changes for a connection unless rekeyed, but 3062306a36Sopenharmony_ci * each packet will likely be in a different place. So all we need 3162306a36Sopenharmony_ci * to know to process the packet is where the input is, where the 3262306a36Sopenharmony_ci * output goes, and what context we want to process with. Context is 3362306a36Sopenharmony_ci * in the SharedDesc, packet references in the JobDesc. 3462306a36Sopenharmony_ci * 3562306a36Sopenharmony_ci * So, a job desc looks like: 3662306a36Sopenharmony_ci * 3762306a36Sopenharmony_ci * --------------------- 3862306a36Sopenharmony_ci * | Header | 3962306a36Sopenharmony_ci * | ShareDesc Pointer | 4062306a36Sopenharmony_ci * | SEQ_OUT_PTR | 4162306a36Sopenharmony_ci * | (output buffer) | 4262306a36Sopenharmony_ci * | (output length) | 4362306a36Sopenharmony_ci * | SEQ_IN_PTR | 4462306a36Sopenharmony_ci * | (input buffer) | 4562306a36Sopenharmony_ci * | (input length) | 4662306a36Sopenharmony_ci * --------------------- 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#include "compat.h" 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#include "regs.h" 5262306a36Sopenharmony_ci#include "intern.h" 5362306a36Sopenharmony_ci#include "desc_constr.h" 5462306a36Sopenharmony_ci#include "jr.h" 5562306a36Sopenharmony_ci#include "error.h" 5662306a36Sopenharmony_ci#include "sg_sw_sec4.h" 5762306a36Sopenharmony_ci#include "key_gen.h" 5862306a36Sopenharmony_ci#include "caamalg_desc.h" 5962306a36Sopenharmony_ci#include <asm/unaligned.h> 6062306a36Sopenharmony_ci#include <crypto/internal/aead.h> 6162306a36Sopenharmony_ci#include <crypto/internal/engine.h> 6262306a36Sopenharmony_ci#include <crypto/internal/skcipher.h> 6362306a36Sopenharmony_ci#include <crypto/xts.h> 6462306a36Sopenharmony_ci#include <linux/dma-mapping.h> 6562306a36Sopenharmony_ci#include <linux/device.h> 6662306a36Sopenharmony_ci#include <linux/err.h> 6762306a36Sopenharmony_ci#include <linux/module.h> 6862306a36Sopenharmony_ci#include <linux/kernel.h> 6962306a36Sopenharmony_ci#include <linux/slab.h> 7062306a36Sopenharmony_ci#include <linux/string.h> 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * crypto alg 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci#define CAAM_CRA_PRIORITY 3000 7662306a36Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 7762306a36Sopenharmony_ci#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 7862306a36Sopenharmony_ci CTR_RFC3686_NONCE_SIZE + \ 7962306a36Sopenharmony_ci SHA512_DIGEST_SIZE * 2) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define AEAD_DESC_JOB_IO_LEN (DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2) 8262306a36Sopenharmony_ci#define GCM_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 8362306a36Sopenharmony_ci CAAM_CMD_SZ * 4) 8462306a36Sopenharmony_ci#define AUTHENC_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 8562306a36Sopenharmony_ci CAAM_CMD_SZ * 5) 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci#define CHACHAPOLY_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + CAAM_CMD_SZ * 6) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define DESC_MAX_USED_BYTES (CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN) 9062306a36Sopenharmony_ci#define DESC_MAX_USED_LEN (DESC_MAX_USED_BYTES / CAAM_CMD_SZ) 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistruct caam_alg_entry { 9362306a36Sopenharmony_ci int class1_alg_type; 9462306a36Sopenharmony_ci int class2_alg_type; 9562306a36Sopenharmony_ci bool rfc3686; 9662306a36Sopenharmony_ci bool geniv; 9762306a36Sopenharmony_ci bool nodkp; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistruct caam_aead_alg { 10162306a36Sopenharmony_ci struct aead_engine_alg aead; 10262306a36Sopenharmony_ci struct caam_alg_entry caam; 10362306a36Sopenharmony_ci bool registered; 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct caam_skcipher_alg { 10762306a36Sopenharmony_ci struct skcipher_engine_alg skcipher; 10862306a36Sopenharmony_ci struct caam_alg_entry caam; 10962306a36Sopenharmony_ci bool registered; 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* 11362306a36Sopenharmony_ci * per-session context 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_cistruct caam_ctx { 11662306a36Sopenharmony_ci u32 sh_desc_enc[DESC_MAX_USED_LEN]; 11762306a36Sopenharmony_ci u32 sh_desc_dec[DESC_MAX_USED_LEN]; 11862306a36Sopenharmony_ci u8 key[CAAM_MAX_KEY_SIZE]; 11962306a36Sopenharmony_ci dma_addr_t sh_desc_enc_dma; 12062306a36Sopenharmony_ci dma_addr_t sh_desc_dec_dma; 12162306a36Sopenharmony_ci dma_addr_t key_dma; 12262306a36Sopenharmony_ci enum dma_data_direction dir; 12362306a36Sopenharmony_ci struct device *jrdev; 12462306a36Sopenharmony_ci struct alginfo adata; 12562306a36Sopenharmony_ci struct alginfo cdata; 12662306a36Sopenharmony_ci unsigned int authsize; 12762306a36Sopenharmony_ci bool xts_key_fallback; 12862306a36Sopenharmony_ci struct crypto_skcipher *fallback; 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistruct caam_skcipher_req_ctx { 13262306a36Sopenharmony_ci struct skcipher_edesc *edesc; 13362306a36Sopenharmony_ci struct skcipher_request fallback_req; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct caam_aead_req_ctx { 13762306a36Sopenharmony_ci struct aead_edesc *edesc; 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic int aead_null_set_sh_desc(struct crypto_aead *aead) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 14362306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 14462306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 14562306a36Sopenharmony_ci u32 *desc; 14662306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN - 14762306a36Sopenharmony_ci ctx->adata.keylen_pad; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* 15062306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 15162306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 15262306a36Sopenharmony_ci */ 15362306a36Sopenharmony_ci if (rem_bytes >= DESC_AEAD_NULL_ENC_LEN) { 15462306a36Sopenharmony_ci ctx->adata.key_inline = true; 15562306a36Sopenharmony_ci ctx->adata.key_virt = ctx->key; 15662306a36Sopenharmony_ci } else { 15762306a36Sopenharmony_ci ctx->adata.key_inline = false; 15862306a36Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 15962306a36Sopenharmony_ci } 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci /* aead_encrypt shared descriptor */ 16262306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 16362306a36Sopenharmony_ci cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize, 16462306a36Sopenharmony_ci ctrlpriv->era); 16562306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 16662306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci /* 16962306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 17062306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 17162306a36Sopenharmony_ci */ 17262306a36Sopenharmony_ci if (rem_bytes >= DESC_AEAD_NULL_DEC_LEN) { 17362306a36Sopenharmony_ci ctx->adata.key_inline = true; 17462306a36Sopenharmony_ci ctx->adata.key_virt = ctx->key; 17562306a36Sopenharmony_ci } else { 17662306a36Sopenharmony_ci ctx->adata.key_inline = false; 17762306a36Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci /* aead_decrypt shared descriptor */ 18162306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 18262306a36Sopenharmony_ci cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize, 18362306a36Sopenharmony_ci ctrlpriv->era); 18462306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 18562306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci return 0; 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 19362306a36Sopenharmony_ci struct caam_aead_alg, 19462306a36Sopenharmony_ci aead.base); 19562306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 19662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 19762306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 19862306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 19962306a36Sopenharmony_ci u32 ctx1_iv_off = 0; 20062306a36Sopenharmony_ci u32 *desc, *nonce = NULL; 20162306a36Sopenharmony_ci u32 inl_mask; 20262306a36Sopenharmony_ci unsigned int data_len[2]; 20362306a36Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 20462306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 20562306a36Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci if (!ctx->authsize) 20862306a36Sopenharmony_ci return 0; 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* NULL encryption / decryption */ 21162306a36Sopenharmony_ci if (!ctx->cdata.keylen) 21262306a36Sopenharmony_ci return aead_null_set_sh_desc(aead); 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci /* 21562306a36Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 21662306a36Sopenharmony_ci * at an offset of 128bits (16bytes) 21762306a36Sopenharmony_ci * CONTEXT1[255:128] = IV 21862306a36Sopenharmony_ci */ 21962306a36Sopenharmony_ci if (ctr_mode) 22062306a36Sopenharmony_ci ctx1_iv_off = 16; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* 22362306a36Sopenharmony_ci * RFC3686 specific: 22462306a36Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 22562306a36Sopenharmony_ci */ 22662306a36Sopenharmony_ci if (is_rfc3686) { 22762306a36Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 22862306a36Sopenharmony_ci nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad + 22962306a36Sopenharmony_ci ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE); 23062306a36Sopenharmony_ci } 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci /* 23362306a36Sopenharmony_ci * In case |user key| > |derived key|, using DKP<imm,imm> 23462306a36Sopenharmony_ci * would result in invalid opcodes (last bytes of user key) in 23562306a36Sopenharmony_ci * the resulting descriptor. Use DKP<ptr,imm> instead => both 23662306a36Sopenharmony_ci * virtual and dma key addresses are needed. 23762306a36Sopenharmony_ci */ 23862306a36Sopenharmony_ci ctx->adata.key_virt = ctx->key; 23962306a36Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad; 24262306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci data_len[0] = ctx->adata.keylen_pad; 24562306a36Sopenharmony_ci data_len[1] = ctx->cdata.keylen; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci if (alg->caam.geniv) 24862306a36Sopenharmony_ci goto skip_enc; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci /* 25162306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 25262306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 25362306a36Sopenharmony_ci */ 25462306a36Sopenharmony_ci if (desc_inline_query(DESC_AEAD_ENC_LEN + 25562306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 25662306a36Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 25762306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 25862306a36Sopenharmony_ci return -EINVAL; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 26162306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci /* aead_encrypt shared descriptor */ 26462306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 26562306a36Sopenharmony_ci cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize, 26662306a36Sopenharmony_ci ctx->authsize, is_rfc3686, nonce, ctx1_iv_off, 26762306a36Sopenharmony_ci false, ctrlpriv->era); 26862306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 26962306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ciskip_enc: 27262306a36Sopenharmony_ci /* 27362306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 27462306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_ci if (desc_inline_query(DESC_AEAD_DEC_LEN + 27762306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 27862306a36Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 27962306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 28062306a36Sopenharmony_ci return -EINVAL; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 28362306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci /* aead_decrypt shared descriptor */ 28662306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 28762306a36Sopenharmony_ci cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize, 28862306a36Sopenharmony_ci ctx->authsize, alg->caam.geniv, is_rfc3686, 28962306a36Sopenharmony_ci nonce, ctx1_iv_off, false, ctrlpriv->era); 29062306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 29162306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci if (!alg->caam.geniv) 29462306a36Sopenharmony_ci goto skip_givenc; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci /* 29762306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 29862306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 29962306a36Sopenharmony_ci */ 30062306a36Sopenharmony_ci if (desc_inline_query(DESC_AEAD_GIVENC_LEN + 30162306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 30262306a36Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 30362306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 30462306a36Sopenharmony_ci return -EINVAL; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 30762306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci /* aead_givencrypt shared descriptor */ 31062306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 31162306a36Sopenharmony_ci cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize, 31262306a36Sopenharmony_ci ctx->authsize, is_rfc3686, nonce, 31362306a36Sopenharmony_ci ctx1_iv_off, false, ctrlpriv->era); 31462306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 31562306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ciskip_givenc: 31862306a36Sopenharmony_ci return 0; 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, 32262306a36Sopenharmony_ci unsigned int authsize) 32362306a36Sopenharmony_ci{ 32462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci ctx->authsize = authsize; 32762306a36Sopenharmony_ci aead_set_sh_desc(authenc); 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci return 0; 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 33562306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 33662306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 33762306a36Sopenharmony_ci u32 *desc; 33862306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 33962306a36Sopenharmony_ci ctx->cdata.keylen; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 34262306a36Sopenharmony_ci return 0; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci /* 34562306a36Sopenharmony_ci * AES GCM encrypt shared descriptor 34662306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 34762306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 34862306a36Sopenharmony_ci */ 34962306a36Sopenharmony_ci if (rem_bytes >= DESC_GCM_ENC_LEN) { 35062306a36Sopenharmony_ci ctx->cdata.key_inline = true; 35162306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 35262306a36Sopenharmony_ci } else { 35362306a36Sopenharmony_ci ctx->cdata.key_inline = false; 35462306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 35562306a36Sopenharmony_ci } 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 35862306a36Sopenharmony_ci cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, false); 35962306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 36062306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci /* 36362306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 36462306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 36562306a36Sopenharmony_ci */ 36662306a36Sopenharmony_ci if (rem_bytes >= DESC_GCM_DEC_LEN) { 36762306a36Sopenharmony_ci ctx->cdata.key_inline = true; 36862306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 36962306a36Sopenharmony_ci } else { 37062306a36Sopenharmony_ci ctx->cdata.key_inline = false; 37162306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 37562306a36Sopenharmony_ci cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, false); 37662306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 37762306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci return 0; 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 38562306a36Sopenharmony_ci int err; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci err = crypto_gcm_check_authsize(authsize); 38862306a36Sopenharmony_ci if (err) 38962306a36Sopenharmony_ci return err; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci ctx->authsize = authsize; 39262306a36Sopenharmony_ci gcm_set_sh_desc(authenc); 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci return 0; 39562306a36Sopenharmony_ci} 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead) 39862306a36Sopenharmony_ci{ 39962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 40062306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 40162306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 40262306a36Sopenharmony_ci u32 *desc; 40362306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 40462306a36Sopenharmony_ci ctx->cdata.keylen; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 40762306a36Sopenharmony_ci return 0; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci /* 41062306a36Sopenharmony_ci * RFC4106 encrypt shared descriptor 41162306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 41262306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 41362306a36Sopenharmony_ci */ 41462306a36Sopenharmony_ci if (rem_bytes >= DESC_RFC4106_ENC_LEN) { 41562306a36Sopenharmony_ci ctx->cdata.key_inline = true; 41662306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 41762306a36Sopenharmony_ci } else { 41862306a36Sopenharmony_ci ctx->cdata.key_inline = false; 41962306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 42062306a36Sopenharmony_ci } 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 42362306a36Sopenharmony_ci cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 42462306a36Sopenharmony_ci false); 42562306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 42662306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci /* 42962306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 43062306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 43162306a36Sopenharmony_ci */ 43262306a36Sopenharmony_ci if (rem_bytes >= DESC_RFC4106_DEC_LEN) { 43362306a36Sopenharmony_ci ctx->cdata.key_inline = true; 43462306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 43562306a36Sopenharmony_ci } else { 43662306a36Sopenharmony_ci ctx->cdata.key_inline = false; 43762306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 43862306a36Sopenharmony_ci } 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 44162306a36Sopenharmony_ci cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 44262306a36Sopenharmony_ci false); 44362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 44462306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci return 0; 44762306a36Sopenharmony_ci} 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc, 45062306a36Sopenharmony_ci unsigned int authsize) 45162306a36Sopenharmony_ci{ 45262306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 45362306a36Sopenharmony_ci int err; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci err = crypto_rfc4106_check_authsize(authsize); 45662306a36Sopenharmony_ci if (err) 45762306a36Sopenharmony_ci return err; 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ci ctx->authsize = authsize; 46062306a36Sopenharmony_ci rfc4106_set_sh_desc(authenc); 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci return 0; 46362306a36Sopenharmony_ci} 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead) 46662306a36Sopenharmony_ci{ 46762306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 46862306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 46962306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 47062306a36Sopenharmony_ci u32 *desc; 47162306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 47262306a36Sopenharmony_ci ctx->cdata.keylen; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 47562306a36Sopenharmony_ci return 0; 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci /* 47862306a36Sopenharmony_ci * RFC4543 encrypt shared descriptor 47962306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 48062306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 48162306a36Sopenharmony_ci */ 48262306a36Sopenharmony_ci if (rem_bytes >= DESC_RFC4543_ENC_LEN) { 48362306a36Sopenharmony_ci ctx->cdata.key_inline = true; 48462306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 48562306a36Sopenharmony_ci } else { 48662306a36Sopenharmony_ci ctx->cdata.key_inline = false; 48762306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 48862306a36Sopenharmony_ci } 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 49162306a36Sopenharmony_ci cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 49262306a36Sopenharmony_ci false); 49362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 49462306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci /* 49762306a36Sopenharmony_ci * Job Descriptor and Shared Descriptors 49862306a36Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 49962306a36Sopenharmony_ci */ 50062306a36Sopenharmony_ci if (rem_bytes >= DESC_RFC4543_DEC_LEN) { 50162306a36Sopenharmony_ci ctx->cdata.key_inline = true; 50262306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 50362306a36Sopenharmony_ci } else { 50462306a36Sopenharmony_ci ctx->cdata.key_inline = false; 50562306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 50662306a36Sopenharmony_ci } 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 50962306a36Sopenharmony_ci cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 51062306a36Sopenharmony_ci false); 51162306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 51262306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci return 0; 51562306a36Sopenharmony_ci} 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc, 51862306a36Sopenharmony_ci unsigned int authsize) 51962306a36Sopenharmony_ci{ 52062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci if (authsize != 16) 52362306a36Sopenharmony_ci return -EINVAL; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci ctx->authsize = authsize; 52662306a36Sopenharmony_ci rfc4543_set_sh_desc(authenc); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci return 0; 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic int chachapoly_set_sh_desc(struct crypto_aead *aead) 53262306a36Sopenharmony_ci{ 53362306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 53462306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 53562306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 53662306a36Sopenharmony_ci u32 *desc; 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 53962306a36Sopenharmony_ci return 0; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 54262306a36Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 54362306a36Sopenharmony_ci ctx->authsize, true, false); 54462306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 54562306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 54862306a36Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 54962306a36Sopenharmony_ci ctx->authsize, false, false); 55062306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 55162306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci return 0; 55462306a36Sopenharmony_ci} 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_cistatic int chachapoly_setauthsize(struct crypto_aead *aead, 55762306a36Sopenharmony_ci unsigned int authsize) 55862306a36Sopenharmony_ci{ 55962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci if (authsize != POLY1305_DIGEST_SIZE) 56262306a36Sopenharmony_ci return -EINVAL; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci ctx->authsize = authsize; 56562306a36Sopenharmony_ci return chachapoly_set_sh_desc(aead); 56662306a36Sopenharmony_ci} 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_cistatic int chachapoly_setkey(struct crypto_aead *aead, const u8 *key, 56962306a36Sopenharmony_ci unsigned int keylen) 57062306a36Sopenharmony_ci{ 57162306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 57262306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 57362306a36Sopenharmony_ci unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize; 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci if (keylen != CHACHA_KEY_SIZE + saltlen) 57662306a36Sopenharmony_ci return -EINVAL; 57762306a36Sopenharmony_ci 57862306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 57962306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 58062306a36Sopenharmony_ci ctx->cdata.keylen = keylen - saltlen; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci return chachapoly_set_sh_desc(aead); 58362306a36Sopenharmony_ci} 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, 58662306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 58962306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 59062306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 59162306a36Sopenharmony_ci struct crypto_authenc_keys keys; 59262306a36Sopenharmony_ci int ret = 0; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci if (crypto_authenc_extractkeys(&keys, key, keylen) != 0) 59562306a36Sopenharmony_ci goto badkey; 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n", 59862306a36Sopenharmony_ci keys.authkeylen + keys.enckeylen, keys.enckeylen, 59962306a36Sopenharmony_ci keys.authkeylen); 60062306a36Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 60162306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci /* 60462306a36Sopenharmony_ci * If DKP is supported, use it in the shared descriptor to generate 60562306a36Sopenharmony_ci * the split key. 60662306a36Sopenharmony_ci */ 60762306a36Sopenharmony_ci if (ctrlpriv->era >= 6) { 60862306a36Sopenharmony_ci ctx->adata.keylen = keys.authkeylen; 60962306a36Sopenharmony_ci ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype & 61062306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK); 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE) 61362306a36Sopenharmony_ci goto badkey; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci memcpy(ctx->key, keys.authkey, keys.authkeylen); 61662306a36Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, 61762306a36Sopenharmony_ci keys.enckeylen); 61862306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, 61962306a36Sopenharmony_ci ctx->adata.keylen_pad + 62062306a36Sopenharmony_ci keys.enckeylen, ctx->dir); 62162306a36Sopenharmony_ci goto skip_split_key; 62262306a36Sopenharmony_ci } 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_ci ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey, 62562306a36Sopenharmony_ci keys.authkeylen, CAAM_MAX_KEY_SIZE - 62662306a36Sopenharmony_ci keys.enckeylen); 62762306a36Sopenharmony_ci if (ret) { 62862306a36Sopenharmony_ci goto badkey; 62962306a36Sopenharmony_ci } 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci /* postpend encryption key to auth split key */ 63262306a36Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen); 63362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad + 63462306a36Sopenharmony_ci keys.enckeylen, ctx->dir); 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_ci print_hex_dump_debug("ctx.key@"__stringify(__LINE__)": ", 63762306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, 63862306a36Sopenharmony_ci ctx->adata.keylen_pad + keys.enckeylen, 1); 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ciskip_split_key: 64162306a36Sopenharmony_ci ctx->cdata.keylen = keys.enckeylen; 64262306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 64362306a36Sopenharmony_ci return aead_set_sh_desc(aead); 64462306a36Sopenharmony_cibadkey: 64562306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 64662306a36Sopenharmony_ci return -EINVAL; 64762306a36Sopenharmony_ci} 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key, 65062306a36Sopenharmony_ci unsigned int keylen) 65162306a36Sopenharmony_ci{ 65262306a36Sopenharmony_ci struct crypto_authenc_keys keys; 65362306a36Sopenharmony_ci int err; 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ci err = crypto_authenc_extractkeys(&keys, key, keylen); 65662306a36Sopenharmony_ci if (unlikely(err)) 65762306a36Sopenharmony_ci return err; 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?: 66062306a36Sopenharmony_ci aead_setkey(aead, key, keylen); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 66362306a36Sopenharmony_ci return err; 66462306a36Sopenharmony_ci} 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead, 66762306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 66862306a36Sopenharmony_ci{ 66962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 67062306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 67162306a36Sopenharmony_ci int err; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci err = aes_check_keylen(keylen); 67462306a36Sopenharmony_ci if (err) 67562306a36Sopenharmony_ci return err; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 67862306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 68162306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir); 68262306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci return gcm_set_sh_desc(aead); 68562306a36Sopenharmony_ci} 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead, 68862306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 68962306a36Sopenharmony_ci{ 69062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 69162306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 69262306a36Sopenharmony_ci int err; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci err = aes_check_keylen(keylen - 4); 69562306a36Sopenharmony_ci if (err) 69662306a36Sopenharmony_ci return err; 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 69962306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci /* 70462306a36Sopenharmony_ci * The last four bytes of the key material are used as the salt value 70562306a36Sopenharmony_ci * in the nonce. Update the AES key length. 70662306a36Sopenharmony_ci */ 70762306a36Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 70862306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, 70962306a36Sopenharmony_ci ctx->dir); 71062306a36Sopenharmony_ci return rfc4106_set_sh_desc(aead); 71162306a36Sopenharmony_ci} 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead, 71462306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 71562306a36Sopenharmony_ci{ 71662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 71762306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 71862306a36Sopenharmony_ci int err; 71962306a36Sopenharmony_ci 72062306a36Sopenharmony_ci err = aes_check_keylen(keylen - 4); 72162306a36Sopenharmony_ci if (err) 72262306a36Sopenharmony_ci return err; 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 72562306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci /* 73062306a36Sopenharmony_ci * The last four bytes of the key material are used as the salt value 73162306a36Sopenharmony_ci * in the nonce. Update the AES key length. 73262306a36Sopenharmony_ci */ 73362306a36Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 73462306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, 73562306a36Sopenharmony_ci ctx->dir); 73662306a36Sopenharmony_ci return rfc4543_set_sh_desc(aead); 73762306a36Sopenharmony_ci} 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 74062306a36Sopenharmony_ci unsigned int keylen, const u32 ctx1_iv_off) 74162306a36Sopenharmony_ci{ 74262306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 74362306a36Sopenharmony_ci struct caam_skcipher_alg *alg = 74462306a36Sopenharmony_ci container_of(crypto_skcipher_alg(skcipher), typeof(*alg), 74562306a36Sopenharmony_ci skcipher.base); 74662306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 74762306a36Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 74862306a36Sopenharmony_ci u32 *desc; 74962306a36Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 75262306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 75562306a36Sopenharmony_ci ctx->cdata.key_virt = key; 75662306a36Sopenharmony_ci ctx->cdata.key_inline = true; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci /* skcipher_encrypt shared descriptor */ 75962306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 76062306a36Sopenharmony_ci cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686, 76162306a36Sopenharmony_ci ctx1_iv_off); 76262306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 76362306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci /* skcipher_decrypt shared descriptor */ 76662306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 76762306a36Sopenharmony_ci cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686, 76862306a36Sopenharmony_ci ctx1_iv_off); 76962306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 77062306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci return 0; 77362306a36Sopenharmony_ci} 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher, 77662306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 77762306a36Sopenharmony_ci{ 77862306a36Sopenharmony_ci int err; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci err = aes_check_keylen(keylen); 78162306a36Sopenharmony_ci if (err) 78262306a36Sopenharmony_ci return err; 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, 0); 78562306a36Sopenharmony_ci} 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher, 78862306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 78962306a36Sopenharmony_ci{ 79062306a36Sopenharmony_ci u32 ctx1_iv_off; 79162306a36Sopenharmony_ci int err; 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci /* 79462306a36Sopenharmony_ci * RFC3686 specific: 79562306a36Sopenharmony_ci * | CONTEXT1[255:128] = {NONCE, IV, COUNTER} 79662306a36Sopenharmony_ci * | *key = {KEY, NONCE} 79762306a36Sopenharmony_ci */ 79862306a36Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 79962306a36Sopenharmony_ci keylen -= CTR_RFC3686_NONCE_SIZE; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci err = aes_check_keylen(keylen); 80262306a36Sopenharmony_ci if (err) 80362306a36Sopenharmony_ci return err; 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 80662306a36Sopenharmony_ci} 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher, 80962306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 81062306a36Sopenharmony_ci{ 81162306a36Sopenharmony_ci u32 ctx1_iv_off; 81262306a36Sopenharmony_ci int err; 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci /* 81562306a36Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 81662306a36Sopenharmony_ci * at an offset of 128bits (16bytes) 81762306a36Sopenharmony_ci * CONTEXT1[255:128] = IV 81862306a36Sopenharmony_ci */ 81962306a36Sopenharmony_ci ctx1_iv_off = 16; 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci err = aes_check_keylen(keylen); 82262306a36Sopenharmony_ci if (err) 82362306a36Sopenharmony_ci return err; 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 82662306a36Sopenharmony_ci} 82762306a36Sopenharmony_ci 82862306a36Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher, 82962306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 83062306a36Sopenharmony_ci{ 83162306a36Sopenharmony_ci return verify_skcipher_des_key(skcipher, key) ?: 83262306a36Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 83362306a36Sopenharmony_ci} 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher, 83662306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 83762306a36Sopenharmony_ci{ 83862306a36Sopenharmony_ci return verify_skcipher_des3_key(skcipher, key) ?: 83962306a36Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 84062306a36Sopenharmony_ci} 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 84362306a36Sopenharmony_ci unsigned int keylen) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 84662306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 84762306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 84862306a36Sopenharmony_ci u32 *desc; 84962306a36Sopenharmony_ci int err; 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci err = xts_verify_key(skcipher, key, keylen); 85262306a36Sopenharmony_ci if (err) { 85362306a36Sopenharmony_ci dev_dbg(jrdev, "key size mismatch\n"); 85462306a36Sopenharmony_ci return err; 85562306a36Sopenharmony_ci } 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_ci if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256) 85862306a36Sopenharmony_ci ctx->xts_key_fallback = true; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) { 86162306a36Sopenharmony_ci err = crypto_skcipher_setkey(ctx->fallback, key, keylen); 86262306a36Sopenharmony_ci if (err) 86362306a36Sopenharmony_ci return err; 86462306a36Sopenharmony_ci } 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 86762306a36Sopenharmony_ci ctx->cdata.key_virt = key; 86862306a36Sopenharmony_ci ctx->cdata.key_inline = true; 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci /* xts_skcipher_encrypt shared descriptor */ 87162306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 87262306a36Sopenharmony_ci cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata); 87362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 87462306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci /* xts_skcipher_decrypt shared descriptor */ 87762306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 87862306a36Sopenharmony_ci cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata); 87962306a36Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 88062306a36Sopenharmony_ci desc_bytes(desc), ctx->dir); 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci return 0; 88362306a36Sopenharmony_ci} 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci/* 88662306a36Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor 88762306a36Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist 88862306a36Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist 88962306a36Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table 89062306a36Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table 89162306a36Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space 89262306a36Sopenharmony_ci * @bklog: stored to determine if the request needs backlog 89362306a36Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table 89462306a36Sopenharmony_ci * @sec4_sg: pointer to h/w link table 89562306a36Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables 89662306a36Sopenharmony_ci */ 89762306a36Sopenharmony_cistruct aead_edesc { 89862306a36Sopenharmony_ci int src_nents; 89962306a36Sopenharmony_ci int dst_nents; 90062306a36Sopenharmony_ci int mapped_src_nents; 90162306a36Sopenharmony_ci int mapped_dst_nents; 90262306a36Sopenharmony_ci int sec4_sg_bytes; 90362306a36Sopenharmony_ci bool bklog; 90462306a36Sopenharmony_ci dma_addr_t sec4_sg_dma; 90562306a36Sopenharmony_ci struct sec4_sg_entry *sec4_sg; 90662306a36Sopenharmony_ci u32 hw_desc[]; 90762306a36Sopenharmony_ci}; 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_ci/* 91062306a36Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor 91162306a36Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist 91262306a36Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist 91362306a36Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table 91462306a36Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table 91562306a36Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 91662306a36Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space 91762306a36Sopenharmony_ci * @bklog: stored to determine if the request needs backlog 91862306a36Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table 91962306a36Sopenharmony_ci * @sec4_sg: pointer to h/w link table 92062306a36Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables 92162306a36Sopenharmony_ci * and IV 92262306a36Sopenharmony_ci */ 92362306a36Sopenharmony_cistruct skcipher_edesc { 92462306a36Sopenharmony_ci int src_nents; 92562306a36Sopenharmony_ci int dst_nents; 92662306a36Sopenharmony_ci int mapped_src_nents; 92762306a36Sopenharmony_ci int mapped_dst_nents; 92862306a36Sopenharmony_ci dma_addr_t iv_dma; 92962306a36Sopenharmony_ci int sec4_sg_bytes; 93062306a36Sopenharmony_ci bool bklog; 93162306a36Sopenharmony_ci dma_addr_t sec4_sg_dma; 93262306a36Sopenharmony_ci struct sec4_sg_entry *sec4_sg; 93362306a36Sopenharmony_ci u32 hw_desc[]; 93462306a36Sopenharmony_ci}; 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src, 93762306a36Sopenharmony_ci struct scatterlist *dst, int src_nents, 93862306a36Sopenharmony_ci int dst_nents, 93962306a36Sopenharmony_ci dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma, 94062306a36Sopenharmony_ci int sec4_sg_bytes) 94162306a36Sopenharmony_ci{ 94262306a36Sopenharmony_ci if (dst != src) { 94362306a36Sopenharmony_ci if (src_nents) 94462306a36Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE); 94562306a36Sopenharmony_ci if (dst_nents) 94662306a36Sopenharmony_ci dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE); 94762306a36Sopenharmony_ci } else { 94862306a36Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL); 94962306a36Sopenharmony_ci } 95062306a36Sopenharmony_ci 95162306a36Sopenharmony_ci if (iv_dma) 95262306a36Sopenharmony_ci dma_unmap_single(dev, iv_dma, ivsize, DMA_BIDIRECTIONAL); 95362306a36Sopenharmony_ci if (sec4_sg_bytes) 95462306a36Sopenharmony_ci dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes, 95562306a36Sopenharmony_ci DMA_TO_DEVICE); 95662306a36Sopenharmony_ci} 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_cistatic void aead_unmap(struct device *dev, 95962306a36Sopenharmony_ci struct aead_edesc *edesc, 96062306a36Sopenharmony_ci struct aead_request *req) 96162306a36Sopenharmony_ci{ 96262306a36Sopenharmony_ci caam_unmap(dev, req->src, req->dst, 96362306a36Sopenharmony_ci edesc->src_nents, edesc->dst_nents, 0, 0, 96462306a36Sopenharmony_ci edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 96562306a36Sopenharmony_ci} 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc, 96862306a36Sopenharmony_ci struct skcipher_request *req) 96962306a36Sopenharmony_ci{ 97062306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 97162306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci caam_unmap(dev, req->src, req->dst, 97462306a36Sopenharmony_ci edesc->src_nents, edesc->dst_nents, 97562306a36Sopenharmony_ci edesc->iv_dma, ivsize, 97662306a36Sopenharmony_ci edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 97762306a36Sopenharmony_ci} 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_cistatic void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err, 98062306a36Sopenharmony_ci void *context) 98162306a36Sopenharmony_ci{ 98262306a36Sopenharmony_ci struct aead_request *req = context; 98362306a36Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 98462306a36Sopenharmony_ci struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev); 98562306a36Sopenharmony_ci struct aead_edesc *edesc; 98662306a36Sopenharmony_ci int ecode = 0; 98762306a36Sopenharmony_ci bool has_bklog; 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 99062306a36Sopenharmony_ci 99162306a36Sopenharmony_ci edesc = rctx->edesc; 99262306a36Sopenharmony_ci has_bklog = edesc->bklog; 99362306a36Sopenharmony_ci 99462306a36Sopenharmony_ci if (err) 99562306a36Sopenharmony_ci ecode = caam_jr_strstatus(jrdev, err); 99662306a36Sopenharmony_ci 99762306a36Sopenharmony_ci aead_unmap(jrdev, edesc, req); 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_ci kfree(edesc); 100062306a36Sopenharmony_ci 100162306a36Sopenharmony_ci /* 100262306a36Sopenharmony_ci * If no backlog flag, the completion of the request is done 100362306a36Sopenharmony_ci * by CAAM, not crypto engine. 100462306a36Sopenharmony_ci */ 100562306a36Sopenharmony_ci if (!has_bklog) 100662306a36Sopenharmony_ci aead_request_complete(req, ecode); 100762306a36Sopenharmony_ci else 100862306a36Sopenharmony_ci crypto_finalize_aead_request(jrp->engine, req, ecode); 100962306a36Sopenharmony_ci} 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_cistatic inline u8 *skcipher_edesc_iv(struct skcipher_edesc *edesc) 101262306a36Sopenharmony_ci{ 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_ci return PTR_ALIGN((u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes, 101562306a36Sopenharmony_ci dma_get_cache_alignment()); 101662306a36Sopenharmony_ci} 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_cistatic void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err, 101962306a36Sopenharmony_ci void *context) 102062306a36Sopenharmony_ci{ 102162306a36Sopenharmony_ci struct skcipher_request *req = context; 102262306a36Sopenharmony_ci struct skcipher_edesc *edesc; 102362306a36Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 102462306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 102562306a36Sopenharmony_ci struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev); 102662306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 102762306a36Sopenharmony_ci int ecode = 0; 102862306a36Sopenharmony_ci bool has_bklog; 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci edesc = rctx->edesc; 103362306a36Sopenharmony_ci has_bklog = edesc->bklog; 103462306a36Sopenharmony_ci if (err) 103562306a36Sopenharmony_ci ecode = caam_jr_strstatus(jrdev, err); 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci skcipher_unmap(jrdev, edesc, req); 103862306a36Sopenharmony_ci 103962306a36Sopenharmony_ci /* 104062306a36Sopenharmony_ci * The crypto API expects us to set the IV (req->iv) to the last 104162306a36Sopenharmony_ci * ciphertext block (CBC mode) or last counter (CTR mode). 104262306a36Sopenharmony_ci * This is used e.g. by the CTS mode. 104362306a36Sopenharmony_ci */ 104462306a36Sopenharmony_ci if (ivsize && !ecode) { 104562306a36Sopenharmony_ci memcpy(req->iv, skcipher_edesc_iv(edesc), ivsize); 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ", 104862306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, 104962306a36Sopenharmony_ci ivsize, 1); 105062306a36Sopenharmony_ci } 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci caam_dump_sg("dst @" __stringify(__LINE__)": ", 105362306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->dst, 105462306a36Sopenharmony_ci edesc->dst_nents > 1 ? 100 : req->cryptlen, 1); 105562306a36Sopenharmony_ci 105662306a36Sopenharmony_ci kfree(edesc); 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci /* 105962306a36Sopenharmony_ci * If no backlog flag, the completion of the request is done 106062306a36Sopenharmony_ci * by CAAM, not crypto engine. 106162306a36Sopenharmony_ci */ 106262306a36Sopenharmony_ci if (!has_bklog) 106362306a36Sopenharmony_ci skcipher_request_complete(req, ecode); 106462306a36Sopenharmony_ci else 106562306a36Sopenharmony_ci crypto_finalize_skcipher_request(jrp->engine, req, ecode); 106662306a36Sopenharmony_ci} 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci/* 106962306a36Sopenharmony_ci * Fill in aead job descriptor 107062306a36Sopenharmony_ci */ 107162306a36Sopenharmony_cistatic void init_aead_job(struct aead_request *req, 107262306a36Sopenharmony_ci struct aead_edesc *edesc, 107362306a36Sopenharmony_ci bool all_contig, bool encrypt) 107462306a36Sopenharmony_ci{ 107562306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 107662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 107762306a36Sopenharmony_ci int authsize = ctx->authsize; 107862306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 107962306a36Sopenharmony_ci u32 out_options, in_options; 108062306a36Sopenharmony_ci dma_addr_t dst_dma, src_dma; 108162306a36Sopenharmony_ci int len, sec4_sg_index = 0; 108262306a36Sopenharmony_ci dma_addr_t ptr; 108362306a36Sopenharmony_ci u32 *sh_desc; 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec; 108662306a36Sopenharmony_ci ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma; 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_ci len = desc_len(sh_desc); 108962306a36Sopenharmony_ci init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci if (all_contig) { 109262306a36Sopenharmony_ci src_dma = edesc->mapped_src_nents ? sg_dma_address(req->src) : 109362306a36Sopenharmony_ci 0; 109462306a36Sopenharmony_ci in_options = 0; 109562306a36Sopenharmony_ci } else { 109662306a36Sopenharmony_ci src_dma = edesc->sec4_sg_dma; 109762306a36Sopenharmony_ci sec4_sg_index += edesc->mapped_src_nents; 109862306a36Sopenharmony_ci in_options = LDST_SGF; 109962306a36Sopenharmony_ci } 110062306a36Sopenharmony_ci 110162306a36Sopenharmony_ci append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen, 110262306a36Sopenharmony_ci in_options); 110362306a36Sopenharmony_ci 110462306a36Sopenharmony_ci dst_dma = src_dma; 110562306a36Sopenharmony_ci out_options = in_options; 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci if (unlikely(req->src != req->dst)) { 110862306a36Sopenharmony_ci if (!edesc->mapped_dst_nents) { 110962306a36Sopenharmony_ci dst_dma = 0; 111062306a36Sopenharmony_ci out_options = 0; 111162306a36Sopenharmony_ci } else if (edesc->mapped_dst_nents == 1) { 111262306a36Sopenharmony_ci dst_dma = sg_dma_address(req->dst); 111362306a36Sopenharmony_ci out_options = 0; 111462306a36Sopenharmony_ci } else { 111562306a36Sopenharmony_ci dst_dma = edesc->sec4_sg_dma + 111662306a36Sopenharmony_ci sec4_sg_index * 111762306a36Sopenharmony_ci sizeof(struct sec4_sg_entry); 111862306a36Sopenharmony_ci out_options = LDST_SGF; 111962306a36Sopenharmony_ci } 112062306a36Sopenharmony_ci } 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci if (encrypt) 112362306a36Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, 112462306a36Sopenharmony_ci req->assoclen + req->cryptlen + authsize, 112562306a36Sopenharmony_ci out_options); 112662306a36Sopenharmony_ci else 112762306a36Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, 112862306a36Sopenharmony_ci req->assoclen + req->cryptlen - authsize, 112962306a36Sopenharmony_ci out_options); 113062306a36Sopenharmony_ci} 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_cistatic void init_gcm_job(struct aead_request *req, 113362306a36Sopenharmony_ci struct aead_edesc *edesc, 113462306a36Sopenharmony_ci bool all_contig, bool encrypt) 113562306a36Sopenharmony_ci{ 113662306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 113762306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 113862306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 113962306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 114062306a36Sopenharmony_ci bool generic_gcm = (ivsize == GCM_AES_IV_SIZE); 114162306a36Sopenharmony_ci unsigned int last; 114262306a36Sopenharmony_ci 114362306a36Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 114462306a36Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen); 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci /* BUG This should not be specific to generic GCM. */ 114762306a36Sopenharmony_ci last = 0; 114862306a36Sopenharmony_ci if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen)) 114962306a36Sopenharmony_ci last = FIFOLD_TYPE_LAST1; 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci /* Read GCM IV */ 115262306a36Sopenharmony_ci append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE | 115362306a36Sopenharmony_ci FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | GCM_AES_IV_SIZE | last); 115462306a36Sopenharmony_ci /* Append Salt */ 115562306a36Sopenharmony_ci if (!generic_gcm) 115662306a36Sopenharmony_ci append_data(desc, ctx->key + ctx->cdata.keylen, 4); 115762306a36Sopenharmony_ci /* Append IV */ 115862306a36Sopenharmony_ci append_data(desc, req->iv, ivsize); 115962306a36Sopenharmony_ci /* End of blank commands */ 116062306a36Sopenharmony_ci} 116162306a36Sopenharmony_ci 116262306a36Sopenharmony_cistatic void init_chachapoly_job(struct aead_request *req, 116362306a36Sopenharmony_ci struct aead_edesc *edesc, bool all_contig, 116462306a36Sopenharmony_ci bool encrypt) 116562306a36Sopenharmony_ci{ 116662306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 116762306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 116862306a36Sopenharmony_ci unsigned int assoclen = req->assoclen; 116962306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 117062306a36Sopenharmony_ci u32 ctx_iv_off = 4; 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 117362306a36Sopenharmony_ci 117462306a36Sopenharmony_ci if (ivsize != CHACHAPOLY_IV_SIZE) { 117562306a36Sopenharmony_ci /* IPsec specific: CONTEXT1[223:128] = {NONCE, IV} */ 117662306a36Sopenharmony_ci ctx_iv_off += 4; 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_ci /* 117962306a36Sopenharmony_ci * The associated data comes already with the IV but we need 118062306a36Sopenharmony_ci * to skip it when we authenticate or encrypt... 118162306a36Sopenharmony_ci */ 118262306a36Sopenharmony_ci assoclen -= ivsize; 118362306a36Sopenharmony_ci } 118462306a36Sopenharmony_ci 118562306a36Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, assoclen); 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci /* 118862306a36Sopenharmony_ci * For IPsec load the IV further in the same register. 118962306a36Sopenharmony_ci * For RFC7539 simply load the 12 bytes nonce in a single operation 119062306a36Sopenharmony_ci */ 119162306a36Sopenharmony_ci append_load_as_imm(desc, req->iv, ivsize, LDST_CLASS_1_CCB | 119262306a36Sopenharmony_ci LDST_SRCDST_BYTE_CONTEXT | 119362306a36Sopenharmony_ci ctx_iv_off << LDST_OFFSET_SHIFT); 119462306a36Sopenharmony_ci} 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_cistatic void init_authenc_job(struct aead_request *req, 119762306a36Sopenharmony_ci struct aead_edesc *edesc, 119862306a36Sopenharmony_ci bool all_contig, bool encrypt) 119962306a36Sopenharmony_ci{ 120062306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 120162306a36Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 120262306a36Sopenharmony_ci struct caam_aead_alg, 120362306a36Sopenharmony_ci aead.base); 120462306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 120562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 120662306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent); 120762306a36Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 120862306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 120962306a36Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 121062306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 121162306a36Sopenharmony_ci u32 ivoffset = 0; 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci /* 121462306a36Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 121562306a36Sopenharmony_ci * at an offset of 128bits (16bytes) 121662306a36Sopenharmony_ci * CONTEXT1[255:128] = IV 121762306a36Sopenharmony_ci */ 121862306a36Sopenharmony_ci if (ctr_mode) 121962306a36Sopenharmony_ci ivoffset = 16; 122062306a36Sopenharmony_ci 122162306a36Sopenharmony_ci /* 122262306a36Sopenharmony_ci * RFC3686 specific: 122362306a36Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 122462306a36Sopenharmony_ci */ 122562306a36Sopenharmony_ci if (is_rfc3686) 122662306a36Sopenharmony_ci ivoffset = 16 + CTR_RFC3686_NONCE_SIZE; 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci /* 123162306a36Sopenharmony_ci * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports 123262306a36Sopenharmony_ci * having DPOVRD as destination. 123362306a36Sopenharmony_ci */ 123462306a36Sopenharmony_ci if (ctrlpriv->era < 3) 123562306a36Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen); 123662306a36Sopenharmony_ci else 123762306a36Sopenharmony_ci append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen); 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv)) 124062306a36Sopenharmony_ci append_load_as_imm(desc, req->iv, ivsize, 124162306a36Sopenharmony_ci LDST_CLASS_1_CCB | 124262306a36Sopenharmony_ci LDST_SRCDST_BYTE_CONTEXT | 124362306a36Sopenharmony_ci (ivoffset << LDST_OFFSET_SHIFT)); 124462306a36Sopenharmony_ci} 124562306a36Sopenharmony_ci 124662306a36Sopenharmony_ci/* 124762306a36Sopenharmony_ci * Fill in skcipher job descriptor 124862306a36Sopenharmony_ci */ 124962306a36Sopenharmony_cistatic void init_skcipher_job(struct skcipher_request *req, 125062306a36Sopenharmony_ci struct skcipher_edesc *edesc, 125162306a36Sopenharmony_ci const bool encrypt) 125262306a36Sopenharmony_ci{ 125362306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 125462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 125562306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 125662306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 125762306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 125862306a36Sopenharmony_ci u32 *sh_desc; 125962306a36Sopenharmony_ci u32 in_options = 0, out_options = 0; 126062306a36Sopenharmony_ci dma_addr_t src_dma, dst_dma, ptr; 126162306a36Sopenharmony_ci int len, sec4_sg_index = 0; 126262306a36Sopenharmony_ci 126362306a36Sopenharmony_ci print_hex_dump_debug("presciv@"__stringify(__LINE__)": ", 126462306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, ivsize, 1); 126562306a36Sopenharmony_ci dev_dbg(jrdev, "asked=%d, cryptlen%d\n", 126662306a36Sopenharmony_ci (int)edesc->src_nents > 1 ? 100 : req->cryptlen, req->cryptlen); 126762306a36Sopenharmony_ci 126862306a36Sopenharmony_ci caam_dump_sg("src @" __stringify(__LINE__)": ", 126962306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->src, 127062306a36Sopenharmony_ci edesc->src_nents > 1 ? 100 : req->cryptlen, 1); 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec; 127362306a36Sopenharmony_ci ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma; 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci len = desc_len(sh_desc); 127662306a36Sopenharmony_ci init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 127762306a36Sopenharmony_ci 127862306a36Sopenharmony_ci if (ivsize || edesc->mapped_src_nents > 1) { 127962306a36Sopenharmony_ci src_dma = edesc->sec4_sg_dma; 128062306a36Sopenharmony_ci sec4_sg_index = edesc->mapped_src_nents + !!ivsize; 128162306a36Sopenharmony_ci in_options = LDST_SGF; 128262306a36Sopenharmony_ci } else { 128362306a36Sopenharmony_ci src_dma = sg_dma_address(req->src); 128462306a36Sopenharmony_ci } 128562306a36Sopenharmony_ci 128662306a36Sopenharmony_ci append_seq_in_ptr(desc, src_dma, req->cryptlen + ivsize, in_options); 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci if (likely(req->src == req->dst)) { 128962306a36Sopenharmony_ci dst_dma = src_dma + !!ivsize * sizeof(struct sec4_sg_entry); 129062306a36Sopenharmony_ci out_options = in_options; 129162306a36Sopenharmony_ci } else if (!ivsize && edesc->mapped_dst_nents == 1) { 129262306a36Sopenharmony_ci dst_dma = sg_dma_address(req->dst); 129362306a36Sopenharmony_ci } else { 129462306a36Sopenharmony_ci dst_dma = edesc->sec4_sg_dma + sec4_sg_index * 129562306a36Sopenharmony_ci sizeof(struct sec4_sg_entry); 129662306a36Sopenharmony_ci out_options = LDST_SGF; 129762306a36Sopenharmony_ci } 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, req->cryptlen + ivsize, out_options); 130062306a36Sopenharmony_ci} 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci/* 130362306a36Sopenharmony_ci * allocate and map the aead extended descriptor 130462306a36Sopenharmony_ci */ 130562306a36Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req, 130662306a36Sopenharmony_ci int desc_bytes, bool *all_contig_ptr, 130762306a36Sopenharmony_ci bool encrypt) 130862306a36Sopenharmony_ci{ 130962306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 131062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 131162306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 131262306a36Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 131362306a36Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 131462306a36Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 131562306a36Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 131662306a36Sopenharmony_ci int src_len, dst_len = 0; 131762306a36Sopenharmony_ci struct aead_edesc *edesc; 131862306a36Sopenharmony_ci int sec4_sg_index, sec4_sg_len, sec4_sg_bytes; 131962306a36Sopenharmony_ci unsigned int authsize = ctx->authsize; 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_ci if (unlikely(req->dst != req->src)) { 132262306a36Sopenharmony_ci src_len = req->assoclen + req->cryptlen; 132362306a36Sopenharmony_ci dst_len = src_len + (encrypt ? authsize : (-authsize)); 132462306a36Sopenharmony_ci 132562306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 132662306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 132762306a36Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 132862306a36Sopenharmony_ci src_len); 132962306a36Sopenharmony_ci return ERR_PTR(src_nents); 133062306a36Sopenharmony_ci } 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, dst_len); 133362306a36Sopenharmony_ci if (unlikely(dst_nents < 0)) { 133462306a36Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n", 133562306a36Sopenharmony_ci dst_len); 133662306a36Sopenharmony_ci return ERR_PTR(dst_nents); 133762306a36Sopenharmony_ci } 133862306a36Sopenharmony_ci } else { 133962306a36Sopenharmony_ci src_len = req->assoclen + req->cryptlen + 134062306a36Sopenharmony_ci (encrypt ? authsize : 0); 134162306a36Sopenharmony_ci 134262306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 134362306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 134462306a36Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 134562306a36Sopenharmony_ci src_len); 134662306a36Sopenharmony_ci return ERR_PTR(src_nents); 134762306a36Sopenharmony_ci } 134862306a36Sopenharmony_ci } 134962306a36Sopenharmony_ci 135062306a36Sopenharmony_ci if (likely(req->src == req->dst)) { 135162306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 135262306a36Sopenharmony_ci DMA_BIDIRECTIONAL); 135362306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 135462306a36Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 135562306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 135662306a36Sopenharmony_ci } 135762306a36Sopenharmony_ci } else { 135862306a36Sopenharmony_ci /* Cover also the case of null (zero length) input data */ 135962306a36Sopenharmony_ci if (src_nents) { 136062306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, 136162306a36Sopenharmony_ci src_nents, DMA_TO_DEVICE); 136262306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 136362306a36Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 136462306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 136562306a36Sopenharmony_ci } 136662306a36Sopenharmony_ci } else { 136762306a36Sopenharmony_ci mapped_src_nents = 0; 136862306a36Sopenharmony_ci } 136962306a36Sopenharmony_ci 137062306a36Sopenharmony_ci /* Cover also the case of null (zero length) output data */ 137162306a36Sopenharmony_ci if (dst_nents) { 137262306a36Sopenharmony_ci mapped_dst_nents = dma_map_sg(jrdev, req->dst, 137362306a36Sopenharmony_ci dst_nents, 137462306a36Sopenharmony_ci DMA_FROM_DEVICE); 137562306a36Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 137662306a36Sopenharmony_ci dev_err(jrdev, "unable to map destination\n"); 137762306a36Sopenharmony_ci dma_unmap_sg(jrdev, req->src, src_nents, 137862306a36Sopenharmony_ci DMA_TO_DEVICE); 137962306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 138062306a36Sopenharmony_ci } 138162306a36Sopenharmony_ci } else { 138262306a36Sopenharmony_ci mapped_dst_nents = 0; 138362306a36Sopenharmony_ci } 138462306a36Sopenharmony_ci } 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci /* 138762306a36Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 138862306a36Sopenharmony_ci * the end of the table by allocating more S/G entries. 138962306a36Sopenharmony_ci */ 139062306a36Sopenharmony_ci sec4_sg_len = mapped_src_nents > 1 ? mapped_src_nents : 0; 139162306a36Sopenharmony_ci if (mapped_dst_nents > 1) 139262306a36Sopenharmony_ci sec4_sg_len += pad_sg_nents(mapped_dst_nents); 139362306a36Sopenharmony_ci else 139462306a36Sopenharmony_ci sec4_sg_len = pad_sg_nents(sec4_sg_len); 139562306a36Sopenharmony_ci 139662306a36Sopenharmony_ci sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry); 139762306a36Sopenharmony_ci 139862306a36Sopenharmony_ci /* allocate space for base edesc and hw desc commands, link tables */ 139962306a36Sopenharmony_ci edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, flags); 140062306a36Sopenharmony_ci if (!edesc) { 140162306a36Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0, 140262306a36Sopenharmony_ci 0, 0, 0); 140362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 140462306a36Sopenharmony_ci } 140562306a36Sopenharmony_ci 140662306a36Sopenharmony_ci edesc->src_nents = src_nents; 140762306a36Sopenharmony_ci edesc->dst_nents = dst_nents; 140862306a36Sopenharmony_ci edesc->mapped_src_nents = mapped_src_nents; 140962306a36Sopenharmony_ci edesc->mapped_dst_nents = mapped_dst_nents; 141062306a36Sopenharmony_ci edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) + 141162306a36Sopenharmony_ci desc_bytes; 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_ci rctx->edesc = edesc; 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_ci *all_contig_ptr = !(mapped_src_nents > 1); 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_ci sec4_sg_index = 0; 141862306a36Sopenharmony_ci if (mapped_src_nents > 1) { 141962306a36Sopenharmony_ci sg_to_sec4_sg_last(req->src, src_len, 142062306a36Sopenharmony_ci edesc->sec4_sg + sec4_sg_index, 0); 142162306a36Sopenharmony_ci sec4_sg_index += mapped_src_nents; 142262306a36Sopenharmony_ci } 142362306a36Sopenharmony_ci if (mapped_dst_nents > 1) { 142462306a36Sopenharmony_ci sg_to_sec4_sg_last(req->dst, dst_len, 142562306a36Sopenharmony_ci edesc->sec4_sg + sec4_sg_index, 0); 142662306a36Sopenharmony_ci } 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci if (!sec4_sg_bytes) 142962306a36Sopenharmony_ci return edesc; 143062306a36Sopenharmony_ci 143162306a36Sopenharmony_ci edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 143262306a36Sopenharmony_ci sec4_sg_bytes, DMA_TO_DEVICE); 143362306a36Sopenharmony_ci if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 143462306a36Sopenharmony_ci dev_err(jrdev, "unable to map S/G table\n"); 143562306a36Sopenharmony_ci aead_unmap(jrdev, edesc, req); 143662306a36Sopenharmony_ci kfree(edesc); 143762306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 143862306a36Sopenharmony_ci } 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_ci edesc->sec4_sg_bytes = sec4_sg_bytes; 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci return edesc; 144362306a36Sopenharmony_ci} 144462306a36Sopenharmony_ci 144562306a36Sopenharmony_cistatic int aead_enqueue_req(struct device *jrdev, struct aead_request *req) 144662306a36Sopenharmony_ci{ 144762306a36Sopenharmony_ci struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 144862306a36Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 144962306a36Sopenharmony_ci struct aead_edesc *edesc = rctx->edesc; 145062306a36Sopenharmony_ci u32 *desc = edesc->hw_desc; 145162306a36Sopenharmony_ci int ret; 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci /* 145462306a36Sopenharmony_ci * Only the backlog request are sent to crypto-engine since the others 145562306a36Sopenharmony_ci * can be handled by CAAM, if free, especially since JR has up to 1024 145662306a36Sopenharmony_ci * entries (more than the 10 entries from crypto-engine). 145762306a36Sopenharmony_ci */ 145862306a36Sopenharmony_ci if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG) 145962306a36Sopenharmony_ci ret = crypto_transfer_aead_request_to_engine(jrpriv->engine, 146062306a36Sopenharmony_ci req); 146162306a36Sopenharmony_ci else 146262306a36Sopenharmony_ci ret = caam_jr_enqueue(jrdev, desc, aead_crypt_done, req); 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci if ((ret != -EINPROGRESS) && (ret != -EBUSY)) { 146562306a36Sopenharmony_ci aead_unmap(jrdev, edesc, req); 146662306a36Sopenharmony_ci kfree(rctx->edesc); 146762306a36Sopenharmony_ci } 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci return ret; 147062306a36Sopenharmony_ci} 147162306a36Sopenharmony_ci 147262306a36Sopenharmony_cistatic inline int chachapoly_crypt(struct aead_request *req, bool encrypt) 147362306a36Sopenharmony_ci{ 147462306a36Sopenharmony_ci struct aead_edesc *edesc; 147562306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 147662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 147762306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 147862306a36Sopenharmony_ci bool all_contig; 147962306a36Sopenharmony_ci u32 *desc; 148062306a36Sopenharmony_ci 148162306a36Sopenharmony_ci edesc = aead_edesc_alloc(req, CHACHAPOLY_DESC_JOB_IO_LEN, &all_contig, 148262306a36Sopenharmony_ci encrypt); 148362306a36Sopenharmony_ci if (IS_ERR(edesc)) 148462306a36Sopenharmony_ci return PTR_ERR(edesc); 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_ci desc = edesc->hw_desc; 148762306a36Sopenharmony_ci 148862306a36Sopenharmony_ci init_chachapoly_job(req, edesc, all_contig, encrypt); 148962306a36Sopenharmony_ci print_hex_dump_debug("chachapoly jobdesc@" __stringify(__LINE__)": ", 149062306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 149162306a36Sopenharmony_ci 1); 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci return aead_enqueue_req(jrdev, req); 149462306a36Sopenharmony_ci} 149562306a36Sopenharmony_ci 149662306a36Sopenharmony_cistatic int chachapoly_encrypt(struct aead_request *req) 149762306a36Sopenharmony_ci{ 149862306a36Sopenharmony_ci return chachapoly_crypt(req, true); 149962306a36Sopenharmony_ci} 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_cistatic int chachapoly_decrypt(struct aead_request *req) 150262306a36Sopenharmony_ci{ 150362306a36Sopenharmony_ci return chachapoly_crypt(req, false); 150462306a36Sopenharmony_ci} 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_cistatic inline int aead_crypt(struct aead_request *req, bool encrypt) 150762306a36Sopenharmony_ci{ 150862306a36Sopenharmony_ci struct aead_edesc *edesc; 150962306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 151062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 151162306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 151262306a36Sopenharmony_ci bool all_contig; 151362306a36Sopenharmony_ci 151462306a36Sopenharmony_ci /* allocate extended descriptor */ 151562306a36Sopenharmony_ci edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN, 151662306a36Sopenharmony_ci &all_contig, encrypt); 151762306a36Sopenharmony_ci if (IS_ERR(edesc)) 151862306a36Sopenharmony_ci return PTR_ERR(edesc); 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci /* Create and submit job descriptor */ 152162306a36Sopenharmony_ci init_authenc_job(req, edesc, all_contig, encrypt); 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ", 152462306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 152562306a36Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_ci return aead_enqueue_req(jrdev, req); 152862306a36Sopenharmony_ci} 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_cistatic int aead_encrypt(struct aead_request *req) 153162306a36Sopenharmony_ci{ 153262306a36Sopenharmony_ci return aead_crypt(req, true); 153362306a36Sopenharmony_ci} 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_cistatic int aead_decrypt(struct aead_request *req) 153662306a36Sopenharmony_ci{ 153762306a36Sopenharmony_ci return aead_crypt(req, false); 153862306a36Sopenharmony_ci} 153962306a36Sopenharmony_ci 154062306a36Sopenharmony_cistatic int aead_do_one_req(struct crypto_engine *engine, void *areq) 154162306a36Sopenharmony_ci{ 154262306a36Sopenharmony_ci struct aead_request *req = aead_request_cast(areq); 154362306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(crypto_aead_reqtfm(req)); 154462306a36Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 154562306a36Sopenharmony_ci u32 *desc = rctx->edesc->hw_desc; 154662306a36Sopenharmony_ci int ret; 154762306a36Sopenharmony_ci 154862306a36Sopenharmony_ci rctx->edesc->bklog = true; 154962306a36Sopenharmony_ci 155062306a36Sopenharmony_ci ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req); 155162306a36Sopenharmony_ci 155262306a36Sopenharmony_ci if (ret == -ENOSPC && engine->retry_support) 155362306a36Sopenharmony_ci return ret; 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_ci if (ret != -EINPROGRESS) { 155662306a36Sopenharmony_ci aead_unmap(ctx->jrdev, rctx->edesc, req); 155762306a36Sopenharmony_ci kfree(rctx->edesc); 155862306a36Sopenharmony_ci } else { 155962306a36Sopenharmony_ci ret = 0; 156062306a36Sopenharmony_ci } 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_ci return ret; 156362306a36Sopenharmony_ci} 156462306a36Sopenharmony_ci 156562306a36Sopenharmony_cistatic inline int gcm_crypt(struct aead_request *req, bool encrypt) 156662306a36Sopenharmony_ci{ 156762306a36Sopenharmony_ci struct aead_edesc *edesc; 156862306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 156962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 157062306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 157162306a36Sopenharmony_ci bool all_contig; 157262306a36Sopenharmony_ci 157362306a36Sopenharmony_ci /* allocate extended descriptor */ 157462306a36Sopenharmony_ci edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, 157562306a36Sopenharmony_ci encrypt); 157662306a36Sopenharmony_ci if (IS_ERR(edesc)) 157762306a36Sopenharmony_ci return PTR_ERR(edesc); 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_ci /* Create and submit job descriptor */ 158062306a36Sopenharmony_ci init_gcm_job(req, edesc, all_contig, encrypt); 158162306a36Sopenharmony_ci 158262306a36Sopenharmony_ci print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ", 158362306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 158462306a36Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 158562306a36Sopenharmony_ci 158662306a36Sopenharmony_ci return aead_enqueue_req(jrdev, req); 158762306a36Sopenharmony_ci} 158862306a36Sopenharmony_ci 158962306a36Sopenharmony_cistatic int gcm_encrypt(struct aead_request *req) 159062306a36Sopenharmony_ci{ 159162306a36Sopenharmony_ci return gcm_crypt(req, true); 159262306a36Sopenharmony_ci} 159362306a36Sopenharmony_ci 159462306a36Sopenharmony_cistatic int gcm_decrypt(struct aead_request *req) 159562306a36Sopenharmony_ci{ 159662306a36Sopenharmony_ci return gcm_crypt(req, false); 159762306a36Sopenharmony_ci} 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req) 160062306a36Sopenharmony_ci{ 160162306a36Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req); 160262306a36Sopenharmony_ci} 160362306a36Sopenharmony_ci 160462306a36Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req) 160562306a36Sopenharmony_ci{ 160662306a36Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req); 160762306a36Sopenharmony_ci} 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_ci/* 161062306a36Sopenharmony_ci * allocate and map the skcipher extended descriptor for skcipher 161162306a36Sopenharmony_ci */ 161262306a36Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req, 161362306a36Sopenharmony_ci int desc_bytes) 161462306a36Sopenharmony_ci{ 161562306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 161662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 161762306a36Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 161862306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 161962306a36Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 162062306a36Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 162162306a36Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 162262306a36Sopenharmony_ci struct skcipher_edesc *edesc; 162362306a36Sopenharmony_ci dma_addr_t iv_dma = 0; 162462306a36Sopenharmony_ci u8 *iv; 162562306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 162662306a36Sopenharmony_ci int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes; 162762306a36Sopenharmony_ci unsigned int aligned_size; 162862306a36Sopenharmony_ci 162962306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->cryptlen); 163062306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 163162306a36Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 163262306a36Sopenharmony_ci req->cryptlen); 163362306a36Sopenharmony_ci return ERR_PTR(src_nents); 163462306a36Sopenharmony_ci } 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci if (req->dst != req->src) { 163762306a36Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, req->cryptlen); 163862306a36Sopenharmony_ci if (unlikely(dst_nents < 0)) { 163962306a36Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n", 164062306a36Sopenharmony_ci req->cryptlen); 164162306a36Sopenharmony_ci return ERR_PTR(dst_nents); 164262306a36Sopenharmony_ci } 164362306a36Sopenharmony_ci } 164462306a36Sopenharmony_ci 164562306a36Sopenharmony_ci if (likely(req->src == req->dst)) { 164662306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 164762306a36Sopenharmony_ci DMA_BIDIRECTIONAL); 164862306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 164962306a36Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 165062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 165162306a36Sopenharmony_ci } 165262306a36Sopenharmony_ci } else { 165362306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 165462306a36Sopenharmony_ci DMA_TO_DEVICE); 165562306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 165662306a36Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 165762306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 165862306a36Sopenharmony_ci } 165962306a36Sopenharmony_ci mapped_dst_nents = dma_map_sg(jrdev, req->dst, dst_nents, 166062306a36Sopenharmony_ci DMA_FROM_DEVICE); 166162306a36Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 166262306a36Sopenharmony_ci dev_err(jrdev, "unable to map destination\n"); 166362306a36Sopenharmony_ci dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE); 166462306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 166562306a36Sopenharmony_ci } 166662306a36Sopenharmony_ci } 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_ci if (!ivsize && mapped_src_nents == 1) 166962306a36Sopenharmony_ci sec4_sg_ents = 0; // no need for an input hw s/g table 167062306a36Sopenharmony_ci else 167162306a36Sopenharmony_ci sec4_sg_ents = mapped_src_nents + !!ivsize; 167262306a36Sopenharmony_ci dst_sg_idx = sec4_sg_ents; 167362306a36Sopenharmony_ci 167462306a36Sopenharmony_ci /* 167562306a36Sopenharmony_ci * Input, output HW S/G tables: [IV, src][dst, IV] 167662306a36Sopenharmony_ci * IV entries point to the same buffer 167762306a36Sopenharmony_ci * If src == dst, S/G entries are reused (S/G tables overlap) 167862306a36Sopenharmony_ci * 167962306a36Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 168062306a36Sopenharmony_ci * the end of the table by allocating more S/G entries. Logic: 168162306a36Sopenharmony_ci * if (output S/G) 168262306a36Sopenharmony_ci * pad output S/G, if needed 168362306a36Sopenharmony_ci * else if (input S/G) ... 168462306a36Sopenharmony_ci * pad input S/G, if needed 168562306a36Sopenharmony_ci */ 168662306a36Sopenharmony_ci if (ivsize || mapped_dst_nents > 1) { 168762306a36Sopenharmony_ci if (req->src == req->dst) 168862306a36Sopenharmony_ci sec4_sg_ents = !!ivsize + pad_sg_nents(sec4_sg_ents); 168962306a36Sopenharmony_ci else 169062306a36Sopenharmony_ci sec4_sg_ents += pad_sg_nents(mapped_dst_nents + 169162306a36Sopenharmony_ci !!ivsize); 169262306a36Sopenharmony_ci } else { 169362306a36Sopenharmony_ci sec4_sg_ents = pad_sg_nents(sec4_sg_ents); 169462306a36Sopenharmony_ci } 169562306a36Sopenharmony_ci 169662306a36Sopenharmony_ci sec4_sg_bytes = sec4_sg_ents * sizeof(struct sec4_sg_entry); 169762306a36Sopenharmony_ci 169862306a36Sopenharmony_ci /* 169962306a36Sopenharmony_ci * allocate space for base edesc and hw desc commands, link tables, IV 170062306a36Sopenharmony_ci */ 170162306a36Sopenharmony_ci aligned_size = sizeof(*edesc) + desc_bytes + sec4_sg_bytes; 170262306a36Sopenharmony_ci aligned_size = ALIGN(aligned_size, dma_get_cache_alignment()); 170362306a36Sopenharmony_ci aligned_size += ~(ARCH_KMALLOC_MINALIGN - 1) & 170462306a36Sopenharmony_ci (dma_get_cache_alignment() - 1); 170562306a36Sopenharmony_ci aligned_size += ALIGN(ivsize, dma_get_cache_alignment()); 170662306a36Sopenharmony_ci edesc = kzalloc(aligned_size, flags); 170762306a36Sopenharmony_ci if (!edesc) { 170862306a36Sopenharmony_ci dev_err(jrdev, "could not allocate extended descriptor\n"); 170962306a36Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0, 171062306a36Sopenharmony_ci 0, 0, 0); 171162306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 171262306a36Sopenharmony_ci } 171362306a36Sopenharmony_ci 171462306a36Sopenharmony_ci edesc->src_nents = src_nents; 171562306a36Sopenharmony_ci edesc->dst_nents = dst_nents; 171662306a36Sopenharmony_ci edesc->mapped_src_nents = mapped_src_nents; 171762306a36Sopenharmony_ci edesc->mapped_dst_nents = mapped_dst_nents; 171862306a36Sopenharmony_ci edesc->sec4_sg_bytes = sec4_sg_bytes; 171962306a36Sopenharmony_ci edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc + 172062306a36Sopenharmony_ci desc_bytes); 172162306a36Sopenharmony_ci rctx->edesc = edesc; 172262306a36Sopenharmony_ci 172362306a36Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 172462306a36Sopenharmony_ci if (ivsize) { 172562306a36Sopenharmony_ci iv = skcipher_edesc_iv(edesc); 172662306a36Sopenharmony_ci memcpy(iv, req->iv, ivsize); 172762306a36Sopenharmony_ci 172862306a36Sopenharmony_ci iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL); 172962306a36Sopenharmony_ci if (dma_mapping_error(jrdev, iv_dma)) { 173062306a36Sopenharmony_ci dev_err(jrdev, "unable to map IV\n"); 173162306a36Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, 173262306a36Sopenharmony_ci dst_nents, 0, 0, 0, 0); 173362306a36Sopenharmony_ci kfree(edesc); 173462306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 173562306a36Sopenharmony_ci } 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_ci dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0); 173862306a36Sopenharmony_ci } 173962306a36Sopenharmony_ci if (dst_sg_idx) 174062306a36Sopenharmony_ci sg_to_sec4_sg(req->src, req->cryptlen, edesc->sec4_sg + 174162306a36Sopenharmony_ci !!ivsize, 0); 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_ci if (req->src != req->dst && (ivsize || mapped_dst_nents > 1)) 174462306a36Sopenharmony_ci sg_to_sec4_sg(req->dst, req->cryptlen, edesc->sec4_sg + 174562306a36Sopenharmony_ci dst_sg_idx, 0); 174662306a36Sopenharmony_ci 174762306a36Sopenharmony_ci if (ivsize) 174862306a36Sopenharmony_ci dma_to_sec4_sg_one(edesc->sec4_sg + dst_sg_idx + 174962306a36Sopenharmony_ci mapped_dst_nents, iv_dma, ivsize, 0); 175062306a36Sopenharmony_ci 175162306a36Sopenharmony_ci if (ivsize || mapped_dst_nents > 1) 175262306a36Sopenharmony_ci sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx + 175362306a36Sopenharmony_ci mapped_dst_nents - 1 + !!ivsize); 175462306a36Sopenharmony_ci 175562306a36Sopenharmony_ci if (sec4_sg_bytes) { 175662306a36Sopenharmony_ci edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 175762306a36Sopenharmony_ci sec4_sg_bytes, 175862306a36Sopenharmony_ci DMA_TO_DEVICE); 175962306a36Sopenharmony_ci if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 176062306a36Sopenharmony_ci dev_err(jrdev, "unable to map S/G table\n"); 176162306a36Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, 176262306a36Sopenharmony_ci dst_nents, iv_dma, ivsize, 0, 0); 176362306a36Sopenharmony_ci kfree(edesc); 176462306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 176562306a36Sopenharmony_ci } 176662306a36Sopenharmony_ci } 176762306a36Sopenharmony_ci 176862306a36Sopenharmony_ci edesc->iv_dma = iv_dma; 176962306a36Sopenharmony_ci 177062306a36Sopenharmony_ci print_hex_dump_debug("skcipher sec4_sg@" __stringify(__LINE__)": ", 177162306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg, 177262306a36Sopenharmony_ci sec4_sg_bytes, 1); 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci return edesc; 177562306a36Sopenharmony_ci} 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_cistatic int skcipher_do_one_req(struct crypto_engine *engine, void *areq) 177862306a36Sopenharmony_ci{ 177962306a36Sopenharmony_ci struct skcipher_request *req = skcipher_request_cast(areq); 178062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(crypto_skcipher_reqtfm(req)); 178162306a36Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 178262306a36Sopenharmony_ci u32 *desc = rctx->edesc->hw_desc; 178362306a36Sopenharmony_ci int ret; 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_ci rctx->edesc->bklog = true; 178662306a36Sopenharmony_ci 178762306a36Sopenharmony_ci ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req); 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_ci if (ret == -ENOSPC && engine->retry_support) 179062306a36Sopenharmony_ci return ret; 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci if (ret != -EINPROGRESS) { 179362306a36Sopenharmony_ci skcipher_unmap(ctx->jrdev, rctx->edesc, req); 179462306a36Sopenharmony_ci kfree(rctx->edesc); 179562306a36Sopenharmony_ci } else { 179662306a36Sopenharmony_ci ret = 0; 179762306a36Sopenharmony_ci } 179862306a36Sopenharmony_ci 179962306a36Sopenharmony_ci return ret; 180062306a36Sopenharmony_ci} 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req) 180362306a36Sopenharmony_ci{ 180462306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 180562306a36Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 180662306a36Sopenharmony_ci 180762306a36Sopenharmony_ci return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); 180862306a36Sopenharmony_ci} 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_cistatic inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) 181162306a36Sopenharmony_ci{ 181262306a36Sopenharmony_ci struct skcipher_edesc *edesc; 181362306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 181462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 181562306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 181662306a36Sopenharmony_ci struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 181762306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 181862306a36Sopenharmony_ci u32 *desc; 181962306a36Sopenharmony_ci int ret = 0; 182062306a36Sopenharmony_ci 182162306a36Sopenharmony_ci /* 182262306a36Sopenharmony_ci * XTS is expected to return an error even for input length = 0 182362306a36Sopenharmony_ci * Note that the case input length < block size will be caught during 182462306a36Sopenharmony_ci * HW offloading and return an error. 182562306a36Sopenharmony_ci */ 182662306a36Sopenharmony_ci if (!req->cryptlen && !ctx->fallback) 182762306a36Sopenharmony_ci return 0; 182862306a36Sopenharmony_ci 182962306a36Sopenharmony_ci if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) || 183062306a36Sopenharmony_ci ctx->xts_key_fallback)) { 183162306a36Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 183262306a36Sopenharmony_ci 183362306a36Sopenharmony_ci skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); 183462306a36Sopenharmony_ci skcipher_request_set_callback(&rctx->fallback_req, 183562306a36Sopenharmony_ci req->base.flags, 183662306a36Sopenharmony_ci req->base.complete, 183762306a36Sopenharmony_ci req->base.data); 183862306a36Sopenharmony_ci skcipher_request_set_crypt(&rctx->fallback_req, req->src, 183962306a36Sopenharmony_ci req->dst, req->cryptlen, req->iv); 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) : 184262306a36Sopenharmony_ci crypto_skcipher_decrypt(&rctx->fallback_req); 184362306a36Sopenharmony_ci } 184462306a36Sopenharmony_ci 184562306a36Sopenharmony_ci /* allocate extended descriptor */ 184662306a36Sopenharmony_ci edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ); 184762306a36Sopenharmony_ci if (IS_ERR(edesc)) 184862306a36Sopenharmony_ci return PTR_ERR(edesc); 184962306a36Sopenharmony_ci 185062306a36Sopenharmony_ci /* Create and submit job descriptor*/ 185162306a36Sopenharmony_ci init_skcipher_job(req, edesc, encrypt); 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci print_hex_dump_debug("skcipher jobdesc@" __stringify(__LINE__)": ", 185462306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 185562306a36Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ci desc = edesc->hw_desc; 185862306a36Sopenharmony_ci /* 185962306a36Sopenharmony_ci * Only the backlog request are sent to crypto-engine since the others 186062306a36Sopenharmony_ci * can be handled by CAAM, if free, especially since JR has up to 1024 186162306a36Sopenharmony_ci * entries (more than the 10 entries from crypto-engine). 186262306a36Sopenharmony_ci */ 186362306a36Sopenharmony_ci if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG) 186462306a36Sopenharmony_ci ret = crypto_transfer_skcipher_request_to_engine(jrpriv->engine, 186562306a36Sopenharmony_ci req); 186662306a36Sopenharmony_ci else 186762306a36Sopenharmony_ci ret = caam_jr_enqueue(jrdev, desc, skcipher_crypt_done, req); 186862306a36Sopenharmony_ci 186962306a36Sopenharmony_ci if ((ret != -EINPROGRESS) && (ret != -EBUSY)) { 187062306a36Sopenharmony_ci skcipher_unmap(jrdev, edesc, req); 187162306a36Sopenharmony_ci kfree(edesc); 187262306a36Sopenharmony_ci } 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci return ret; 187562306a36Sopenharmony_ci} 187662306a36Sopenharmony_ci 187762306a36Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req) 187862306a36Sopenharmony_ci{ 187962306a36Sopenharmony_ci return skcipher_crypt(req, true); 188062306a36Sopenharmony_ci} 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req) 188362306a36Sopenharmony_ci{ 188462306a36Sopenharmony_ci return skcipher_crypt(req, false); 188562306a36Sopenharmony_ci} 188662306a36Sopenharmony_ci 188762306a36Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = { 188862306a36Sopenharmony_ci { 188962306a36Sopenharmony_ci .skcipher.base = { 189062306a36Sopenharmony_ci .base = { 189162306a36Sopenharmony_ci .cra_name = "cbc(aes)", 189262306a36Sopenharmony_ci .cra_driver_name = "cbc-aes-caam", 189362306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 189462306a36Sopenharmony_ci }, 189562306a36Sopenharmony_ci .setkey = aes_skcipher_setkey, 189662306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 189762306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 189862306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 189962306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 190062306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 190162306a36Sopenharmony_ci }, 190262306a36Sopenharmony_ci .skcipher.op = { 190362306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 190462306a36Sopenharmony_ci }, 190562306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 190662306a36Sopenharmony_ci }, 190762306a36Sopenharmony_ci { 190862306a36Sopenharmony_ci .skcipher.base = { 190962306a36Sopenharmony_ci .base = { 191062306a36Sopenharmony_ci .cra_name = "cbc(des3_ede)", 191162306a36Sopenharmony_ci .cra_driver_name = "cbc-3des-caam", 191262306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 191362306a36Sopenharmony_ci }, 191462306a36Sopenharmony_ci .setkey = des3_skcipher_setkey, 191562306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 191662306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 191762306a36Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 191862306a36Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 191962306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 192062306a36Sopenharmony_ci }, 192162306a36Sopenharmony_ci .skcipher.op = { 192262306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 192362306a36Sopenharmony_ci }, 192462306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 192562306a36Sopenharmony_ci }, 192662306a36Sopenharmony_ci { 192762306a36Sopenharmony_ci .skcipher.base = { 192862306a36Sopenharmony_ci .base = { 192962306a36Sopenharmony_ci .cra_name = "cbc(des)", 193062306a36Sopenharmony_ci .cra_driver_name = "cbc-des-caam", 193162306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 193262306a36Sopenharmony_ci }, 193362306a36Sopenharmony_ci .setkey = des_skcipher_setkey, 193462306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 193562306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 193662306a36Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 193762306a36Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 193862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 193962306a36Sopenharmony_ci }, 194062306a36Sopenharmony_ci .skcipher.op = { 194162306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 194262306a36Sopenharmony_ci }, 194362306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 194462306a36Sopenharmony_ci }, 194562306a36Sopenharmony_ci { 194662306a36Sopenharmony_ci .skcipher.base = { 194762306a36Sopenharmony_ci .base = { 194862306a36Sopenharmony_ci .cra_name = "ctr(aes)", 194962306a36Sopenharmony_ci .cra_driver_name = "ctr-aes-caam", 195062306a36Sopenharmony_ci .cra_blocksize = 1, 195162306a36Sopenharmony_ci }, 195262306a36Sopenharmony_ci .setkey = ctr_skcipher_setkey, 195362306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 195462306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 195562306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 195662306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 195762306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 195862306a36Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 195962306a36Sopenharmony_ci }, 196062306a36Sopenharmony_ci .skcipher.op = { 196162306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 196262306a36Sopenharmony_ci }, 196362306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | 196462306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 196562306a36Sopenharmony_ci }, 196662306a36Sopenharmony_ci { 196762306a36Sopenharmony_ci .skcipher.base = { 196862306a36Sopenharmony_ci .base = { 196962306a36Sopenharmony_ci .cra_name = "rfc3686(ctr(aes))", 197062306a36Sopenharmony_ci .cra_driver_name = "rfc3686-ctr-aes-caam", 197162306a36Sopenharmony_ci .cra_blocksize = 1, 197262306a36Sopenharmony_ci }, 197362306a36Sopenharmony_ci .setkey = rfc3686_skcipher_setkey, 197462306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 197562306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 197662306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE + 197762306a36Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 197862306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE + 197962306a36Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 198062306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 198162306a36Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 198262306a36Sopenharmony_ci }, 198362306a36Sopenharmony_ci .skcipher.op = { 198462306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 198562306a36Sopenharmony_ci }, 198662306a36Sopenharmony_ci .caam = { 198762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 198862306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 198962306a36Sopenharmony_ci .rfc3686 = true, 199062306a36Sopenharmony_ci }, 199162306a36Sopenharmony_ci }, 199262306a36Sopenharmony_ci { 199362306a36Sopenharmony_ci .skcipher.base = { 199462306a36Sopenharmony_ci .base = { 199562306a36Sopenharmony_ci .cra_name = "xts(aes)", 199662306a36Sopenharmony_ci .cra_driver_name = "xts-aes-caam", 199762306a36Sopenharmony_ci .cra_flags = CRYPTO_ALG_NEED_FALLBACK, 199862306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 199962306a36Sopenharmony_ci }, 200062306a36Sopenharmony_ci .setkey = xts_skcipher_setkey, 200162306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 200262306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 200362306a36Sopenharmony_ci .min_keysize = 2 * AES_MIN_KEY_SIZE, 200462306a36Sopenharmony_ci .max_keysize = 2 * AES_MAX_KEY_SIZE, 200562306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 200662306a36Sopenharmony_ci }, 200762306a36Sopenharmony_ci .skcipher.op = { 200862306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 200962306a36Sopenharmony_ci }, 201062306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS, 201162306a36Sopenharmony_ci }, 201262306a36Sopenharmony_ci { 201362306a36Sopenharmony_ci .skcipher.base = { 201462306a36Sopenharmony_ci .base = { 201562306a36Sopenharmony_ci .cra_name = "ecb(des)", 201662306a36Sopenharmony_ci .cra_driver_name = "ecb-des-caam", 201762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 201862306a36Sopenharmony_ci }, 201962306a36Sopenharmony_ci .setkey = des_skcipher_setkey, 202062306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 202162306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 202262306a36Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 202362306a36Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 202462306a36Sopenharmony_ci }, 202562306a36Sopenharmony_ci .skcipher.op = { 202662306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 202762306a36Sopenharmony_ci }, 202862306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_ECB, 202962306a36Sopenharmony_ci }, 203062306a36Sopenharmony_ci { 203162306a36Sopenharmony_ci .skcipher.base = { 203262306a36Sopenharmony_ci .base = { 203362306a36Sopenharmony_ci .cra_name = "ecb(aes)", 203462306a36Sopenharmony_ci .cra_driver_name = "ecb-aes-caam", 203562306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 203662306a36Sopenharmony_ci }, 203762306a36Sopenharmony_ci .setkey = aes_skcipher_setkey, 203862306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 203962306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 204062306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 204162306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 204262306a36Sopenharmony_ci }, 204362306a36Sopenharmony_ci .skcipher.op = { 204462306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 204562306a36Sopenharmony_ci }, 204662306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_ECB, 204762306a36Sopenharmony_ci }, 204862306a36Sopenharmony_ci { 204962306a36Sopenharmony_ci .skcipher.base = { 205062306a36Sopenharmony_ci .base = { 205162306a36Sopenharmony_ci .cra_name = "ecb(des3_ede)", 205262306a36Sopenharmony_ci .cra_driver_name = "ecb-des3-caam", 205362306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 205462306a36Sopenharmony_ci }, 205562306a36Sopenharmony_ci .setkey = des3_skcipher_setkey, 205662306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 205762306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 205862306a36Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 205962306a36Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 206062306a36Sopenharmony_ci }, 206162306a36Sopenharmony_ci .skcipher.op = { 206262306a36Sopenharmony_ci .do_one_request = skcipher_do_one_req, 206362306a36Sopenharmony_ci }, 206462306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_ECB, 206562306a36Sopenharmony_ci }, 206662306a36Sopenharmony_ci}; 206762306a36Sopenharmony_ci 206862306a36Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = { 206962306a36Sopenharmony_ci { 207062306a36Sopenharmony_ci .aead.base = { 207162306a36Sopenharmony_ci .base = { 207262306a36Sopenharmony_ci .cra_name = "rfc4106(gcm(aes))", 207362306a36Sopenharmony_ci .cra_driver_name = "rfc4106-gcm-aes-caam", 207462306a36Sopenharmony_ci .cra_blocksize = 1, 207562306a36Sopenharmony_ci }, 207662306a36Sopenharmony_ci .setkey = rfc4106_setkey, 207762306a36Sopenharmony_ci .setauthsize = rfc4106_setauthsize, 207862306a36Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 207962306a36Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 208062306a36Sopenharmony_ci .ivsize = GCM_RFC4106_IV_SIZE, 208162306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 208262306a36Sopenharmony_ci }, 208362306a36Sopenharmony_ci .aead.op = { 208462306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 208562306a36Sopenharmony_ci }, 208662306a36Sopenharmony_ci .caam = { 208762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 208862306a36Sopenharmony_ci .nodkp = true, 208962306a36Sopenharmony_ci }, 209062306a36Sopenharmony_ci }, 209162306a36Sopenharmony_ci { 209262306a36Sopenharmony_ci .aead.base = { 209362306a36Sopenharmony_ci .base = { 209462306a36Sopenharmony_ci .cra_name = "rfc4543(gcm(aes))", 209562306a36Sopenharmony_ci .cra_driver_name = "rfc4543-gcm-aes-caam", 209662306a36Sopenharmony_ci .cra_blocksize = 1, 209762306a36Sopenharmony_ci }, 209862306a36Sopenharmony_ci .setkey = rfc4543_setkey, 209962306a36Sopenharmony_ci .setauthsize = rfc4543_setauthsize, 210062306a36Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 210162306a36Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 210262306a36Sopenharmony_ci .ivsize = GCM_RFC4543_IV_SIZE, 210362306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 210462306a36Sopenharmony_ci }, 210562306a36Sopenharmony_ci .aead.op = { 210662306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 210762306a36Sopenharmony_ci }, 210862306a36Sopenharmony_ci .caam = { 210962306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 211062306a36Sopenharmony_ci .nodkp = true, 211162306a36Sopenharmony_ci }, 211262306a36Sopenharmony_ci }, 211362306a36Sopenharmony_ci /* Galois Counter Mode */ 211462306a36Sopenharmony_ci { 211562306a36Sopenharmony_ci .aead.base = { 211662306a36Sopenharmony_ci .base = { 211762306a36Sopenharmony_ci .cra_name = "gcm(aes)", 211862306a36Sopenharmony_ci .cra_driver_name = "gcm-aes-caam", 211962306a36Sopenharmony_ci .cra_blocksize = 1, 212062306a36Sopenharmony_ci }, 212162306a36Sopenharmony_ci .setkey = gcm_setkey, 212262306a36Sopenharmony_ci .setauthsize = gcm_setauthsize, 212362306a36Sopenharmony_ci .encrypt = gcm_encrypt, 212462306a36Sopenharmony_ci .decrypt = gcm_decrypt, 212562306a36Sopenharmony_ci .ivsize = GCM_AES_IV_SIZE, 212662306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 212762306a36Sopenharmony_ci }, 212862306a36Sopenharmony_ci .aead.op = { 212962306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 213062306a36Sopenharmony_ci }, 213162306a36Sopenharmony_ci .caam = { 213262306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 213362306a36Sopenharmony_ci .nodkp = true, 213462306a36Sopenharmony_ci }, 213562306a36Sopenharmony_ci }, 213662306a36Sopenharmony_ci /* single-pass ipsec_esp descriptor */ 213762306a36Sopenharmony_ci { 213862306a36Sopenharmony_ci .aead.base = { 213962306a36Sopenharmony_ci .base = { 214062306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5)," 214162306a36Sopenharmony_ci "ecb(cipher_null))", 214262306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 214362306a36Sopenharmony_ci "ecb-cipher_null-caam", 214462306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 214562306a36Sopenharmony_ci }, 214662306a36Sopenharmony_ci .setkey = aead_setkey, 214762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 214862306a36Sopenharmony_ci .encrypt = aead_encrypt, 214962306a36Sopenharmony_ci .decrypt = aead_decrypt, 215062306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 215162306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 215262306a36Sopenharmony_ci }, 215362306a36Sopenharmony_ci .aead.op = { 215462306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 215562306a36Sopenharmony_ci }, 215662306a36Sopenharmony_ci .caam = { 215762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 215862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 215962306a36Sopenharmony_ci }, 216062306a36Sopenharmony_ci }, 216162306a36Sopenharmony_ci { 216262306a36Sopenharmony_ci .aead.base = { 216362306a36Sopenharmony_ci .base = { 216462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 216562306a36Sopenharmony_ci "ecb(cipher_null))", 216662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 216762306a36Sopenharmony_ci "ecb-cipher_null-caam", 216862306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 216962306a36Sopenharmony_ci }, 217062306a36Sopenharmony_ci .setkey = aead_setkey, 217162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 217262306a36Sopenharmony_ci .encrypt = aead_encrypt, 217362306a36Sopenharmony_ci .decrypt = aead_decrypt, 217462306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 217562306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 217662306a36Sopenharmony_ci }, 217762306a36Sopenharmony_ci .aead.op = { 217862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 217962306a36Sopenharmony_ci }, 218062306a36Sopenharmony_ci .caam = { 218162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 218262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 218362306a36Sopenharmony_ci }, 218462306a36Sopenharmony_ci }, 218562306a36Sopenharmony_ci { 218662306a36Sopenharmony_ci .aead.base = { 218762306a36Sopenharmony_ci .base = { 218862306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 218962306a36Sopenharmony_ci "ecb(cipher_null))", 219062306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 219162306a36Sopenharmony_ci "ecb-cipher_null-caam", 219262306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 219362306a36Sopenharmony_ci }, 219462306a36Sopenharmony_ci .setkey = aead_setkey, 219562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 219662306a36Sopenharmony_ci .encrypt = aead_encrypt, 219762306a36Sopenharmony_ci .decrypt = aead_decrypt, 219862306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 219962306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 220062306a36Sopenharmony_ci }, 220162306a36Sopenharmony_ci .aead.op = { 220262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 220362306a36Sopenharmony_ci }, 220462306a36Sopenharmony_ci .caam = { 220562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 220662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 220762306a36Sopenharmony_ci }, 220862306a36Sopenharmony_ci }, 220962306a36Sopenharmony_ci { 221062306a36Sopenharmony_ci .aead.base = { 221162306a36Sopenharmony_ci .base = { 221262306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 221362306a36Sopenharmony_ci "ecb(cipher_null))", 221462306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 221562306a36Sopenharmony_ci "ecb-cipher_null-caam", 221662306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 221762306a36Sopenharmony_ci }, 221862306a36Sopenharmony_ci .setkey = aead_setkey, 221962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 222062306a36Sopenharmony_ci .encrypt = aead_encrypt, 222162306a36Sopenharmony_ci .decrypt = aead_decrypt, 222262306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 222362306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 222462306a36Sopenharmony_ci }, 222562306a36Sopenharmony_ci .aead.op = { 222662306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 222762306a36Sopenharmony_ci }, 222862306a36Sopenharmony_ci .caam = { 222962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 223062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 223162306a36Sopenharmony_ci }, 223262306a36Sopenharmony_ci }, 223362306a36Sopenharmony_ci { 223462306a36Sopenharmony_ci .aead.base = { 223562306a36Sopenharmony_ci .base = { 223662306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 223762306a36Sopenharmony_ci "ecb(cipher_null))", 223862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 223962306a36Sopenharmony_ci "ecb-cipher_null-caam", 224062306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 224162306a36Sopenharmony_ci }, 224262306a36Sopenharmony_ci .setkey = aead_setkey, 224362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 224462306a36Sopenharmony_ci .encrypt = aead_encrypt, 224562306a36Sopenharmony_ci .decrypt = aead_decrypt, 224662306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 224762306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 224862306a36Sopenharmony_ci }, 224962306a36Sopenharmony_ci .aead.op = { 225062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 225162306a36Sopenharmony_ci }, 225262306a36Sopenharmony_ci .caam = { 225362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 225462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 225562306a36Sopenharmony_ci }, 225662306a36Sopenharmony_ci }, 225762306a36Sopenharmony_ci { 225862306a36Sopenharmony_ci .aead.base = { 225962306a36Sopenharmony_ci .base = { 226062306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 226162306a36Sopenharmony_ci "ecb(cipher_null))", 226262306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 226362306a36Sopenharmony_ci "ecb-cipher_null-caam", 226462306a36Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 226562306a36Sopenharmony_ci }, 226662306a36Sopenharmony_ci .setkey = aead_setkey, 226762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 226862306a36Sopenharmony_ci .encrypt = aead_encrypt, 226962306a36Sopenharmony_ci .decrypt = aead_decrypt, 227062306a36Sopenharmony_ci .ivsize = NULL_IV_SIZE, 227162306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 227262306a36Sopenharmony_ci }, 227362306a36Sopenharmony_ci .aead.op = { 227462306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 227562306a36Sopenharmony_ci }, 227662306a36Sopenharmony_ci .caam = { 227762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 227862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 227962306a36Sopenharmony_ci }, 228062306a36Sopenharmony_ci }, 228162306a36Sopenharmony_ci { 228262306a36Sopenharmony_ci .aead.base = { 228362306a36Sopenharmony_ci .base = { 228462306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(aes))", 228562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 228662306a36Sopenharmony_ci "cbc-aes-caam", 228762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 228862306a36Sopenharmony_ci }, 228962306a36Sopenharmony_ci .setkey = aead_setkey, 229062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 229162306a36Sopenharmony_ci .encrypt = aead_encrypt, 229262306a36Sopenharmony_ci .decrypt = aead_decrypt, 229362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 229462306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 229562306a36Sopenharmony_ci }, 229662306a36Sopenharmony_ci .aead.op = { 229762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 229862306a36Sopenharmony_ci }, 229962306a36Sopenharmony_ci .caam = { 230062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 230162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 230262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 230362306a36Sopenharmony_ci }, 230462306a36Sopenharmony_ci }, 230562306a36Sopenharmony_ci { 230662306a36Sopenharmony_ci .aead.base = { 230762306a36Sopenharmony_ci .base = { 230862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 230962306a36Sopenharmony_ci "cbc(aes)))", 231062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 231162306a36Sopenharmony_ci "cbc-aes-caam", 231262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 231362306a36Sopenharmony_ci }, 231462306a36Sopenharmony_ci .setkey = aead_setkey, 231562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 231662306a36Sopenharmony_ci .encrypt = aead_encrypt, 231762306a36Sopenharmony_ci .decrypt = aead_decrypt, 231862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 231962306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 232062306a36Sopenharmony_ci }, 232162306a36Sopenharmony_ci .aead.op = { 232262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 232362306a36Sopenharmony_ci }, 232462306a36Sopenharmony_ci .caam = { 232562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 232662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 232762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 232862306a36Sopenharmony_ci .geniv = true, 232962306a36Sopenharmony_ci }, 233062306a36Sopenharmony_ci }, 233162306a36Sopenharmony_ci { 233262306a36Sopenharmony_ci .aead.base = { 233362306a36Sopenharmony_ci .base = { 233462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(aes))", 233562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 233662306a36Sopenharmony_ci "cbc-aes-caam", 233762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 233862306a36Sopenharmony_ci }, 233962306a36Sopenharmony_ci .setkey = aead_setkey, 234062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 234162306a36Sopenharmony_ci .encrypt = aead_encrypt, 234262306a36Sopenharmony_ci .decrypt = aead_decrypt, 234362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 234462306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 234562306a36Sopenharmony_ci }, 234662306a36Sopenharmony_ci .aead.op = { 234762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 234862306a36Sopenharmony_ci }, 234962306a36Sopenharmony_ci .caam = { 235062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 235162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 235262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 235362306a36Sopenharmony_ci }, 235462306a36Sopenharmony_ci }, 235562306a36Sopenharmony_ci { 235662306a36Sopenharmony_ci .aead.base = { 235762306a36Sopenharmony_ci .base = { 235862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 235962306a36Sopenharmony_ci "cbc(aes)))", 236062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 236162306a36Sopenharmony_ci "hmac-sha1-cbc-aes-caam", 236262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 236362306a36Sopenharmony_ci }, 236462306a36Sopenharmony_ci .setkey = aead_setkey, 236562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 236662306a36Sopenharmony_ci .encrypt = aead_encrypt, 236762306a36Sopenharmony_ci .decrypt = aead_decrypt, 236862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 236962306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 237062306a36Sopenharmony_ci }, 237162306a36Sopenharmony_ci .aead.op = { 237262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 237362306a36Sopenharmony_ci }, 237462306a36Sopenharmony_ci .caam = { 237562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 237662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 237762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 237862306a36Sopenharmony_ci .geniv = true, 237962306a36Sopenharmony_ci }, 238062306a36Sopenharmony_ci }, 238162306a36Sopenharmony_ci { 238262306a36Sopenharmony_ci .aead.base = { 238362306a36Sopenharmony_ci .base = { 238462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(aes))", 238562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 238662306a36Sopenharmony_ci "cbc-aes-caam", 238762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 238862306a36Sopenharmony_ci }, 238962306a36Sopenharmony_ci .setkey = aead_setkey, 239062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 239162306a36Sopenharmony_ci .encrypt = aead_encrypt, 239262306a36Sopenharmony_ci .decrypt = aead_decrypt, 239362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 239462306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 239562306a36Sopenharmony_ci }, 239662306a36Sopenharmony_ci .aead.op = { 239762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 239862306a36Sopenharmony_ci }, 239962306a36Sopenharmony_ci .caam = { 240062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 240162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 240262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 240362306a36Sopenharmony_ci }, 240462306a36Sopenharmony_ci }, 240562306a36Sopenharmony_ci { 240662306a36Sopenharmony_ci .aead.base = { 240762306a36Sopenharmony_ci .base = { 240862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 240962306a36Sopenharmony_ci "cbc(aes)))", 241062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 241162306a36Sopenharmony_ci "hmac-sha224-cbc-aes-caam", 241262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 241362306a36Sopenharmony_ci }, 241462306a36Sopenharmony_ci .setkey = aead_setkey, 241562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 241662306a36Sopenharmony_ci .encrypt = aead_encrypt, 241762306a36Sopenharmony_ci .decrypt = aead_decrypt, 241862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 241962306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 242062306a36Sopenharmony_ci }, 242162306a36Sopenharmony_ci .aead.op = { 242262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 242362306a36Sopenharmony_ci }, 242462306a36Sopenharmony_ci .caam = { 242562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 242662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 242762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 242862306a36Sopenharmony_ci .geniv = true, 242962306a36Sopenharmony_ci }, 243062306a36Sopenharmony_ci }, 243162306a36Sopenharmony_ci { 243262306a36Sopenharmony_ci .aead.base = { 243362306a36Sopenharmony_ci .base = { 243462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(aes))", 243562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 243662306a36Sopenharmony_ci "cbc-aes-caam", 243762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 243862306a36Sopenharmony_ci }, 243962306a36Sopenharmony_ci .setkey = aead_setkey, 244062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 244162306a36Sopenharmony_ci .encrypt = aead_encrypt, 244262306a36Sopenharmony_ci .decrypt = aead_decrypt, 244362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 244462306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 244562306a36Sopenharmony_ci }, 244662306a36Sopenharmony_ci .aead.op = { 244762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 244862306a36Sopenharmony_ci }, 244962306a36Sopenharmony_ci .caam = { 245062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 245162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 245262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 245362306a36Sopenharmony_ci }, 245462306a36Sopenharmony_ci }, 245562306a36Sopenharmony_ci { 245662306a36Sopenharmony_ci .aead.base = { 245762306a36Sopenharmony_ci .base = { 245862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 245962306a36Sopenharmony_ci "cbc(aes)))", 246062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 246162306a36Sopenharmony_ci "hmac-sha256-cbc-aes-caam", 246262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 246362306a36Sopenharmony_ci }, 246462306a36Sopenharmony_ci .setkey = aead_setkey, 246562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 246662306a36Sopenharmony_ci .encrypt = aead_encrypt, 246762306a36Sopenharmony_ci .decrypt = aead_decrypt, 246862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 246962306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 247062306a36Sopenharmony_ci }, 247162306a36Sopenharmony_ci .aead.op = { 247262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 247362306a36Sopenharmony_ci }, 247462306a36Sopenharmony_ci .caam = { 247562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 247662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 247762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 247862306a36Sopenharmony_ci .geniv = true, 247962306a36Sopenharmony_ci }, 248062306a36Sopenharmony_ci }, 248162306a36Sopenharmony_ci { 248262306a36Sopenharmony_ci .aead.base = { 248362306a36Sopenharmony_ci .base = { 248462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(aes))", 248562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 248662306a36Sopenharmony_ci "cbc-aes-caam", 248762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 248862306a36Sopenharmony_ci }, 248962306a36Sopenharmony_ci .setkey = aead_setkey, 249062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 249162306a36Sopenharmony_ci .encrypt = aead_encrypt, 249262306a36Sopenharmony_ci .decrypt = aead_decrypt, 249362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 249462306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 249562306a36Sopenharmony_ci }, 249662306a36Sopenharmony_ci .aead.op = { 249762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 249862306a36Sopenharmony_ci }, 249962306a36Sopenharmony_ci .caam = { 250062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 250162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 250262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 250362306a36Sopenharmony_ci }, 250462306a36Sopenharmony_ci }, 250562306a36Sopenharmony_ci { 250662306a36Sopenharmony_ci .aead.base = { 250762306a36Sopenharmony_ci .base = { 250862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 250962306a36Sopenharmony_ci "cbc(aes)))", 251062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 251162306a36Sopenharmony_ci "hmac-sha384-cbc-aes-caam", 251262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 251362306a36Sopenharmony_ci }, 251462306a36Sopenharmony_ci .setkey = aead_setkey, 251562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 251662306a36Sopenharmony_ci .encrypt = aead_encrypt, 251762306a36Sopenharmony_ci .decrypt = aead_decrypt, 251862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 251962306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 252062306a36Sopenharmony_ci }, 252162306a36Sopenharmony_ci .aead.op = { 252262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 252362306a36Sopenharmony_ci }, 252462306a36Sopenharmony_ci .caam = { 252562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 252662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 252762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 252862306a36Sopenharmony_ci .geniv = true, 252962306a36Sopenharmony_ci }, 253062306a36Sopenharmony_ci }, 253162306a36Sopenharmony_ci { 253262306a36Sopenharmony_ci .aead.base = { 253362306a36Sopenharmony_ci .base = { 253462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(aes))", 253562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 253662306a36Sopenharmony_ci "cbc-aes-caam", 253762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 253862306a36Sopenharmony_ci }, 253962306a36Sopenharmony_ci .setkey = aead_setkey, 254062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 254162306a36Sopenharmony_ci .encrypt = aead_encrypt, 254262306a36Sopenharmony_ci .decrypt = aead_decrypt, 254362306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 254462306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 254562306a36Sopenharmony_ci }, 254662306a36Sopenharmony_ci .aead.op = { 254762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 254862306a36Sopenharmony_ci }, 254962306a36Sopenharmony_ci .caam = { 255062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 255162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 255262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 255362306a36Sopenharmony_ci }, 255462306a36Sopenharmony_ci }, 255562306a36Sopenharmony_ci { 255662306a36Sopenharmony_ci .aead.base = { 255762306a36Sopenharmony_ci .base = { 255862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 255962306a36Sopenharmony_ci "cbc(aes)))", 256062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 256162306a36Sopenharmony_ci "hmac-sha512-cbc-aes-caam", 256262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 256362306a36Sopenharmony_ci }, 256462306a36Sopenharmony_ci .setkey = aead_setkey, 256562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 256662306a36Sopenharmony_ci .encrypt = aead_encrypt, 256762306a36Sopenharmony_ci .decrypt = aead_decrypt, 256862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 256962306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 257062306a36Sopenharmony_ci }, 257162306a36Sopenharmony_ci .aead.op = { 257262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 257362306a36Sopenharmony_ci }, 257462306a36Sopenharmony_ci .caam = { 257562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 257662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 257762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 257862306a36Sopenharmony_ci .geniv = true, 257962306a36Sopenharmony_ci }, 258062306a36Sopenharmony_ci }, 258162306a36Sopenharmony_ci { 258262306a36Sopenharmony_ci .aead.base = { 258362306a36Sopenharmony_ci .base = { 258462306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des3_ede))", 258562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 258662306a36Sopenharmony_ci "cbc-des3_ede-caam", 258762306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 258862306a36Sopenharmony_ci }, 258962306a36Sopenharmony_ci .setkey = des3_aead_setkey, 259062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 259162306a36Sopenharmony_ci .encrypt = aead_encrypt, 259262306a36Sopenharmony_ci .decrypt = aead_decrypt, 259362306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 259462306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 259562306a36Sopenharmony_ci }, 259662306a36Sopenharmony_ci .aead.op = { 259762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 259862306a36Sopenharmony_ci }, 259962306a36Sopenharmony_ci .caam = { 260062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 260162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 260262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 260362306a36Sopenharmony_ci } 260462306a36Sopenharmony_ci }, 260562306a36Sopenharmony_ci { 260662306a36Sopenharmony_ci .aead.base = { 260762306a36Sopenharmony_ci .base = { 260862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 260962306a36Sopenharmony_ci "cbc(des3_ede)))", 261062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 261162306a36Sopenharmony_ci "cbc-des3_ede-caam", 261262306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 261362306a36Sopenharmony_ci }, 261462306a36Sopenharmony_ci .setkey = des3_aead_setkey, 261562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 261662306a36Sopenharmony_ci .encrypt = aead_encrypt, 261762306a36Sopenharmony_ci .decrypt = aead_decrypt, 261862306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 261962306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 262062306a36Sopenharmony_ci }, 262162306a36Sopenharmony_ci .aead.op = { 262262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 262362306a36Sopenharmony_ci }, 262462306a36Sopenharmony_ci .caam = { 262562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 262662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 262762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 262862306a36Sopenharmony_ci .geniv = true, 262962306a36Sopenharmony_ci } 263062306a36Sopenharmony_ci }, 263162306a36Sopenharmony_ci { 263262306a36Sopenharmony_ci .aead.base = { 263362306a36Sopenharmony_ci .base = { 263462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 263562306a36Sopenharmony_ci "cbc(des3_ede))", 263662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 263762306a36Sopenharmony_ci "cbc-des3_ede-caam", 263862306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 263962306a36Sopenharmony_ci }, 264062306a36Sopenharmony_ci .setkey = des3_aead_setkey, 264162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 264262306a36Sopenharmony_ci .encrypt = aead_encrypt, 264362306a36Sopenharmony_ci .decrypt = aead_decrypt, 264462306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 264562306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 264662306a36Sopenharmony_ci }, 264762306a36Sopenharmony_ci .aead.op = { 264862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 264962306a36Sopenharmony_ci }, 265062306a36Sopenharmony_ci .caam = { 265162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 265262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 265362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 265462306a36Sopenharmony_ci }, 265562306a36Sopenharmony_ci }, 265662306a36Sopenharmony_ci { 265762306a36Sopenharmony_ci .aead.base = { 265862306a36Sopenharmony_ci .base = { 265962306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 266062306a36Sopenharmony_ci "cbc(des3_ede)))", 266162306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 266262306a36Sopenharmony_ci "hmac-sha1-" 266362306a36Sopenharmony_ci "cbc-des3_ede-caam", 266462306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 266562306a36Sopenharmony_ci }, 266662306a36Sopenharmony_ci .setkey = des3_aead_setkey, 266762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 266862306a36Sopenharmony_ci .encrypt = aead_encrypt, 266962306a36Sopenharmony_ci .decrypt = aead_decrypt, 267062306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 267162306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 267262306a36Sopenharmony_ci }, 267362306a36Sopenharmony_ci .aead.op = { 267462306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 267562306a36Sopenharmony_ci }, 267662306a36Sopenharmony_ci .caam = { 267762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 267862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 267962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 268062306a36Sopenharmony_ci .geniv = true, 268162306a36Sopenharmony_ci }, 268262306a36Sopenharmony_ci }, 268362306a36Sopenharmony_ci { 268462306a36Sopenharmony_ci .aead.base = { 268562306a36Sopenharmony_ci .base = { 268662306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 268762306a36Sopenharmony_ci "cbc(des3_ede))", 268862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 268962306a36Sopenharmony_ci "cbc-des3_ede-caam", 269062306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 269162306a36Sopenharmony_ci }, 269262306a36Sopenharmony_ci .setkey = des3_aead_setkey, 269362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 269462306a36Sopenharmony_ci .encrypt = aead_encrypt, 269562306a36Sopenharmony_ci .decrypt = aead_decrypt, 269662306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 269762306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 269862306a36Sopenharmony_ci }, 269962306a36Sopenharmony_ci .aead.op = { 270062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 270162306a36Sopenharmony_ci }, 270262306a36Sopenharmony_ci .caam = { 270362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 270462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 270562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 270662306a36Sopenharmony_ci }, 270762306a36Sopenharmony_ci }, 270862306a36Sopenharmony_ci { 270962306a36Sopenharmony_ci .aead.base = { 271062306a36Sopenharmony_ci .base = { 271162306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 271262306a36Sopenharmony_ci "cbc(des3_ede)))", 271362306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 271462306a36Sopenharmony_ci "hmac-sha224-" 271562306a36Sopenharmony_ci "cbc-des3_ede-caam", 271662306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 271762306a36Sopenharmony_ci }, 271862306a36Sopenharmony_ci .setkey = des3_aead_setkey, 271962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 272062306a36Sopenharmony_ci .encrypt = aead_encrypt, 272162306a36Sopenharmony_ci .decrypt = aead_decrypt, 272262306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 272362306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 272462306a36Sopenharmony_ci }, 272562306a36Sopenharmony_ci .aead.op = { 272662306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 272762306a36Sopenharmony_ci }, 272862306a36Sopenharmony_ci .caam = { 272962306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 273062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 273162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 273262306a36Sopenharmony_ci .geniv = true, 273362306a36Sopenharmony_ci }, 273462306a36Sopenharmony_ci }, 273562306a36Sopenharmony_ci { 273662306a36Sopenharmony_ci .aead.base = { 273762306a36Sopenharmony_ci .base = { 273862306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 273962306a36Sopenharmony_ci "cbc(des3_ede))", 274062306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 274162306a36Sopenharmony_ci "cbc-des3_ede-caam", 274262306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 274362306a36Sopenharmony_ci }, 274462306a36Sopenharmony_ci .setkey = des3_aead_setkey, 274562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 274662306a36Sopenharmony_ci .encrypt = aead_encrypt, 274762306a36Sopenharmony_ci .decrypt = aead_decrypt, 274862306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 274962306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 275062306a36Sopenharmony_ci }, 275162306a36Sopenharmony_ci .aead.op = { 275262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 275362306a36Sopenharmony_ci }, 275462306a36Sopenharmony_ci .caam = { 275562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 275662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 275762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 275862306a36Sopenharmony_ci }, 275962306a36Sopenharmony_ci }, 276062306a36Sopenharmony_ci { 276162306a36Sopenharmony_ci .aead.base = { 276262306a36Sopenharmony_ci .base = { 276362306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 276462306a36Sopenharmony_ci "cbc(des3_ede)))", 276562306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 276662306a36Sopenharmony_ci "hmac-sha256-" 276762306a36Sopenharmony_ci "cbc-des3_ede-caam", 276862306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 276962306a36Sopenharmony_ci }, 277062306a36Sopenharmony_ci .setkey = des3_aead_setkey, 277162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 277262306a36Sopenharmony_ci .encrypt = aead_encrypt, 277362306a36Sopenharmony_ci .decrypt = aead_decrypt, 277462306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 277562306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 277662306a36Sopenharmony_ci }, 277762306a36Sopenharmony_ci .aead.op = { 277862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 277962306a36Sopenharmony_ci }, 278062306a36Sopenharmony_ci .caam = { 278162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 278262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 278362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 278462306a36Sopenharmony_ci .geniv = true, 278562306a36Sopenharmony_ci }, 278662306a36Sopenharmony_ci }, 278762306a36Sopenharmony_ci { 278862306a36Sopenharmony_ci .aead.base = { 278962306a36Sopenharmony_ci .base = { 279062306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 279162306a36Sopenharmony_ci "cbc(des3_ede))", 279262306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 279362306a36Sopenharmony_ci "cbc-des3_ede-caam", 279462306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 279562306a36Sopenharmony_ci }, 279662306a36Sopenharmony_ci .setkey = des3_aead_setkey, 279762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 279862306a36Sopenharmony_ci .encrypt = aead_encrypt, 279962306a36Sopenharmony_ci .decrypt = aead_decrypt, 280062306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 280162306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 280262306a36Sopenharmony_ci }, 280362306a36Sopenharmony_ci .aead.op = { 280462306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 280562306a36Sopenharmony_ci }, 280662306a36Sopenharmony_ci .caam = { 280762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 280862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 280962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 281062306a36Sopenharmony_ci }, 281162306a36Sopenharmony_ci }, 281262306a36Sopenharmony_ci { 281362306a36Sopenharmony_ci .aead.base = { 281462306a36Sopenharmony_ci .base = { 281562306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 281662306a36Sopenharmony_ci "cbc(des3_ede)))", 281762306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 281862306a36Sopenharmony_ci "hmac-sha384-" 281962306a36Sopenharmony_ci "cbc-des3_ede-caam", 282062306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 282162306a36Sopenharmony_ci }, 282262306a36Sopenharmony_ci .setkey = des3_aead_setkey, 282362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 282462306a36Sopenharmony_ci .encrypt = aead_encrypt, 282562306a36Sopenharmony_ci .decrypt = aead_decrypt, 282662306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 282762306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 282862306a36Sopenharmony_ci }, 282962306a36Sopenharmony_ci .aead.op = { 283062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 283162306a36Sopenharmony_ci }, 283262306a36Sopenharmony_ci .caam = { 283362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 283462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 283562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 283662306a36Sopenharmony_ci .geniv = true, 283762306a36Sopenharmony_ci }, 283862306a36Sopenharmony_ci }, 283962306a36Sopenharmony_ci { 284062306a36Sopenharmony_ci .aead.base = { 284162306a36Sopenharmony_ci .base = { 284262306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 284362306a36Sopenharmony_ci "cbc(des3_ede))", 284462306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 284562306a36Sopenharmony_ci "cbc-des3_ede-caam", 284662306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 284762306a36Sopenharmony_ci }, 284862306a36Sopenharmony_ci .setkey = des3_aead_setkey, 284962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 285062306a36Sopenharmony_ci .encrypt = aead_encrypt, 285162306a36Sopenharmony_ci .decrypt = aead_decrypt, 285262306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 285362306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 285462306a36Sopenharmony_ci }, 285562306a36Sopenharmony_ci .aead.op = { 285662306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 285762306a36Sopenharmony_ci }, 285862306a36Sopenharmony_ci .caam = { 285962306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 286062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 286162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 286262306a36Sopenharmony_ci }, 286362306a36Sopenharmony_ci }, 286462306a36Sopenharmony_ci { 286562306a36Sopenharmony_ci .aead.base = { 286662306a36Sopenharmony_ci .base = { 286762306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 286862306a36Sopenharmony_ci "cbc(des3_ede)))", 286962306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 287062306a36Sopenharmony_ci "hmac-sha512-" 287162306a36Sopenharmony_ci "cbc-des3_ede-caam", 287262306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 287362306a36Sopenharmony_ci }, 287462306a36Sopenharmony_ci .setkey = des3_aead_setkey, 287562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 287662306a36Sopenharmony_ci .encrypt = aead_encrypt, 287762306a36Sopenharmony_ci .decrypt = aead_decrypt, 287862306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 287962306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 288062306a36Sopenharmony_ci }, 288162306a36Sopenharmony_ci .aead.op = { 288262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 288362306a36Sopenharmony_ci }, 288462306a36Sopenharmony_ci .caam = { 288562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 288662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 288762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 288862306a36Sopenharmony_ci .geniv = true, 288962306a36Sopenharmony_ci }, 289062306a36Sopenharmony_ci }, 289162306a36Sopenharmony_ci { 289262306a36Sopenharmony_ci .aead.base = { 289362306a36Sopenharmony_ci .base = { 289462306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des))", 289562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 289662306a36Sopenharmony_ci "cbc-des-caam", 289762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 289862306a36Sopenharmony_ci }, 289962306a36Sopenharmony_ci .setkey = aead_setkey, 290062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 290162306a36Sopenharmony_ci .encrypt = aead_encrypt, 290262306a36Sopenharmony_ci .decrypt = aead_decrypt, 290362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 290462306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 290562306a36Sopenharmony_ci }, 290662306a36Sopenharmony_ci .aead.op = { 290762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 290862306a36Sopenharmony_ci }, 290962306a36Sopenharmony_ci .caam = { 291062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 291162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 291262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 291362306a36Sopenharmony_ci }, 291462306a36Sopenharmony_ci }, 291562306a36Sopenharmony_ci { 291662306a36Sopenharmony_ci .aead.base = { 291762306a36Sopenharmony_ci .base = { 291862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 291962306a36Sopenharmony_ci "cbc(des)))", 292062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 292162306a36Sopenharmony_ci "cbc-des-caam", 292262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 292362306a36Sopenharmony_ci }, 292462306a36Sopenharmony_ci .setkey = aead_setkey, 292562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 292662306a36Sopenharmony_ci .encrypt = aead_encrypt, 292762306a36Sopenharmony_ci .decrypt = aead_decrypt, 292862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 292962306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 293062306a36Sopenharmony_ci }, 293162306a36Sopenharmony_ci .aead.op = { 293262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 293362306a36Sopenharmony_ci }, 293462306a36Sopenharmony_ci .caam = { 293562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 293662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 293762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 293862306a36Sopenharmony_ci .geniv = true, 293962306a36Sopenharmony_ci }, 294062306a36Sopenharmony_ci }, 294162306a36Sopenharmony_ci { 294262306a36Sopenharmony_ci .aead.base = { 294362306a36Sopenharmony_ci .base = { 294462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(des))", 294562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 294662306a36Sopenharmony_ci "cbc-des-caam", 294762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 294862306a36Sopenharmony_ci }, 294962306a36Sopenharmony_ci .setkey = aead_setkey, 295062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 295162306a36Sopenharmony_ci .encrypt = aead_encrypt, 295262306a36Sopenharmony_ci .decrypt = aead_decrypt, 295362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 295462306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 295562306a36Sopenharmony_ci }, 295662306a36Sopenharmony_ci .aead.op = { 295762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 295862306a36Sopenharmony_ci }, 295962306a36Sopenharmony_ci .caam = { 296062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 296162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 296262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 296362306a36Sopenharmony_ci }, 296462306a36Sopenharmony_ci }, 296562306a36Sopenharmony_ci { 296662306a36Sopenharmony_ci .aead.base = { 296762306a36Sopenharmony_ci .base = { 296862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 296962306a36Sopenharmony_ci "cbc(des)))", 297062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 297162306a36Sopenharmony_ci "hmac-sha1-cbc-des-caam", 297262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 297362306a36Sopenharmony_ci }, 297462306a36Sopenharmony_ci .setkey = aead_setkey, 297562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 297662306a36Sopenharmony_ci .encrypt = aead_encrypt, 297762306a36Sopenharmony_ci .decrypt = aead_decrypt, 297862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 297962306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 298062306a36Sopenharmony_ci }, 298162306a36Sopenharmony_ci .aead.op = { 298262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 298362306a36Sopenharmony_ci }, 298462306a36Sopenharmony_ci .caam = { 298562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 298662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 298762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 298862306a36Sopenharmony_ci .geniv = true, 298962306a36Sopenharmony_ci }, 299062306a36Sopenharmony_ci }, 299162306a36Sopenharmony_ci { 299262306a36Sopenharmony_ci .aead.base = { 299362306a36Sopenharmony_ci .base = { 299462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(des))", 299562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 299662306a36Sopenharmony_ci "cbc-des-caam", 299762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 299862306a36Sopenharmony_ci }, 299962306a36Sopenharmony_ci .setkey = aead_setkey, 300062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 300162306a36Sopenharmony_ci .encrypt = aead_encrypt, 300262306a36Sopenharmony_ci .decrypt = aead_decrypt, 300362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 300462306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 300562306a36Sopenharmony_ci }, 300662306a36Sopenharmony_ci .aead.op = { 300762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 300862306a36Sopenharmony_ci }, 300962306a36Sopenharmony_ci .caam = { 301062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 301162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 301262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 301362306a36Sopenharmony_ci }, 301462306a36Sopenharmony_ci }, 301562306a36Sopenharmony_ci { 301662306a36Sopenharmony_ci .aead.base = { 301762306a36Sopenharmony_ci .base = { 301862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 301962306a36Sopenharmony_ci "cbc(des)))", 302062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 302162306a36Sopenharmony_ci "hmac-sha224-cbc-des-caam", 302262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 302362306a36Sopenharmony_ci }, 302462306a36Sopenharmony_ci .setkey = aead_setkey, 302562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 302662306a36Sopenharmony_ci .encrypt = aead_encrypt, 302762306a36Sopenharmony_ci .decrypt = aead_decrypt, 302862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 302962306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 303062306a36Sopenharmony_ci }, 303162306a36Sopenharmony_ci .aead.op = { 303262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 303362306a36Sopenharmony_ci }, 303462306a36Sopenharmony_ci .caam = { 303562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 303662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 303762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 303862306a36Sopenharmony_ci .geniv = true, 303962306a36Sopenharmony_ci }, 304062306a36Sopenharmony_ci }, 304162306a36Sopenharmony_ci { 304262306a36Sopenharmony_ci .aead.base = { 304362306a36Sopenharmony_ci .base = { 304462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(des))", 304562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 304662306a36Sopenharmony_ci "cbc-des-caam", 304762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 304862306a36Sopenharmony_ci }, 304962306a36Sopenharmony_ci .setkey = aead_setkey, 305062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 305162306a36Sopenharmony_ci .encrypt = aead_encrypt, 305262306a36Sopenharmony_ci .decrypt = aead_decrypt, 305362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 305462306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 305562306a36Sopenharmony_ci }, 305662306a36Sopenharmony_ci .aead.op = { 305762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 305862306a36Sopenharmony_ci }, 305962306a36Sopenharmony_ci .caam = { 306062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 306162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 306262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 306362306a36Sopenharmony_ci }, 306462306a36Sopenharmony_ci }, 306562306a36Sopenharmony_ci { 306662306a36Sopenharmony_ci .aead.base = { 306762306a36Sopenharmony_ci .base = { 306862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 306962306a36Sopenharmony_ci "cbc(des)))", 307062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 307162306a36Sopenharmony_ci "hmac-sha256-cbc-des-caam", 307262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 307362306a36Sopenharmony_ci }, 307462306a36Sopenharmony_ci .setkey = aead_setkey, 307562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 307662306a36Sopenharmony_ci .encrypt = aead_encrypt, 307762306a36Sopenharmony_ci .decrypt = aead_decrypt, 307862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 307962306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 308062306a36Sopenharmony_ci }, 308162306a36Sopenharmony_ci .aead.op = { 308262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 308362306a36Sopenharmony_ci }, 308462306a36Sopenharmony_ci .caam = { 308562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 308662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 308762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 308862306a36Sopenharmony_ci .geniv = true, 308962306a36Sopenharmony_ci }, 309062306a36Sopenharmony_ci }, 309162306a36Sopenharmony_ci { 309262306a36Sopenharmony_ci .aead.base = { 309362306a36Sopenharmony_ci .base = { 309462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(des))", 309562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 309662306a36Sopenharmony_ci "cbc-des-caam", 309762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 309862306a36Sopenharmony_ci }, 309962306a36Sopenharmony_ci .setkey = aead_setkey, 310062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 310162306a36Sopenharmony_ci .encrypt = aead_encrypt, 310262306a36Sopenharmony_ci .decrypt = aead_decrypt, 310362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 310462306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 310562306a36Sopenharmony_ci }, 310662306a36Sopenharmony_ci .aead.op = { 310762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 310862306a36Sopenharmony_ci }, 310962306a36Sopenharmony_ci .caam = { 311062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 311162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 311262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 311362306a36Sopenharmony_ci }, 311462306a36Sopenharmony_ci }, 311562306a36Sopenharmony_ci { 311662306a36Sopenharmony_ci .aead.base = { 311762306a36Sopenharmony_ci .base = { 311862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 311962306a36Sopenharmony_ci "cbc(des)))", 312062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 312162306a36Sopenharmony_ci "hmac-sha384-cbc-des-caam", 312262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 312362306a36Sopenharmony_ci }, 312462306a36Sopenharmony_ci .setkey = aead_setkey, 312562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 312662306a36Sopenharmony_ci .encrypt = aead_encrypt, 312762306a36Sopenharmony_ci .decrypt = aead_decrypt, 312862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 312962306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 313062306a36Sopenharmony_ci }, 313162306a36Sopenharmony_ci .aead.op = { 313262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 313362306a36Sopenharmony_ci }, 313462306a36Sopenharmony_ci .caam = { 313562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 313662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 313762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 313862306a36Sopenharmony_ci .geniv = true, 313962306a36Sopenharmony_ci }, 314062306a36Sopenharmony_ci }, 314162306a36Sopenharmony_ci { 314262306a36Sopenharmony_ci .aead.base = { 314362306a36Sopenharmony_ci .base = { 314462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(des))", 314562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 314662306a36Sopenharmony_ci "cbc-des-caam", 314762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 314862306a36Sopenharmony_ci }, 314962306a36Sopenharmony_ci .setkey = aead_setkey, 315062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 315162306a36Sopenharmony_ci .encrypt = aead_encrypt, 315262306a36Sopenharmony_ci .decrypt = aead_decrypt, 315362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 315462306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 315562306a36Sopenharmony_ci }, 315662306a36Sopenharmony_ci .aead.op = { 315762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 315862306a36Sopenharmony_ci }, 315962306a36Sopenharmony_ci .caam = { 316062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 316162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 316262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 316362306a36Sopenharmony_ci }, 316462306a36Sopenharmony_ci }, 316562306a36Sopenharmony_ci { 316662306a36Sopenharmony_ci .aead.base = { 316762306a36Sopenharmony_ci .base = { 316862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 316962306a36Sopenharmony_ci "cbc(des)))", 317062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 317162306a36Sopenharmony_ci "hmac-sha512-cbc-des-caam", 317262306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 317362306a36Sopenharmony_ci }, 317462306a36Sopenharmony_ci .setkey = aead_setkey, 317562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 317662306a36Sopenharmony_ci .encrypt = aead_encrypt, 317762306a36Sopenharmony_ci .decrypt = aead_decrypt, 317862306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 317962306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 318062306a36Sopenharmony_ci }, 318162306a36Sopenharmony_ci .aead.op = { 318262306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 318362306a36Sopenharmony_ci }, 318462306a36Sopenharmony_ci .caam = { 318562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 318662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 318762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 318862306a36Sopenharmony_ci .geniv = true, 318962306a36Sopenharmony_ci }, 319062306a36Sopenharmony_ci }, 319162306a36Sopenharmony_ci { 319262306a36Sopenharmony_ci .aead.base = { 319362306a36Sopenharmony_ci .base = { 319462306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5)," 319562306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 319662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 319762306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 319862306a36Sopenharmony_ci .cra_blocksize = 1, 319962306a36Sopenharmony_ci }, 320062306a36Sopenharmony_ci .setkey = aead_setkey, 320162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 320262306a36Sopenharmony_ci .encrypt = aead_encrypt, 320362306a36Sopenharmony_ci .decrypt = aead_decrypt, 320462306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 320562306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 320662306a36Sopenharmony_ci }, 320762306a36Sopenharmony_ci .aead.op = { 320862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 320962306a36Sopenharmony_ci }, 321062306a36Sopenharmony_ci .caam = { 321162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 321262306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 321362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 321462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 321562306a36Sopenharmony_ci .rfc3686 = true, 321662306a36Sopenharmony_ci }, 321762306a36Sopenharmony_ci }, 321862306a36Sopenharmony_ci { 321962306a36Sopenharmony_ci .aead.base = { 322062306a36Sopenharmony_ci .base = { 322162306a36Sopenharmony_ci .cra_name = "seqiv(authenc(" 322262306a36Sopenharmony_ci "hmac(md5),rfc3686(ctr(aes))))", 322362306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-md5-" 322462306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 322562306a36Sopenharmony_ci .cra_blocksize = 1, 322662306a36Sopenharmony_ci }, 322762306a36Sopenharmony_ci .setkey = aead_setkey, 322862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 322962306a36Sopenharmony_ci .encrypt = aead_encrypt, 323062306a36Sopenharmony_ci .decrypt = aead_decrypt, 323162306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 323262306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 323362306a36Sopenharmony_ci }, 323462306a36Sopenharmony_ci .aead.op = { 323562306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 323662306a36Sopenharmony_ci }, 323762306a36Sopenharmony_ci .caam = { 323862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 323962306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 324062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 324162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 324262306a36Sopenharmony_ci .rfc3686 = true, 324362306a36Sopenharmony_ci .geniv = true, 324462306a36Sopenharmony_ci }, 324562306a36Sopenharmony_ci }, 324662306a36Sopenharmony_ci { 324762306a36Sopenharmony_ci .aead.base = { 324862306a36Sopenharmony_ci .base = { 324962306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 325062306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 325162306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 325262306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 325362306a36Sopenharmony_ci .cra_blocksize = 1, 325462306a36Sopenharmony_ci }, 325562306a36Sopenharmony_ci .setkey = aead_setkey, 325662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 325762306a36Sopenharmony_ci .encrypt = aead_encrypt, 325862306a36Sopenharmony_ci .decrypt = aead_decrypt, 325962306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 326062306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 326162306a36Sopenharmony_ci }, 326262306a36Sopenharmony_ci .aead.op = { 326362306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 326462306a36Sopenharmony_ci }, 326562306a36Sopenharmony_ci .caam = { 326662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 326762306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 326862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 326962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 327062306a36Sopenharmony_ci .rfc3686 = true, 327162306a36Sopenharmony_ci }, 327262306a36Sopenharmony_ci }, 327362306a36Sopenharmony_ci { 327462306a36Sopenharmony_ci .aead.base = { 327562306a36Sopenharmony_ci .base = { 327662306a36Sopenharmony_ci .cra_name = "seqiv(authenc(" 327762306a36Sopenharmony_ci "hmac(sha1),rfc3686(ctr(aes))))", 327862306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha1-" 327962306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 328062306a36Sopenharmony_ci .cra_blocksize = 1, 328162306a36Sopenharmony_ci }, 328262306a36Sopenharmony_ci .setkey = aead_setkey, 328362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 328462306a36Sopenharmony_ci .encrypt = aead_encrypt, 328562306a36Sopenharmony_ci .decrypt = aead_decrypt, 328662306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 328762306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 328862306a36Sopenharmony_ci }, 328962306a36Sopenharmony_ci .aead.op = { 329062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 329162306a36Sopenharmony_ci }, 329262306a36Sopenharmony_ci .caam = { 329362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 329462306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 329562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 329662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 329762306a36Sopenharmony_ci .rfc3686 = true, 329862306a36Sopenharmony_ci .geniv = true, 329962306a36Sopenharmony_ci }, 330062306a36Sopenharmony_ci }, 330162306a36Sopenharmony_ci { 330262306a36Sopenharmony_ci .aead.base = { 330362306a36Sopenharmony_ci .base = { 330462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 330562306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 330662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 330762306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 330862306a36Sopenharmony_ci .cra_blocksize = 1, 330962306a36Sopenharmony_ci }, 331062306a36Sopenharmony_ci .setkey = aead_setkey, 331162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 331262306a36Sopenharmony_ci .encrypt = aead_encrypt, 331362306a36Sopenharmony_ci .decrypt = aead_decrypt, 331462306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 331562306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 331662306a36Sopenharmony_ci }, 331762306a36Sopenharmony_ci .aead.op = { 331862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 331962306a36Sopenharmony_ci }, 332062306a36Sopenharmony_ci .caam = { 332162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 332262306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 332362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 332462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 332562306a36Sopenharmony_ci .rfc3686 = true, 332662306a36Sopenharmony_ci }, 332762306a36Sopenharmony_ci }, 332862306a36Sopenharmony_ci { 332962306a36Sopenharmony_ci .aead.base = { 333062306a36Sopenharmony_ci .base = { 333162306a36Sopenharmony_ci .cra_name = "seqiv(authenc(" 333262306a36Sopenharmony_ci "hmac(sha224),rfc3686(ctr(aes))))", 333362306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha224-" 333462306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 333562306a36Sopenharmony_ci .cra_blocksize = 1, 333662306a36Sopenharmony_ci }, 333762306a36Sopenharmony_ci .setkey = aead_setkey, 333862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 333962306a36Sopenharmony_ci .encrypt = aead_encrypt, 334062306a36Sopenharmony_ci .decrypt = aead_decrypt, 334162306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 334262306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 334362306a36Sopenharmony_ci }, 334462306a36Sopenharmony_ci .aead.op = { 334562306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 334662306a36Sopenharmony_ci }, 334762306a36Sopenharmony_ci .caam = { 334862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 334962306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 335062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 335162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 335262306a36Sopenharmony_ci .rfc3686 = true, 335362306a36Sopenharmony_ci .geniv = true, 335462306a36Sopenharmony_ci }, 335562306a36Sopenharmony_ci }, 335662306a36Sopenharmony_ci { 335762306a36Sopenharmony_ci .aead.base = { 335862306a36Sopenharmony_ci .base = { 335962306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 336062306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 336162306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 336262306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 336362306a36Sopenharmony_ci .cra_blocksize = 1, 336462306a36Sopenharmony_ci }, 336562306a36Sopenharmony_ci .setkey = aead_setkey, 336662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 336762306a36Sopenharmony_ci .encrypt = aead_encrypt, 336862306a36Sopenharmony_ci .decrypt = aead_decrypt, 336962306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 337062306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 337162306a36Sopenharmony_ci }, 337262306a36Sopenharmony_ci .aead.op = { 337362306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 337462306a36Sopenharmony_ci }, 337562306a36Sopenharmony_ci .caam = { 337662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 337762306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 337862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 337962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 338062306a36Sopenharmony_ci .rfc3686 = true, 338162306a36Sopenharmony_ci }, 338262306a36Sopenharmony_ci }, 338362306a36Sopenharmony_ci { 338462306a36Sopenharmony_ci .aead.base = { 338562306a36Sopenharmony_ci .base = { 338662306a36Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha256)," 338762306a36Sopenharmony_ci "rfc3686(ctr(aes))))", 338862306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha256-" 338962306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 339062306a36Sopenharmony_ci .cra_blocksize = 1, 339162306a36Sopenharmony_ci }, 339262306a36Sopenharmony_ci .setkey = aead_setkey, 339362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 339462306a36Sopenharmony_ci .encrypt = aead_encrypt, 339562306a36Sopenharmony_ci .decrypt = aead_decrypt, 339662306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 339762306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 339862306a36Sopenharmony_ci }, 339962306a36Sopenharmony_ci .aead.op = { 340062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 340162306a36Sopenharmony_ci }, 340262306a36Sopenharmony_ci .caam = { 340362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 340462306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 340562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 340662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 340762306a36Sopenharmony_ci .rfc3686 = true, 340862306a36Sopenharmony_ci .geniv = true, 340962306a36Sopenharmony_ci }, 341062306a36Sopenharmony_ci }, 341162306a36Sopenharmony_ci { 341262306a36Sopenharmony_ci .aead.base = { 341362306a36Sopenharmony_ci .base = { 341462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 341562306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 341662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 341762306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 341862306a36Sopenharmony_ci .cra_blocksize = 1, 341962306a36Sopenharmony_ci }, 342062306a36Sopenharmony_ci .setkey = aead_setkey, 342162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 342262306a36Sopenharmony_ci .encrypt = aead_encrypt, 342362306a36Sopenharmony_ci .decrypt = aead_decrypt, 342462306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 342562306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 342662306a36Sopenharmony_ci }, 342762306a36Sopenharmony_ci .aead.op = { 342862306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 342962306a36Sopenharmony_ci }, 343062306a36Sopenharmony_ci .caam = { 343162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 343262306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 343362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 343462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 343562306a36Sopenharmony_ci .rfc3686 = true, 343662306a36Sopenharmony_ci }, 343762306a36Sopenharmony_ci }, 343862306a36Sopenharmony_ci { 343962306a36Sopenharmony_ci .aead.base = { 344062306a36Sopenharmony_ci .base = { 344162306a36Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha384)," 344262306a36Sopenharmony_ci "rfc3686(ctr(aes))))", 344362306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha384-" 344462306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 344562306a36Sopenharmony_ci .cra_blocksize = 1, 344662306a36Sopenharmony_ci }, 344762306a36Sopenharmony_ci .setkey = aead_setkey, 344862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 344962306a36Sopenharmony_ci .encrypt = aead_encrypt, 345062306a36Sopenharmony_ci .decrypt = aead_decrypt, 345162306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 345262306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 345362306a36Sopenharmony_ci }, 345462306a36Sopenharmony_ci .aead.op = { 345562306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 345662306a36Sopenharmony_ci }, 345762306a36Sopenharmony_ci .caam = { 345862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 345962306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 346062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 346162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 346262306a36Sopenharmony_ci .rfc3686 = true, 346362306a36Sopenharmony_ci .geniv = true, 346462306a36Sopenharmony_ci }, 346562306a36Sopenharmony_ci }, 346662306a36Sopenharmony_ci { 346762306a36Sopenharmony_ci .aead.base = { 346862306a36Sopenharmony_ci .base = { 346962306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 347062306a36Sopenharmony_ci "rfc3686(ctr(aes)))", 347162306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 347262306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 347362306a36Sopenharmony_ci .cra_blocksize = 1, 347462306a36Sopenharmony_ci }, 347562306a36Sopenharmony_ci .setkey = aead_setkey, 347662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 347762306a36Sopenharmony_ci .encrypt = aead_encrypt, 347862306a36Sopenharmony_ci .decrypt = aead_decrypt, 347962306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 348062306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 348162306a36Sopenharmony_ci }, 348262306a36Sopenharmony_ci .aead.op = { 348362306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 348462306a36Sopenharmony_ci }, 348562306a36Sopenharmony_ci .caam = { 348662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 348762306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 348862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 348962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 349062306a36Sopenharmony_ci .rfc3686 = true, 349162306a36Sopenharmony_ci }, 349262306a36Sopenharmony_ci }, 349362306a36Sopenharmony_ci { 349462306a36Sopenharmony_ci .aead.base = { 349562306a36Sopenharmony_ci .base = { 349662306a36Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha512)," 349762306a36Sopenharmony_ci "rfc3686(ctr(aes))))", 349862306a36Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha512-" 349962306a36Sopenharmony_ci "rfc3686-ctr-aes-caam", 350062306a36Sopenharmony_ci .cra_blocksize = 1, 350162306a36Sopenharmony_ci }, 350262306a36Sopenharmony_ci .setkey = aead_setkey, 350362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 350462306a36Sopenharmony_ci .encrypt = aead_encrypt, 350562306a36Sopenharmony_ci .decrypt = aead_decrypt, 350662306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 350762306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 350862306a36Sopenharmony_ci }, 350962306a36Sopenharmony_ci .aead.op = { 351062306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 351162306a36Sopenharmony_ci }, 351262306a36Sopenharmony_ci .caam = { 351362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 351462306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 351562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 351662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 351762306a36Sopenharmony_ci .rfc3686 = true, 351862306a36Sopenharmony_ci .geniv = true, 351962306a36Sopenharmony_ci }, 352062306a36Sopenharmony_ci }, 352162306a36Sopenharmony_ci { 352262306a36Sopenharmony_ci .aead.base = { 352362306a36Sopenharmony_ci .base = { 352462306a36Sopenharmony_ci .cra_name = "rfc7539(chacha20,poly1305)", 352562306a36Sopenharmony_ci .cra_driver_name = "rfc7539-chacha20-poly1305-" 352662306a36Sopenharmony_ci "caam", 352762306a36Sopenharmony_ci .cra_blocksize = 1, 352862306a36Sopenharmony_ci }, 352962306a36Sopenharmony_ci .setkey = chachapoly_setkey, 353062306a36Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 353162306a36Sopenharmony_ci .encrypt = chachapoly_encrypt, 353262306a36Sopenharmony_ci .decrypt = chachapoly_decrypt, 353362306a36Sopenharmony_ci .ivsize = CHACHAPOLY_IV_SIZE, 353462306a36Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 353562306a36Sopenharmony_ci }, 353662306a36Sopenharmony_ci .aead.op = { 353762306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 353862306a36Sopenharmony_ci }, 353962306a36Sopenharmony_ci .caam = { 354062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 354162306a36Sopenharmony_ci OP_ALG_AAI_AEAD, 354262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 354362306a36Sopenharmony_ci OP_ALG_AAI_AEAD, 354462306a36Sopenharmony_ci .nodkp = true, 354562306a36Sopenharmony_ci }, 354662306a36Sopenharmony_ci }, 354762306a36Sopenharmony_ci { 354862306a36Sopenharmony_ci .aead.base = { 354962306a36Sopenharmony_ci .base = { 355062306a36Sopenharmony_ci .cra_name = "rfc7539esp(chacha20,poly1305)", 355162306a36Sopenharmony_ci .cra_driver_name = "rfc7539esp-chacha20-" 355262306a36Sopenharmony_ci "poly1305-caam", 355362306a36Sopenharmony_ci .cra_blocksize = 1, 355462306a36Sopenharmony_ci }, 355562306a36Sopenharmony_ci .setkey = chachapoly_setkey, 355662306a36Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 355762306a36Sopenharmony_ci .encrypt = chachapoly_encrypt, 355862306a36Sopenharmony_ci .decrypt = chachapoly_decrypt, 355962306a36Sopenharmony_ci .ivsize = 8, 356062306a36Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 356162306a36Sopenharmony_ci }, 356262306a36Sopenharmony_ci .aead.op = { 356362306a36Sopenharmony_ci .do_one_request = aead_do_one_req, 356462306a36Sopenharmony_ci }, 356562306a36Sopenharmony_ci .caam = { 356662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 356762306a36Sopenharmony_ci OP_ALG_AAI_AEAD, 356862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 356962306a36Sopenharmony_ci OP_ALG_AAI_AEAD, 357062306a36Sopenharmony_ci .nodkp = true, 357162306a36Sopenharmony_ci }, 357262306a36Sopenharmony_ci }, 357362306a36Sopenharmony_ci}; 357462306a36Sopenharmony_ci 357562306a36Sopenharmony_cistatic int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, 357662306a36Sopenharmony_ci bool uses_dkp) 357762306a36Sopenharmony_ci{ 357862306a36Sopenharmony_ci dma_addr_t dma_addr; 357962306a36Sopenharmony_ci struct caam_drv_private *priv; 358062306a36Sopenharmony_ci const size_t sh_desc_enc_offset = offsetof(struct caam_ctx, 358162306a36Sopenharmony_ci sh_desc_enc); 358262306a36Sopenharmony_ci 358362306a36Sopenharmony_ci ctx->jrdev = caam_jr_alloc(); 358462306a36Sopenharmony_ci if (IS_ERR(ctx->jrdev)) { 358562306a36Sopenharmony_ci pr_err("Job Ring Device allocation for transform failed\n"); 358662306a36Sopenharmony_ci return PTR_ERR(ctx->jrdev); 358762306a36Sopenharmony_ci } 358862306a36Sopenharmony_ci 358962306a36Sopenharmony_ci priv = dev_get_drvdata(ctx->jrdev->parent); 359062306a36Sopenharmony_ci if (priv->era >= 6 && uses_dkp) 359162306a36Sopenharmony_ci ctx->dir = DMA_BIDIRECTIONAL; 359262306a36Sopenharmony_ci else 359362306a36Sopenharmony_ci ctx->dir = DMA_TO_DEVICE; 359462306a36Sopenharmony_ci 359562306a36Sopenharmony_ci dma_addr = dma_map_single_attrs(ctx->jrdev, ctx->sh_desc_enc, 359662306a36Sopenharmony_ci offsetof(struct caam_ctx, 359762306a36Sopenharmony_ci sh_desc_enc_dma) - 359862306a36Sopenharmony_ci sh_desc_enc_offset, 359962306a36Sopenharmony_ci ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 360062306a36Sopenharmony_ci if (dma_mapping_error(ctx->jrdev, dma_addr)) { 360162306a36Sopenharmony_ci dev_err(ctx->jrdev, "unable to map key, shared descriptors\n"); 360262306a36Sopenharmony_ci caam_jr_free(ctx->jrdev); 360362306a36Sopenharmony_ci return -ENOMEM; 360462306a36Sopenharmony_ci } 360562306a36Sopenharmony_ci 360662306a36Sopenharmony_ci ctx->sh_desc_enc_dma = dma_addr; 360762306a36Sopenharmony_ci ctx->sh_desc_dec_dma = dma_addr + offsetof(struct caam_ctx, 360862306a36Sopenharmony_ci sh_desc_dec) - 360962306a36Sopenharmony_ci sh_desc_enc_offset; 361062306a36Sopenharmony_ci ctx->key_dma = dma_addr + offsetof(struct caam_ctx, key) - 361162306a36Sopenharmony_ci sh_desc_enc_offset; 361262306a36Sopenharmony_ci 361362306a36Sopenharmony_ci /* copy descriptor header template value */ 361462306a36Sopenharmony_ci ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; 361562306a36Sopenharmony_ci ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci return 0; 361862306a36Sopenharmony_ci} 361962306a36Sopenharmony_ci 362062306a36Sopenharmony_cistatic int caam_cra_init(struct crypto_skcipher *tfm) 362162306a36Sopenharmony_ci{ 362262306a36Sopenharmony_ci struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 362362306a36Sopenharmony_ci struct caam_skcipher_alg *caam_alg = 362462306a36Sopenharmony_ci container_of(alg, typeof(*caam_alg), skcipher.base); 362562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm); 362662306a36Sopenharmony_ci u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 362762306a36Sopenharmony_ci int ret = 0; 362862306a36Sopenharmony_ci 362962306a36Sopenharmony_ci if (alg_aai == OP_ALG_AAI_XTS) { 363062306a36Sopenharmony_ci const char *tfm_name = crypto_tfm_alg_name(&tfm->base); 363162306a36Sopenharmony_ci struct crypto_skcipher *fallback; 363262306a36Sopenharmony_ci 363362306a36Sopenharmony_ci fallback = crypto_alloc_skcipher(tfm_name, 0, 363462306a36Sopenharmony_ci CRYPTO_ALG_NEED_FALLBACK); 363562306a36Sopenharmony_ci if (IS_ERR(fallback)) { 363662306a36Sopenharmony_ci pr_err("Failed to allocate %s fallback: %ld\n", 363762306a36Sopenharmony_ci tfm_name, PTR_ERR(fallback)); 363862306a36Sopenharmony_ci return PTR_ERR(fallback); 363962306a36Sopenharmony_ci } 364062306a36Sopenharmony_ci 364162306a36Sopenharmony_ci ctx->fallback = fallback; 364262306a36Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) + 364362306a36Sopenharmony_ci crypto_skcipher_reqsize(fallback)); 364462306a36Sopenharmony_ci } else { 364562306a36Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx)); 364662306a36Sopenharmony_ci } 364762306a36Sopenharmony_ci 364862306a36Sopenharmony_ci ret = caam_init_common(ctx, &caam_alg->caam, false); 364962306a36Sopenharmony_ci if (ret && ctx->fallback) 365062306a36Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 365162306a36Sopenharmony_ci 365262306a36Sopenharmony_ci return ret; 365362306a36Sopenharmony_ci} 365462306a36Sopenharmony_ci 365562306a36Sopenharmony_cistatic int caam_aead_init(struct crypto_aead *tfm) 365662306a36Sopenharmony_ci{ 365762306a36Sopenharmony_ci struct aead_alg *alg = crypto_aead_alg(tfm); 365862306a36Sopenharmony_ci struct caam_aead_alg *caam_alg = 365962306a36Sopenharmony_ci container_of(alg, struct caam_aead_alg, aead.base); 366062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(tfm); 366162306a36Sopenharmony_ci 366262306a36Sopenharmony_ci crypto_aead_set_reqsize(tfm, sizeof(struct caam_aead_req_ctx)); 366362306a36Sopenharmony_ci 366462306a36Sopenharmony_ci return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp); 366562306a36Sopenharmony_ci} 366662306a36Sopenharmony_ci 366762306a36Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx) 366862306a36Sopenharmony_ci{ 366962306a36Sopenharmony_ci dma_unmap_single_attrs(ctx->jrdev, ctx->sh_desc_enc_dma, 367062306a36Sopenharmony_ci offsetof(struct caam_ctx, sh_desc_enc_dma) - 367162306a36Sopenharmony_ci offsetof(struct caam_ctx, sh_desc_enc), 367262306a36Sopenharmony_ci ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 367362306a36Sopenharmony_ci caam_jr_free(ctx->jrdev); 367462306a36Sopenharmony_ci} 367562306a36Sopenharmony_ci 367662306a36Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm) 367762306a36Sopenharmony_ci{ 367862306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm); 367962306a36Sopenharmony_ci 368062306a36Sopenharmony_ci if (ctx->fallback) 368162306a36Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 368262306a36Sopenharmony_ci caam_exit_common(ctx); 368362306a36Sopenharmony_ci} 368462306a36Sopenharmony_ci 368562306a36Sopenharmony_cistatic void caam_aead_exit(struct crypto_aead *tfm) 368662306a36Sopenharmony_ci{ 368762306a36Sopenharmony_ci caam_exit_common(crypto_aead_ctx_dma(tfm)); 368862306a36Sopenharmony_ci} 368962306a36Sopenharmony_ci 369062306a36Sopenharmony_civoid caam_algapi_exit(void) 369162306a36Sopenharmony_ci{ 369262306a36Sopenharmony_ci int i; 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 369562306a36Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 369662306a36Sopenharmony_ci 369762306a36Sopenharmony_ci if (t_alg->registered) 369862306a36Sopenharmony_ci crypto_engine_unregister_aead(&t_alg->aead); 369962306a36Sopenharmony_ci } 370062306a36Sopenharmony_ci 370162306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 370262306a36Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 370362306a36Sopenharmony_ci 370462306a36Sopenharmony_ci if (t_alg->registered) 370562306a36Sopenharmony_ci crypto_engine_unregister_skcipher(&t_alg->skcipher); 370662306a36Sopenharmony_ci } 370762306a36Sopenharmony_ci} 370862306a36Sopenharmony_ci 370962306a36Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 371062306a36Sopenharmony_ci{ 371162306a36Sopenharmony_ci struct skcipher_alg *alg = &t_alg->skcipher.base; 371262306a36Sopenharmony_ci 371362306a36Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 371462306a36Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 371562306a36Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding(); 371662306a36Sopenharmony_ci alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 371762306a36Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY); 371862306a36Sopenharmony_ci 371962306a36Sopenharmony_ci alg->init = caam_cra_init; 372062306a36Sopenharmony_ci alg->exit = caam_cra_exit; 372162306a36Sopenharmony_ci} 372262306a36Sopenharmony_ci 372362306a36Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg) 372462306a36Sopenharmony_ci{ 372562306a36Sopenharmony_ci struct aead_alg *alg = &t_alg->aead.base; 372662306a36Sopenharmony_ci 372762306a36Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 372862306a36Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 372962306a36Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding(); 373062306a36Sopenharmony_ci alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 373162306a36Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY; 373262306a36Sopenharmony_ci 373362306a36Sopenharmony_ci alg->init = caam_aead_init; 373462306a36Sopenharmony_ci alg->exit = caam_aead_exit; 373562306a36Sopenharmony_ci} 373662306a36Sopenharmony_ci 373762306a36Sopenharmony_ciint caam_algapi_init(struct device *ctrldev) 373862306a36Sopenharmony_ci{ 373962306a36Sopenharmony_ci struct caam_drv_private *priv = dev_get_drvdata(ctrldev); 374062306a36Sopenharmony_ci int i = 0, err = 0; 374162306a36Sopenharmony_ci u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst; 374262306a36Sopenharmony_ci unsigned int md_limit = SHA512_DIGEST_SIZE; 374362306a36Sopenharmony_ci bool registered = false, gcm_support; 374462306a36Sopenharmony_ci 374562306a36Sopenharmony_ci /* 374662306a36Sopenharmony_ci * Register crypto algorithms the device supports. 374762306a36Sopenharmony_ci * First, detect presence and attributes of DES, AES, and MD blocks. 374862306a36Sopenharmony_ci */ 374962306a36Sopenharmony_ci if (priv->era < 10) { 375062306a36Sopenharmony_ci struct caam_perfmon __iomem *perfmon = &priv->jr[0]->perfmon; 375162306a36Sopenharmony_ci u32 cha_vid, cha_inst, aes_rn; 375262306a36Sopenharmony_ci 375362306a36Sopenharmony_ci cha_vid = rd_reg32(&perfmon->cha_id_ls); 375462306a36Sopenharmony_ci aes_vid = cha_vid & CHA_ID_LS_AES_MASK; 375562306a36Sopenharmony_ci md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 375662306a36Sopenharmony_ci 375762306a36Sopenharmony_ci cha_inst = rd_reg32(&perfmon->cha_num_ls); 375862306a36Sopenharmony_ci des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >> 375962306a36Sopenharmony_ci CHA_ID_LS_DES_SHIFT; 376062306a36Sopenharmony_ci aes_inst = cha_inst & CHA_ID_LS_AES_MASK; 376162306a36Sopenharmony_ci md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 376262306a36Sopenharmony_ci ccha_inst = 0; 376362306a36Sopenharmony_ci ptha_inst = 0; 376462306a36Sopenharmony_ci 376562306a36Sopenharmony_ci aes_rn = rd_reg32(&perfmon->cha_rev_ls) & CHA_ID_LS_AES_MASK; 376662306a36Sopenharmony_ci gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8); 376762306a36Sopenharmony_ci } else { 376862306a36Sopenharmony_ci struct version_regs __iomem *vreg = &priv->jr[0]->vreg; 376962306a36Sopenharmony_ci u32 aesa, mdha; 377062306a36Sopenharmony_ci 377162306a36Sopenharmony_ci aesa = rd_reg32(&vreg->aesa); 377262306a36Sopenharmony_ci mdha = rd_reg32(&vreg->mdha); 377362306a36Sopenharmony_ci 377462306a36Sopenharmony_ci aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 377562306a36Sopenharmony_ci md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 377662306a36Sopenharmony_ci 377762306a36Sopenharmony_ci des_inst = rd_reg32(&vreg->desa) & CHA_VER_NUM_MASK; 377862306a36Sopenharmony_ci aes_inst = aesa & CHA_VER_NUM_MASK; 377962306a36Sopenharmony_ci md_inst = mdha & CHA_VER_NUM_MASK; 378062306a36Sopenharmony_ci ccha_inst = rd_reg32(&vreg->ccha) & CHA_VER_NUM_MASK; 378162306a36Sopenharmony_ci ptha_inst = rd_reg32(&vreg->ptha) & CHA_VER_NUM_MASK; 378262306a36Sopenharmony_ci 378362306a36Sopenharmony_ci gcm_support = aesa & CHA_VER_MISC_AES_GCM; 378462306a36Sopenharmony_ci } 378562306a36Sopenharmony_ci 378662306a36Sopenharmony_ci /* If MD is present, limit digest size based on LP256 */ 378762306a36Sopenharmony_ci if (md_inst && md_vid == CHA_VER_VID_MD_LP256) 378862306a36Sopenharmony_ci md_limit = SHA256_DIGEST_SIZE; 378962306a36Sopenharmony_ci 379062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 379162306a36Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 379262306a36Sopenharmony_ci u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK; 379362306a36Sopenharmony_ci 379462306a36Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 379562306a36Sopenharmony_ci if (!des_inst && 379662306a36Sopenharmony_ci ((alg_sel == OP_ALG_ALGSEL_3DES) || 379762306a36Sopenharmony_ci (alg_sel == OP_ALG_ALGSEL_DES))) 379862306a36Sopenharmony_ci continue; 379962306a36Sopenharmony_ci 380062306a36Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 380162306a36Sopenharmony_ci if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 380262306a36Sopenharmony_ci continue; 380362306a36Sopenharmony_ci 380462306a36Sopenharmony_ci /* 380562306a36Sopenharmony_ci * Check support for AES modes not available 380662306a36Sopenharmony_ci * on LP devices. 380762306a36Sopenharmony_ci */ 380862306a36Sopenharmony_ci if (aes_vid == CHA_VER_VID_AES_LP && 380962306a36Sopenharmony_ci (t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK) == 381062306a36Sopenharmony_ci OP_ALG_AAI_XTS) 381162306a36Sopenharmony_ci continue; 381262306a36Sopenharmony_ci 381362306a36Sopenharmony_ci caam_skcipher_alg_init(t_alg); 381462306a36Sopenharmony_ci 381562306a36Sopenharmony_ci err = crypto_engine_register_skcipher(&t_alg->skcipher); 381662306a36Sopenharmony_ci if (err) { 381762306a36Sopenharmony_ci pr_warn("%s alg registration failed\n", 381862306a36Sopenharmony_ci t_alg->skcipher.base.base.cra_driver_name); 381962306a36Sopenharmony_ci continue; 382062306a36Sopenharmony_ci } 382162306a36Sopenharmony_ci 382262306a36Sopenharmony_ci t_alg->registered = true; 382362306a36Sopenharmony_ci registered = true; 382462306a36Sopenharmony_ci } 382562306a36Sopenharmony_ci 382662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 382762306a36Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 382862306a36Sopenharmony_ci u32 c1_alg_sel = t_alg->caam.class1_alg_type & 382962306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK; 383062306a36Sopenharmony_ci u32 c2_alg_sel = t_alg->caam.class2_alg_type & 383162306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK; 383262306a36Sopenharmony_ci u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 383362306a36Sopenharmony_ci 383462306a36Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 383562306a36Sopenharmony_ci if (!des_inst && 383662306a36Sopenharmony_ci ((c1_alg_sel == OP_ALG_ALGSEL_3DES) || 383762306a36Sopenharmony_ci (c1_alg_sel == OP_ALG_ALGSEL_DES))) 383862306a36Sopenharmony_ci continue; 383962306a36Sopenharmony_ci 384062306a36Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 384162306a36Sopenharmony_ci if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES)) 384262306a36Sopenharmony_ci continue; 384362306a36Sopenharmony_ci 384462306a36Sopenharmony_ci /* Skip CHACHA20 algorithms if not supported by device */ 384562306a36Sopenharmony_ci if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && !ccha_inst) 384662306a36Sopenharmony_ci continue; 384762306a36Sopenharmony_ci 384862306a36Sopenharmony_ci /* Skip POLY1305 algorithms if not supported by device */ 384962306a36Sopenharmony_ci if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && !ptha_inst) 385062306a36Sopenharmony_ci continue; 385162306a36Sopenharmony_ci 385262306a36Sopenharmony_ci /* Skip GCM algorithms if not supported by device */ 385362306a36Sopenharmony_ci if (c1_alg_sel == OP_ALG_ALGSEL_AES && 385462306a36Sopenharmony_ci alg_aai == OP_ALG_AAI_GCM && !gcm_support) 385562306a36Sopenharmony_ci continue; 385662306a36Sopenharmony_ci 385762306a36Sopenharmony_ci /* 385862306a36Sopenharmony_ci * Skip algorithms requiring message digests 385962306a36Sopenharmony_ci * if MD or MD size is not supported by device. 386062306a36Sopenharmony_ci */ 386162306a36Sopenharmony_ci if (is_mdha(c2_alg_sel) && 386262306a36Sopenharmony_ci (!md_inst || t_alg->aead.base.maxauthsize > md_limit)) 386362306a36Sopenharmony_ci continue; 386462306a36Sopenharmony_ci 386562306a36Sopenharmony_ci caam_aead_alg_init(t_alg); 386662306a36Sopenharmony_ci 386762306a36Sopenharmony_ci err = crypto_engine_register_aead(&t_alg->aead); 386862306a36Sopenharmony_ci if (err) { 386962306a36Sopenharmony_ci pr_warn("%s alg registration failed\n", 387062306a36Sopenharmony_ci t_alg->aead.base.base.cra_driver_name); 387162306a36Sopenharmony_ci continue; 387262306a36Sopenharmony_ci } 387362306a36Sopenharmony_ci 387462306a36Sopenharmony_ci t_alg->registered = true; 387562306a36Sopenharmony_ci registered = true; 387662306a36Sopenharmony_ci } 387762306a36Sopenharmony_ci 387862306a36Sopenharmony_ci if (registered) 387962306a36Sopenharmony_ci pr_info("caam algorithms registered in /proc/crypto\n"); 388062306a36Sopenharmony_ci 388162306a36Sopenharmony_ci return err; 388262306a36Sopenharmony_ci} 3883