162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale FSL CAAM support for crypto API over QI backend. 462306a36Sopenharmony_ci * Based on caamalg.c 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor, Inc. 762306a36Sopenharmony_ci * Copyright 2016-2019 NXP 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "compat.h" 1162306a36Sopenharmony_ci#include "ctrl.h" 1262306a36Sopenharmony_ci#include "regs.h" 1362306a36Sopenharmony_ci#include "intern.h" 1462306a36Sopenharmony_ci#include "desc_constr.h" 1562306a36Sopenharmony_ci#include "error.h" 1662306a36Sopenharmony_ci#include "sg_sw_qm.h" 1762306a36Sopenharmony_ci#include "key_gen.h" 1862306a36Sopenharmony_ci#include "qi.h" 1962306a36Sopenharmony_ci#include "jr.h" 2062306a36Sopenharmony_ci#include "caamalg_desc.h" 2162306a36Sopenharmony_ci#include <crypto/xts.h> 2262306a36Sopenharmony_ci#include <asm/unaligned.h> 2362306a36Sopenharmony_ci#include <linux/device.h> 2462306a36Sopenharmony_ci#include <linux/err.h> 2562306a36Sopenharmony_ci#include <linux/dma-mapping.h> 2662306a36Sopenharmony_ci#include <linux/kernel.h> 2762306a36Sopenharmony_ci#include <linux/string.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci * crypto alg 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_ci#define CAAM_CRA_PRIORITY 2000 3362306a36Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 3462306a36Sopenharmony_ci#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 3562306a36Sopenharmony_ci SHA512_DIGEST_SIZE * 2) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define DESC_MAX_USED_BYTES (DESC_QI_AEAD_GIVENC_LEN + \ 3862306a36Sopenharmony_ci CAAM_MAX_KEY_SIZE) 3962306a36Sopenharmony_ci#define DESC_MAX_USED_LEN (DESC_MAX_USED_BYTES / CAAM_CMD_SZ) 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistruct caam_alg_entry { 4262306a36Sopenharmony_ci int class1_alg_type; 4362306a36Sopenharmony_ci int class2_alg_type; 4462306a36Sopenharmony_ci bool rfc3686; 4562306a36Sopenharmony_ci bool geniv; 4662306a36Sopenharmony_ci bool nodkp; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct caam_aead_alg { 5062306a36Sopenharmony_ci struct aead_alg aead; 5162306a36Sopenharmony_ci struct caam_alg_entry caam; 5262306a36Sopenharmony_ci bool registered; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct caam_skcipher_alg { 5662306a36Sopenharmony_ci struct skcipher_alg skcipher; 5762306a36Sopenharmony_ci struct caam_alg_entry caam; 5862306a36Sopenharmony_ci bool registered; 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* 6262306a36Sopenharmony_ci * per-session context 6362306a36Sopenharmony_ci */ 6462306a36Sopenharmony_cistruct caam_ctx { 6562306a36Sopenharmony_ci struct device *jrdev; 6662306a36Sopenharmony_ci u32 sh_desc_enc[DESC_MAX_USED_LEN]; 6762306a36Sopenharmony_ci u32 sh_desc_dec[DESC_MAX_USED_LEN]; 6862306a36Sopenharmony_ci u8 key[CAAM_MAX_KEY_SIZE]; 6962306a36Sopenharmony_ci dma_addr_t key_dma; 7062306a36Sopenharmony_ci enum dma_data_direction dir; 7162306a36Sopenharmony_ci struct alginfo adata; 7262306a36Sopenharmony_ci struct alginfo cdata; 7362306a36Sopenharmony_ci unsigned int authsize; 7462306a36Sopenharmony_ci struct device *qidev; 7562306a36Sopenharmony_ci spinlock_t lock; /* Protects multiple init of driver context */ 7662306a36Sopenharmony_ci struct caam_drv_ctx *drv_ctx[NUM_OP]; 7762306a36Sopenharmony_ci bool xts_key_fallback; 7862306a36Sopenharmony_ci struct crypto_skcipher *fallback; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct caam_skcipher_req_ctx { 8262306a36Sopenharmony_ci struct skcipher_request fallback_req; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 8862306a36Sopenharmony_ci typeof(*alg), aead); 8962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 9062306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 9162306a36Sopenharmony_ci u32 ctx1_iv_off = 0; 9262306a36Sopenharmony_ci u32 *nonce = NULL; 9362306a36Sopenharmony_ci unsigned int data_len[2]; 9462306a36Sopenharmony_ci u32 inl_mask; 9562306a36Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 9662306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 9762306a36Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 9862306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 10162306a36Sopenharmony_ci return 0; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci /* 10462306a36Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 10562306a36Sopenharmony_ci * at an offset of 128bits (16bytes) 10662306a36Sopenharmony_ci * CONTEXT1[255:128] = IV 10762306a36Sopenharmony_ci */ 10862306a36Sopenharmony_ci if (ctr_mode) 10962306a36Sopenharmony_ci ctx1_iv_off = 16; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci /* 11262306a36Sopenharmony_ci * RFC3686 specific: 11362306a36Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 11462306a36Sopenharmony_ci */ 11562306a36Sopenharmony_ci if (is_rfc3686) { 11662306a36Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 11762306a36Sopenharmony_ci nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad + 11862306a36Sopenharmony_ci ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE); 11962306a36Sopenharmony_ci } 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci /* 12262306a36Sopenharmony_ci * In case |user key| > |derived key|, using DKP<imm,imm> would result 12362306a36Sopenharmony_ci * in invalid opcodes (last bytes of user key) in the resulting 12462306a36Sopenharmony_ci * descriptor. Use DKP<ptr,imm> instead => both virtual and dma key 12562306a36Sopenharmony_ci * addresses are needed. 12662306a36Sopenharmony_ci */ 12762306a36Sopenharmony_ci ctx->adata.key_virt = ctx->key; 12862306a36Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad; 13162306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci data_len[0] = ctx->adata.keylen_pad; 13462306a36Sopenharmony_ci data_len[1] = ctx->cdata.keylen; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci if (alg->caam.geniv) 13762306a36Sopenharmony_ci goto skip_enc; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci /* aead_encrypt shared descriptor */ 14062306a36Sopenharmony_ci if (desc_inline_query(DESC_QI_AEAD_ENC_LEN + 14162306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 14262306a36Sopenharmony_ci DESC_JOB_IO_LEN, data_len, &inl_mask, 14362306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 14462306a36Sopenharmony_ci return -EINVAL; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 14762306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci cnstr_shdsc_aead_encap(ctx->sh_desc_enc, &ctx->cdata, &ctx->adata, 15062306a36Sopenharmony_ci ivsize, ctx->authsize, is_rfc3686, nonce, 15162306a36Sopenharmony_ci ctx1_iv_off, true, ctrlpriv->era); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ciskip_enc: 15462306a36Sopenharmony_ci /* aead_decrypt shared descriptor */ 15562306a36Sopenharmony_ci if (desc_inline_query(DESC_QI_AEAD_DEC_LEN + 15662306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 15762306a36Sopenharmony_ci DESC_JOB_IO_LEN, data_len, &inl_mask, 15862306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 15962306a36Sopenharmony_ci return -EINVAL; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 16262306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci cnstr_shdsc_aead_decap(ctx->sh_desc_dec, &ctx->cdata, &ctx->adata, 16562306a36Sopenharmony_ci ivsize, ctx->authsize, alg->caam.geniv, 16662306a36Sopenharmony_ci is_rfc3686, nonce, ctx1_iv_off, true, 16762306a36Sopenharmony_ci ctrlpriv->era); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci if (!alg->caam.geniv) 17062306a36Sopenharmony_ci goto skip_givenc; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* aead_givencrypt shared descriptor */ 17362306a36Sopenharmony_ci if (desc_inline_query(DESC_QI_AEAD_GIVENC_LEN + 17462306a36Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 17562306a36Sopenharmony_ci DESC_JOB_IO_LEN, data_len, &inl_mask, 17662306a36Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 17762306a36Sopenharmony_ci return -EINVAL; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 18062306a36Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci cnstr_shdsc_aead_givencap(ctx->sh_desc_enc, &ctx->cdata, &ctx->adata, 18362306a36Sopenharmony_ci ivsize, ctx->authsize, is_rfc3686, nonce, 18462306a36Sopenharmony_ci ctx1_iv_off, true, ctrlpriv->era); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciskip_givenc: 18762306a36Sopenharmony_ci return 0; 18862306a36Sopenharmony_ci} 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci ctx->authsize = authsize; 19562306a36Sopenharmony_ci aead_set_sh_desc(authenc); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci return 0; 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, const u8 *key, 20162306a36Sopenharmony_ci unsigned int keylen) 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 20462306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 20562306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 20662306a36Sopenharmony_ci struct crypto_authenc_keys keys; 20762306a36Sopenharmony_ci int ret = 0; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci if (crypto_authenc_extractkeys(&keys, key, keylen) != 0) 21062306a36Sopenharmony_ci goto badkey; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n", 21362306a36Sopenharmony_ci keys.authkeylen + keys.enckeylen, keys.enckeylen, 21462306a36Sopenharmony_ci keys.authkeylen); 21562306a36Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 21662306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci /* 21962306a36Sopenharmony_ci * If DKP is supported, use it in the shared descriptor to generate 22062306a36Sopenharmony_ci * the split key. 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_ci if (ctrlpriv->era >= 6) { 22362306a36Sopenharmony_ci ctx->adata.keylen = keys.authkeylen; 22462306a36Sopenharmony_ci ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype & 22562306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE) 22862306a36Sopenharmony_ci goto badkey; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci memcpy(ctx->key, keys.authkey, keys.authkeylen); 23162306a36Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, 23262306a36Sopenharmony_ci keys.enckeylen); 23362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev->parent, ctx->key_dma, 23462306a36Sopenharmony_ci ctx->adata.keylen_pad + 23562306a36Sopenharmony_ci keys.enckeylen, ctx->dir); 23662306a36Sopenharmony_ci goto skip_split_key; 23762306a36Sopenharmony_ci } 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci ret = gen_split_key(jrdev, ctx->key, &ctx->adata, keys.authkey, 24062306a36Sopenharmony_ci keys.authkeylen, CAAM_MAX_KEY_SIZE - 24162306a36Sopenharmony_ci keys.enckeylen); 24262306a36Sopenharmony_ci if (ret) 24362306a36Sopenharmony_ci goto badkey; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* postpend encryption key to auth split key */ 24662306a36Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen); 24762306a36Sopenharmony_ci dma_sync_single_for_device(jrdev->parent, ctx->key_dma, 24862306a36Sopenharmony_ci ctx->adata.keylen_pad + keys.enckeylen, 24962306a36Sopenharmony_ci ctx->dir); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci print_hex_dump_debug("ctx.key@" __stringify(__LINE__)": ", 25262306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, 25362306a36Sopenharmony_ci ctx->adata.keylen_pad + keys.enckeylen, 1); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ciskip_split_key: 25662306a36Sopenharmony_ci ctx->cdata.keylen = keys.enckeylen; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci ret = aead_set_sh_desc(aead); 25962306a36Sopenharmony_ci if (ret) 26062306a36Sopenharmony_ci goto badkey; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 26362306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 26462306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 26562306a36Sopenharmony_ci ctx->sh_desc_enc); 26662306a36Sopenharmony_ci if (ret) { 26762306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 26862306a36Sopenharmony_ci goto badkey; 26962306a36Sopenharmony_ci } 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 27362306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 27462306a36Sopenharmony_ci ctx->sh_desc_dec); 27562306a36Sopenharmony_ci if (ret) { 27662306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 27762306a36Sopenharmony_ci goto badkey; 27862306a36Sopenharmony_ci } 27962306a36Sopenharmony_ci } 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 28262306a36Sopenharmony_ci return ret; 28362306a36Sopenharmony_cibadkey: 28462306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 28562306a36Sopenharmony_ci return -EINVAL; 28662306a36Sopenharmony_ci} 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key, 28962306a36Sopenharmony_ci unsigned int keylen) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci struct crypto_authenc_keys keys; 29262306a36Sopenharmony_ci int err; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci err = crypto_authenc_extractkeys(&keys, key, keylen); 29562306a36Sopenharmony_ci if (unlikely(err)) 29662306a36Sopenharmony_ci return err; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?: 29962306a36Sopenharmony_ci aead_setkey(aead, key, keylen); 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 30262306a36Sopenharmony_ci return err; 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 30862306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 30962306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 31062306a36Sopenharmony_ci ctx->cdata.keylen; 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 31362306a36Sopenharmony_ci return 0; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci /* 31662306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 31762306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_GCM_ENC_LEN) { 32062306a36Sopenharmony_ci ctx->cdata.key_inline = true; 32162306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 32262306a36Sopenharmony_ci } else { 32362306a36Sopenharmony_ci ctx->cdata.key_inline = false; 32462306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 32562306a36Sopenharmony_ci } 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci cnstr_shdsc_gcm_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize, 32862306a36Sopenharmony_ci ctx->authsize, true); 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci /* 33162306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 33262306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 33362306a36Sopenharmony_ci */ 33462306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_GCM_DEC_LEN) { 33562306a36Sopenharmony_ci ctx->cdata.key_inline = true; 33662306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 33762306a36Sopenharmony_ci } else { 33862306a36Sopenharmony_ci ctx->cdata.key_inline = false; 33962306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 34062306a36Sopenharmony_ci } 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci cnstr_shdsc_gcm_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize, 34362306a36Sopenharmony_ci ctx->authsize, true); 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci return 0; 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 34962306a36Sopenharmony_ci{ 35062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 35162306a36Sopenharmony_ci int err; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci err = crypto_gcm_check_authsize(authsize); 35462306a36Sopenharmony_ci if (err) 35562306a36Sopenharmony_ci return err; 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci ctx->authsize = authsize; 35862306a36Sopenharmony_ci gcm_set_sh_desc(authenc); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci return 0; 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead, 36462306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 36762306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 36862306a36Sopenharmony_ci int ret; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci ret = aes_check_keylen(keylen); 37162306a36Sopenharmony_ci if (ret) 37262306a36Sopenharmony_ci return ret; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 37562306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 37862306a36Sopenharmony_ci dma_sync_single_for_device(jrdev->parent, ctx->key_dma, keylen, 37962306a36Sopenharmony_ci ctx->dir); 38062306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci ret = gcm_set_sh_desc(aead); 38362306a36Sopenharmony_ci if (ret) 38462306a36Sopenharmony_ci return ret; 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 38762306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 38862306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 38962306a36Sopenharmony_ci ctx->sh_desc_enc); 39062306a36Sopenharmony_ci if (ret) { 39162306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 39262306a36Sopenharmony_ci return ret; 39362306a36Sopenharmony_ci } 39462306a36Sopenharmony_ci } 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 39762306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 39862306a36Sopenharmony_ci ctx->sh_desc_dec); 39962306a36Sopenharmony_ci if (ret) { 40062306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 40162306a36Sopenharmony_ci return ret; 40262306a36Sopenharmony_ci } 40362306a36Sopenharmony_ci } 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci return 0; 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 41162306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 41262306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 41362306a36Sopenharmony_ci ctx->cdata.keylen; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 41662306a36Sopenharmony_ci return 0; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci /* 42162306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 42262306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 42362306a36Sopenharmony_ci */ 42462306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4106_ENC_LEN) { 42562306a36Sopenharmony_ci ctx->cdata.key_inline = true; 42662306a36Sopenharmony_ci } else { 42762306a36Sopenharmony_ci ctx->cdata.key_inline = false; 42862306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 42962306a36Sopenharmony_ci } 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci cnstr_shdsc_rfc4106_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize, 43262306a36Sopenharmony_ci ctx->authsize, true); 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci /* 43562306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 43662306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 43762306a36Sopenharmony_ci */ 43862306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4106_DEC_LEN) { 43962306a36Sopenharmony_ci ctx->cdata.key_inline = true; 44062306a36Sopenharmony_ci } else { 44162306a36Sopenharmony_ci ctx->cdata.key_inline = false; 44262306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 44362306a36Sopenharmony_ci } 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci cnstr_shdsc_rfc4106_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize, 44662306a36Sopenharmony_ci ctx->authsize, true); 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci return 0; 44962306a36Sopenharmony_ci} 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc, 45262306a36Sopenharmony_ci unsigned int authsize) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 45562306a36Sopenharmony_ci int err; 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci err = crypto_rfc4106_check_authsize(authsize); 45862306a36Sopenharmony_ci if (err) 45962306a36Sopenharmony_ci return err; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ci ctx->authsize = authsize; 46262306a36Sopenharmony_ci rfc4106_set_sh_desc(authenc); 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci return 0; 46562306a36Sopenharmony_ci} 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead, 46862306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 47162306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 47262306a36Sopenharmony_ci int ret; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci ret = aes_check_keylen(keylen - 4); 47562306a36Sopenharmony_ci if (ret) 47662306a36Sopenharmony_ci return ret; 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 47962306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 48262306a36Sopenharmony_ci /* 48362306a36Sopenharmony_ci * The last four bytes of the key material are used as the salt value 48462306a36Sopenharmony_ci * in the nonce. Update the AES key length. 48562306a36Sopenharmony_ci */ 48662306a36Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 48762306a36Sopenharmony_ci dma_sync_single_for_device(jrdev->parent, ctx->key_dma, 48862306a36Sopenharmony_ci ctx->cdata.keylen, ctx->dir); 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci ret = rfc4106_set_sh_desc(aead); 49162306a36Sopenharmony_ci if (ret) 49262306a36Sopenharmony_ci return ret; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 49562306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 49662306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 49762306a36Sopenharmony_ci ctx->sh_desc_enc); 49862306a36Sopenharmony_ci if (ret) { 49962306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 50062306a36Sopenharmony_ci return ret; 50162306a36Sopenharmony_ci } 50262306a36Sopenharmony_ci } 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 50562306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 50662306a36Sopenharmony_ci ctx->sh_desc_dec); 50762306a36Sopenharmony_ci if (ret) { 50862306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 50962306a36Sopenharmony_ci return ret; 51062306a36Sopenharmony_ci } 51162306a36Sopenharmony_ci } 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci return 0; 51462306a36Sopenharmony_ci} 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead) 51762306a36Sopenharmony_ci{ 51862306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 51962306a36Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 52062306a36Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN - 52162306a36Sopenharmony_ci ctx->cdata.keylen; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 52462306a36Sopenharmony_ci return 0; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci /* 52962306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 53062306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 53162306a36Sopenharmony_ci */ 53262306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4543_ENC_LEN) { 53362306a36Sopenharmony_ci ctx->cdata.key_inline = true; 53462306a36Sopenharmony_ci } else { 53562306a36Sopenharmony_ci ctx->cdata.key_inline = false; 53662306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 53762306a36Sopenharmony_ci } 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci cnstr_shdsc_rfc4543_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize, 54062306a36Sopenharmony_ci ctx->authsize, true); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci /* 54362306a36Sopenharmony_ci * Job Descriptor and Shared Descriptor 54462306a36Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 54562306a36Sopenharmony_ci */ 54662306a36Sopenharmony_ci if (rem_bytes >= DESC_QI_RFC4543_DEC_LEN) { 54762306a36Sopenharmony_ci ctx->cdata.key_inline = true; 54862306a36Sopenharmony_ci } else { 54962306a36Sopenharmony_ci ctx->cdata.key_inline = false; 55062306a36Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 55162306a36Sopenharmony_ci } 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci cnstr_shdsc_rfc4543_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize, 55462306a36Sopenharmony_ci ctx->authsize, true); 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci return 0; 55762306a36Sopenharmony_ci} 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc, 56062306a36Sopenharmony_ci unsigned int authsize) 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(authenc); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci if (authsize != 16) 56562306a36Sopenharmony_ci return -EINVAL; 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci ctx->authsize = authsize; 56862306a36Sopenharmony_ci rfc4543_set_sh_desc(authenc); 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_ci return 0; 57162306a36Sopenharmony_ci} 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead, 57462306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 57562306a36Sopenharmony_ci{ 57662306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 57762306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 57862306a36Sopenharmony_ci int ret; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci ret = aes_check_keylen(keylen - 4); 58162306a36Sopenharmony_ci if (ret) 58262306a36Sopenharmony_ci return ret; 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 58562306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci memcpy(ctx->key, key, keylen); 58862306a36Sopenharmony_ci /* 58962306a36Sopenharmony_ci * The last four bytes of the key material are used as the salt value 59062306a36Sopenharmony_ci * in the nonce. Update the AES key length. 59162306a36Sopenharmony_ci */ 59262306a36Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 59362306a36Sopenharmony_ci dma_sync_single_for_device(jrdev->parent, ctx->key_dma, 59462306a36Sopenharmony_ci ctx->cdata.keylen, ctx->dir); 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci ret = rfc4543_set_sh_desc(aead); 59762306a36Sopenharmony_ci if (ret) 59862306a36Sopenharmony_ci return ret; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 60162306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 60262306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 60362306a36Sopenharmony_ci ctx->sh_desc_enc); 60462306a36Sopenharmony_ci if (ret) { 60562306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 60662306a36Sopenharmony_ci return ret; 60762306a36Sopenharmony_ci } 60862306a36Sopenharmony_ci } 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 61162306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 61262306a36Sopenharmony_ci ctx->sh_desc_dec); 61362306a36Sopenharmony_ci if (ret) { 61462306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 61562306a36Sopenharmony_ci return ret; 61662306a36Sopenharmony_ci } 61762306a36Sopenharmony_ci } 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci return 0; 62062306a36Sopenharmony_ci} 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 62362306a36Sopenharmony_ci unsigned int keylen, const u32 ctx1_iv_off) 62462306a36Sopenharmony_ci{ 62562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 62662306a36Sopenharmony_ci struct caam_skcipher_alg *alg = 62762306a36Sopenharmony_ci container_of(crypto_skcipher_alg(skcipher), typeof(*alg), 62862306a36Sopenharmony_ci skcipher); 62962306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 63062306a36Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 63162306a36Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 63262306a36Sopenharmony_ci int ret = 0; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci print_hex_dump_debug("key in @" __stringify(__LINE__)": ", 63562306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 63862306a36Sopenharmony_ci ctx->cdata.key_virt = key; 63962306a36Sopenharmony_ci ctx->cdata.key_inline = true; 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ci /* skcipher encrypt, decrypt shared descriptors */ 64262306a36Sopenharmony_ci cnstr_shdsc_skcipher_encap(ctx->sh_desc_enc, &ctx->cdata, ivsize, 64362306a36Sopenharmony_ci is_rfc3686, ctx1_iv_off); 64462306a36Sopenharmony_ci cnstr_shdsc_skcipher_decap(ctx->sh_desc_dec, &ctx->cdata, ivsize, 64562306a36Sopenharmony_ci is_rfc3686, ctx1_iv_off); 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 64862306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 64962306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 65062306a36Sopenharmony_ci ctx->sh_desc_enc); 65162306a36Sopenharmony_ci if (ret) { 65262306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 65362306a36Sopenharmony_ci return -EINVAL; 65462306a36Sopenharmony_ci } 65562306a36Sopenharmony_ci } 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 65862306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 65962306a36Sopenharmony_ci ctx->sh_desc_dec); 66062306a36Sopenharmony_ci if (ret) { 66162306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 66262306a36Sopenharmony_ci return -EINVAL; 66362306a36Sopenharmony_ci } 66462306a36Sopenharmony_ci } 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ci return ret; 66762306a36Sopenharmony_ci} 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher, 67062306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 67162306a36Sopenharmony_ci{ 67262306a36Sopenharmony_ci int err; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci err = aes_check_keylen(keylen); 67562306a36Sopenharmony_ci if (err) 67662306a36Sopenharmony_ci return err; 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, 0); 67962306a36Sopenharmony_ci} 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher, 68262306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 68362306a36Sopenharmony_ci{ 68462306a36Sopenharmony_ci u32 ctx1_iv_off; 68562306a36Sopenharmony_ci int err; 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_ci /* 68862306a36Sopenharmony_ci * RFC3686 specific: 68962306a36Sopenharmony_ci * | CONTEXT1[255:128] = {NONCE, IV, COUNTER} 69062306a36Sopenharmony_ci * | *key = {KEY, NONCE} 69162306a36Sopenharmony_ci */ 69262306a36Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 69362306a36Sopenharmony_ci keylen -= CTR_RFC3686_NONCE_SIZE; 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci err = aes_check_keylen(keylen); 69662306a36Sopenharmony_ci if (err) 69762306a36Sopenharmony_ci return err; 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 70062306a36Sopenharmony_ci} 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher, 70362306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 70462306a36Sopenharmony_ci{ 70562306a36Sopenharmony_ci u32 ctx1_iv_off; 70662306a36Sopenharmony_ci int err; 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci /* 70962306a36Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 71062306a36Sopenharmony_ci * at an offset of 128bits (16bytes) 71162306a36Sopenharmony_ci * CONTEXT1[255:128] = IV 71262306a36Sopenharmony_ci */ 71362306a36Sopenharmony_ci ctx1_iv_off = 16; 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci err = aes_check_keylen(keylen); 71662306a36Sopenharmony_ci if (err) 71762306a36Sopenharmony_ci return err; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 72062306a36Sopenharmony_ci} 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher, 72362306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 72462306a36Sopenharmony_ci{ 72562306a36Sopenharmony_ci return verify_skcipher_des3_key(skcipher, key) ?: 72662306a36Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 72762306a36Sopenharmony_ci} 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher, 73062306a36Sopenharmony_ci const u8 *key, unsigned int keylen) 73162306a36Sopenharmony_ci{ 73262306a36Sopenharmony_ci return verify_skcipher_des_key(skcipher, key) ?: 73362306a36Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 73462306a36Sopenharmony_ci} 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 73762306a36Sopenharmony_ci unsigned int keylen) 73862306a36Sopenharmony_ci{ 73962306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 74062306a36Sopenharmony_ci struct device *jrdev = ctx->jrdev; 74162306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 74262306a36Sopenharmony_ci int ret = 0; 74362306a36Sopenharmony_ci int err; 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci err = xts_verify_key(skcipher, key, keylen); 74662306a36Sopenharmony_ci if (err) { 74762306a36Sopenharmony_ci dev_dbg(jrdev, "key size mismatch\n"); 74862306a36Sopenharmony_ci return err; 74962306a36Sopenharmony_ci } 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256) 75262306a36Sopenharmony_ci ctx->xts_key_fallback = true; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) { 75562306a36Sopenharmony_ci err = crypto_skcipher_setkey(ctx->fallback, key, keylen); 75662306a36Sopenharmony_ci if (err) 75762306a36Sopenharmony_ci return err; 75862306a36Sopenharmony_ci } 75962306a36Sopenharmony_ci 76062306a36Sopenharmony_ci ctx->cdata.keylen = keylen; 76162306a36Sopenharmony_ci ctx->cdata.key_virt = key; 76262306a36Sopenharmony_ci ctx->cdata.key_inline = true; 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci /* xts skcipher encrypt, decrypt shared descriptors */ 76562306a36Sopenharmony_ci cnstr_shdsc_xts_skcipher_encap(ctx->sh_desc_enc, &ctx->cdata); 76662306a36Sopenharmony_ci cnstr_shdsc_xts_skcipher_decap(ctx->sh_desc_dec, &ctx->cdata); 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci /* Now update the driver contexts with the new shared descriptor */ 76962306a36Sopenharmony_ci if (ctx->drv_ctx[ENCRYPT]) { 77062306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[ENCRYPT], 77162306a36Sopenharmony_ci ctx->sh_desc_enc); 77262306a36Sopenharmony_ci if (ret) { 77362306a36Sopenharmony_ci dev_err(jrdev, "driver enc context update failed\n"); 77462306a36Sopenharmony_ci return -EINVAL; 77562306a36Sopenharmony_ci } 77662306a36Sopenharmony_ci } 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci if (ctx->drv_ctx[DECRYPT]) { 77962306a36Sopenharmony_ci ret = caam_drv_ctx_update(ctx->drv_ctx[DECRYPT], 78062306a36Sopenharmony_ci ctx->sh_desc_dec); 78162306a36Sopenharmony_ci if (ret) { 78262306a36Sopenharmony_ci dev_err(jrdev, "driver dec context update failed\n"); 78362306a36Sopenharmony_ci return -EINVAL; 78462306a36Sopenharmony_ci } 78562306a36Sopenharmony_ci } 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci return ret; 78862306a36Sopenharmony_ci} 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci/* 79162306a36Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor 79262306a36Sopenharmony_ci * @src_nents: number of segments in input scatterlist 79362306a36Sopenharmony_ci * @dst_nents: number of segments in output scatterlist 79462306a36Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 79562306a36Sopenharmony_ci * @qm_sg_bytes: length of dma mapped h/w link table 79662306a36Sopenharmony_ci * @qm_sg_dma: bus physical mapped address of h/w link table 79762306a36Sopenharmony_ci * @assoclen: associated data length, in CAAM endianness 79862306a36Sopenharmony_ci * @assoclen_dma: bus physical mapped address of req->assoclen 79962306a36Sopenharmony_ci * @drv_req: driver-specific request structure 80062306a36Sopenharmony_ci * @sgt: the h/w link table, followed by IV 80162306a36Sopenharmony_ci */ 80262306a36Sopenharmony_cistruct aead_edesc { 80362306a36Sopenharmony_ci int src_nents; 80462306a36Sopenharmony_ci int dst_nents; 80562306a36Sopenharmony_ci dma_addr_t iv_dma; 80662306a36Sopenharmony_ci int qm_sg_bytes; 80762306a36Sopenharmony_ci dma_addr_t qm_sg_dma; 80862306a36Sopenharmony_ci unsigned int assoclen; 80962306a36Sopenharmony_ci dma_addr_t assoclen_dma; 81062306a36Sopenharmony_ci struct caam_drv_req drv_req; 81162306a36Sopenharmony_ci struct qm_sg_entry sgt[]; 81262306a36Sopenharmony_ci}; 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci/* 81562306a36Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor 81662306a36Sopenharmony_ci * @src_nents: number of segments in input scatterlist 81762306a36Sopenharmony_ci * @dst_nents: number of segments in output scatterlist 81862306a36Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 81962306a36Sopenharmony_ci * @qm_sg_bytes: length of dma mapped h/w link table 82062306a36Sopenharmony_ci * @qm_sg_dma: bus physical mapped address of h/w link table 82162306a36Sopenharmony_ci * @drv_req: driver-specific request structure 82262306a36Sopenharmony_ci * @sgt: the h/w link table, followed by IV 82362306a36Sopenharmony_ci */ 82462306a36Sopenharmony_cistruct skcipher_edesc { 82562306a36Sopenharmony_ci int src_nents; 82662306a36Sopenharmony_ci int dst_nents; 82762306a36Sopenharmony_ci dma_addr_t iv_dma; 82862306a36Sopenharmony_ci int qm_sg_bytes; 82962306a36Sopenharmony_ci dma_addr_t qm_sg_dma; 83062306a36Sopenharmony_ci struct caam_drv_req drv_req; 83162306a36Sopenharmony_ci struct qm_sg_entry sgt[]; 83262306a36Sopenharmony_ci}; 83362306a36Sopenharmony_ci 83462306a36Sopenharmony_cistatic struct caam_drv_ctx *get_drv_ctx(struct caam_ctx *ctx, 83562306a36Sopenharmony_ci enum optype type) 83662306a36Sopenharmony_ci{ 83762306a36Sopenharmony_ci /* 83862306a36Sopenharmony_ci * This function is called on the fast path with values of 'type' 83962306a36Sopenharmony_ci * known at compile time. Invalid arguments are not expected and 84062306a36Sopenharmony_ci * thus no checks are made. 84162306a36Sopenharmony_ci */ 84262306a36Sopenharmony_ci struct caam_drv_ctx *drv_ctx = ctx->drv_ctx[type]; 84362306a36Sopenharmony_ci u32 *desc; 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci if (unlikely(!drv_ctx)) { 84662306a36Sopenharmony_ci spin_lock(&ctx->lock); 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci /* Read again to check if some other core init drv_ctx */ 84962306a36Sopenharmony_ci drv_ctx = ctx->drv_ctx[type]; 85062306a36Sopenharmony_ci if (!drv_ctx) { 85162306a36Sopenharmony_ci int cpu; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci if (type == ENCRYPT) 85462306a36Sopenharmony_ci desc = ctx->sh_desc_enc; 85562306a36Sopenharmony_ci else /* (type == DECRYPT) */ 85662306a36Sopenharmony_ci desc = ctx->sh_desc_dec; 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_ci cpu = smp_processor_id(); 85962306a36Sopenharmony_ci drv_ctx = caam_drv_ctx_init(ctx->qidev, &cpu, desc); 86062306a36Sopenharmony_ci if (!IS_ERR(drv_ctx)) 86162306a36Sopenharmony_ci drv_ctx->op_type = type; 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci ctx->drv_ctx[type] = drv_ctx; 86462306a36Sopenharmony_ci } 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ci spin_unlock(&ctx->lock); 86762306a36Sopenharmony_ci } 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_ci return drv_ctx; 87062306a36Sopenharmony_ci} 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src, 87362306a36Sopenharmony_ci struct scatterlist *dst, int src_nents, 87462306a36Sopenharmony_ci int dst_nents, dma_addr_t iv_dma, int ivsize, 87562306a36Sopenharmony_ci enum dma_data_direction iv_dir, dma_addr_t qm_sg_dma, 87662306a36Sopenharmony_ci int qm_sg_bytes) 87762306a36Sopenharmony_ci{ 87862306a36Sopenharmony_ci if (dst != src) { 87962306a36Sopenharmony_ci if (src_nents) 88062306a36Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE); 88162306a36Sopenharmony_ci if (dst_nents) 88262306a36Sopenharmony_ci dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE); 88362306a36Sopenharmony_ci } else { 88462306a36Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL); 88562306a36Sopenharmony_ci } 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci if (iv_dma) 88862306a36Sopenharmony_ci dma_unmap_single(dev, iv_dma, ivsize, iv_dir); 88962306a36Sopenharmony_ci if (qm_sg_bytes) 89062306a36Sopenharmony_ci dma_unmap_single(dev, qm_sg_dma, qm_sg_bytes, DMA_TO_DEVICE); 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic void aead_unmap(struct device *dev, 89462306a36Sopenharmony_ci struct aead_edesc *edesc, 89562306a36Sopenharmony_ci struct aead_request *req) 89662306a36Sopenharmony_ci{ 89762306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 89862306a36Sopenharmony_ci int ivsize = crypto_aead_ivsize(aead); 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents, 90162306a36Sopenharmony_ci edesc->iv_dma, ivsize, DMA_TO_DEVICE, edesc->qm_sg_dma, 90262306a36Sopenharmony_ci edesc->qm_sg_bytes); 90362306a36Sopenharmony_ci dma_unmap_single(dev, edesc->assoclen_dma, 4, DMA_TO_DEVICE); 90462306a36Sopenharmony_ci} 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc, 90762306a36Sopenharmony_ci struct skcipher_request *req) 90862306a36Sopenharmony_ci{ 90962306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 91062306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 91162306a36Sopenharmony_ci 91262306a36Sopenharmony_ci caam_unmap(dev, req->src, req->dst, edesc->src_nents, edesc->dst_nents, 91362306a36Sopenharmony_ci edesc->iv_dma, ivsize, DMA_BIDIRECTIONAL, edesc->qm_sg_dma, 91462306a36Sopenharmony_ci edesc->qm_sg_bytes); 91562306a36Sopenharmony_ci} 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_cistatic void aead_done(struct caam_drv_req *drv_req, u32 status) 91862306a36Sopenharmony_ci{ 91962306a36Sopenharmony_ci struct device *qidev; 92062306a36Sopenharmony_ci struct aead_edesc *edesc; 92162306a36Sopenharmony_ci struct aead_request *aead_req = drv_req->app_ctx; 92262306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(aead_req); 92362306a36Sopenharmony_ci struct caam_ctx *caam_ctx = crypto_aead_ctx_dma(aead); 92462306a36Sopenharmony_ci int ecode = 0; 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci qidev = caam_ctx->qidev; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci if (unlikely(status)) 92962306a36Sopenharmony_ci ecode = caam_jr_strstatus(qidev, status); 93062306a36Sopenharmony_ci 93162306a36Sopenharmony_ci edesc = container_of(drv_req, typeof(*edesc), drv_req); 93262306a36Sopenharmony_ci aead_unmap(qidev, edesc, aead_req); 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci aead_request_complete(aead_req, ecode); 93562306a36Sopenharmony_ci qi_cache_free(edesc); 93662306a36Sopenharmony_ci} 93762306a36Sopenharmony_ci 93862306a36Sopenharmony_ci/* 93962306a36Sopenharmony_ci * allocate and map the aead extended descriptor 94062306a36Sopenharmony_ci */ 94162306a36Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req, 94262306a36Sopenharmony_ci bool encrypt) 94362306a36Sopenharmony_ci{ 94462306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 94562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 94662306a36Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 94762306a36Sopenharmony_ci typeof(*alg), aead); 94862306a36Sopenharmony_ci struct device *qidev = ctx->qidev; 94962306a36Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 95062306a36Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 95162306a36Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 95262306a36Sopenharmony_ci int src_len, dst_len = 0; 95362306a36Sopenharmony_ci struct aead_edesc *edesc; 95462306a36Sopenharmony_ci dma_addr_t qm_sg_dma, iv_dma = 0; 95562306a36Sopenharmony_ci int ivsize = 0; 95662306a36Sopenharmony_ci unsigned int authsize = ctx->authsize; 95762306a36Sopenharmony_ci int qm_sg_index = 0, qm_sg_ents = 0, qm_sg_bytes; 95862306a36Sopenharmony_ci int in_len, out_len; 95962306a36Sopenharmony_ci struct qm_sg_entry *sg_table, *fd_sgt; 96062306a36Sopenharmony_ci struct caam_drv_ctx *drv_ctx; 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci drv_ctx = get_drv_ctx(ctx, encrypt ? ENCRYPT : DECRYPT); 96362306a36Sopenharmony_ci if (IS_ERR(drv_ctx)) 96462306a36Sopenharmony_ci return (struct aead_edesc *)drv_ctx; 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_ci /* allocate space for base edesc and hw desc commands, link tables */ 96762306a36Sopenharmony_ci edesc = qi_cache_alloc(flags); 96862306a36Sopenharmony_ci if (unlikely(!edesc)) { 96962306a36Sopenharmony_ci dev_err(qidev, "could not allocate extended descriptor\n"); 97062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 97162306a36Sopenharmony_ci } 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci if (likely(req->src == req->dst)) { 97462306a36Sopenharmony_ci src_len = req->assoclen + req->cryptlen + 97562306a36Sopenharmony_ci (encrypt ? authsize : 0); 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 97862306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 97962306a36Sopenharmony_ci dev_err(qidev, "Insufficient bytes (%d) in src S/G\n", 98062306a36Sopenharmony_ci src_len); 98162306a36Sopenharmony_ci qi_cache_free(edesc); 98262306a36Sopenharmony_ci return ERR_PTR(src_nents); 98362306a36Sopenharmony_ci } 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(qidev, req->src, src_nents, 98662306a36Sopenharmony_ci DMA_BIDIRECTIONAL); 98762306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 98862306a36Sopenharmony_ci dev_err(qidev, "unable to map source\n"); 98962306a36Sopenharmony_ci qi_cache_free(edesc); 99062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 99162306a36Sopenharmony_ci } 99262306a36Sopenharmony_ci } else { 99362306a36Sopenharmony_ci src_len = req->assoclen + req->cryptlen; 99462306a36Sopenharmony_ci dst_len = src_len + (encrypt ? authsize : (-authsize)); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 99762306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 99862306a36Sopenharmony_ci dev_err(qidev, "Insufficient bytes (%d) in src S/G\n", 99962306a36Sopenharmony_ci src_len); 100062306a36Sopenharmony_ci qi_cache_free(edesc); 100162306a36Sopenharmony_ci return ERR_PTR(src_nents); 100262306a36Sopenharmony_ci } 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, dst_len); 100562306a36Sopenharmony_ci if (unlikely(dst_nents < 0)) { 100662306a36Sopenharmony_ci dev_err(qidev, "Insufficient bytes (%d) in dst S/G\n", 100762306a36Sopenharmony_ci dst_len); 100862306a36Sopenharmony_ci qi_cache_free(edesc); 100962306a36Sopenharmony_ci return ERR_PTR(dst_nents); 101062306a36Sopenharmony_ci } 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_ci if (src_nents) { 101362306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(qidev, req->src, 101462306a36Sopenharmony_ci src_nents, DMA_TO_DEVICE); 101562306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 101662306a36Sopenharmony_ci dev_err(qidev, "unable to map source\n"); 101762306a36Sopenharmony_ci qi_cache_free(edesc); 101862306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 101962306a36Sopenharmony_ci } 102062306a36Sopenharmony_ci } else { 102162306a36Sopenharmony_ci mapped_src_nents = 0; 102262306a36Sopenharmony_ci } 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_ci if (dst_nents) { 102562306a36Sopenharmony_ci mapped_dst_nents = dma_map_sg(qidev, req->dst, 102662306a36Sopenharmony_ci dst_nents, 102762306a36Sopenharmony_ci DMA_FROM_DEVICE); 102862306a36Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 102962306a36Sopenharmony_ci dev_err(qidev, "unable to map destination\n"); 103062306a36Sopenharmony_ci dma_unmap_sg(qidev, req->src, src_nents, 103162306a36Sopenharmony_ci DMA_TO_DEVICE); 103262306a36Sopenharmony_ci qi_cache_free(edesc); 103362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 103462306a36Sopenharmony_ci } 103562306a36Sopenharmony_ci } else { 103662306a36Sopenharmony_ci mapped_dst_nents = 0; 103762306a36Sopenharmony_ci } 103862306a36Sopenharmony_ci } 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci if ((alg->caam.rfc3686 && encrypt) || !alg->caam.geniv) 104162306a36Sopenharmony_ci ivsize = crypto_aead_ivsize(aead); 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci /* 104462306a36Sopenharmony_ci * Create S/G table: req->assoclen, [IV,] req->src [, req->dst]. 104562306a36Sopenharmony_ci * Input is not contiguous. 104662306a36Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 104762306a36Sopenharmony_ci * the end of the table by allocating more S/G entries. Logic: 104862306a36Sopenharmony_ci * if (src != dst && output S/G) 104962306a36Sopenharmony_ci * pad output S/G, if needed 105062306a36Sopenharmony_ci * else if (src == dst && S/G) 105162306a36Sopenharmony_ci * overlapping S/Gs; pad one of them 105262306a36Sopenharmony_ci * else if (input S/G) ... 105362306a36Sopenharmony_ci * pad input S/G, if needed 105462306a36Sopenharmony_ci */ 105562306a36Sopenharmony_ci qm_sg_ents = 1 + !!ivsize + mapped_src_nents; 105662306a36Sopenharmony_ci if (mapped_dst_nents > 1) 105762306a36Sopenharmony_ci qm_sg_ents += pad_sg_nents(mapped_dst_nents); 105862306a36Sopenharmony_ci else if ((req->src == req->dst) && (mapped_src_nents > 1)) 105962306a36Sopenharmony_ci qm_sg_ents = max(pad_sg_nents(qm_sg_ents), 106062306a36Sopenharmony_ci 1 + !!ivsize + pad_sg_nents(mapped_src_nents)); 106162306a36Sopenharmony_ci else 106262306a36Sopenharmony_ci qm_sg_ents = pad_sg_nents(qm_sg_ents); 106362306a36Sopenharmony_ci 106462306a36Sopenharmony_ci sg_table = &edesc->sgt[0]; 106562306a36Sopenharmony_ci qm_sg_bytes = qm_sg_ents * sizeof(*sg_table); 106662306a36Sopenharmony_ci if (unlikely(offsetof(struct aead_edesc, sgt) + qm_sg_bytes + ivsize > 106762306a36Sopenharmony_ci CAAM_QI_MEMCACHE_SIZE)) { 106862306a36Sopenharmony_ci dev_err(qidev, "No space for %d S/G entries and/or %dB IV\n", 106962306a36Sopenharmony_ci qm_sg_ents, ivsize); 107062306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0, 107162306a36Sopenharmony_ci 0, DMA_NONE, 0, 0); 107262306a36Sopenharmony_ci qi_cache_free(edesc); 107362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 107462306a36Sopenharmony_ci } 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ci if (ivsize) { 107762306a36Sopenharmony_ci u8 *iv = (u8 *)(sg_table + qm_sg_ents); 107862306a36Sopenharmony_ci 107962306a36Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 108062306a36Sopenharmony_ci memcpy(iv, req->iv, ivsize); 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci iv_dma = dma_map_single(qidev, iv, ivsize, DMA_TO_DEVICE); 108362306a36Sopenharmony_ci if (dma_mapping_error(qidev, iv_dma)) { 108462306a36Sopenharmony_ci dev_err(qidev, "unable to map IV\n"); 108562306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, 108662306a36Sopenharmony_ci dst_nents, 0, 0, DMA_NONE, 0, 0); 108762306a36Sopenharmony_ci qi_cache_free(edesc); 108862306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 108962306a36Sopenharmony_ci } 109062306a36Sopenharmony_ci } 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_ci edesc->src_nents = src_nents; 109362306a36Sopenharmony_ci edesc->dst_nents = dst_nents; 109462306a36Sopenharmony_ci edesc->iv_dma = iv_dma; 109562306a36Sopenharmony_ci edesc->drv_req.app_ctx = req; 109662306a36Sopenharmony_ci edesc->drv_req.cbk = aead_done; 109762306a36Sopenharmony_ci edesc->drv_req.drv_ctx = drv_ctx; 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci edesc->assoclen = cpu_to_caam32(req->assoclen); 110062306a36Sopenharmony_ci edesc->assoclen_dma = dma_map_single(qidev, &edesc->assoclen, 4, 110162306a36Sopenharmony_ci DMA_TO_DEVICE); 110262306a36Sopenharmony_ci if (dma_mapping_error(qidev, edesc->assoclen_dma)) { 110362306a36Sopenharmony_ci dev_err(qidev, "unable to map assoclen\n"); 110462306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 110562306a36Sopenharmony_ci iv_dma, ivsize, DMA_TO_DEVICE, 0, 0); 110662306a36Sopenharmony_ci qi_cache_free(edesc); 110762306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 110862306a36Sopenharmony_ci } 110962306a36Sopenharmony_ci 111062306a36Sopenharmony_ci dma_to_qm_sg_one(sg_table, edesc->assoclen_dma, 4, 0); 111162306a36Sopenharmony_ci qm_sg_index++; 111262306a36Sopenharmony_ci if (ivsize) { 111362306a36Sopenharmony_ci dma_to_qm_sg_one(sg_table + qm_sg_index, iv_dma, ivsize, 0); 111462306a36Sopenharmony_ci qm_sg_index++; 111562306a36Sopenharmony_ci } 111662306a36Sopenharmony_ci sg_to_qm_sg_last(req->src, src_len, sg_table + qm_sg_index, 0); 111762306a36Sopenharmony_ci qm_sg_index += mapped_src_nents; 111862306a36Sopenharmony_ci 111962306a36Sopenharmony_ci if (mapped_dst_nents > 1) 112062306a36Sopenharmony_ci sg_to_qm_sg_last(req->dst, dst_len, sg_table + qm_sg_index, 0); 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci qm_sg_dma = dma_map_single(qidev, sg_table, qm_sg_bytes, DMA_TO_DEVICE); 112362306a36Sopenharmony_ci if (dma_mapping_error(qidev, qm_sg_dma)) { 112462306a36Sopenharmony_ci dev_err(qidev, "unable to map S/G table\n"); 112562306a36Sopenharmony_ci dma_unmap_single(qidev, edesc->assoclen_dma, 4, DMA_TO_DEVICE); 112662306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 112762306a36Sopenharmony_ci iv_dma, ivsize, DMA_TO_DEVICE, 0, 0); 112862306a36Sopenharmony_ci qi_cache_free(edesc); 112962306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 113062306a36Sopenharmony_ci } 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_ci edesc->qm_sg_dma = qm_sg_dma; 113362306a36Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci out_len = req->assoclen + req->cryptlen + 113662306a36Sopenharmony_ci (encrypt ? ctx->authsize : (-ctx->authsize)); 113762306a36Sopenharmony_ci in_len = 4 + ivsize + req->assoclen + req->cryptlen; 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci fd_sgt = &edesc->drv_req.fd_sgt[0]; 114062306a36Sopenharmony_ci dma_to_qm_sg_one_last_ext(&fd_sgt[1], qm_sg_dma, in_len, 0); 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_ci if (req->dst == req->src) { 114362306a36Sopenharmony_ci if (mapped_src_nents == 1) 114462306a36Sopenharmony_ci dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->src), 114562306a36Sopenharmony_ci out_len, 0); 114662306a36Sopenharmony_ci else 114762306a36Sopenharmony_ci dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma + 114862306a36Sopenharmony_ci (1 + !!ivsize) * sizeof(*sg_table), 114962306a36Sopenharmony_ci out_len, 0); 115062306a36Sopenharmony_ci } else if (mapped_dst_nents <= 1) { 115162306a36Sopenharmony_ci dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->dst), out_len, 115262306a36Sopenharmony_ci 0); 115362306a36Sopenharmony_ci } else { 115462306a36Sopenharmony_ci dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma + sizeof(*sg_table) * 115562306a36Sopenharmony_ci qm_sg_index, out_len, 0); 115662306a36Sopenharmony_ci } 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_ci return edesc; 115962306a36Sopenharmony_ci} 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_cistatic inline int aead_crypt(struct aead_request *req, bool encrypt) 116262306a36Sopenharmony_ci{ 116362306a36Sopenharmony_ci struct aead_edesc *edesc; 116462306a36Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 116562306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(aead); 116662306a36Sopenharmony_ci int ret; 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci if (unlikely(caam_congested)) 116962306a36Sopenharmony_ci return -EAGAIN; 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_ci /* allocate extended descriptor */ 117262306a36Sopenharmony_ci edesc = aead_edesc_alloc(req, encrypt); 117362306a36Sopenharmony_ci if (IS_ERR(edesc)) 117462306a36Sopenharmony_ci return PTR_ERR(edesc); 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* Create and submit job descriptor */ 117762306a36Sopenharmony_ci ret = caam_qi_enqueue(ctx->qidev, &edesc->drv_req); 117862306a36Sopenharmony_ci if (!ret) { 117962306a36Sopenharmony_ci ret = -EINPROGRESS; 118062306a36Sopenharmony_ci } else { 118162306a36Sopenharmony_ci aead_unmap(ctx->qidev, edesc, req); 118262306a36Sopenharmony_ci qi_cache_free(edesc); 118362306a36Sopenharmony_ci } 118462306a36Sopenharmony_ci 118562306a36Sopenharmony_ci return ret; 118662306a36Sopenharmony_ci} 118762306a36Sopenharmony_ci 118862306a36Sopenharmony_cistatic int aead_encrypt(struct aead_request *req) 118962306a36Sopenharmony_ci{ 119062306a36Sopenharmony_ci return aead_crypt(req, true); 119162306a36Sopenharmony_ci} 119262306a36Sopenharmony_ci 119362306a36Sopenharmony_cistatic int aead_decrypt(struct aead_request *req) 119462306a36Sopenharmony_ci{ 119562306a36Sopenharmony_ci return aead_crypt(req, false); 119662306a36Sopenharmony_ci} 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req) 119962306a36Sopenharmony_ci{ 120062306a36Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req, 120162306a36Sopenharmony_ci true); 120262306a36Sopenharmony_ci} 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req) 120562306a36Sopenharmony_ci{ 120662306a36Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : aead_crypt(req, 120762306a36Sopenharmony_ci false); 120862306a36Sopenharmony_ci} 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_cistatic inline u8 *skcipher_edesc_iv(struct skcipher_edesc *edesc) 121162306a36Sopenharmony_ci{ 121262306a36Sopenharmony_ci return PTR_ALIGN((u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes, 121362306a36Sopenharmony_ci dma_get_cache_alignment()); 121462306a36Sopenharmony_ci} 121562306a36Sopenharmony_ci 121662306a36Sopenharmony_cistatic void skcipher_done(struct caam_drv_req *drv_req, u32 status) 121762306a36Sopenharmony_ci{ 121862306a36Sopenharmony_ci struct skcipher_edesc *edesc; 121962306a36Sopenharmony_ci struct skcipher_request *req = drv_req->app_ctx; 122062306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 122162306a36Sopenharmony_ci struct caam_ctx *caam_ctx = crypto_skcipher_ctx_dma(skcipher); 122262306a36Sopenharmony_ci struct device *qidev = caam_ctx->qidev; 122362306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 122462306a36Sopenharmony_ci int ecode = 0; 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci dev_dbg(qidev, "%s %d: status 0x%x\n", __func__, __LINE__, status); 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci edesc = container_of(drv_req, typeof(*edesc), drv_req); 122962306a36Sopenharmony_ci 123062306a36Sopenharmony_ci if (status) 123162306a36Sopenharmony_ci ecode = caam_jr_strstatus(qidev, status); 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ci print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ", 123462306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, 123562306a36Sopenharmony_ci edesc->src_nents > 1 ? 100 : ivsize, 1); 123662306a36Sopenharmony_ci caam_dump_sg("dst @" __stringify(__LINE__)": ", 123762306a36Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->dst, 123862306a36Sopenharmony_ci edesc->dst_nents > 1 ? 100 : req->cryptlen, 1); 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci skcipher_unmap(qidev, edesc, req); 124162306a36Sopenharmony_ci 124262306a36Sopenharmony_ci /* 124362306a36Sopenharmony_ci * The crypto API expects us to set the IV (req->iv) to the last 124462306a36Sopenharmony_ci * ciphertext block (CBC mode) or last counter (CTR mode). 124562306a36Sopenharmony_ci * This is used e.g. by the CTS mode. 124662306a36Sopenharmony_ci */ 124762306a36Sopenharmony_ci if (!ecode) 124862306a36Sopenharmony_ci memcpy(req->iv, skcipher_edesc_iv(edesc), ivsize); 124962306a36Sopenharmony_ci 125062306a36Sopenharmony_ci qi_cache_free(edesc); 125162306a36Sopenharmony_ci skcipher_request_complete(req, ecode); 125262306a36Sopenharmony_ci} 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req, 125562306a36Sopenharmony_ci bool encrypt) 125662306a36Sopenharmony_ci{ 125762306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 125862306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 125962306a36Sopenharmony_ci struct device *qidev = ctx->qidev; 126062306a36Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 126162306a36Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 126262306a36Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 126362306a36Sopenharmony_ci struct skcipher_edesc *edesc; 126462306a36Sopenharmony_ci dma_addr_t iv_dma; 126562306a36Sopenharmony_ci u8 *iv; 126662306a36Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 126762306a36Sopenharmony_ci int dst_sg_idx, qm_sg_ents, qm_sg_bytes; 126862306a36Sopenharmony_ci struct qm_sg_entry *sg_table, *fd_sgt; 126962306a36Sopenharmony_ci struct caam_drv_ctx *drv_ctx; 127062306a36Sopenharmony_ci unsigned int len; 127162306a36Sopenharmony_ci 127262306a36Sopenharmony_ci drv_ctx = get_drv_ctx(ctx, encrypt ? ENCRYPT : DECRYPT); 127362306a36Sopenharmony_ci if (IS_ERR(drv_ctx)) 127462306a36Sopenharmony_ci return (struct skcipher_edesc *)drv_ctx; 127562306a36Sopenharmony_ci 127662306a36Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->cryptlen); 127762306a36Sopenharmony_ci if (unlikely(src_nents < 0)) { 127862306a36Sopenharmony_ci dev_err(qidev, "Insufficient bytes (%d) in src S/G\n", 127962306a36Sopenharmony_ci req->cryptlen); 128062306a36Sopenharmony_ci return ERR_PTR(src_nents); 128162306a36Sopenharmony_ci } 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci if (unlikely(req->src != req->dst)) { 128462306a36Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, req->cryptlen); 128562306a36Sopenharmony_ci if (unlikely(dst_nents < 0)) { 128662306a36Sopenharmony_ci dev_err(qidev, "Insufficient bytes (%d) in dst S/G\n", 128762306a36Sopenharmony_ci req->cryptlen); 128862306a36Sopenharmony_ci return ERR_PTR(dst_nents); 128962306a36Sopenharmony_ci } 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(qidev, req->src, src_nents, 129262306a36Sopenharmony_ci DMA_TO_DEVICE); 129362306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 129462306a36Sopenharmony_ci dev_err(qidev, "unable to map source\n"); 129562306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 129662306a36Sopenharmony_ci } 129762306a36Sopenharmony_ci 129862306a36Sopenharmony_ci mapped_dst_nents = dma_map_sg(qidev, req->dst, dst_nents, 129962306a36Sopenharmony_ci DMA_FROM_DEVICE); 130062306a36Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 130162306a36Sopenharmony_ci dev_err(qidev, "unable to map destination\n"); 130262306a36Sopenharmony_ci dma_unmap_sg(qidev, req->src, src_nents, DMA_TO_DEVICE); 130362306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 130462306a36Sopenharmony_ci } 130562306a36Sopenharmony_ci } else { 130662306a36Sopenharmony_ci mapped_src_nents = dma_map_sg(qidev, req->src, src_nents, 130762306a36Sopenharmony_ci DMA_BIDIRECTIONAL); 130862306a36Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 130962306a36Sopenharmony_ci dev_err(qidev, "unable to map source\n"); 131062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 131162306a36Sopenharmony_ci } 131262306a36Sopenharmony_ci } 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_ci qm_sg_ents = 1 + mapped_src_nents; 131562306a36Sopenharmony_ci dst_sg_idx = qm_sg_ents; 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_ci /* 131862306a36Sopenharmony_ci * Input, output HW S/G tables: [IV, src][dst, IV] 131962306a36Sopenharmony_ci * IV entries point to the same buffer 132062306a36Sopenharmony_ci * If src == dst, S/G entries are reused (S/G tables overlap) 132162306a36Sopenharmony_ci * 132262306a36Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 132362306a36Sopenharmony_ci * the end of the table by allocating more S/G entries. 132462306a36Sopenharmony_ci */ 132562306a36Sopenharmony_ci if (req->src != req->dst) 132662306a36Sopenharmony_ci qm_sg_ents += pad_sg_nents(mapped_dst_nents + 1); 132762306a36Sopenharmony_ci else 132862306a36Sopenharmony_ci qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents); 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci qm_sg_bytes = qm_sg_ents * sizeof(struct qm_sg_entry); 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci len = offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes; 133362306a36Sopenharmony_ci len = ALIGN(len, dma_get_cache_alignment()); 133462306a36Sopenharmony_ci len += ivsize; 133562306a36Sopenharmony_ci 133662306a36Sopenharmony_ci if (unlikely(len > CAAM_QI_MEMCACHE_SIZE)) { 133762306a36Sopenharmony_ci dev_err(qidev, "No space for %d S/G entries and/or %dB IV\n", 133862306a36Sopenharmony_ci qm_sg_ents, ivsize); 133962306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0, 134062306a36Sopenharmony_ci 0, DMA_NONE, 0, 0); 134162306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 134262306a36Sopenharmony_ci } 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci /* allocate space for base edesc, link tables and IV */ 134562306a36Sopenharmony_ci edesc = qi_cache_alloc(flags); 134662306a36Sopenharmony_ci if (unlikely(!edesc)) { 134762306a36Sopenharmony_ci dev_err(qidev, "could not allocate extended descriptor\n"); 134862306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0, 134962306a36Sopenharmony_ci 0, DMA_NONE, 0, 0); 135062306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 135162306a36Sopenharmony_ci } 135262306a36Sopenharmony_ci 135362306a36Sopenharmony_ci edesc->src_nents = src_nents; 135462306a36Sopenharmony_ci edesc->dst_nents = dst_nents; 135562306a36Sopenharmony_ci edesc->qm_sg_bytes = qm_sg_bytes; 135662306a36Sopenharmony_ci edesc->drv_req.app_ctx = req; 135762306a36Sopenharmony_ci edesc->drv_req.cbk = skcipher_done; 135862306a36Sopenharmony_ci edesc->drv_req.drv_ctx = drv_ctx; 135962306a36Sopenharmony_ci 136062306a36Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 136162306a36Sopenharmony_ci sg_table = &edesc->sgt[0]; 136262306a36Sopenharmony_ci iv = skcipher_edesc_iv(edesc); 136362306a36Sopenharmony_ci memcpy(iv, req->iv, ivsize); 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci iv_dma = dma_map_single(qidev, iv, ivsize, DMA_BIDIRECTIONAL); 136662306a36Sopenharmony_ci if (dma_mapping_error(qidev, iv_dma)) { 136762306a36Sopenharmony_ci dev_err(qidev, "unable to map IV\n"); 136862306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0, 136962306a36Sopenharmony_ci 0, DMA_NONE, 0, 0); 137062306a36Sopenharmony_ci qi_cache_free(edesc); 137162306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 137262306a36Sopenharmony_ci } 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci edesc->iv_dma = iv_dma; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0); 137762306a36Sopenharmony_ci sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0); 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_ci if (req->src != req->dst) 138062306a36Sopenharmony_ci sg_to_qm_sg(req->dst, req->cryptlen, sg_table + dst_sg_idx, 0); 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_ci dma_to_qm_sg_one(sg_table + dst_sg_idx + mapped_dst_nents, iv_dma, 138362306a36Sopenharmony_ci ivsize, 0); 138462306a36Sopenharmony_ci 138562306a36Sopenharmony_ci edesc->qm_sg_dma = dma_map_single(qidev, sg_table, edesc->qm_sg_bytes, 138662306a36Sopenharmony_ci DMA_TO_DEVICE); 138762306a36Sopenharmony_ci if (dma_mapping_error(qidev, edesc->qm_sg_dma)) { 138862306a36Sopenharmony_ci dev_err(qidev, "unable to map S/G table\n"); 138962306a36Sopenharmony_ci caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 139062306a36Sopenharmony_ci iv_dma, ivsize, DMA_BIDIRECTIONAL, 0, 0); 139162306a36Sopenharmony_ci qi_cache_free(edesc); 139262306a36Sopenharmony_ci return ERR_PTR(-ENOMEM); 139362306a36Sopenharmony_ci } 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_ci fd_sgt = &edesc->drv_req.fd_sgt[0]; 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_ci dma_to_qm_sg_one_last_ext(&fd_sgt[1], edesc->qm_sg_dma, 139862306a36Sopenharmony_ci ivsize + req->cryptlen, 0); 139962306a36Sopenharmony_ci 140062306a36Sopenharmony_ci if (req->src == req->dst) 140162306a36Sopenharmony_ci dma_to_qm_sg_one_ext(&fd_sgt[0], edesc->qm_sg_dma + 140262306a36Sopenharmony_ci sizeof(*sg_table), req->cryptlen + ivsize, 140362306a36Sopenharmony_ci 0); 140462306a36Sopenharmony_ci else 140562306a36Sopenharmony_ci dma_to_qm_sg_one_ext(&fd_sgt[0], edesc->qm_sg_dma + dst_sg_idx * 140662306a36Sopenharmony_ci sizeof(*sg_table), req->cryptlen + ivsize, 140762306a36Sopenharmony_ci 0); 140862306a36Sopenharmony_ci 140962306a36Sopenharmony_ci return edesc; 141062306a36Sopenharmony_ci} 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req) 141362306a36Sopenharmony_ci{ 141462306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 141562306a36Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_ci return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); 141862306a36Sopenharmony_ci} 141962306a36Sopenharmony_ci 142062306a36Sopenharmony_cistatic inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) 142162306a36Sopenharmony_ci{ 142262306a36Sopenharmony_ci struct skcipher_edesc *edesc; 142362306a36Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 142462306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(skcipher); 142562306a36Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent); 142662306a36Sopenharmony_ci int ret; 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_ci /* 142962306a36Sopenharmony_ci * XTS is expected to return an error even for input length = 0 143062306a36Sopenharmony_ci * Note that the case input length < block size will be caught during 143162306a36Sopenharmony_ci * HW offloading and return an error. 143262306a36Sopenharmony_ci */ 143362306a36Sopenharmony_ci if (!req->cryptlen && !ctx->fallback) 143462306a36Sopenharmony_ci return 0; 143562306a36Sopenharmony_ci 143662306a36Sopenharmony_ci if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) || 143762306a36Sopenharmony_ci ctx->xts_key_fallback)) { 143862306a36Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_ci skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); 144162306a36Sopenharmony_ci skcipher_request_set_callback(&rctx->fallback_req, 144262306a36Sopenharmony_ci req->base.flags, 144362306a36Sopenharmony_ci req->base.complete, 144462306a36Sopenharmony_ci req->base.data); 144562306a36Sopenharmony_ci skcipher_request_set_crypt(&rctx->fallback_req, req->src, 144662306a36Sopenharmony_ci req->dst, req->cryptlen, req->iv); 144762306a36Sopenharmony_ci 144862306a36Sopenharmony_ci return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) : 144962306a36Sopenharmony_ci crypto_skcipher_decrypt(&rctx->fallback_req); 145062306a36Sopenharmony_ci } 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci if (unlikely(caam_congested)) 145362306a36Sopenharmony_ci return -EAGAIN; 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci /* allocate extended descriptor */ 145662306a36Sopenharmony_ci edesc = skcipher_edesc_alloc(req, encrypt); 145762306a36Sopenharmony_ci if (IS_ERR(edesc)) 145862306a36Sopenharmony_ci return PTR_ERR(edesc); 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_ci ret = caam_qi_enqueue(ctx->qidev, &edesc->drv_req); 146162306a36Sopenharmony_ci if (!ret) { 146262306a36Sopenharmony_ci ret = -EINPROGRESS; 146362306a36Sopenharmony_ci } else { 146462306a36Sopenharmony_ci skcipher_unmap(ctx->qidev, edesc, req); 146562306a36Sopenharmony_ci qi_cache_free(edesc); 146662306a36Sopenharmony_ci } 146762306a36Sopenharmony_ci 146862306a36Sopenharmony_ci return ret; 146962306a36Sopenharmony_ci} 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req) 147262306a36Sopenharmony_ci{ 147362306a36Sopenharmony_ci return skcipher_crypt(req, true); 147462306a36Sopenharmony_ci} 147562306a36Sopenharmony_ci 147662306a36Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req) 147762306a36Sopenharmony_ci{ 147862306a36Sopenharmony_ci return skcipher_crypt(req, false); 147962306a36Sopenharmony_ci} 148062306a36Sopenharmony_ci 148162306a36Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = { 148262306a36Sopenharmony_ci { 148362306a36Sopenharmony_ci .skcipher = { 148462306a36Sopenharmony_ci .base = { 148562306a36Sopenharmony_ci .cra_name = "cbc(aes)", 148662306a36Sopenharmony_ci .cra_driver_name = "cbc-aes-caam-qi", 148762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 148862306a36Sopenharmony_ci }, 148962306a36Sopenharmony_ci .setkey = aes_skcipher_setkey, 149062306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 149162306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 149262306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 149362306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 149462306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 149562306a36Sopenharmony_ci }, 149662306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 149762306a36Sopenharmony_ci }, 149862306a36Sopenharmony_ci { 149962306a36Sopenharmony_ci .skcipher = { 150062306a36Sopenharmony_ci .base = { 150162306a36Sopenharmony_ci .cra_name = "cbc(des3_ede)", 150262306a36Sopenharmony_ci .cra_driver_name = "cbc-3des-caam-qi", 150362306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 150462306a36Sopenharmony_ci }, 150562306a36Sopenharmony_ci .setkey = des3_skcipher_setkey, 150662306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 150762306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 150862306a36Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 150962306a36Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 151062306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 151162306a36Sopenharmony_ci }, 151262306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 151362306a36Sopenharmony_ci }, 151462306a36Sopenharmony_ci { 151562306a36Sopenharmony_ci .skcipher = { 151662306a36Sopenharmony_ci .base = { 151762306a36Sopenharmony_ci .cra_name = "cbc(des)", 151862306a36Sopenharmony_ci .cra_driver_name = "cbc-des-caam-qi", 151962306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 152062306a36Sopenharmony_ci }, 152162306a36Sopenharmony_ci .setkey = des_skcipher_setkey, 152262306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 152362306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 152462306a36Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 152562306a36Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 152662306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 152762306a36Sopenharmony_ci }, 152862306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 152962306a36Sopenharmony_ci }, 153062306a36Sopenharmony_ci { 153162306a36Sopenharmony_ci .skcipher = { 153262306a36Sopenharmony_ci .base = { 153362306a36Sopenharmony_ci .cra_name = "ctr(aes)", 153462306a36Sopenharmony_ci .cra_driver_name = "ctr-aes-caam-qi", 153562306a36Sopenharmony_ci .cra_blocksize = 1, 153662306a36Sopenharmony_ci }, 153762306a36Sopenharmony_ci .setkey = ctr_skcipher_setkey, 153862306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 153962306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 154062306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 154162306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 154262306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 154362306a36Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 154462306a36Sopenharmony_ci }, 154562306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | 154662306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 154762306a36Sopenharmony_ci }, 154862306a36Sopenharmony_ci { 154962306a36Sopenharmony_ci .skcipher = { 155062306a36Sopenharmony_ci .base = { 155162306a36Sopenharmony_ci .cra_name = "rfc3686(ctr(aes))", 155262306a36Sopenharmony_ci .cra_driver_name = "rfc3686-ctr-aes-caam-qi", 155362306a36Sopenharmony_ci .cra_blocksize = 1, 155462306a36Sopenharmony_ci }, 155562306a36Sopenharmony_ci .setkey = rfc3686_skcipher_setkey, 155662306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 155762306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 155862306a36Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE + 155962306a36Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 156062306a36Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE + 156162306a36Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 156262306a36Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 156362306a36Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 156462306a36Sopenharmony_ci }, 156562306a36Sopenharmony_ci .caam = { 156662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 156762306a36Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 156862306a36Sopenharmony_ci .rfc3686 = true, 156962306a36Sopenharmony_ci }, 157062306a36Sopenharmony_ci }, 157162306a36Sopenharmony_ci { 157262306a36Sopenharmony_ci .skcipher = { 157362306a36Sopenharmony_ci .base = { 157462306a36Sopenharmony_ci .cra_name = "xts(aes)", 157562306a36Sopenharmony_ci .cra_driver_name = "xts-aes-caam-qi", 157662306a36Sopenharmony_ci .cra_flags = CRYPTO_ALG_NEED_FALLBACK, 157762306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 157862306a36Sopenharmony_ci }, 157962306a36Sopenharmony_ci .setkey = xts_skcipher_setkey, 158062306a36Sopenharmony_ci .encrypt = skcipher_encrypt, 158162306a36Sopenharmony_ci .decrypt = skcipher_decrypt, 158262306a36Sopenharmony_ci .min_keysize = 2 * AES_MIN_KEY_SIZE, 158362306a36Sopenharmony_ci .max_keysize = 2 * AES_MAX_KEY_SIZE, 158462306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 158562306a36Sopenharmony_ci }, 158662306a36Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS, 158762306a36Sopenharmony_ci }, 158862306a36Sopenharmony_ci}; 158962306a36Sopenharmony_ci 159062306a36Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = { 159162306a36Sopenharmony_ci { 159262306a36Sopenharmony_ci .aead = { 159362306a36Sopenharmony_ci .base = { 159462306a36Sopenharmony_ci .cra_name = "rfc4106(gcm(aes))", 159562306a36Sopenharmony_ci .cra_driver_name = "rfc4106-gcm-aes-caam-qi", 159662306a36Sopenharmony_ci .cra_blocksize = 1, 159762306a36Sopenharmony_ci }, 159862306a36Sopenharmony_ci .setkey = rfc4106_setkey, 159962306a36Sopenharmony_ci .setauthsize = rfc4106_setauthsize, 160062306a36Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 160162306a36Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 160262306a36Sopenharmony_ci .ivsize = 8, 160362306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 160462306a36Sopenharmony_ci }, 160562306a36Sopenharmony_ci .caam = { 160662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 160762306a36Sopenharmony_ci .nodkp = true, 160862306a36Sopenharmony_ci }, 160962306a36Sopenharmony_ci }, 161062306a36Sopenharmony_ci { 161162306a36Sopenharmony_ci .aead = { 161262306a36Sopenharmony_ci .base = { 161362306a36Sopenharmony_ci .cra_name = "rfc4543(gcm(aes))", 161462306a36Sopenharmony_ci .cra_driver_name = "rfc4543-gcm-aes-caam-qi", 161562306a36Sopenharmony_ci .cra_blocksize = 1, 161662306a36Sopenharmony_ci }, 161762306a36Sopenharmony_ci .setkey = rfc4543_setkey, 161862306a36Sopenharmony_ci .setauthsize = rfc4543_setauthsize, 161962306a36Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 162062306a36Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 162162306a36Sopenharmony_ci .ivsize = 8, 162262306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 162362306a36Sopenharmony_ci }, 162462306a36Sopenharmony_ci .caam = { 162562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 162662306a36Sopenharmony_ci .nodkp = true, 162762306a36Sopenharmony_ci }, 162862306a36Sopenharmony_ci }, 162962306a36Sopenharmony_ci /* Galois Counter Mode */ 163062306a36Sopenharmony_ci { 163162306a36Sopenharmony_ci .aead = { 163262306a36Sopenharmony_ci .base = { 163362306a36Sopenharmony_ci .cra_name = "gcm(aes)", 163462306a36Sopenharmony_ci .cra_driver_name = "gcm-aes-caam-qi", 163562306a36Sopenharmony_ci .cra_blocksize = 1, 163662306a36Sopenharmony_ci }, 163762306a36Sopenharmony_ci .setkey = gcm_setkey, 163862306a36Sopenharmony_ci .setauthsize = gcm_setauthsize, 163962306a36Sopenharmony_ci .encrypt = aead_encrypt, 164062306a36Sopenharmony_ci .decrypt = aead_decrypt, 164162306a36Sopenharmony_ci .ivsize = 12, 164262306a36Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 164362306a36Sopenharmony_ci }, 164462306a36Sopenharmony_ci .caam = { 164562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 164662306a36Sopenharmony_ci .nodkp = true, 164762306a36Sopenharmony_ci } 164862306a36Sopenharmony_ci }, 164962306a36Sopenharmony_ci /* single-pass ipsec_esp descriptor */ 165062306a36Sopenharmony_ci { 165162306a36Sopenharmony_ci .aead = { 165262306a36Sopenharmony_ci .base = { 165362306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(aes))", 165462306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 165562306a36Sopenharmony_ci "cbc-aes-caam-qi", 165662306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 165762306a36Sopenharmony_ci }, 165862306a36Sopenharmony_ci .setkey = aead_setkey, 165962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 166062306a36Sopenharmony_ci .encrypt = aead_encrypt, 166162306a36Sopenharmony_ci .decrypt = aead_decrypt, 166262306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 166362306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 166462306a36Sopenharmony_ci }, 166562306a36Sopenharmony_ci .caam = { 166662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 166762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 166862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 166962306a36Sopenharmony_ci } 167062306a36Sopenharmony_ci }, 167162306a36Sopenharmony_ci { 167262306a36Sopenharmony_ci .aead = { 167362306a36Sopenharmony_ci .base = { 167462306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 167562306a36Sopenharmony_ci "cbc(aes)))", 167662306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 167762306a36Sopenharmony_ci "cbc-aes-caam-qi", 167862306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 167962306a36Sopenharmony_ci }, 168062306a36Sopenharmony_ci .setkey = aead_setkey, 168162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 168262306a36Sopenharmony_ci .encrypt = aead_encrypt, 168362306a36Sopenharmony_ci .decrypt = aead_decrypt, 168462306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 168562306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 168662306a36Sopenharmony_ci }, 168762306a36Sopenharmony_ci .caam = { 168862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 168962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 169062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 169162306a36Sopenharmony_ci .geniv = true, 169262306a36Sopenharmony_ci } 169362306a36Sopenharmony_ci }, 169462306a36Sopenharmony_ci { 169562306a36Sopenharmony_ci .aead = { 169662306a36Sopenharmony_ci .base = { 169762306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(aes))", 169862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 169962306a36Sopenharmony_ci "cbc-aes-caam-qi", 170062306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 170162306a36Sopenharmony_ci }, 170262306a36Sopenharmony_ci .setkey = aead_setkey, 170362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 170462306a36Sopenharmony_ci .encrypt = aead_encrypt, 170562306a36Sopenharmony_ci .decrypt = aead_decrypt, 170662306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 170762306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 170862306a36Sopenharmony_ci }, 170962306a36Sopenharmony_ci .caam = { 171062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 171162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 171262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 171362306a36Sopenharmony_ci } 171462306a36Sopenharmony_ci }, 171562306a36Sopenharmony_ci { 171662306a36Sopenharmony_ci .aead = { 171762306a36Sopenharmony_ci .base = { 171862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 171962306a36Sopenharmony_ci "cbc(aes)))", 172062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 172162306a36Sopenharmony_ci "hmac-sha1-cbc-aes-caam-qi", 172262306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 172362306a36Sopenharmony_ci }, 172462306a36Sopenharmony_ci .setkey = aead_setkey, 172562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 172662306a36Sopenharmony_ci .encrypt = aead_encrypt, 172762306a36Sopenharmony_ci .decrypt = aead_decrypt, 172862306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 172962306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 173062306a36Sopenharmony_ci }, 173162306a36Sopenharmony_ci .caam = { 173262306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 173362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 173462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 173562306a36Sopenharmony_ci .geniv = true, 173662306a36Sopenharmony_ci }, 173762306a36Sopenharmony_ci }, 173862306a36Sopenharmony_ci { 173962306a36Sopenharmony_ci .aead = { 174062306a36Sopenharmony_ci .base = { 174162306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(aes))", 174262306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 174362306a36Sopenharmony_ci "cbc-aes-caam-qi", 174462306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 174562306a36Sopenharmony_ci }, 174662306a36Sopenharmony_ci .setkey = aead_setkey, 174762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 174862306a36Sopenharmony_ci .encrypt = aead_encrypt, 174962306a36Sopenharmony_ci .decrypt = aead_decrypt, 175062306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 175162306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 175262306a36Sopenharmony_ci }, 175362306a36Sopenharmony_ci .caam = { 175462306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 175562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 175662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 175762306a36Sopenharmony_ci } 175862306a36Sopenharmony_ci }, 175962306a36Sopenharmony_ci { 176062306a36Sopenharmony_ci .aead = { 176162306a36Sopenharmony_ci .base = { 176262306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 176362306a36Sopenharmony_ci "cbc(aes)))", 176462306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 176562306a36Sopenharmony_ci "hmac-sha224-cbc-aes-caam-qi", 176662306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 176762306a36Sopenharmony_ci }, 176862306a36Sopenharmony_ci .setkey = aead_setkey, 176962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 177062306a36Sopenharmony_ci .encrypt = aead_encrypt, 177162306a36Sopenharmony_ci .decrypt = aead_decrypt, 177262306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 177362306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 177462306a36Sopenharmony_ci }, 177562306a36Sopenharmony_ci .caam = { 177662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 177762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 177862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 177962306a36Sopenharmony_ci .geniv = true, 178062306a36Sopenharmony_ci } 178162306a36Sopenharmony_ci }, 178262306a36Sopenharmony_ci { 178362306a36Sopenharmony_ci .aead = { 178462306a36Sopenharmony_ci .base = { 178562306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(aes))", 178662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 178762306a36Sopenharmony_ci "cbc-aes-caam-qi", 178862306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 178962306a36Sopenharmony_ci }, 179062306a36Sopenharmony_ci .setkey = aead_setkey, 179162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 179262306a36Sopenharmony_ci .encrypt = aead_encrypt, 179362306a36Sopenharmony_ci .decrypt = aead_decrypt, 179462306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 179562306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 179662306a36Sopenharmony_ci }, 179762306a36Sopenharmony_ci .caam = { 179862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 179962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 180062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 180162306a36Sopenharmony_ci } 180262306a36Sopenharmony_ci }, 180362306a36Sopenharmony_ci { 180462306a36Sopenharmony_ci .aead = { 180562306a36Sopenharmony_ci .base = { 180662306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 180762306a36Sopenharmony_ci "cbc(aes)))", 180862306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 180962306a36Sopenharmony_ci "hmac-sha256-cbc-aes-" 181062306a36Sopenharmony_ci "caam-qi", 181162306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 181262306a36Sopenharmony_ci }, 181362306a36Sopenharmony_ci .setkey = aead_setkey, 181462306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 181562306a36Sopenharmony_ci .encrypt = aead_encrypt, 181662306a36Sopenharmony_ci .decrypt = aead_decrypt, 181762306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 181862306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 181962306a36Sopenharmony_ci }, 182062306a36Sopenharmony_ci .caam = { 182162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 182262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 182362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 182462306a36Sopenharmony_ci .geniv = true, 182562306a36Sopenharmony_ci } 182662306a36Sopenharmony_ci }, 182762306a36Sopenharmony_ci { 182862306a36Sopenharmony_ci .aead = { 182962306a36Sopenharmony_ci .base = { 183062306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(aes))", 183162306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 183262306a36Sopenharmony_ci "cbc-aes-caam-qi", 183362306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 183462306a36Sopenharmony_ci }, 183562306a36Sopenharmony_ci .setkey = aead_setkey, 183662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 183762306a36Sopenharmony_ci .encrypt = aead_encrypt, 183862306a36Sopenharmony_ci .decrypt = aead_decrypt, 183962306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 184062306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 184162306a36Sopenharmony_ci }, 184262306a36Sopenharmony_ci .caam = { 184362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 184462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 184562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 184662306a36Sopenharmony_ci } 184762306a36Sopenharmony_ci }, 184862306a36Sopenharmony_ci { 184962306a36Sopenharmony_ci .aead = { 185062306a36Sopenharmony_ci .base = { 185162306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 185262306a36Sopenharmony_ci "cbc(aes)))", 185362306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 185462306a36Sopenharmony_ci "hmac-sha384-cbc-aes-" 185562306a36Sopenharmony_ci "caam-qi", 185662306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 185762306a36Sopenharmony_ci }, 185862306a36Sopenharmony_ci .setkey = aead_setkey, 185962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 186062306a36Sopenharmony_ci .encrypt = aead_encrypt, 186162306a36Sopenharmony_ci .decrypt = aead_decrypt, 186262306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 186362306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 186462306a36Sopenharmony_ci }, 186562306a36Sopenharmony_ci .caam = { 186662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 186762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 186862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 186962306a36Sopenharmony_ci .geniv = true, 187062306a36Sopenharmony_ci } 187162306a36Sopenharmony_ci }, 187262306a36Sopenharmony_ci { 187362306a36Sopenharmony_ci .aead = { 187462306a36Sopenharmony_ci .base = { 187562306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(aes))", 187662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 187762306a36Sopenharmony_ci "cbc-aes-caam-qi", 187862306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 187962306a36Sopenharmony_ci }, 188062306a36Sopenharmony_ci .setkey = aead_setkey, 188162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 188262306a36Sopenharmony_ci .encrypt = aead_encrypt, 188362306a36Sopenharmony_ci .decrypt = aead_decrypt, 188462306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 188562306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 188662306a36Sopenharmony_ci }, 188762306a36Sopenharmony_ci .caam = { 188862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 188962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 189062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 189162306a36Sopenharmony_ci } 189262306a36Sopenharmony_ci }, 189362306a36Sopenharmony_ci { 189462306a36Sopenharmony_ci .aead = { 189562306a36Sopenharmony_ci .base = { 189662306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 189762306a36Sopenharmony_ci "cbc(aes)))", 189862306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 189962306a36Sopenharmony_ci "hmac-sha512-cbc-aes-" 190062306a36Sopenharmony_ci "caam-qi", 190162306a36Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 190262306a36Sopenharmony_ci }, 190362306a36Sopenharmony_ci .setkey = aead_setkey, 190462306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 190562306a36Sopenharmony_ci .encrypt = aead_encrypt, 190662306a36Sopenharmony_ci .decrypt = aead_decrypt, 190762306a36Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 190862306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 190962306a36Sopenharmony_ci }, 191062306a36Sopenharmony_ci .caam = { 191162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 191262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 191362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 191462306a36Sopenharmony_ci .geniv = true, 191562306a36Sopenharmony_ci } 191662306a36Sopenharmony_ci }, 191762306a36Sopenharmony_ci { 191862306a36Sopenharmony_ci .aead = { 191962306a36Sopenharmony_ci .base = { 192062306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des3_ede))", 192162306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 192262306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 192362306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 192462306a36Sopenharmony_ci }, 192562306a36Sopenharmony_ci .setkey = des3_aead_setkey, 192662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 192762306a36Sopenharmony_ci .encrypt = aead_encrypt, 192862306a36Sopenharmony_ci .decrypt = aead_decrypt, 192962306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 193062306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 193162306a36Sopenharmony_ci }, 193262306a36Sopenharmony_ci .caam = { 193362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 193462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 193562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 193662306a36Sopenharmony_ci } 193762306a36Sopenharmony_ci }, 193862306a36Sopenharmony_ci { 193962306a36Sopenharmony_ci .aead = { 194062306a36Sopenharmony_ci .base = { 194162306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 194262306a36Sopenharmony_ci "cbc(des3_ede)))", 194362306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 194462306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 194562306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 194662306a36Sopenharmony_ci }, 194762306a36Sopenharmony_ci .setkey = des3_aead_setkey, 194862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 194962306a36Sopenharmony_ci .encrypt = aead_encrypt, 195062306a36Sopenharmony_ci .decrypt = aead_decrypt, 195162306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 195262306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 195362306a36Sopenharmony_ci }, 195462306a36Sopenharmony_ci .caam = { 195562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 195662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 195762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 195862306a36Sopenharmony_ci .geniv = true, 195962306a36Sopenharmony_ci } 196062306a36Sopenharmony_ci }, 196162306a36Sopenharmony_ci { 196262306a36Sopenharmony_ci .aead = { 196362306a36Sopenharmony_ci .base = { 196462306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 196562306a36Sopenharmony_ci "cbc(des3_ede))", 196662306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 196762306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 196862306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 196962306a36Sopenharmony_ci }, 197062306a36Sopenharmony_ci .setkey = des3_aead_setkey, 197162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 197262306a36Sopenharmony_ci .encrypt = aead_encrypt, 197362306a36Sopenharmony_ci .decrypt = aead_decrypt, 197462306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 197562306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 197662306a36Sopenharmony_ci }, 197762306a36Sopenharmony_ci .caam = { 197862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 197962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 198062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 198162306a36Sopenharmony_ci }, 198262306a36Sopenharmony_ci }, 198362306a36Sopenharmony_ci { 198462306a36Sopenharmony_ci .aead = { 198562306a36Sopenharmony_ci .base = { 198662306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 198762306a36Sopenharmony_ci "cbc(des3_ede)))", 198862306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 198962306a36Sopenharmony_ci "hmac-sha1-" 199062306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 199162306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 199262306a36Sopenharmony_ci }, 199362306a36Sopenharmony_ci .setkey = des3_aead_setkey, 199462306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 199562306a36Sopenharmony_ci .encrypt = aead_encrypt, 199662306a36Sopenharmony_ci .decrypt = aead_decrypt, 199762306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 199862306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 199962306a36Sopenharmony_ci }, 200062306a36Sopenharmony_ci .caam = { 200162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 200262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 200362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 200462306a36Sopenharmony_ci .geniv = true, 200562306a36Sopenharmony_ci } 200662306a36Sopenharmony_ci }, 200762306a36Sopenharmony_ci { 200862306a36Sopenharmony_ci .aead = { 200962306a36Sopenharmony_ci .base = { 201062306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 201162306a36Sopenharmony_ci "cbc(des3_ede))", 201262306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 201362306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 201462306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 201562306a36Sopenharmony_ci }, 201662306a36Sopenharmony_ci .setkey = des3_aead_setkey, 201762306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 201862306a36Sopenharmony_ci .encrypt = aead_encrypt, 201962306a36Sopenharmony_ci .decrypt = aead_decrypt, 202062306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 202162306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 202262306a36Sopenharmony_ci }, 202362306a36Sopenharmony_ci .caam = { 202462306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 202562306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 202662306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 202762306a36Sopenharmony_ci }, 202862306a36Sopenharmony_ci }, 202962306a36Sopenharmony_ci { 203062306a36Sopenharmony_ci .aead = { 203162306a36Sopenharmony_ci .base = { 203262306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 203362306a36Sopenharmony_ci "cbc(des3_ede)))", 203462306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 203562306a36Sopenharmony_ci "hmac-sha224-" 203662306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 203762306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 203862306a36Sopenharmony_ci }, 203962306a36Sopenharmony_ci .setkey = des3_aead_setkey, 204062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 204162306a36Sopenharmony_ci .encrypt = aead_encrypt, 204262306a36Sopenharmony_ci .decrypt = aead_decrypt, 204362306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 204462306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 204562306a36Sopenharmony_ci }, 204662306a36Sopenharmony_ci .caam = { 204762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 204862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 204962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 205062306a36Sopenharmony_ci .geniv = true, 205162306a36Sopenharmony_ci } 205262306a36Sopenharmony_ci }, 205362306a36Sopenharmony_ci { 205462306a36Sopenharmony_ci .aead = { 205562306a36Sopenharmony_ci .base = { 205662306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 205762306a36Sopenharmony_ci "cbc(des3_ede))", 205862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 205962306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 206062306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 206162306a36Sopenharmony_ci }, 206262306a36Sopenharmony_ci .setkey = des3_aead_setkey, 206362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 206462306a36Sopenharmony_ci .encrypt = aead_encrypt, 206562306a36Sopenharmony_ci .decrypt = aead_decrypt, 206662306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 206762306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 206862306a36Sopenharmony_ci }, 206962306a36Sopenharmony_ci .caam = { 207062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 207162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 207262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 207362306a36Sopenharmony_ci }, 207462306a36Sopenharmony_ci }, 207562306a36Sopenharmony_ci { 207662306a36Sopenharmony_ci .aead = { 207762306a36Sopenharmony_ci .base = { 207862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 207962306a36Sopenharmony_ci "cbc(des3_ede)))", 208062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 208162306a36Sopenharmony_ci "hmac-sha256-" 208262306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 208362306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 208462306a36Sopenharmony_ci }, 208562306a36Sopenharmony_ci .setkey = des3_aead_setkey, 208662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 208762306a36Sopenharmony_ci .encrypt = aead_encrypt, 208862306a36Sopenharmony_ci .decrypt = aead_decrypt, 208962306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 209062306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 209162306a36Sopenharmony_ci }, 209262306a36Sopenharmony_ci .caam = { 209362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 209462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 209562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 209662306a36Sopenharmony_ci .geniv = true, 209762306a36Sopenharmony_ci } 209862306a36Sopenharmony_ci }, 209962306a36Sopenharmony_ci { 210062306a36Sopenharmony_ci .aead = { 210162306a36Sopenharmony_ci .base = { 210262306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 210362306a36Sopenharmony_ci "cbc(des3_ede))", 210462306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 210562306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 210662306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 210762306a36Sopenharmony_ci }, 210862306a36Sopenharmony_ci .setkey = des3_aead_setkey, 210962306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 211062306a36Sopenharmony_ci .encrypt = aead_encrypt, 211162306a36Sopenharmony_ci .decrypt = aead_decrypt, 211262306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 211362306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 211462306a36Sopenharmony_ci }, 211562306a36Sopenharmony_ci .caam = { 211662306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 211762306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 211862306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 211962306a36Sopenharmony_ci }, 212062306a36Sopenharmony_ci }, 212162306a36Sopenharmony_ci { 212262306a36Sopenharmony_ci .aead = { 212362306a36Sopenharmony_ci .base = { 212462306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 212562306a36Sopenharmony_ci "cbc(des3_ede)))", 212662306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 212762306a36Sopenharmony_ci "hmac-sha384-" 212862306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 212962306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 213062306a36Sopenharmony_ci }, 213162306a36Sopenharmony_ci .setkey = des3_aead_setkey, 213262306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 213362306a36Sopenharmony_ci .encrypt = aead_encrypt, 213462306a36Sopenharmony_ci .decrypt = aead_decrypt, 213562306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 213662306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 213762306a36Sopenharmony_ci }, 213862306a36Sopenharmony_ci .caam = { 213962306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 214062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 214162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 214262306a36Sopenharmony_ci .geniv = true, 214362306a36Sopenharmony_ci } 214462306a36Sopenharmony_ci }, 214562306a36Sopenharmony_ci { 214662306a36Sopenharmony_ci .aead = { 214762306a36Sopenharmony_ci .base = { 214862306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 214962306a36Sopenharmony_ci "cbc(des3_ede))", 215062306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 215162306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 215262306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 215362306a36Sopenharmony_ci }, 215462306a36Sopenharmony_ci .setkey = des3_aead_setkey, 215562306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 215662306a36Sopenharmony_ci .encrypt = aead_encrypt, 215762306a36Sopenharmony_ci .decrypt = aead_decrypt, 215862306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 215962306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 216062306a36Sopenharmony_ci }, 216162306a36Sopenharmony_ci .caam = { 216262306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 216362306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 216462306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 216562306a36Sopenharmony_ci }, 216662306a36Sopenharmony_ci }, 216762306a36Sopenharmony_ci { 216862306a36Sopenharmony_ci .aead = { 216962306a36Sopenharmony_ci .base = { 217062306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 217162306a36Sopenharmony_ci "cbc(des3_ede)))", 217262306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 217362306a36Sopenharmony_ci "hmac-sha512-" 217462306a36Sopenharmony_ci "cbc-des3_ede-caam-qi", 217562306a36Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 217662306a36Sopenharmony_ci }, 217762306a36Sopenharmony_ci .setkey = des3_aead_setkey, 217862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 217962306a36Sopenharmony_ci .encrypt = aead_encrypt, 218062306a36Sopenharmony_ci .decrypt = aead_decrypt, 218162306a36Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 218262306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 218362306a36Sopenharmony_ci }, 218462306a36Sopenharmony_ci .caam = { 218562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 218662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 218762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 218862306a36Sopenharmony_ci .geniv = true, 218962306a36Sopenharmony_ci } 219062306a36Sopenharmony_ci }, 219162306a36Sopenharmony_ci { 219262306a36Sopenharmony_ci .aead = { 219362306a36Sopenharmony_ci .base = { 219462306a36Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des))", 219562306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 219662306a36Sopenharmony_ci "cbc-des-caam-qi", 219762306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 219862306a36Sopenharmony_ci }, 219962306a36Sopenharmony_ci .setkey = aead_setkey, 220062306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 220162306a36Sopenharmony_ci .encrypt = aead_encrypt, 220262306a36Sopenharmony_ci .decrypt = aead_decrypt, 220362306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 220462306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 220562306a36Sopenharmony_ci }, 220662306a36Sopenharmony_ci .caam = { 220762306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 220862306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 220962306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 221062306a36Sopenharmony_ci }, 221162306a36Sopenharmony_ci }, 221262306a36Sopenharmony_ci { 221362306a36Sopenharmony_ci .aead = { 221462306a36Sopenharmony_ci .base = { 221562306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 221662306a36Sopenharmony_ci "cbc(des)))", 221762306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 221862306a36Sopenharmony_ci "cbc-des-caam-qi", 221962306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 222062306a36Sopenharmony_ci }, 222162306a36Sopenharmony_ci .setkey = aead_setkey, 222262306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 222362306a36Sopenharmony_ci .encrypt = aead_encrypt, 222462306a36Sopenharmony_ci .decrypt = aead_decrypt, 222562306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 222662306a36Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 222762306a36Sopenharmony_ci }, 222862306a36Sopenharmony_ci .caam = { 222962306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 223062306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 223162306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 223262306a36Sopenharmony_ci .geniv = true, 223362306a36Sopenharmony_ci } 223462306a36Sopenharmony_ci }, 223562306a36Sopenharmony_ci { 223662306a36Sopenharmony_ci .aead = { 223762306a36Sopenharmony_ci .base = { 223862306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(des))", 223962306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 224062306a36Sopenharmony_ci "cbc-des-caam-qi", 224162306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 224262306a36Sopenharmony_ci }, 224362306a36Sopenharmony_ci .setkey = aead_setkey, 224462306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 224562306a36Sopenharmony_ci .encrypt = aead_encrypt, 224662306a36Sopenharmony_ci .decrypt = aead_decrypt, 224762306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 224862306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 224962306a36Sopenharmony_ci }, 225062306a36Sopenharmony_ci .caam = { 225162306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 225262306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 225362306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 225462306a36Sopenharmony_ci }, 225562306a36Sopenharmony_ci }, 225662306a36Sopenharmony_ci { 225762306a36Sopenharmony_ci .aead = { 225862306a36Sopenharmony_ci .base = { 225962306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 226062306a36Sopenharmony_ci "cbc(des)))", 226162306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 226262306a36Sopenharmony_ci "hmac-sha1-cbc-des-caam-qi", 226362306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 226462306a36Sopenharmony_ci }, 226562306a36Sopenharmony_ci .setkey = aead_setkey, 226662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 226762306a36Sopenharmony_ci .encrypt = aead_encrypt, 226862306a36Sopenharmony_ci .decrypt = aead_decrypt, 226962306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 227062306a36Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 227162306a36Sopenharmony_ci }, 227262306a36Sopenharmony_ci .caam = { 227362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 227462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 227562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 227662306a36Sopenharmony_ci .geniv = true, 227762306a36Sopenharmony_ci } 227862306a36Sopenharmony_ci }, 227962306a36Sopenharmony_ci { 228062306a36Sopenharmony_ci .aead = { 228162306a36Sopenharmony_ci .base = { 228262306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(des))", 228362306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 228462306a36Sopenharmony_ci "cbc-des-caam-qi", 228562306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 228662306a36Sopenharmony_ci }, 228762306a36Sopenharmony_ci .setkey = aead_setkey, 228862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 228962306a36Sopenharmony_ci .encrypt = aead_encrypt, 229062306a36Sopenharmony_ci .decrypt = aead_decrypt, 229162306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 229262306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 229362306a36Sopenharmony_ci }, 229462306a36Sopenharmony_ci .caam = { 229562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 229662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 229762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 229862306a36Sopenharmony_ci }, 229962306a36Sopenharmony_ci }, 230062306a36Sopenharmony_ci { 230162306a36Sopenharmony_ci .aead = { 230262306a36Sopenharmony_ci .base = { 230362306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 230462306a36Sopenharmony_ci "cbc(des)))", 230562306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 230662306a36Sopenharmony_ci "hmac-sha224-cbc-des-" 230762306a36Sopenharmony_ci "caam-qi", 230862306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 230962306a36Sopenharmony_ci }, 231062306a36Sopenharmony_ci .setkey = aead_setkey, 231162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 231262306a36Sopenharmony_ci .encrypt = aead_encrypt, 231362306a36Sopenharmony_ci .decrypt = aead_decrypt, 231462306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 231562306a36Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 231662306a36Sopenharmony_ci }, 231762306a36Sopenharmony_ci .caam = { 231862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 231962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 232062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 232162306a36Sopenharmony_ci .geniv = true, 232262306a36Sopenharmony_ci } 232362306a36Sopenharmony_ci }, 232462306a36Sopenharmony_ci { 232562306a36Sopenharmony_ci .aead = { 232662306a36Sopenharmony_ci .base = { 232762306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(des))", 232862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 232962306a36Sopenharmony_ci "cbc-des-caam-qi", 233062306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 233162306a36Sopenharmony_ci }, 233262306a36Sopenharmony_ci .setkey = aead_setkey, 233362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 233462306a36Sopenharmony_ci .encrypt = aead_encrypt, 233562306a36Sopenharmony_ci .decrypt = aead_decrypt, 233662306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 233762306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 233862306a36Sopenharmony_ci }, 233962306a36Sopenharmony_ci .caam = { 234062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 234162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 234262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 234362306a36Sopenharmony_ci }, 234462306a36Sopenharmony_ci }, 234562306a36Sopenharmony_ci { 234662306a36Sopenharmony_ci .aead = { 234762306a36Sopenharmony_ci .base = { 234862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 234962306a36Sopenharmony_ci "cbc(des)))", 235062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 235162306a36Sopenharmony_ci "hmac-sha256-cbc-des-" 235262306a36Sopenharmony_ci "caam-qi", 235362306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 235462306a36Sopenharmony_ci }, 235562306a36Sopenharmony_ci .setkey = aead_setkey, 235662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 235762306a36Sopenharmony_ci .encrypt = aead_encrypt, 235862306a36Sopenharmony_ci .decrypt = aead_decrypt, 235962306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 236062306a36Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 236162306a36Sopenharmony_ci }, 236262306a36Sopenharmony_ci .caam = { 236362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 236462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 236562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 236662306a36Sopenharmony_ci .geniv = true, 236762306a36Sopenharmony_ci }, 236862306a36Sopenharmony_ci }, 236962306a36Sopenharmony_ci { 237062306a36Sopenharmony_ci .aead = { 237162306a36Sopenharmony_ci .base = { 237262306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(des))", 237362306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 237462306a36Sopenharmony_ci "cbc-des-caam-qi", 237562306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 237662306a36Sopenharmony_ci }, 237762306a36Sopenharmony_ci .setkey = aead_setkey, 237862306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 237962306a36Sopenharmony_ci .encrypt = aead_encrypt, 238062306a36Sopenharmony_ci .decrypt = aead_decrypt, 238162306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 238262306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 238362306a36Sopenharmony_ci }, 238462306a36Sopenharmony_ci .caam = { 238562306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 238662306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 238762306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 238862306a36Sopenharmony_ci }, 238962306a36Sopenharmony_ci }, 239062306a36Sopenharmony_ci { 239162306a36Sopenharmony_ci .aead = { 239262306a36Sopenharmony_ci .base = { 239362306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 239462306a36Sopenharmony_ci "cbc(des)))", 239562306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 239662306a36Sopenharmony_ci "hmac-sha384-cbc-des-" 239762306a36Sopenharmony_ci "caam-qi", 239862306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 239962306a36Sopenharmony_ci }, 240062306a36Sopenharmony_ci .setkey = aead_setkey, 240162306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 240262306a36Sopenharmony_ci .encrypt = aead_encrypt, 240362306a36Sopenharmony_ci .decrypt = aead_decrypt, 240462306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 240562306a36Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 240662306a36Sopenharmony_ci }, 240762306a36Sopenharmony_ci .caam = { 240862306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 240962306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 241062306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 241162306a36Sopenharmony_ci .geniv = true, 241262306a36Sopenharmony_ci } 241362306a36Sopenharmony_ci }, 241462306a36Sopenharmony_ci { 241562306a36Sopenharmony_ci .aead = { 241662306a36Sopenharmony_ci .base = { 241762306a36Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(des))", 241862306a36Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 241962306a36Sopenharmony_ci "cbc-des-caam-qi", 242062306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 242162306a36Sopenharmony_ci }, 242262306a36Sopenharmony_ci .setkey = aead_setkey, 242362306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 242462306a36Sopenharmony_ci .encrypt = aead_encrypt, 242562306a36Sopenharmony_ci .decrypt = aead_decrypt, 242662306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 242762306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 242862306a36Sopenharmony_ci }, 242962306a36Sopenharmony_ci .caam = { 243062306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 243162306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 243262306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 243362306a36Sopenharmony_ci } 243462306a36Sopenharmony_ci }, 243562306a36Sopenharmony_ci { 243662306a36Sopenharmony_ci .aead = { 243762306a36Sopenharmony_ci .base = { 243862306a36Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 243962306a36Sopenharmony_ci "cbc(des)))", 244062306a36Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 244162306a36Sopenharmony_ci "hmac-sha512-cbc-des-" 244262306a36Sopenharmony_ci "caam-qi", 244362306a36Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 244462306a36Sopenharmony_ci }, 244562306a36Sopenharmony_ci .setkey = aead_setkey, 244662306a36Sopenharmony_ci .setauthsize = aead_setauthsize, 244762306a36Sopenharmony_ci .encrypt = aead_encrypt, 244862306a36Sopenharmony_ci .decrypt = aead_decrypt, 244962306a36Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 245062306a36Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 245162306a36Sopenharmony_ci }, 245262306a36Sopenharmony_ci .caam = { 245362306a36Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 245462306a36Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 245562306a36Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 245662306a36Sopenharmony_ci .geniv = true, 245762306a36Sopenharmony_ci } 245862306a36Sopenharmony_ci }, 245962306a36Sopenharmony_ci}; 246062306a36Sopenharmony_ci 246162306a36Sopenharmony_cistatic int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, 246262306a36Sopenharmony_ci bool uses_dkp) 246362306a36Sopenharmony_ci{ 246462306a36Sopenharmony_ci struct caam_drv_private *priv; 246562306a36Sopenharmony_ci struct device *dev; 246662306a36Sopenharmony_ci 246762306a36Sopenharmony_ci /* 246862306a36Sopenharmony_ci * distribute tfms across job rings to ensure in-order 246962306a36Sopenharmony_ci * crypto request processing per tfm 247062306a36Sopenharmony_ci */ 247162306a36Sopenharmony_ci ctx->jrdev = caam_jr_alloc(); 247262306a36Sopenharmony_ci if (IS_ERR(ctx->jrdev)) { 247362306a36Sopenharmony_ci pr_err("Job Ring Device allocation for transform failed\n"); 247462306a36Sopenharmony_ci return PTR_ERR(ctx->jrdev); 247562306a36Sopenharmony_ci } 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_ci dev = ctx->jrdev->parent; 247862306a36Sopenharmony_ci priv = dev_get_drvdata(dev); 247962306a36Sopenharmony_ci if (priv->era >= 6 && uses_dkp) 248062306a36Sopenharmony_ci ctx->dir = DMA_BIDIRECTIONAL; 248162306a36Sopenharmony_ci else 248262306a36Sopenharmony_ci ctx->dir = DMA_TO_DEVICE; 248362306a36Sopenharmony_ci 248462306a36Sopenharmony_ci ctx->key_dma = dma_map_single(dev, ctx->key, sizeof(ctx->key), 248562306a36Sopenharmony_ci ctx->dir); 248662306a36Sopenharmony_ci if (dma_mapping_error(dev, ctx->key_dma)) { 248762306a36Sopenharmony_ci dev_err(dev, "unable to map key\n"); 248862306a36Sopenharmony_ci caam_jr_free(ctx->jrdev); 248962306a36Sopenharmony_ci return -ENOMEM; 249062306a36Sopenharmony_ci } 249162306a36Sopenharmony_ci 249262306a36Sopenharmony_ci /* copy descriptor header template value */ 249362306a36Sopenharmony_ci ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; 249462306a36Sopenharmony_ci ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; 249562306a36Sopenharmony_ci 249662306a36Sopenharmony_ci ctx->qidev = dev; 249762306a36Sopenharmony_ci 249862306a36Sopenharmony_ci spin_lock_init(&ctx->lock); 249962306a36Sopenharmony_ci ctx->drv_ctx[ENCRYPT] = NULL; 250062306a36Sopenharmony_ci ctx->drv_ctx[DECRYPT] = NULL; 250162306a36Sopenharmony_ci 250262306a36Sopenharmony_ci return 0; 250362306a36Sopenharmony_ci} 250462306a36Sopenharmony_ci 250562306a36Sopenharmony_cistatic int caam_cra_init(struct crypto_skcipher *tfm) 250662306a36Sopenharmony_ci{ 250762306a36Sopenharmony_ci struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 250862306a36Sopenharmony_ci struct caam_skcipher_alg *caam_alg = 250962306a36Sopenharmony_ci container_of(alg, typeof(*caam_alg), skcipher); 251062306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm); 251162306a36Sopenharmony_ci u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 251262306a36Sopenharmony_ci int ret = 0; 251362306a36Sopenharmony_ci 251462306a36Sopenharmony_ci if (alg_aai == OP_ALG_AAI_XTS) { 251562306a36Sopenharmony_ci const char *tfm_name = crypto_tfm_alg_name(&tfm->base); 251662306a36Sopenharmony_ci struct crypto_skcipher *fallback; 251762306a36Sopenharmony_ci 251862306a36Sopenharmony_ci fallback = crypto_alloc_skcipher(tfm_name, 0, 251962306a36Sopenharmony_ci CRYPTO_ALG_NEED_FALLBACK); 252062306a36Sopenharmony_ci if (IS_ERR(fallback)) { 252162306a36Sopenharmony_ci pr_err("Failed to allocate %s fallback: %ld\n", 252262306a36Sopenharmony_ci tfm_name, PTR_ERR(fallback)); 252362306a36Sopenharmony_ci return PTR_ERR(fallback); 252462306a36Sopenharmony_ci } 252562306a36Sopenharmony_ci 252662306a36Sopenharmony_ci ctx->fallback = fallback; 252762306a36Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) + 252862306a36Sopenharmony_ci crypto_skcipher_reqsize(fallback)); 252962306a36Sopenharmony_ci } 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci ret = caam_init_common(ctx, &caam_alg->caam, false); 253262306a36Sopenharmony_ci if (ret && ctx->fallback) 253362306a36Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 253462306a36Sopenharmony_ci 253562306a36Sopenharmony_ci return ret; 253662306a36Sopenharmony_ci} 253762306a36Sopenharmony_ci 253862306a36Sopenharmony_cistatic int caam_aead_init(struct crypto_aead *tfm) 253962306a36Sopenharmony_ci{ 254062306a36Sopenharmony_ci struct aead_alg *alg = crypto_aead_alg(tfm); 254162306a36Sopenharmony_ci struct caam_aead_alg *caam_alg = container_of(alg, typeof(*caam_alg), 254262306a36Sopenharmony_ci aead); 254362306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx_dma(tfm); 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_ci return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp); 254662306a36Sopenharmony_ci} 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx) 254962306a36Sopenharmony_ci{ 255062306a36Sopenharmony_ci caam_drv_ctx_rel(ctx->drv_ctx[ENCRYPT]); 255162306a36Sopenharmony_ci caam_drv_ctx_rel(ctx->drv_ctx[DECRYPT]); 255262306a36Sopenharmony_ci 255362306a36Sopenharmony_ci dma_unmap_single(ctx->jrdev->parent, ctx->key_dma, sizeof(ctx->key), 255462306a36Sopenharmony_ci ctx->dir); 255562306a36Sopenharmony_ci 255662306a36Sopenharmony_ci caam_jr_free(ctx->jrdev); 255762306a36Sopenharmony_ci} 255862306a36Sopenharmony_ci 255962306a36Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm) 256062306a36Sopenharmony_ci{ 256162306a36Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx_dma(tfm); 256262306a36Sopenharmony_ci 256362306a36Sopenharmony_ci if (ctx->fallback) 256462306a36Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 256562306a36Sopenharmony_ci caam_exit_common(ctx); 256662306a36Sopenharmony_ci} 256762306a36Sopenharmony_ci 256862306a36Sopenharmony_cistatic void caam_aead_exit(struct crypto_aead *tfm) 256962306a36Sopenharmony_ci{ 257062306a36Sopenharmony_ci caam_exit_common(crypto_aead_ctx_dma(tfm)); 257162306a36Sopenharmony_ci} 257262306a36Sopenharmony_ci 257362306a36Sopenharmony_civoid caam_qi_algapi_exit(void) 257462306a36Sopenharmony_ci{ 257562306a36Sopenharmony_ci int i; 257662306a36Sopenharmony_ci 257762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 257862306a36Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 257962306a36Sopenharmony_ci 258062306a36Sopenharmony_ci if (t_alg->registered) 258162306a36Sopenharmony_ci crypto_unregister_aead(&t_alg->aead); 258262306a36Sopenharmony_ci } 258362306a36Sopenharmony_ci 258462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 258562306a36Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 258662306a36Sopenharmony_ci 258762306a36Sopenharmony_ci if (t_alg->registered) 258862306a36Sopenharmony_ci crypto_unregister_skcipher(&t_alg->skcipher); 258962306a36Sopenharmony_ci } 259062306a36Sopenharmony_ci} 259162306a36Sopenharmony_ci 259262306a36Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 259362306a36Sopenharmony_ci{ 259462306a36Sopenharmony_ci struct skcipher_alg *alg = &t_alg->skcipher; 259562306a36Sopenharmony_ci 259662306a36Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 259762306a36Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 259862306a36Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding(); 259962306a36Sopenharmony_ci alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 260062306a36Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY); 260162306a36Sopenharmony_ci 260262306a36Sopenharmony_ci alg->init = caam_cra_init; 260362306a36Sopenharmony_ci alg->exit = caam_cra_exit; 260462306a36Sopenharmony_ci} 260562306a36Sopenharmony_ci 260662306a36Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg) 260762306a36Sopenharmony_ci{ 260862306a36Sopenharmony_ci struct aead_alg *alg = &t_alg->aead; 260962306a36Sopenharmony_ci 261062306a36Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 261162306a36Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 261262306a36Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx) + crypto_dma_padding(); 261362306a36Sopenharmony_ci alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 261462306a36Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY; 261562306a36Sopenharmony_ci 261662306a36Sopenharmony_ci alg->init = caam_aead_init; 261762306a36Sopenharmony_ci alg->exit = caam_aead_exit; 261862306a36Sopenharmony_ci} 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ciint caam_qi_algapi_init(struct device *ctrldev) 262162306a36Sopenharmony_ci{ 262262306a36Sopenharmony_ci struct caam_drv_private *priv = dev_get_drvdata(ctrldev); 262362306a36Sopenharmony_ci int i = 0, err = 0; 262462306a36Sopenharmony_ci u32 aes_vid, aes_inst, des_inst, md_vid, md_inst; 262562306a36Sopenharmony_ci unsigned int md_limit = SHA512_DIGEST_SIZE; 262662306a36Sopenharmony_ci bool registered = false; 262762306a36Sopenharmony_ci 262862306a36Sopenharmony_ci /* Make sure this runs only on (DPAA 1.x) QI */ 262962306a36Sopenharmony_ci if (!priv->qi_present || caam_dpaa2) 263062306a36Sopenharmony_ci return 0; 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_ci /* 263362306a36Sopenharmony_ci * Register crypto algorithms the device supports. 263462306a36Sopenharmony_ci * First, detect presence and attributes of DES, AES, and MD blocks. 263562306a36Sopenharmony_ci */ 263662306a36Sopenharmony_ci if (priv->era < 10) { 263762306a36Sopenharmony_ci u32 cha_vid, cha_inst; 263862306a36Sopenharmony_ci 263962306a36Sopenharmony_ci cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls); 264062306a36Sopenharmony_ci aes_vid = cha_vid & CHA_ID_LS_AES_MASK; 264162306a36Sopenharmony_ci md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 264262306a36Sopenharmony_ci 264362306a36Sopenharmony_ci cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls); 264462306a36Sopenharmony_ci des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >> 264562306a36Sopenharmony_ci CHA_ID_LS_DES_SHIFT; 264662306a36Sopenharmony_ci aes_inst = cha_inst & CHA_ID_LS_AES_MASK; 264762306a36Sopenharmony_ci md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 264862306a36Sopenharmony_ci } else { 264962306a36Sopenharmony_ci u32 aesa, mdha; 265062306a36Sopenharmony_ci 265162306a36Sopenharmony_ci aesa = rd_reg32(&priv->ctrl->vreg.aesa); 265262306a36Sopenharmony_ci mdha = rd_reg32(&priv->ctrl->vreg.mdha); 265362306a36Sopenharmony_ci 265462306a36Sopenharmony_ci aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 265562306a36Sopenharmony_ci md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 265662306a36Sopenharmony_ci 265762306a36Sopenharmony_ci des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK; 265862306a36Sopenharmony_ci aes_inst = aesa & CHA_VER_NUM_MASK; 265962306a36Sopenharmony_ci md_inst = mdha & CHA_VER_NUM_MASK; 266062306a36Sopenharmony_ci } 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci /* If MD is present, limit digest size based on LP256 */ 266362306a36Sopenharmony_ci if (md_inst && md_vid == CHA_VER_VID_MD_LP256) 266462306a36Sopenharmony_ci md_limit = SHA256_DIGEST_SIZE; 266562306a36Sopenharmony_ci 266662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 266762306a36Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 266862306a36Sopenharmony_ci u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK; 266962306a36Sopenharmony_ci 267062306a36Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 267162306a36Sopenharmony_ci if (!des_inst && 267262306a36Sopenharmony_ci ((alg_sel == OP_ALG_ALGSEL_3DES) || 267362306a36Sopenharmony_ci (alg_sel == OP_ALG_ALGSEL_DES))) 267462306a36Sopenharmony_ci continue; 267562306a36Sopenharmony_ci 267662306a36Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 267762306a36Sopenharmony_ci if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 267862306a36Sopenharmony_ci continue; 267962306a36Sopenharmony_ci 268062306a36Sopenharmony_ci caam_skcipher_alg_init(t_alg); 268162306a36Sopenharmony_ci 268262306a36Sopenharmony_ci err = crypto_register_skcipher(&t_alg->skcipher); 268362306a36Sopenharmony_ci if (err) { 268462306a36Sopenharmony_ci dev_warn(ctrldev, "%s alg registration failed\n", 268562306a36Sopenharmony_ci t_alg->skcipher.base.cra_driver_name); 268662306a36Sopenharmony_ci continue; 268762306a36Sopenharmony_ci } 268862306a36Sopenharmony_ci 268962306a36Sopenharmony_ci t_alg->registered = true; 269062306a36Sopenharmony_ci registered = true; 269162306a36Sopenharmony_ci } 269262306a36Sopenharmony_ci 269362306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 269462306a36Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 269562306a36Sopenharmony_ci u32 c1_alg_sel = t_alg->caam.class1_alg_type & 269662306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK; 269762306a36Sopenharmony_ci u32 c2_alg_sel = t_alg->caam.class2_alg_type & 269862306a36Sopenharmony_ci OP_ALG_ALGSEL_MASK; 269962306a36Sopenharmony_ci u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 270062306a36Sopenharmony_ci 270162306a36Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 270262306a36Sopenharmony_ci if (!des_inst && 270362306a36Sopenharmony_ci ((c1_alg_sel == OP_ALG_ALGSEL_3DES) || 270462306a36Sopenharmony_ci (c1_alg_sel == OP_ALG_ALGSEL_DES))) 270562306a36Sopenharmony_ci continue; 270662306a36Sopenharmony_ci 270762306a36Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 270862306a36Sopenharmony_ci if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES)) 270962306a36Sopenharmony_ci continue; 271062306a36Sopenharmony_ci 271162306a36Sopenharmony_ci /* 271262306a36Sopenharmony_ci * Check support for AES algorithms not available 271362306a36Sopenharmony_ci * on LP devices. 271462306a36Sopenharmony_ci */ 271562306a36Sopenharmony_ci if (aes_vid == CHA_VER_VID_AES_LP && alg_aai == OP_ALG_AAI_GCM) 271662306a36Sopenharmony_ci continue; 271762306a36Sopenharmony_ci 271862306a36Sopenharmony_ci /* 271962306a36Sopenharmony_ci * Skip algorithms requiring message digests 272062306a36Sopenharmony_ci * if MD or MD size is not supported by device. 272162306a36Sopenharmony_ci */ 272262306a36Sopenharmony_ci if (c2_alg_sel && 272362306a36Sopenharmony_ci (!md_inst || (t_alg->aead.maxauthsize > md_limit))) 272462306a36Sopenharmony_ci continue; 272562306a36Sopenharmony_ci 272662306a36Sopenharmony_ci caam_aead_alg_init(t_alg); 272762306a36Sopenharmony_ci 272862306a36Sopenharmony_ci err = crypto_register_aead(&t_alg->aead); 272962306a36Sopenharmony_ci if (err) { 273062306a36Sopenharmony_ci pr_warn("%s alg registration failed\n", 273162306a36Sopenharmony_ci t_alg->aead.base.cra_driver_name); 273262306a36Sopenharmony_ci continue; 273362306a36Sopenharmony_ci } 273462306a36Sopenharmony_ci 273562306a36Sopenharmony_ci t_alg->registered = true; 273662306a36Sopenharmony_ci registered = true; 273762306a36Sopenharmony_ci } 273862306a36Sopenharmony_ci 273962306a36Sopenharmony_ci if (registered) 274062306a36Sopenharmony_ci dev_info(ctrldev, "algorithms registered in /proc/crypto\n"); 274162306a36Sopenharmony_ci 274262306a36Sopenharmony_ci return err; 274362306a36Sopenharmony_ci} 2744