18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * caam - Freescale FSL CAAM support for crypto API 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2008-2011 Freescale Semiconductor, Inc. 68c2ecf20Sopenharmony_ci * Copyright 2016-2019 NXP 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Based on talitos crypto API driver. 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008): 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * --------------- --------------- 138c2ecf20Sopenharmony_ci * | JobDesc #1 |-------------------->| ShareDesc | 148c2ecf20Sopenharmony_ci * | *(packet 1) | | (PDB) | 158c2ecf20Sopenharmony_ci * --------------- |------------->| (hashKey) | 168c2ecf20Sopenharmony_ci * . | | (cipherKey) | 178c2ecf20Sopenharmony_ci * . | |-------->| (operation) | 188c2ecf20Sopenharmony_ci * --------------- | | --------------- 198c2ecf20Sopenharmony_ci * | JobDesc #2 |------| | 208c2ecf20Sopenharmony_ci * | *(packet 2) | | 218c2ecf20Sopenharmony_ci * --------------- | 228c2ecf20Sopenharmony_ci * . | 238c2ecf20Sopenharmony_ci * . | 248c2ecf20Sopenharmony_ci * --------------- | 258c2ecf20Sopenharmony_ci * | JobDesc #3 |------------ 268c2ecf20Sopenharmony_ci * | *(packet 3) | 278c2ecf20Sopenharmony_ci * --------------- 288c2ecf20Sopenharmony_ci * 298c2ecf20Sopenharmony_ci * The SharedDesc never changes for a connection unless rekeyed, but 308c2ecf20Sopenharmony_ci * each packet will likely be in a different place. So all we need 318c2ecf20Sopenharmony_ci * to know to process the packet is where the input is, where the 328c2ecf20Sopenharmony_ci * output goes, and what context we want to process with. Context is 338c2ecf20Sopenharmony_ci * in the SharedDesc, packet references in the JobDesc. 348c2ecf20Sopenharmony_ci * 358c2ecf20Sopenharmony_ci * So, a job desc looks like: 368c2ecf20Sopenharmony_ci * 378c2ecf20Sopenharmony_ci * --------------------- 388c2ecf20Sopenharmony_ci * | Header | 398c2ecf20Sopenharmony_ci * | ShareDesc Pointer | 408c2ecf20Sopenharmony_ci * | SEQ_OUT_PTR | 418c2ecf20Sopenharmony_ci * | (output buffer) | 428c2ecf20Sopenharmony_ci * | (output length) | 438c2ecf20Sopenharmony_ci * | SEQ_IN_PTR | 448c2ecf20Sopenharmony_ci * | (input buffer) | 458c2ecf20Sopenharmony_ci * | (input length) | 468c2ecf20Sopenharmony_ci * --------------------- 478c2ecf20Sopenharmony_ci */ 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#include "compat.h" 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#include "regs.h" 528c2ecf20Sopenharmony_ci#include "intern.h" 538c2ecf20Sopenharmony_ci#include "desc_constr.h" 548c2ecf20Sopenharmony_ci#include "jr.h" 558c2ecf20Sopenharmony_ci#include "error.h" 568c2ecf20Sopenharmony_ci#include "sg_sw_sec4.h" 578c2ecf20Sopenharmony_ci#include "key_gen.h" 588c2ecf20Sopenharmony_ci#include "caamalg_desc.h" 598c2ecf20Sopenharmony_ci#include <crypto/engine.h> 608c2ecf20Sopenharmony_ci#include <crypto/xts.h> 618c2ecf20Sopenharmony_ci#include <asm/unaligned.h> 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/* 648c2ecf20Sopenharmony_ci * crypto alg 658c2ecf20Sopenharmony_ci */ 668c2ecf20Sopenharmony_ci#define CAAM_CRA_PRIORITY 3000 678c2ecf20Sopenharmony_ci/* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 688c2ecf20Sopenharmony_ci#define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 698c2ecf20Sopenharmony_ci CTR_RFC3686_NONCE_SIZE + \ 708c2ecf20Sopenharmony_ci SHA512_DIGEST_SIZE * 2) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define AEAD_DESC_JOB_IO_LEN (DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2) 738c2ecf20Sopenharmony_ci#define GCM_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 748c2ecf20Sopenharmony_ci CAAM_CMD_SZ * 4) 758c2ecf20Sopenharmony_ci#define AUTHENC_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 768c2ecf20Sopenharmony_ci CAAM_CMD_SZ * 5) 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci#define CHACHAPOLY_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + CAAM_CMD_SZ * 6) 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci#define DESC_MAX_USED_BYTES (CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN_MIN) 818c2ecf20Sopenharmony_ci#define DESC_MAX_USED_LEN (DESC_MAX_USED_BYTES / CAAM_CMD_SZ) 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistruct caam_alg_entry { 848c2ecf20Sopenharmony_ci int class1_alg_type; 858c2ecf20Sopenharmony_ci int class2_alg_type; 868c2ecf20Sopenharmony_ci bool rfc3686; 878c2ecf20Sopenharmony_ci bool geniv; 888c2ecf20Sopenharmony_ci bool nodkp; 898c2ecf20Sopenharmony_ci}; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistruct caam_aead_alg { 928c2ecf20Sopenharmony_ci struct aead_alg aead; 938c2ecf20Sopenharmony_ci struct caam_alg_entry caam; 948c2ecf20Sopenharmony_ci bool registered; 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistruct caam_skcipher_alg { 988c2ecf20Sopenharmony_ci struct skcipher_alg skcipher; 998c2ecf20Sopenharmony_ci struct caam_alg_entry caam; 1008c2ecf20Sopenharmony_ci bool registered; 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci/* 1048c2ecf20Sopenharmony_ci * per-session context 1058c2ecf20Sopenharmony_ci */ 1068c2ecf20Sopenharmony_cistruct caam_ctx { 1078c2ecf20Sopenharmony_ci struct crypto_engine_ctx enginectx; 1088c2ecf20Sopenharmony_ci u32 sh_desc_enc[DESC_MAX_USED_LEN]; 1098c2ecf20Sopenharmony_ci u32 sh_desc_dec[DESC_MAX_USED_LEN]; 1108c2ecf20Sopenharmony_ci u8 key[CAAM_MAX_KEY_SIZE]; 1118c2ecf20Sopenharmony_ci dma_addr_t sh_desc_enc_dma; 1128c2ecf20Sopenharmony_ci dma_addr_t sh_desc_dec_dma; 1138c2ecf20Sopenharmony_ci dma_addr_t key_dma; 1148c2ecf20Sopenharmony_ci enum dma_data_direction dir; 1158c2ecf20Sopenharmony_ci struct device *jrdev; 1168c2ecf20Sopenharmony_ci struct alginfo adata; 1178c2ecf20Sopenharmony_ci struct alginfo cdata; 1188c2ecf20Sopenharmony_ci unsigned int authsize; 1198c2ecf20Sopenharmony_ci bool xts_key_fallback; 1208c2ecf20Sopenharmony_ci struct crypto_skcipher *fallback; 1218c2ecf20Sopenharmony_ci}; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cistruct caam_skcipher_req_ctx { 1248c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 1258c2ecf20Sopenharmony_ci struct skcipher_request fallback_req; 1268c2ecf20Sopenharmony_ci}; 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_cistruct caam_aead_req_ctx { 1298c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistatic int aead_null_set_sh_desc(struct crypto_aead *aead) 1338c2ecf20Sopenharmony_ci{ 1348c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 1358c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 1368c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 1378c2ecf20Sopenharmony_ci u32 *desc; 1388c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - AEAD_DESC_JOB_IO_LEN - 1398c2ecf20Sopenharmony_ci ctx->adata.keylen_pad; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci /* 1428c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 1438c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 1448c2ecf20Sopenharmony_ci */ 1458c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_AEAD_NULL_ENC_LEN) { 1468c2ecf20Sopenharmony_ci ctx->adata.key_inline = true; 1478c2ecf20Sopenharmony_ci ctx->adata.key_virt = ctx->key; 1488c2ecf20Sopenharmony_ci } else { 1498c2ecf20Sopenharmony_ci ctx->adata.key_inline = false; 1508c2ecf20Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 1518c2ecf20Sopenharmony_ci } 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci /* aead_encrypt shared descriptor */ 1548c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 1558c2ecf20Sopenharmony_ci cnstr_shdsc_aead_null_encap(desc, &ctx->adata, ctx->authsize, 1568c2ecf20Sopenharmony_ci ctrlpriv->era); 1578c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 1588c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci /* 1618c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 1628c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 1638c2ecf20Sopenharmony_ci */ 1648c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_AEAD_NULL_DEC_LEN) { 1658c2ecf20Sopenharmony_ci ctx->adata.key_inline = true; 1668c2ecf20Sopenharmony_ci ctx->adata.key_virt = ctx->key; 1678c2ecf20Sopenharmony_ci } else { 1688c2ecf20Sopenharmony_ci ctx->adata.key_inline = false; 1698c2ecf20Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 1708c2ecf20Sopenharmony_ci } 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_ci /* aead_decrypt shared descriptor */ 1738c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 1748c2ecf20Sopenharmony_ci cnstr_shdsc_aead_null_decap(desc, &ctx->adata, ctx->authsize, 1758c2ecf20Sopenharmony_ci ctrlpriv->era); 1768c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 1778c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci return 0; 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_cistatic int aead_set_sh_desc(struct crypto_aead *aead) 1838c2ecf20Sopenharmony_ci{ 1848c2ecf20Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 1858c2ecf20Sopenharmony_ci struct caam_aead_alg, aead); 1868c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 1878c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 1888c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 1898c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 1908c2ecf20Sopenharmony_ci u32 ctx1_iv_off = 0; 1918c2ecf20Sopenharmony_ci u32 *desc, *nonce = NULL; 1928c2ecf20Sopenharmony_ci u32 inl_mask; 1938c2ecf20Sopenharmony_ci unsigned int data_len[2]; 1948c2ecf20Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 1958c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 1968c2ecf20Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci if (!ctx->authsize) 1998c2ecf20Sopenharmony_ci return 0; 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci /* NULL encryption / decryption */ 2028c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen) 2038c2ecf20Sopenharmony_ci return aead_null_set_sh_desc(aead); 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci /* 2068c2ecf20Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 2078c2ecf20Sopenharmony_ci * at an offset of 128bits (16bytes) 2088c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = IV 2098c2ecf20Sopenharmony_ci */ 2108c2ecf20Sopenharmony_ci if (ctr_mode) 2118c2ecf20Sopenharmony_ci ctx1_iv_off = 16; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci /* 2148c2ecf20Sopenharmony_ci * RFC3686 specific: 2158c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 2168c2ecf20Sopenharmony_ci */ 2178c2ecf20Sopenharmony_ci if (is_rfc3686) { 2188c2ecf20Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 2198c2ecf20Sopenharmony_ci nonce = (u32 *)((void *)ctx->key + ctx->adata.keylen_pad + 2208c2ecf20Sopenharmony_ci ctx->cdata.keylen - CTR_RFC3686_NONCE_SIZE); 2218c2ecf20Sopenharmony_ci } 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci /* 2248c2ecf20Sopenharmony_ci * In case |user key| > |derived key|, using DKP<imm,imm> 2258c2ecf20Sopenharmony_ci * would result in invalid opcodes (last bytes of user key) in 2268c2ecf20Sopenharmony_ci * the resulting descriptor. Use DKP<ptr,imm> instead => both 2278c2ecf20Sopenharmony_ci * virtual and dma key addresses are needed. 2288c2ecf20Sopenharmony_ci */ 2298c2ecf20Sopenharmony_ci ctx->adata.key_virt = ctx->key; 2308c2ecf20Sopenharmony_ci ctx->adata.key_dma = ctx->key_dma; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key + ctx->adata.keylen_pad; 2338c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma + ctx->adata.keylen_pad; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci data_len[0] = ctx->adata.keylen_pad; 2368c2ecf20Sopenharmony_ci data_len[1] = ctx->cdata.keylen; 2378c2ecf20Sopenharmony_ci 2388c2ecf20Sopenharmony_ci if (alg->caam.geniv) 2398c2ecf20Sopenharmony_ci goto skip_enc; 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci /* 2428c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 2438c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 2448c2ecf20Sopenharmony_ci */ 2458c2ecf20Sopenharmony_ci if (desc_inline_query(DESC_AEAD_ENC_LEN + 2468c2ecf20Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 2478c2ecf20Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 2488c2ecf20Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 2498c2ecf20Sopenharmony_ci return -EINVAL; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 2528c2ecf20Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci /* aead_encrypt shared descriptor */ 2558c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 2568c2ecf20Sopenharmony_ci cnstr_shdsc_aead_encap(desc, &ctx->cdata, &ctx->adata, ivsize, 2578c2ecf20Sopenharmony_ci ctx->authsize, is_rfc3686, nonce, ctx1_iv_off, 2588c2ecf20Sopenharmony_ci false, ctrlpriv->era); 2598c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 2608c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ciskip_enc: 2638c2ecf20Sopenharmony_ci /* 2648c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 2658c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 2668c2ecf20Sopenharmony_ci */ 2678c2ecf20Sopenharmony_ci if (desc_inline_query(DESC_AEAD_DEC_LEN + 2688c2ecf20Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 2698c2ecf20Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 2708c2ecf20Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 2718c2ecf20Sopenharmony_ci return -EINVAL; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 2748c2ecf20Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci /* aead_decrypt shared descriptor */ 2778c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 2788c2ecf20Sopenharmony_ci cnstr_shdsc_aead_decap(desc, &ctx->cdata, &ctx->adata, ivsize, 2798c2ecf20Sopenharmony_ci ctx->authsize, alg->caam.geniv, is_rfc3686, 2808c2ecf20Sopenharmony_ci nonce, ctx1_iv_off, false, ctrlpriv->era); 2818c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 2828c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci if (!alg->caam.geniv) 2858c2ecf20Sopenharmony_ci goto skip_givenc; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci /* 2888c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 2898c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 2908c2ecf20Sopenharmony_ci */ 2918c2ecf20Sopenharmony_ci if (desc_inline_query(DESC_AEAD_GIVENC_LEN + 2928c2ecf20Sopenharmony_ci (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0), 2938c2ecf20Sopenharmony_ci AUTHENC_DESC_JOB_IO_LEN, data_len, &inl_mask, 2948c2ecf20Sopenharmony_ci ARRAY_SIZE(data_len)) < 0) 2958c2ecf20Sopenharmony_ci return -EINVAL; 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci ctx->adata.key_inline = !!(inl_mask & 1); 2988c2ecf20Sopenharmony_ci ctx->cdata.key_inline = !!(inl_mask & 2); 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci /* aead_givencrypt shared descriptor */ 3018c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 3028c2ecf20Sopenharmony_ci cnstr_shdsc_aead_givencap(desc, &ctx->cdata, &ctx->adata, ivsize, 3038c2ecf20Sopenharmony_ci ctx->authsize, is_rfc3686, nonce, 3048c2ecf20Sopenharmony_ci ctx1_iv_off, false, ctrlpriv->era); 3058c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 3068c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ciskip_givenc: 3098c2ecf20Sopenharmony_ci return 0; 3108c2ecf20Sopenharmony_ci} 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistatic int aead_setauthsize(struct crypto_aead *authenc, 3138c2ecf20Sopenharmony_ci unsigned int authsize) 3148c2ecf20Sopenharmony_ci{ 3158c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci ctx->authsize = authsize; 3188c2ecf20Sopenharmony_ci aead_set_sh_desc(authenc); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci return 0; 3218c2ecf20Sopenharmony_ci} 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_cistatic int gcm_set_sh_desc(struct crypto_aead *aead) 3248c2ecf20Sopenharmony_ci{ 3258c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 3268c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 3278c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 3288c2ecf20Sopenharmony_ci u32 *desc; 3298c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 3308c2ecf20Sopenharmony_ci ctx->cdata.keylen; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 3338c2ecf20Sopenharmony_ci return 0; 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci /* 3368c2ecf20Sopenharmony_ci * AES GCM encrypt shared descriptor 3378c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 3388c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 3398c2ecf20Sopenharmony_ci */ 3408c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_GCM_ENC_LEN) { 3418c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 3428c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 3438c2ecf20Sopenharmony_ci } else { 3448c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 3458c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 3468c2ecf20Sopenharmony_ci } 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 3498c2ecf20Sopenharmony_ci cnstr_shdsc_gcm_encap(desc, &ctx->cdata, ivsize, ctx->authsize, false); 3508c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 3518c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci /* 3548c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 3558c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 3568c2ecf20Sopenharmony_ci */ 3578c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_GCM_DEC_LEN) { 3588c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 3598c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 3608c2ecf20Sopenharmony_ci } else { 3618c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 3628c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 3638c2ecf20Sopenharmony_ci } 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 3668c2ecf20Sopenharmony_ci cnstr_shdsc_gcm_decap(desc, &ctx->cdata, ivsize, ctx->authsize, false); 3678c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 3688c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 3698c2ecf20Sopenharmony_ci 3708c2ecf20Sopenharmony_ci return 0; 3718c2ecf20Sopenharmony_ci} 3728c2ecf20Sopenharmony_ci 3738c2ecf20Sopenharmony_cistatic int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 3748c2ecf20Sopenharmony_ci{ 3758c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 3768c2ecf20Sopenharmony_ci int err; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci err = crypto_gcm_check_authsize(authsize); 3798c2ecf20Sopenharmony_ci if (err) 3808c2ecf20Sopenharmony_ci return err; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci ctx->authsize = authsize; 3838c2ecf20Sopenharmony_ci gcm_set_sh_desc(authenc); 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci return 0; 3868c2ecf20Sopenharmony_ci} 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistatic int rfc4106_set_sh_desc(struct crypto_aead *aead) 3898c2ecf20Sopenharmony_ci{ 3908c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 3918c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 3928c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 3938c2ecf20Sopenharmony_ci u32 *desc; 3948c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 3958c2ecf20Sopenharmony_ci ctx->cdata.keylen; 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 3988c2ecf20Sopenharmony_ci return 0; 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci /* 4018c2ecf20Sopenharmony_ci * RFC4106 encrypt shared descriptor 4028c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 4038c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 4048c2ecf20Sopenharmony_ci */ 4058c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_RFC4106_ENC_LEN) { 4068c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 4078c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 4088c2ecf20Sopenharmony_ci } else { 4098c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 4108c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 4118c2ecf20Sopenharmony_ci } 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 4148c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4106_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 4158c2ecf20Sopenharmony_ci false); 4168c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 4178c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_ci /* 4208c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 4218c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 4228c2ecf20Sopenharmony_ci */ 4238c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_RFC4106_DEC_LEN) { 4248c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 4258c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 4268c2ecf20Sopenharmony_ci } else { 4278c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 4288c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 4298c2ecf20Sopenharmony_ci } 4308c2ecf20Sopenharmony_ci 4318c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 4328c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4106_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 4338c2ecf20Sopenharmony_ci false); 4348c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 4358c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci return 0; 4388c2ecf20Sopenharmony_ci} 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_cistatic int rfc4106_setauthsize(struct crypto_aead *authenc, 4418c2ecf20Sopenharmony_ci unsigned int authsize) 4428c2ecf20Sopenharmony_ci{ 4438c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 4448c2ecf20Sopenharmony_ci int err; 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ci err = crypto_rfc4106_check_authsize(authsize); 4478c2ecf20Sopenharmony_ci if (err) 4488c2ecf20Sopenharmony_ci return err; 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_ci ctx->authsize = authsize; 4518c2ecf20Sopenharmony_ci rfc4106_set_sh_desc(authenc); 4528c2ecf20Sopenharmony_ci 4538c2ecf20Sopenharmony_ci return 0; 4548c2ecf20Sopenharmony_ci} 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_cistatic int rfc4543_set_sh_desc(struct crypto_aead *aead) 4578c2ecf20Sopenharmony_ci{ 4588c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 4598c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 4608c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 4618c2ecf20Sopenharmony_ci u32 *desc; 4628c2ecf20Sopenharmony_ci int rem_bytes = CAAM_DESC_BYTES_MAX - GCM_DESC_JOB_IO_LEN - 4638c2ecf20Sopenharmony_ci ctx->cdata.keylen; 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 4668c2ecf20Sopenharmony_ci return 0; 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_ci /* 4698c2ecf20Sopenharmony_ci * RFC4543 encrypt shared descriptor 4708c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptor 4718c2ecf20Sopenharmony_ci * must fit into the 64-word Descriptor h/w Buffer 4728c2ecf20Sopenharmony_ci */ 4738c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_RFC4543_ENC_LEN) { 4748c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 4758c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 4768c2ecf20Sopenharmony_ci } else { 4778c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 4788c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 4798c2ecf20Sopenharmony_ci } 4808c2ecf20Sopenharmony_ci 4818c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 4828c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4543_encap(desc, &ctx->cdata, ivsize, ctx->authsize, 4838c2ecf20Sopenharmony_ci false); 4848c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 4858c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_ci /* 4888c2ecf20Sopenharmony_ci * Job Descriptor and Shared Descriptors 4898c2ecf20Sopenharmony_ci * must all fit into the 64-word Descriptor h/w Buffer 4908c2ecf20Sopenharmony_ci */ 4918c2ecf20Sopenharmony_ci if (rem_bytes >= DESC_RFC4543_DEC_LEN) { 4928c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 4938c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 4948c2ecf20Sopenharmony_ci } else { 4958c2ecf20Sopenharmony_ci ctx->cdata.key_inline = false; 4968c2ecf20Sopenharmony_ci ctx->cdata.key_dma = ctx->key_dma; 4978c2ecf20Sopenharmony_ci } 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 5008c2ecf20Sopenharmony_ci cnstr_shdsc_rfc4543_decap(desc, &ctx->cdata, ivsize, ctx->authsize, 5018c2ecf20Sopenharmony_ci false); 5028c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 5038c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 5048c2ecf20Sopenharmony_ci 5058c2ecf20Sopenharmony_ci return 0; 5068c2ecf20Sopenharmony_ci} 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_cistatic int rfc4543_setauthsize(struct crypto_aead *authenc, 5098c2ecf20Sopenharmony_ci unsigned int authsize) 5108c2ecf20Sopenharmony_ci{ 5118c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(authenc); 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci if (authsize != 16) 5148c2ecf20Sopenharmony_ci return -EINVAL; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci ctx->authsize = authsize; 5178c2ecf20Sopenharmony_ci rfc4543_set_sh_desc(authenc); 5188c2ecf20Sopenharmony_ci 5198c2ecf20Sopenharmony_ci return 0; 5208c2ecf20Sopenharmony_ci} 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_cistatic int chachapoly_set_sh_desc(struct crypto_aead *aead) 5238c2ecf20Sopenharmony_ci{ 5248c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 5258c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 5268c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 5278c2ecf20Sopenharmony_ci u32 *desc; 5288c2ecf20Sopenharmony_ci 5298c2ecf20Sopenharmony_ci if (!ctx->cdata.keylen || !ctx->authsize) 5308c2ecf20Sopenharmony_ci return 0; 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 5338c2ecf20Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 5348c2ecf20Sopenharmony_ci ctx->authsize, true, false); 5358c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 5368c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 5378c2ecf20Sopenharmony_ci 5388c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 5398c2ecf20Sopenharmony_ci cnstr_shdsc_chachapoly(desc, &ctx->cdata, &ctx->adata, ivsize, 5408c2ecf20Sopenharmony_ci ctx->authsize, false, false); 5418c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 5428c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 5438c2ecf20Sopenharmony_ci 5448c2ecf20Sopenharmony_ci return 0; 5458c2ecf20Sopenharmony_ci} 5468c2ecf20Sopenharmony_ci 5478c2ecf20Sopenharmony_cistatic int chachapoly_setauthsize(struct crypto_aead *aead, 5488c2ecf20Sopenharmony_ci unsigned int authsize) 5498c2ecf20Sopenharmony_ci{ 5508c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 5518c2ecf20Sopenharmony_ci 5528c2ecf20Sopenharmony_ci if (authsize != POLY1305_DIGEST_SIZE) 5538c2ecf20Sopenharmony_ci return -EINVAL; 5548c2ecf20Sopenharmony_ci 5558c2ecf20Sopenharmony_ci ctx->authsize = authsize; 5568c2ecf20Sopenharmony_ci return chachapoly_set_sh_desc(aead); 5578c2ecf20Sopenharmony_ci} 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_cistatic int chachapoly_setkey(struct crypto_aead *aead, const u8 *key, 5608c2ecf20Sopenharmony_ci unsigned int keylen) 5618c2ecf20Sopenharmony_ci{ 5628c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 5638c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 5648c2ecf20Sopenharmony_ci unsigned int saltlen = CHACHAPOLY_IV_SIZE - ivsize; 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_ci if (keylen != CHACHA_KEY_SIZE + saltlen) 5678c2ecf20Sopenharmony_ci return -EINVAL; 5688c2ecf20Sopenharmony_ci 5698c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 5708c2ecf20Sopenharmony_ci ctx->cdata.key_virt = ctx->key; 5718c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - saltlen; 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci return chachapoly_set_sh_desc(aead); 5748c2ecf20Sopenharmony_ci} 5758c2ecf20Sopenharmony_ci 5768c2ecf20Sopenharmony_cistatic int aead_setkey(struct crypto_aead *aead, 5778c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 5788c2ecf20Sopenharmony_ci{ 5798c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 5808c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 5818c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 5828c2ecf20Sopenharmony_ci struct crypto_authenc_keys keys; 5838c2ecf20Sopenharmony_ci int ret = 0; 5848c2ecf20Sopenharmony_ci 5858c2ecf20Sopenharmony_ci if (crypto_authenc_extractkeys(&keys, key, keylen) != 0) 5868c2ecf20Sopenharmony_ci goto badkey; 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_ci dev_dbg(jrdev, "keylen %d enckeylen %d authkeylen %d\n", 5898c2ecf20Sopenharmony_ci keys.authkeylen + keys.enckeylen, keys.enckeylen, 5908c2ecf20Sopenharmony_ci keys.authkeylen); 5918c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 5928c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_ci /* 5958c2ecf20Sopenharmony_ci * If DKP is supported, use it in the shared descriptor to generate 5968c2ecf20Sopenharmony_ci * the split key. 5978c2ecf20Sopenharmony_ci */ 5988c2ecf20Sopenharmony_ci if (ctrlpriv->era >= 6) { 5998c2ecf20Sopenharmony_ci ctx->adata.keylen = keys.authkeylen; 6008c2ecf20Sopenharmony_ci ctx->adata.keylen_pad = split_key_len(ctx->adata.algtype & 6018c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK); 6028c2ecf20Sopenharmony_ci 6038c2ecf20Sopenharmony_ci if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE) 6048c2ecf20Sopenharmony_ci goto badkey; 6058c2ecf20Sopenharmony_ci 6068c2ecf20Sopenharmony_ci memcpy(ctx->key, keys.authkey, keys.authkeylen); 6078c2ecf20Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, 6088c2ecf20Sopenharmony_ci keys.enckeylen); 6098c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, 6108c2ecf20Sopenharmony_ci ctx->adata.keylen_pad + 6118c2ecf20Sopenharmony_ci keys.enckeylen, ctx->dir); 6128c2ecf20Sopenharmony_ci goto skip_split_key; 6138c2ecf20Sopenharmony_ci } 6148c2ecf20Sopenharmony_ci 6158c2ecf20Sopenharmony_ci ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey, 6168c2ecf20Sopenharmony_ci keys.authkeylen, CAAM_MAX_KEY_SIZE - 6178c2ecf20Sopenharmony_ci keys.enckeylen); 6188c2ecf20Sopenharmony_ci if (ret) { 6198c2ecf20Sopenharmony_ci goto badkey; 6208c2ecf20Sopenharmony_ci } 6218c2ecf20Sopenharmony_ci 6228c2ecf20Sopenharmony_ci /* postpend encryption key to auth split key */ 6238c2ecf20Sopenharmony_ci memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen); 6248c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad + 6258c2ecf20Sopenharmony_ci keys.enckeylen, ctx->dir); 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_ci print_hex_dump_debug("ctx.key@"__stringify(__LINE__)": ", 6288c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, 6298c2ecf20Sopenharmony_ci ctx->adata.keylen_pad + keys.enckeylen, 1); 6308c2ecf20Sopenharmony_ci 6318c2ecf20Sopenharmony_ciskip_split_key: 6328c2ecf20Sopenharmony_ci ctx->cdata.keylen = keys.enckeylen; 6338c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 6348c2ecf20Sopenharmony_ci return aead_set_sh_desc(aead); 6358c2ecf20Sopenharmony_cibadkey: 6368c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 6378c2ecf20Sopenharmony_ci return -EINVAL; 6388c2ecf20Sopenharmony_ci} 6398c2ecf20Sopenharmony_ci 6408c2ecf20Sopenharmony_cistatic int des3_aead_setkey(struct crypto_aead *aead, const u8 *key, 6418c2ecf20Sopenharmony_ci unsigned int keylen) 6428c2ecf20Sopenharmony_ci{ 6438c2ecf20Sopenharmony_ci struct crypto_authenc_keys keys; 6448c2ecf20Sopenharmony_ci int err; 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_ci err = crypto_authenc_extractkeys(&keys, key, keylen); 6478c2ecf20Sopenharmony_ci if (unlikely(err)) 6488c2ecf20Sopenharmony_ci return err; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci err = verify_aead_des3_key(aead, keys.enckey, keys.enckeylen) ?: 6518c2ecf20Sopenharmony_ci aead_setkey(aead, key, keylen); 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci memzero_explicit(&keys, sizeof(keys)); 6548c2ecf20Sopenharmony_ci return err; 6558c2ecf20Sopenharmony_ci} 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_cistatic int gcm_setkey(struct crypto_aead *aead, 6588c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 6598c2ecf20Sopenharmony_ci{ 6608c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 6618c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 6628c2ecf20Sopenharmony_ci int err; 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 6658c2ecf20Sopenharmony_ci if (err) 6668c2ecf20Sopenharmony_ci return err; 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 6698c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 6708c2ecf20Sopenharmony_ci 6718c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 6728c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir); 6738c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_ci return gcm_set_sh_desc(aead); 6768c2ecf20Sopenharmony_ci} 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_cistatic int rfc4106_setkey(struct crypto_aead *aead, 6798c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 6808c2ecf20Sopenharmony_ci{ 6818c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 6828c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 6838c2ecf20Sopenharmony_ci int err; 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen - 4); 6868c2ecf20Sopenharmony_ci if (err) 6878c2ecf20Sopenharmony_ci return err; 6888c2ecf20Sopenharmony_ci 6898c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 6908c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 6918c2ecf20Sopenharmony_ci 6928c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_ci /* 6958c2ecf20Sopenharmony_ci * The last four bytes of the key material are used as the salt value 6968c2ecf20Sopenharmony_ci * in the nonce. Update the AES key length. 6978c2ecf20Sopenharmony_ci */ 6988c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 6998c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, 7008c2ecf20Sopenharmony_ci ctx->dir); 7018c2ecf20Sopenharmony_ci return rfc4106_set_sh_desc(aead); 7028c2ecf20Sopenharmony_ci} 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_cistatic int rfc4543_setkey(struct crypto_aead *aead, 7058c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 7068c2ecf20Sopenharmony_ci{ 7078c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 7088c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 7098c2ecf20Sopenharmony_ci int err; 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen - 4); 7128c2ecf20Sopenharmony_ci if (err) 7138c2ecf20Sopenharmony_ci return err; 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 7168c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci memcpy(ctx->key, key, keylen); 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_ci /* 7218c2ecf20Sopenharmony_ci * The last four bytes of the key material are used as the salt value 7228c2ecf20Sopenharmony_ci * in the nonce. Update the AES key length. 7238c2ecf20Sopenharmony_ci */ 7248c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen - 4; 7258c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, 7268c2ecf20Sopenharmony_ci ctx->dir); 7278c2ecf20Sopenharmony_ci return rfc4543_set_sh_desc(aead); 7288c2ecf20Sopenharmony_ci} 7298c2ecf20Sopenharmony_ci 7308c2ecf20Sopenharmony_cistatic int skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 7318c2ecf20Sopenharmony_ci unsigned int keylen, const u32 ctx1_iv_off) 7328c2ecf20Sopenharmony_ci{ 7338c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 7348c2ecf20Sopenharmony_ci struct caam_skcipher_alg *alg = 7358c2ecf20Sopenharmony_ci container_of(crypto_skcipher_alg(skcipher), typeof(*alg), 7368c2ecf20Sopenharmony_ci skcipher); 7378c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 7388c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 7398c2ecf20Sopenharmony_ci u32 *desc; 7408c2ecf20Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_ci print_hex_dump_debug("key in @"__stringify(__LINE__)": ", 7438c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 7448c2ecf20Sopenharmony_ci 7458c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 7468c2ecf20Sopenharmony_ci ctx->cdata.key_virt = key; 7478c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci /* skcipher_encrypt shared descriptor */ 7508c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 7518c2ecf20Sopenharmony_ci cnstr_shdsc_skcipher_encap(desc, &ctx->cdata, ivsize, is_rfc3686, 7528c2ecf20Sopenharmony_ci ctx1_iv_off); 7538c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 7548c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 7558c2ecf20Sopenharmony_ci 7568c2ecf20Sopenharmony_ci /* skcipher_decrypt shared descriptor */ 7578c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 7588c2ecf20Sopenharmony_ci cnstr_shdsc_skcipher_decap(desc, &ctx->cdata, ivsize, is_rfc3686, 7598c2ecf20Sopenharmony_ci ctx1_iv_off); 7608c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 7618c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 7628c2ecf20Sopenharmony_ci 7638c2ecf20Sopenharmony_ci return 0; 7648c2ecf20Sopenharmony_ci} 7658c2ecf20Sopenharmony_ci 7668c2ecf20Sopenharmony_cistatic int aes_skcipher_setkey(struct crypto_skcipher *skcipher, 7678c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 7688c2ecf20Sopenharmony_ci{ 7698c2ecf20Sopenharmony_ci int err; 7708c2ecf20Sopenharmony_ci 7718c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 7728c2ecf20Sopenharmony_ci if (err) 7738c2ecf20Sopenharmony_ci return err; 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, 0); 7768c2ecf20Sopenharmony_ci} 7778c2ecf20Sopenharmony_ci 7788c2ecf20Sopenharmony_cistatic int rfc3686_skcipher_setkey(struct crypto_skcipher *skcipher, 7798c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 7808c2ecf20Sopenharmony_ci{ 7818c2ecf20Sopenharmony_ci u32 ctx1_iv_off; 7828c2ecf20Sopenharmony_ci int err; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci /* 7858c2ecf20Sopenharmony_ci * RFC3686 specific: 7868c2ecf20Sopenharmony_ci * | CONTEXT1[255:128] = {NONCE, IV, COUNTER} 7878c2ecf20Sopenharmony_ci * | *key = {KEY, NONCE} 7888c2ecf20Sopenharmony_ci */ 7898c2ecf20Sopenharmony_ci ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 7908c2ecf20Sopenharmony_ci keylen -= CTR_RFC3686_NONCE_SIZE; 7918c2ecf20Sopenharmony_ci 7928c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 7938c2ecf20Sopenharmony_ci if (err) 7948c2ecf20Sopenharmony_ci return err; 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 7978c2ecf20Sopenharmony_ci} 7988c2ecf20Sopenharmony_ci 7998c2ecf20Sopenharmony_cistatic int ctr_skcipher_setkey(struct crypto_skcipher *skcipher, 8008c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 8018c2ecf20Sopenharmony_ci{ 8028c2ecf20Sopenharmony_ci u32 ctx1_iv_off; 8038c2ecf20Sopenharmony_ci int err; 8048c2ecf20Sopenharmony_ci 8058c2ecf20Sopenharmony_ci /* 8068c2ecf20Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 8078c2ecf20Sopenharmony_ci * at an offset of 128bits (16bytes) 8088c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = IV 8098c2ecf20Sopenharmony_ci */ 8108c2ecf20Sopenharmony_ci ctx1_iv_off = 16; 8118c2ecf20Sopenharmony_ci 8128c2ecf20Sopenharmony_ci err = aes_check_keylen(keylen); 8138c2ecf20Sopenharmony_ci if (err) 8148c2ecf20Sopenharmony_ci return err; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci return skcipher_setkey(skcipher, key, keylen, ctx1_iv_off); 8178c2ecf20Sopenharmony_ci} 8188c2ecf20Sopenharmony_ci 8198c2ecf20Sopenharmony_cistatic int des_skcipher_setkey(struct crypto_skcipher *skcipher, 8208c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 8218c2ecf20Sopenharmony_ci{ 8228c2ecf20Sopenharmony_ci return verify_skcipher_des_key(skcipher, key) ?: 8238c2ecf20Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 8248c2ecf20Sopenharmony_ci} 8258c2ecf20Sopenharmony_ci 8268c2ecf20Sopenharmony_cistatic int des3_skcipher_setkey(struct crypto_skcipher *skcipher, 8278c2ecf20Sopenharmony_ci const u8 *key, unsigned int keylen) 8288c2ecf20Sopenharmony_ci{ 8298c2ecf20Sopenharmony_ci return verify_skcipher_des3_key(skcipher, key) ?: 8308c2ecf20Sopenharmony_ci skcipher_setkey(skcipher, key, keylen, 0); 8318c2ecf20Sopenharmony_ci} 8328c2ecf20Sopenharmony_ci 8338c2ecf20Sopenharmony_cistatic int xts_skcipher_setkey(struct crypto_skcipher *skcipher, const u8 *key, 8348c2ecf20Sopenharmony_ci unsigned int keylen) 8358c2ecf20Sopenharmony_ci{ 8368c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 8378c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 8388c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 8398c2ecf20Sopenharmony_ci u32 *desc; 8408c2ecf20Sopenharmony_ci int err; 8418c2ecf20Sopenharmony_ci 8428c2ecf20Sopenharmony_ci err = xts_verify_key(skcipher, key, keylen); 8438c2ecf20Sopenharmony_ci if (err) { 8448c2ecf20Sopenharmony_ci dev_dbg(jrdev, "key size mismatch\n"); 8458c2ecf20Sopenharmony_ci return err; 8468c2ecf20Sopenharmony_ci } 8478c2ecf20Sopenharmony_ci 8488c2ecf20Sopenharmony_ci if (keylen != 2 * AES_KEYSIZE_128 && keylen != 2 * AES_KEYSIZE_256) 8498c2ecf20Sopenharmony_ci ctx->xts_key_fallback = true; 8508c2ecf20Sopenharmony_ci 8518c2ecf20Sopenharmony_ci if (ctrlpriv->era <= 8 || ctx->xts_key_fallback) { 8528c2ecf20Sopenharmony_ci err = crypto_skcipher_setkey(ctx->fallback, key, keylen); 8538c2ecf20Sopenharmony_ci if (err) 8548c2ecf20Sopenharmony_ci return err; 8558c2ecf20Sopenharmony_ci } 8568c2ecf20Sopenharmony_ci 8578c2ecf20Sopenharmony_ci ctx->cdata.keylen = keylen; 8588c2ecf20Sopenharmony_ci ctx->cdata.key_virt = key; 8598c2ecf20Sopenharmony_ci ctx->cdata.key_inline = true; 8608c2ecf20Sopenharmony_ci 8618c2ecf20Sopenharmony_ci /* xts_skcipher_encrypt shared descriptor */ 8628c2ecf20Sopenharmony_ci desc = ctx->sh_desc_enc; 8638c2ecf20Sopenharmony_ci cnstr_shdsc_xts_skcipher_encap(desc, &ctx->cdata); 8648c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_enc_dma, 8658c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 8668c2ecf20Sopenharmony_ci 8678c2ecf20Sopenharmony_ci /* xts_skcipher_decrypt shared descriptor */ 8688c2ecf20Sopenharmony_ci desc = ctx->sh_desc_dec; 8698c2ecf20Sopenharmony_ci cnstr_shdsc_xts_skcipher_decap(desc, &ctx->cdata); 8708c2ecf20Sopenharmony_ci dma_sync_single_for_device(jrdev, ctx->sh_desc_dec_dma, 8718c2ecf20Sopenharmony_ci desc_bytes(desc), ctx->dir); 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ci return 0; 8748c2ecf20Sopenharmony_ci} 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_ci/* 8778c2ecf20Sopenharmony_ci * aead_edesc - s/w-extended aead descriptor 8788c2ecf20Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist 8798c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist 8808c2ecf20Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table 8818c2ecf20Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table 8828c2ecf20Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space 8838c2ecf20Sopenharmony_ci * @bklog: stored to determine if the request needs backlog 8848c2ecf20Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table 8858c2ecf20Sopenharmony_ci * @sec4_sg: pointer to h/w link table 8868c2ecf20Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables 8878c2ecf20Sopenharmony_ci */ 8888c2ecf20Sopenharmony_cistruct aead_edesc { 8898c2ecf20Sopenharmony_ci int src_nents; 8908c2ecf20Sopenharmony_ci int dst_nents; 8918c2ecf20Sopenharmony_ci int mapped_src_nents; 8928c2ecf20Sopenharmony_ci int mapped_dst_nents; 8938c2ecf20Sopenharmony_ci int sec4_sg_bytes; 8948c2ecf20Sopenharmony_ci bool bklog; 8958c2ecf20Sopenharmony_ci dma_addr_t sec4_sg_dma; 8968c2ecf20Sopenharmony_ci struct sec4_sg_entry *sec4_sg; 8978c2ecf20Sopenharmony_ci u32 hw_desc[]; 8988c2ecf20Sopenharmony_ci}; 8998c2ecf20Sopenharmony_ci 9008c2ecf20Sopenharmony_ci/* 9018c2ecf20Sopenharmony_ci * skcipher_edesc - s/w-extended skcipher descriptor 9028c2ecf20Sopenharmony_ci * @src_nents: number of segments in input s/w scatterlist 9038c2ecf20Sopenharmony_ci * @dst_nents: number of segments in output s/w scatterlist 9048c2ecf20Sopenharmony_ci * @mapped_src_nents: number of segments in input h/w link table 9058c2ecf20Sopenharmony_ci * @mapped_dst_nents: number of segments in output h/w link table 9068c2ecf20Sopenharmony_ci * @iv_dma: dma address of iv for checking continuity and link table 9078c2ecf20Sopenharmony_ci * @sec4_sg_bytes: length of dma mapped sec4_sg space 9088c2ecf20Sopenharmony_ci * @bklog: stored to determine if the request needs backlog 9098c2ecf20Sopenharmony_ci * @sec4_sg_dma: bus physical mapped address of h/w link table 9108c2ecf20Sopenharmony_ci * @sec4_sg: pointer to h/w link table 9118c2ecf20Sopenharmony_ci * @hw_desc: the h/w job descriptor followed by any referenced link tables 9128c2ecf20Sopenharmony_ci * and IV 9138c2ecf20Sopenharmony_ci */ 9148c2ecf20Sopenharmony_cistruct skcipher_edesc { 9158c2ecf20Sopenharmony_ci int src_nents; 9168c2ecf20Sopenharmony_ci int dst_nents; 9178c2ecf20Sopenharmony_ci int mapped_src_nents; 9188c2ecf20Sopenharmony_ci int mapped_dst_nents; 9198c2ecf20Sopenharmony_ci dma_addr_t iv_dma; 9208c2ecf20Sopenharmony_ci int sec4_sg_bytes; 9218c2ecf20Sopenharmony_ci bool bklog; 9228c2ecf20Sopenharmony_ci dma_addr_t sec4_sg_dma; 9238c2ecf20Sopenharmony_ci struct sec4_sg_entry *sec4_sg; 9248c2ecf20Sopenharmony_ci u32 hw_desc[]; 9258c2ecf20Sopenharmony_ci}; 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_cistatic void caam_unmap(struct device *dev, struct scatterlist *src, 9288c2ecf20Sopenharmony_ci struct scatterlist *dst, int src_nents, 9298c2ecf20Sopenharmony_ci int dst_nents, 9308c2ecf20Sopenharmony_ci dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma, 9318c2ecf20Sopenharmony_ci int sec4_sg_bytes) 9328c2ecf20Sopenharmony_ci{ 9338c2ecf20Sopenharmony_ci if (dst != src) { 9348c2ecf20Sopenharmony_ci if (src_nents) 9358c2ecf20Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_TO_DEVICE); 9368c2ecf20Sopenharmony_ci if (dst_nents) 9378c2ecf20Sopenharmony_ci dma_unmap_sg(dev, dst, dst_nents, DMA_FROM_DEVICE); 9388c2ecf20Sopenharmony_ci } else { 9398c2ecf20Sopenharmony_ci dma_unmap_sg(dev, src, src_nents, DMA_BIDIRECTIONAL); 9408c2ecf20Sopenharmony_ci } 9418c2ecf20Sopenharmony_ci 9428c2ecf20Sopenharmony_ci if (iv_dma) 9438c2ecf20Sopenharmony_ci dma_unmap_single(dev, iv_dma, ivsize, DMA_BIDIRECTIONAL); 9448c2ecf20Sopenharmony_ci if (sec4_sg_bytes) 9458c2ecf20Sopenharmony_ci dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes, 9468c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 9478c2ecf20Sopenharmony_ci} 9488c2ecf20Sopenharmony_ci 9498c2ecf20Sopenharmony_cistatic void aead_unmap(struct device *dev, 9508c2ecf20Sopenharmony_ci struct aead_edesc *edesc, 9518c2ecf20Sopenharmony_ci struct aead_request *req) 9528c2ecf20Sopenharmony_ci{ 9538c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, 9548c2ecf20Sopenharmony_ci edesc->src_nents, edesc->dst_nents, 0, 0, 9558c2ecf20Sopenharmony_ci edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 9568c2ecf20Sopenharmony_ci} 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_cistatic void skcipher_unmap(struct device *dev, struct skcipher_edesc *edesc, 9598c2ecf20Sopenharmony_ci struct skcipher_request *req) 9608c2ecf20Sopenharmony_ci{ 9618c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 9628c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 9638c2ecf20Sopenharmony_ci 9648c2ecf20Sopenharmony_ci caam_unmap(dev, req->src, req->dst, 9658c2ecf20Sopenharmony_ci edesc->src_nents, edesc->dst_nents, 9668c2ecf20Sopenharmony_ci edesc->iv_dma, ivsize, 9678c2ecf20Sopenharmony_ci edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 9688c2ecf20Sopenharmony_ci} 9698c2ecf20Sopenharmony_ci 9708c2ecf20Sopenharmony_cistatic void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err, 9718c2ecf20Sopenharmony_ci void *context) 9728c2ecf20Sopenharmony_ci{ 9738c2ecf20Sopenharmony_ci struct aead_request *req = context; 9748c2ecf20Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 9758c2ecf20Sopenharmony_ci struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev); 9768c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 9778c2ecf20Sopenharmony_ci int ecode = 0; 9788c2ecf20Sopenharmony_ci bool has_bklog; 9798c2ecf20Sopenharmony_ci 9808c2ecf20Sopenharmony_ci dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 9818c2ecf20Sopenharmony_ci 9828c2ecf20Sopenharmony_ci edesc = rctx->edesc; 9838c2ecf20Sopenharmony_ci has_bklog = edesc->bklog; 9848c2ecf20Sopenharmony_ci 9858c2ecf20Sopenharmony_ci if (err) 9868c2ecf20Sopenharmony_ci ecode = caam_jr_strstatus(jrdev, err); 9878c2ecf20Sopenharmony_ci 9888c2ecf20Sopenharmony_ci aead_unmap(jrdev, edesc, req); 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci kfree(edesc); 9918c2ecf20Sopenharmony_ci 9928c2ecf20Sopenharmony_ci /* 9938c2ecf20Sopenharmony_ci * If no backlog flag, the completion of the request is done 9948c2ecf20Sopenharmony_ci * by CAAM, not crypto engine. 9958c2ecf20Sopenharmony_ci */ 9968c2ecf20Sopenharmony_ci if (!has_bklog) 9978c2ecf20Sopenharmony_ci aead_request_complete(req, ecode); 9988c2ecf20Sopenharmony_ci else 9998c2ecf20Sopenharmony_ci crypto_finalize_aead_request(jrp->engine, req, ecode); 10008c2ecf20Sopenharmony_ci} 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_cistatic void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err, 10038c2ecf20Sopenharmony_ci void *context) 10048c2ecf20Sopenharmony_ci{ 10058c2ecf20Sopenharmony_ci struct skcipher_request *req = context; 10068c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 10078c2ecf20Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 10088c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 10098c2ecf20Sopenharmony_ci struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev); 10108c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 10118c2ecf20Sopenharmony_ci int ecode = 0; 10128c2ecf20Sopenharmony_ci bool has_bklog; 10138c2ecf20Sopenharmony_ci 10148c2ecf20Sopenharmony_ci dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 10158c2ecf20Sopenharmony_ci 10168c2ecf20Sopenharmony_ci edesc = rctx->edesc; 10178c2ecf20Sopenharmony_ci has_bklog = edesc->bklog; 10188c2ecf20Sopenharmony_ci if (err) 10198c2ecf20Sopenharmony_ci ecode = caam_jr_strstatus(jrdev, err); 10208c2ecf20Sopenharmony_ci 10218c2ecf20Sopenharmony_ci skcipher_unmap(jrdev, edesc, req); 10228c2ecf20Sopenharmony_ci 10238c2ecf20Sopenharmony_ci /* 10248c2ecf20Sopenharmony_ci * The crypto API expects us to set the IV (req->iv) to the last 10258c2ecf20Sopenharmony_ci * ciphertext block (CBC mode) or last counter (CTR mode). 10268c2ecf20Sopenharmony_ci * This is used e.g. by the CTS mode. 10278c2ecf20Sopenharmony_ci */ 10288c2ecf20Sopenharmony_ci if (ivsize && !ecode) { 10298c2ecf20Sopenharmony_ci memcpy(req->iv, (u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes, 10308c2ecf20Sopenharmony_ci ivsize); 10318c2ecf20Sopenharmony_ci 10328c2ecf20Sopenharmony_ci print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ", 10338c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, 10348c2ecf20Sopenharmony_ci ivsize, 1); 10358c2ecf20Sopenharmony_ci } 10368c2ecf20Sopenharmony_ci 10378c2ecf20Sopenharmony_ci caam_dump_sg("dst @" __stringify(__LINE__)": ", 10388c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->dst, 10398c2ecf20Sopenharmony_ci edesc->dst_nents > 1 ? 100 : req->cryptlen, 1); 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci kfree(edesc); 10428c2ecf20Sopenharmony_ci 10438c2ecf20Sopenharmony_ci /* 10448c2ecf20Sopenharmony_ci * If no backlog flag, the completion of the request is done 10458c2ecf20Sopenharmony_ci * by CAAM, not crypto engine. 10468c2ecf20Sopenharmony_ci */ 10478c2ecf20Sopenharmony_ci if (!has_bklog) 10488c2ecf20Sopenharmony_ci skcipher_request_complete(req, ecode); 10498c2ecf20Sopenharmony_ci else 10508c2ecf20Sopenharmony_ci crypto_finalize_skcipher_request(jrp->engine, req, ecode); 10518c2ecf20Sopenharmony_ci} 10528c2ecf20Sopenharmony_ci 10538c2ecf20Sopenharmony_ci/* 10548c2ecf20Sopenharmony_ci * Fill in aead job descriptor 10558c2ecf20Sopenharmony_ci */ 10568c2ecf20Sopenharmony_cistatic void init_aead_job(struct aead_request *req, 10578c2ecf20Sopenharmony_ci struct aead_edesc *edesc, 10588c2ecf20Sopenharmony_ci bool all_contig, bool encrypt) 10598c2ecf20Sopenharmony_ci{ 10608c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 10618c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 10628c2ecf20Sopenharmony_ci int authsize = ctx->authsize; 10638c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 10648c2ecf20Sopenharmony_ci u32 out_options, in_options; 10658c2ecf20Sopenharmony_ci dma_addr_t dst_dma, src_dma; 10668c2ecf20Sopenharmony_ci int len, sec4_sg_index = 0; 10678c2ecf20Sopenharmony_ci dma_addr_t ptr; 10688c2ecf20Sopenharmony_ci u32 *sh_desc; 10698c2ecf20Sopenharmony_ci 10708c2ecf20Sopenharmony_ci sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec; 10718c2ecf20Sopenharmony_ci ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma; 10728c2ecf20Sopenharmony_ci 10738c2ecf20Sopenharmony_ci len = desc_len(sh_desc); 10748c2ecf20Sopenharmony_ci init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 10758c2ecf20Sopenharmony_ci 10768c2ecf20Sopenharmony_ci if (all_contig) { 10778c2ecf20Sopenharmony_ci src_dma = edesc->mapped_src_nents ? sg_dma_address(req->src) : 10788c2ecf20Sopenharmony_ci 0; 10798c2ecf20Sopenharmony_ci in_options = 0; 10808c2ecf20Sopenharmony_ci } else { 10818c2ecf20Sopenharmony_ci src_dma = edesc->sec4_sg_dma; 10828c2ecf20Sopenharmony_ci sec4_sg_index += edesc->mapped_src_nents; 10838c2ecf20Sopenharmony_ci in_options = LDST_SGF; 10848c2ecf20Sopenharmony_ci } 10858c2ecf20Sopenharmony_ci 10868c2ecf20Sopenharmony_ci append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen, 10878c2ecf20Sopenharmony_ci in_options); 10888c2ecf20Sopenharmony_ci 10898c2ecf20Sopenharmony_ci dst_dma = src_dma; 10908c2ecf20Sopenharmony_ci out_options = in_options; 10918c2ecf20Sopenharmony_ci 10928c2ecf20Sopenharmony_ci if (unlikely(req->src != req->dst)) { 10938c2ecf20Sopenharmony_ci if (!edesc->mapped_dst_nents) { 10948c2ecf20Sopenharmony_ci dst_dma = 0; 10958c2ecf20Sopenharmony_ci out_options = 0; 10968c2ecf20Sopenharmony_ci } else if (edesc->mapped_dst_nents == 1) { 10978c2ecf20Sopenharmony_ci dst_dma = sg_dma_address(req->dst); 10988c2ecf20Sopenharmony_ci out_options = 0; 10998c2ecf20Sopenharmony_ci } else { 11008c2ecf20Sopenharmony_ci dst_dma = edesc->sec4_sg_dma + 11018c2ecf20Sopenharmony_ci sec4_sg_index * 11028c2ecf20Sopenharmony_ci sizeof(struct sec4_sg_entry); 11038c2ecf20Sopenharmony_ci out_options = LDST_SGF; 11048c2ecf20Sopenharmony_ci } 11058c2ecf20Sopenharmony_ci } 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_ci if (encrypt) 11088c2ecf20Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, 11098c2ecf20Sopenharmony_ci req->assoclen + req->cryptlen + authsize, 11108c2ecf20Sopenharmony_ci out_options); 11118c2ecf20Sopenharmony_ci else 11128c2ecf20Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, 11138c2ecf20Sopenharmony_ci req->assoclen + req->cryptlen - authsize, 11148c2ecf20Sopenharmony_ci out_options); 11158c2ecf20Sopenharmony_ci} 11168c2ecf20Sopenharmony_ci 11178c2ecf20Sopenharmony_cistatic void init_gcm_job(struct aead_request *req, 11188c2ecf20Sopenharmony_ci struct aead_edesc *edesc, 11198c2ecf20Sopenharmony_ci bool all_contig, bool encrypt) 11208c2ecf20Sopenharmony_ci{ 11218c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 11228c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 11238c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 11248c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 11258c2ecf20Sopenharmony_ci bool generic_gcm = (ivsize == GCM_AES_IV_SIZE); 11268c2ecf20Sopenharmony_ci unsigned int last; 11278c2ecf20Sopenharmony_ci 11288c2ecf20Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 11298c2ecf20Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen); 11308c2ecf20Sopenharmony_ci 11318c2ecf20Sopenharmony_ci /* BUG This should not be specific to generic GCM. */ 11328c2ecf20Sopenharmony_ci last = 0; 11338c2ecf20Sopenharmony_ci if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen)) 11348c2ecf20Sopenharmony_ci last = FIFOLD_TYPE_LAST1; 11358c2ecf20Sopenharmony_ci 11368c2ecf20Sopenharmony_ci /* Read GCM IV */ 11378c2ecf20Sopenharmony_ci append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE | 11388c2ecf20Sopenharmony_ci FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | GCM_AES_IV_SIZE | last); 11398c2ecf20Sopenharmony_ci /* Append Salt */ 11408c2ecf20Sopenharmony_ci if (!generic_gcm) 11418c2ecf20Sopenharmony_ci append_data(desc, ctx->key + ctx->cdata.keylen, 4); 11428c2ecf20Sopenharmony_ci /* Append IV */ 11438c2ecf20Sopenharmony_ci append_data(desc, req->iv, ivsize); 11448c2ecf20Sopenharmony_ci /* End of blank commands */ 11458c2ecf20Sopenharmony_ci} 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_cistatic void init_chachapoly_job(struct aead_request *req, 11488c2ecf20Sopenharmony_ci struct aead_edesc *edesc, bool all_contig, 11498c2ecf20Sopenharmony_ci bool encrypt) 11508c2ecf20Sopenharmony_ci{ 11518c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 11528c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 11538c2ecf20Sopenharmony_ci unsigned int assoclen = req->assoclen; 11548c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 11558c2ecf20Sopenharmony_ci u32 ctx_iv_off = 4; 11568c2ecf20Sopenharmony_ci 11578c2ecf20Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 11588c2ecf20Sopenharmony_ci 11598c2ecf20Sopenharmony_ci if (ivsize != CHACHAPOLY_IV_SIZE) { 11608c2ecf20Sopenharmony_ci /* IPsec specific: CONTEXT1[223:128] = {NONCE, IV} */ 11618c2ecf20Sopenharmony_ci ctx_iv_off += 4; 11628c2ecf20Sopenharmony_ci 11638c2ecf20Sopenharmony_ci /* 11648c2ecf20Sopenharmony_ci * The associated data comes already with the IV but we need 11658c2ecf20Sopenharmony_ci * to skip it when we authenticate or encrypt... 11668c2ecf20Sopenharmony_ci */ 11678c2ecf20Sopenharmony_ci assoclen -= ivsize; 11688c2ecf20Sopenharmony_ci } 11698c2ecf20Sopenharmony_ci 11708c2ecf20Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, assoclen); 11718c2ecf20Sopenharmony_ci 11728c2ecf20Sopenharmony_ci /* 11738c2ecf20Sopenharmony_ci * For IPsec load the IV further in the same register. 11748c2ecf20Sopenharmony_ci * For RFC7539 simply load the 12 bytes nonce in a single operation 11758c2ecf20Sopenharmony_ci */ 11768c2ecf20Sopenharmony_ci append_load_as_imm(desc, req->iv, ivsize, LDST_CLASS_1_CCB | 11778c2ecf20Sopenharmony_ci LDST_SRCDST_BYTE_CONTEXT | 11788c2ecf20Sopenharmony_ci ctx_iv_off << LDST_OFFSET_SHIFT); 11798c2ecf20Sopenharmony_ci} 11808c2ecf20Sopenharmony_ci 11818c2ecf20Sopenharmony_cistatic void init_authenc_job(struct aead_request *req, 11828c2ecf20Sopenharmony_ci struct aead_edesc *edesc, 11838c2ecf20Sopenharmony_ci bool all_contig, bool encrypt) 11848c2ecf20Sopenharmony_ci{ 11858c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 11868c2ecf20Sopenharmony_ci struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 11878c2ecf20Sopenharmony_ci struct caam_aead_alg, aead); 11888c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_aead_ivsize(aead); 11898c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 11908c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctx->jrdev->parent); 11918c2ecf20Sopenharmony_ci const bool ctr_mode = ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == 11928c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128); 11938c2ecf20Sopenharmony_ci const bool is_rfc3686 = alg->caam.rfc3686; 11948c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 11958c2ecf20Sopenharmony_ci u32 ivoffset = 0; 11968c2ecf20Sopenharmony_ci 11978c2ecf20Sopenharmony_ci /* 11988c2ecf20Sopenharmony_ci * AES-CTR needs to load IV in CONTEXT1 reg 11998c2ecf20Sopenharmony_ci * at an offset of 128bits (16bytes) 12008c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = IV 12018c2ecf20Sopenharmony_ci */ 12028c2ecf20Sopenharmony_ci if (ctr_mode) 12038c2ecf20Sopenharmony_ci ivoffset = 16; 12048c2ecf20Sopenharmony_ci 12058c2ecf20Sopenharmony_ci /* 12068c2ecf20Sopenharmony_ci * RFC3686 specific: 12078c2ecf20Sopenharmony_ci * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 12088c2ecf20Sopenharmony_ci */ 12098c2ecf20Sopenharmony_ci if (is_rfc3686) 12108c2ecf20Sopenharmony_ci ivoffset = 16 + CTR_RFC3686_NONCE_SIZE; 12118c2ecf20Sopenharmony_ci 12128c2ecf20Sopenharmony_ci init_aead_job(req, edesc, all_contig, encrypt); 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci /* 12158c2ecf20Sopenharmony_ci * {REG3, DPOVRD} = assoclen, depending on whether MATH command supports 12168c2ecf20Sopenharmony_ci * having DPOVRD as destination. 12178c2ecf20Sopenharmony_ci */ 12188c2ecf20Sopenharmony_ci if (ctrlpriv->era < 3) 12198c2ecf20Sopenharmony_ci append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen); 12208c2ecf20Sopenharmony_ci else 12218c2ecf20Sopenharmony_ci append_math_add_imm_u32(desc, DPOVRD, ZERO, IMM, req->assoclen); 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci if (ivsize && ((is_rfc3686 && encrypt) || !alg->caam.geniv)) 12248c2ecf20Sopenharmony_ci append_load_as_imm(desc, req->iv, ivsize, 12258c2ecf20Sopenharmony_ci LDST_CLASS_1_CCB | 12268c2ecf20Sopenharmony_ci LDST_SRCDST_BYTE_CONTEXT | 12278c2ecf20Sopenharmony_ci (ivoffset << LDST_OFFSET_SHIFT)); 12288c2ecf20Sopenharmony_ci} 12298c2ecf20Sopenharmony_ci 12308c2ecf20Sopenharmony_ci/* 12318c2ecf20Sopenharmony_ci * Fill in skcipher job descriptor 12328c2ecf20Sopenharmony_ci */ 12338c2ecf20Sopenharmony_cistatic void init_skcipher_job(struct skcipher_request *req, 12348c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc, 12358c2ecf20Sopenharmony_ci const bool encrypt) 12368c2ecf20Sopenharmony_ci{ 12378c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 12388c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 12398c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 12408c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 12418c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 12428c2ecf20Sopenharmony_ci u32 *sh_desc; 12438c2ecf20Sopenharmony_ci u32 in_options = 0, out_options = 0; 12448c2ecf20Sopenharmony_ci dma_addr_t src_dma, dst_dma, ptr; 12458c2ecf20Sopenharmony_ci int len, sec4_sg_index = 0; 12468c2ecf20Sopenharmony_ci 12478c2ecf20Sopenharmony_ci print_hex_dump_debug("presciv@"__stringify(__LINE__)": ", 12488c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->iv, ivsize, 1); 12498c2ecf20Sopenharmony_ci dev_dbg(jrdev, "asked=%d, cryptlen%d\n", 12508c2ecf20Sopenharmony_ci (int)edesc->src_nents > 1 ? 100 : req->cryptlen, req->cryptlen); 12518c2ecf20Sopenharmony_ci 12528c2ecf20Sopenharmony_ci caam_dump_sg("src @" __stringify(__LINE__)": ", 12538c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, req->src, 12548c2ecf20Sopenharmony_ci edesc->src_nents > 1 ? 100 : req->cryptlen, 1); 12558c2ecf20Sopenharmony_ci 12568c2ecf20Sopenharmony_ci sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec; 12578c2ecf20Sopenharmony_ci ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma; 12588c2ecf20Sopenharmony_ci 12598c2ecf20Sopenharmony_ci len = desc_len(sh_desc); 12608c2ecf20Sopenharmony_ci init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci if (ivsize || edesc->mapped_src_nents > 1) { 12638c2ecf20Sopenharmony_ci src_dma = edesc->sec4_sg_dma; 12648c2ecf20Sopenharmony_ci sec4_sg_index = edesc->mapped_src_nents + !!ivsize; 12658c2ecf20Sopenharmony_ci in_options = LDST_SGF; 12668c2ecf20Sopenharmony_ci } else { 12678c2ecf20Sopenharmony_ci src_dma = sg_dma_address(req->src); 12688c2ecf20Sopenharmony_ci } 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_ci append_seq_in_ptr(desc, src_dma, req->cryptlen + ivsize, in_options); 12718c2ecf20Sopenharmony_ci 12728c2ecf20Sopenharmony_ci if (likely(req->src == req->dst)) { 12738c2ecf20Sopenharmony_ci dst_dma = src_dma + !!ivsize * sizeof(struct sec4_sg_entry); 12748c2ecf20Sopenharmony_ci out_options = in_options; 12758c2ecf20Sopenharmony_ci } else if (!ivsize && edesc->mapped_dst_nents == 1) { 12768c2ecf20Sopenharmony_ci dst_dma = sg_dma_address(req->dst); 12778c2ecf20Sopenharmony_ci } else { 12788c2ecf20Sopenharmony_ci dst_dma = edesc->sec4_sg_dma + sec4_sg_index * 12798c2ecf20Sopenharmony_ci sizeof(struct sec4_sg_entry); 12808c2ecf20Sopenharmony_ci out_options = LDST_SGF; 12818c2ecf20Sopenharmony_ci } 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_ci append_seq_out_ptr(desc, dst_dma, req->cryptlen + ivsize, out_options); 12848c2ecf20Sopenharmony_ci} 12858c2ecf20Sopenharmony_ci 12868c2ecf20Sopenharmony_ci/* 12878c2ecf20Sopenharmony_ci * allocate and map the aead extended descriptor 12888c2ecf20Sopenharmony_ci */ 12898c2ecf20Sopenharmony_cistatic struct aead_edesc *aead_edesc_alloc(struct aead_request *req, 12908c2ecf20Sopenharmony_ci int desc_bytes, bool *all_contig_ptr, 12918c2ecf20Sopenharmony_ci bool encrypt) 12928c2ecf20Sopenharmony_ci{ 12938c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 12948c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 12958c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 12968c2ecf20Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 12978c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 12988c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 12998c2ecf20Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 13008c2ecf20Sopenharmony_ci int src_len, dst_len = 0; 13018c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 13028c2ecf20Sopenharmony_ci int sec4_sg_index, sec4_sg_len, sec4_sg_bytes; 13038c2ecf20Sopenharmony_ci unsigned int authsize = ctx->authsize; 13048c2ecf20Sopenharmony_ci 13058c2ecf20Sopenharmony_ci if (unlikely(req->dst != req->src)) { 13068c2ecf20Sopenharmony_ci src_len = req->assoclen + req->cryptlen; 13078c2ecf20Sopenharmony_ci dst_len = src_len + (encrypt ? authsize : (-authsize)); 13088c2ecf20Sopenharmony_ci 13098c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 13108c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 13118c2ecf20Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 13128c2ecf20Sopenharmony_ci src_len); 13138c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 13148c2ecf20Sopenharmony_ci } 13158c2ecf20Sopenharmony_ci 13168c2ecf20Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, dst_len); 13178c2ecf20Sopenharmony_ci if (unlikely(dst_nents < 0)) { 13188c2ecf20Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n", 13198c2ecf20Sopenharmony_ci dst_len); 13208c2ecf20Sopenharmony_ci return ERR_PTR(dst_nents); 13218c2ecf20Sopenharmony_ci } 13228c2ecf20Sopenharmony_ci } else { 13238c2ecf20Sopenharmony_ci src_len = req->assoclen + req->cryptlen + 13248c2ecf20Sopenharmony_ci (encrypt ? authsize : 0); 13258c2ecf20Sopenharmony_ci 13268c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, src_len); 13278c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 13288c2ecf20Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 13298c2ecf20Sopenharmony_ci src_len); 13308c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 13318c2ecf20Sopenharmony_ci } 13328c2ecf20Sopenharmony_ci } 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci if (likely(req->src == req->dst)) { 13358c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 13368c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 13378c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 13388c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 13398c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 13408c2ecf20Sopenharmony_ci } 13418c2ecf20Sopenharmony_ci } else { 13428c2ecf20Sopenharmony_ci /* Cover also the case of null (zero length) input data */ 13438c2ecf20Sopenharmony_ci if (src_nents) { 13448c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, 13458c2ecf20Sopenharmony_ci src_nents, DMA_TO_DEVICE); 13468c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 13478c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 13488c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 13498c2ecf20Sopenharmony_ci } 13508c2ecf20Sopenharmony_ci } else { 13518c2ecf20Sopenharmony_ci mapped_src_nents = 0; 13528c2ecf20Sopenharmony_ci } 13538c2ecf20Sopenharmony_ci 13548c2ecf20Sopenharmony_ci /* Cover also the case of null (zero length) output data */ 13558c2ecf20Sopenharmony_ci if (dst_nents) { 13568c2ecf20Sopenharmony_ci mapped_dst_nents = dma_map_sg(jrdev, req->dst, 13578c2ecf20Sopenharmony_ci dst_nents, 13588c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 13598c2ecf20Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 13608c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map destination\n"); 13618c2ecf20Sopenharmony_ci dma_unmap_sg(jrdev, req->src, src_nents, 13628c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 13638c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 13648c2ecf20Sopenharmony_ci } 13658c2ecf20Sopenharmony_ci } else { 13668c2ecf20Sopenharmony_ci mapped_dst_nents = 0; 13678c2ecf20Sopenharmony_ci } 13688c2ecf20Sopenharmony_ci } 13698c2ecf20Sopenharmony_ci 13708c2ecf20Sopenharmony_ci /* 13718c2ecf20Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 13728c2ecf20Sopenharmony_ci * the end of the table by allocating more S/G entries. 13738c2ecf20Sopenharmony_ci */ 13748c2ecf20Sopenharmony_ci sec4_sg_len = mapped_src_nents > 1 ? mapped_src_nents : 0; 13758c2ecf20Sopenharmony_ci if (mapped_dst_nents > 1) 13768c2ecf20Sopenharmony_ci sec4_sg_len += pad_sg_nents(mapped_dst_nents); 13778c2ecf20Sopenharmony_ci else 13788c2ecf20Sopenharmony_ci sec4_sg_len = pad_sg_nents(sec4_sg_len); 13798c2ecf20Sopenharmony_ci 13808c2ecf20Sopenharmony_ci sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry); 13818c2ecf20Sopenharmony_ci 13828c2ecf20Sopenharmony_ci /* allocate space for base edesc and hw desc commands, link tables */ 13838c2ecf20Sopenharmony_ci edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, 13848c2ecf20Sopenharmony_ci GFP_DMA | flags); 13858c2ecf20Sopenharmony_ci if (!edesc) { 13868c2ecf20Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0, 13878c2ecf20Sopenharmony_ci 0, 0, 0); 13888c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 13898c2ecf20Sopenharmony_ci } 13908c2ecf20Sopenharmony_ci 13918c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 13928c2ecf20Sopenharmony_ci edesc->dst_nents = dst_nents; 13938c2ecf20Sopenharmony_ci edesc->mapped_src_nents = mapped_src_nents; 13948c2ecf20Sopenharmony_ci edesc->mapped_dst_nents = mapped_dst_nents; 13958c2ecf20Sopenharmony_ci edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) + 13968c2ecf20Sopenharmony_ci desc_bytes; 13978c2ecf20Sopenharmony_ci 13988c2ecf20Sopenharmony_ci rctx->edesc = edesc; 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_ci *all_contig_ptr = !(mapped_src_nents > 1); 14018c2ecf20Sopenharmony_ci 14028c2ecf20Sopenharmony_ci sec4_sg_index = 0; 14038c2ecf20Sopenharmony_ci if (mapped_src_nents > 1) { 14048c2ecf20Sopenharmony_ci sg_to_sec4_sg_last(req->src, src_len, 14058c2ecf20Sopenharmony_ci edesc->sec4_sg + sec4_sg_index, 0); 14068c2ecf20Sopenharmony_ci sec4_sg_index += mapped_src_nents; 14078c2ecf20Sopenharmony_ci } 14088c2ecf20Sopenharmony_ci if (mapped_dst_nents > 1) { 14098c2ecf20Sopenharmony_ci sg_to_sec4_sg_last(req->dst, dst_len, 14108c2ecf20Sopenharmony_ci edesc->sec4_sg + sec4_sg_index, 0); 14118c2ecf20Sopenharmony_ci } 14128c2ecf20Sopenharmony_ci 14138c2ecf20Sopenharmony_ci if (!sec4_sg_bytes) 14148c2ecf20Sopenharmony_ci return edesc; 14158c2ecf20Sopenharmony_ci 14168c2ecf20Sopenharmony_ci edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 14178c2ecf20Sopenharmony_ci sec4_sg_bytes, DMA_TO_DEVICE); 14188c2ecf20Sopenharmony_ci if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 14198c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map S/G table\n"); 14208c2ecf20Sopenharmony_ci aead_unmap(jrdev, edesc, req); 14218c2ecf20Sopenharmony_ci kfree(edesc); 14228c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 14238c2ecf20Sopenharmony_ci } 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_ci edesc->sec4_sg_bytes = sec4_sg_bytes; 14268c2ecf20Sopenharmony_ci 14278c2ecf20Sopenharmony_ci return edesc; 14288c2ecf20Sopenharmony_ci} 14298c2ecf20Sopenharmony_ci 14308c2ecf20Sopenharmony_cistatic int aead_enqueue_req(struct device *jrdev, struct aead_request *req) 14318c2ecf20Sopenharmony_ci{ 14328c2ecf20Sopenharmony_ci struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 14338c2ecf20Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 14348c2ecf20Sopenharmony_ci struct aead_edesc *edesc = rctx->edesc; 14358c2ecf20Sopenharmony_ci u32 *desc = edesc->hw_desc; 14368c2ecf20Sopenharmony_ci int ret; 14378c2ecf20Sopenharmony_ci 14388c2ecf20Sopenharmony_ci /* 14398c2ecf20Sopenharmony_ci * Only the backlog request are sent to crypto-engine since the others 14408c2ecf20Sopenharmony_ci * can be handled by CAAM, if free, especially since JR has up to 1024 14418c2ecf20Sopenharmony_ci * entries (more than the 10 entries from crypto-engine). 14428c2ecf20Sopenharmony_ci */ 14438c2ecf20Sopenharmony_ci if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG) 14448c2ecf20Sopenharmony_ci ret = crypto_transfer_aead_request_to_engine(jrpriv->engine, 14458c2ecf20Sopenharmony_ci req); 14468c2ecf20Sopenharmony_ci else 14478c2ecf20Sopenharmony_ci ret = caam_jr_enqueue(jrdev, desc, aead_crypt_done, req); 14488c2ecf20Sopenharmony_ci 14498c2ecf20Sopenharmony_ci if ((ret != -EINPROGRESS) && (ret != -EBUSY)) { 14508c2ecf20Sopenharmony_ci aead_unmap(jrdev, edesc, req); 14518c2ecf20Sopenharmony_ci kfree(rctx->edesc); 14528c2ecf20Sopenharmony_ci } 14538c2ecf20Sopenharmony_ci 14548c2ecf20Sopenharmony_ci return ret; 14558c2ecf20Sopenharmony_ci} 14568c2ecf20Sopenharmony_ci 14578c2ecf20Sopenharmony_cistatic inline int chachapoly_crypt(struct aead_request *req, bool encrypt) 14588c2ecf20Sopenharmony_ci{ 14598c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 14608c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 14618c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 14628c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 14638c2ecf20Sopenharmony_ci bool all_contig; 14648c2ecf20Sopenharmony_ci u32 *desc; 14658c2ecf20Sopenharmony_ci 14668c2ecf20Sopenharmony_ci edesc = aead_edesc_alloc(req, CHACHAPOLY_DESC_JOB_IO_LEN, &all_contig, 14678c2ecf20Sopenharmony_ci encrypt); 14688c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 14698c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 14708c2ecf20Sopenharmony_ci 14718c2ecf20Sopenharmony_ci desc = edesc->hw_desc; 14728c2ecf20Sopenharmony_ci 14738c2ecf20Sopenharmony_ci init_chachapoly_job(req, edesc, all_contig, encrypt); 14748c2ecf20Sopenharmony_ci print_hex_dump_debug("chachapoly jobdesc@" __stringify(__LINE__)": ", 14758c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 14768c2ecf20Sopenharmony_ci 1); 14778c2ecf20Sopenharmony_ci 14788c2ecf20Sopenharmony_ci return aead_enqueue_req(jrdev, req); 14798c2ecf20Sopenharmony_ci} 14808c2ecf20Sopenharmony_ci 14818c2ecf20Sopenharmony_cistatic int chachapoly_encrypt(struct aead_request *req) 14828c2ecf20Sopenharmony_ci{ 14838c2ecf20Sopenharmony_ci return chachapoly_crypt(req, true); 14848c2ecf20Sopenharmony_ci} 14858c2ecf20Sopenharmony_ci 14868c2ecf20Sopenharmony_cistatic int chachapoly_decrypt(struct aead_request *req) 14878c2ecf20Sopenharmony_ci{ 14888c2ecf20Sopenharmony_ci return chachapoly_crypt(req, false); 14898c2ecf20Sopenharmony_ci} 14908c2ecf20Sopenharmony_ci 14918c2ecf20Sopenharmony_cistatic inline int aead_crypt(struct aead_request *req, bool encrypt) 14928c2ecf20Sopenharmony_ci{ 14938c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 14948c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 14958c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 14968c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 14978c2ecf20Sopenharmony_ci bool all_contig; 14988c2ecf20Sopenharmony_ci 14998c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 15008c2ecf20Sopenharmony_ci edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN, 15018c2ecf20Sopenharmony_ci &all_contig, encrypt); 15028c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 15038c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 15048c2ecf20Sopenharmony_ci 15058c2ecf20Sopenharmony_ci /* Create and submit job descriptor */ 15068c2ecf20Sopenharmony_ci init_authenc_job(req, edesc, all_contig, encrypt); 15078c2ecf20Sopenharmony_ci 15088c2ecf20Sopenharmony_ci print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ", 15098c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 15108c2ecf20Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 15118c2ecf20Sopenharmony_ci 15128c2ecf20Sopenharmony_ci return aead_enqueue_req(jrdev, req); 15138c2ecf20Sopenharmony_ci} 15148c2ecf20Sopenharmony_ci 15158c2ecf20Sopenharmony_cistatic int aead_encrypt(struct aead_request *req) 15168c2ecf20Sopenharmony_ci{ 15178c2ecf20Sopenharmony_ci return aead_crypt(req, true); 15188c2ecf20Sopenharmony_ci} 15198c2ecf20Sopenharmony_ci 15208c2ecf20Sopenharmony_cistatic int aead_decrypt(struct aead_request *req) 15218c2ecf20Sopenharmony_ci{ 15228c2ecf20Sopenharmony_ci return aead_crypt(req, false); 15238c2ecf20Sopenharmony_ci} 15248c2ecf20Sopenharmony_ci 15258c2ecf20Sopenharmony_cistatic int aead_do_one_req(struct crypto_engine *engine, void *areq) 15268c2ecf20Sopenharmony_ci{ 15278c2ecf20Sopenharmony_ci struct aead_request *req = aead_request_cast(areq); 15288c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(crypto_aead_reqtfm(req)); 15298c2ecf20Sopenharmony_ci struct caam_aead_req_ctx *rctx = aead_request_ctx(req); 15308c2ecf20Sopenharmony_ci u32 *desc = rctx->edesc->hw_desc; 15318c2ecf20Sopenharmony_ci int ret; 15328c2ecf20Sopenharmony_ci 15338c2ecf20Sopenharmony_ci rctx->edesc->bklog = true; 15348c2ecf20Sopenharmony_ci 15358c2ecf20Sopenharmony_ci ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req); 15368c2ecf20Sopenharmony_ci 15378c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS) { 15388c2ecf20Sopenharmony_ci aead_unmap(ctx->jrdev, rctx->edesc, req); 15398c2ecf20Sopenharmony_ci kfree(rctx->edesc); 15408c2ecf20Sopenharmony_ci } else { 15418c2ecf20Sopenharmony_ci ret = 0; 15428c2ecf20Sopenharmony_ci } 15438c2ecf20Sopenharmony_ci 15448c2ecf20Sopenharmony_ci return ret; 15458c2ecf20Sopenharmony_ci} 15468c2ecf20Sopenharmony_ci 15478c2ecf20Sopenharmony_cistatic inline int gcm_crypt(struct aead_request *req, bool encrypt) 15488c2ecf20Sopenharmony_ci{ 15498c2ecf20Sopenharmony_ci struct aead_edesc *edesc; 15508c2ecf20Sopenharmony_ci struct crypto_aead *aead = crypto_aead_reqtfm(req); 15518c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(aead); 15528c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 15538c2ecf20Sopenharmony_ci bool all_contig; 15548c2ecf20Sopenharmony_ci 15558c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 15568c2ecf20Sopenharmony_ci edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, 15578c2ecf20Sopenharmony_ci encrypt); 15588c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 15598c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 15608c2ecf20Sopenharmony_ci 15618c2ecf20Sopenharmony_ci /* Create and submit job descriptor */ 15628c2ecf20Sopenharmony_ci init_gcm_job(req, edesc, all_contig, encrypt); 15638c2ecf20Sopenharmony_ci 15648c2ecf20Sopenharmony_ci print_hex_dump_debug("aead jobdesc@"__stringify(__LINE__)": ", 15658c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 15668c2ecf20Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 15678c2ecf20Sopenharmony_ci 15688c2ecf20Sopenharmony_ci return aead_enqueue_req(jrdev, req); 15698c2ecf20Sopenharmony_ci} 15708c2ecf20Sopenharmony_ci 15718c2ecf20Sopenharmony_cistatic int gcm_encrypt(struct aead_request *req) 15728c2ecf20Sopenharmony_ci{ 15738c2ecf20Sopenharmony_ci return gcm_crypt(req, true); 15748c2ecf20Sopenharmony_ci} 15758c2ecf20Sopenharmony_ci 15768c2ecf20Sopenharmony_cistatic int gcm_decrypt(struct aead_request *req) 15778c2ecf20Sopenharmony_ci{ 15788c2ecf20Sopenharmony_ci return gcm_crypt(req, false); 15798c2ecf20Sopenharmony_ci} 15808c2ecf20Sopenharmony_ci 15818c2ecf20Sopenharmony_cistatic int ipsec_gcm_encrypt(struct aead_request *req) 15828c2ecf20Sopenharmony_ci{ 15838c2ecf20Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_encrypt(req); 15848c2ecf20Sopenharmony_ci} 15858c2ecf20Sopenharmony_ci 15868c2ecf20Sopenharmony_cistatic int ipsec_gcm_decrypt(struct aead_request *req) 15878c2ecf20Sopenharmony_ci{ 15888c2ecf20Sopenharmony_ci return crypto_ipsec_check_assoclen(req->assoclen) ? : gcm_decrypt(req); 15898c2ecf20Sopenharmony_ci} 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci/* 15928c2ecf20Sopenharmony_ci * allocate and map the skcipher extended descriptor for skcipher 15938c2ecf20Sopenharmony_ci */ 15948c2ecf20Sopenharmony_cistatic struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req, 15958c2ecf20Sopenharmony_ci int desc_bytes) 15968c2ecf20Sopenharmony_ci{ 15978c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 15988c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 15998c2ecf20Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 16008c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 16018c2ecf20Sopenharmony_ci gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ? 16028c2ecf20Sopenharmony_ci GFP_KERNEL : GFP_ATOMIC; 16038c2ecf20Sopenharmony_ci int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0; 16048c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 16058c2ecf20Sopenharmony_ci dma_addr_t iv_dma = 0; 16068c2ecf20Sopenharmony_ci u8 *iv; 16078c2ecf20Sopenharmony_ci int ivsize = crypto_skcipher_ivsize(skcipher); 16088c2ecf20Sopenharmony_ci int dst_sg_idx, sec4_sg_ents, sec4_sg_bytes; 16098c2ecf20Sopenharmony_ci 16108c2ecf20Sopenharmony_ci src_nents = sg_nents_for_len(req->src, req->cryptlen); 16118c2ecf20Sopenharmony_ci if (unlikely(src_nents < 0)) { 16128c2ecf20Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in src S/G\n", 16138c2ecf20Sopenharmony_ci req->cryptlen); 16148c2ecf20Sopenharmony_ci return ERR_PTR(src_nents); 16158c2ecf20Sopenharmony_ci } 16168c2ecf20Sopenharmony_ci 16178c2ecf20Sopenharmony_ci if (req->dst != req->src) { 16188c2ecf20Sopenharmony_ci dst_nents = sg_nents_for_len(req->dst, req->cryptlen); 16198c2ecf20Sopenharmony_ci if (unlikely(dst_nents < 0)) { 16208c2ecf20Sopenharmony_ci dev_err(jrdev, "Insufficient bytes (%d) in dst S/G\n", 16218c2ecf20Sopenharmony_ci req->cryptlen); 16228c2ecf20Sopenharmony_ci return ERR_PTR(dst_nents); 16238c2ecf20Sopenharmony_ci } 16248c2ecf20Sopenharmony_ci } 16258c2ecf20Sopenharmony_ci 16268c2ecf20Sopenharmony_ci if (likely(req->src == req->dst)) { 16278c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 16288c2ecf20Sopenharmony_ci DMA_BIDIRECTIONAL); 16298c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 16308c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 16318c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 16328c2ecf20Sopenharmony_ci } 16338c2ecf20Sopenharmony_ci } else { 16348c2ecf20Sopenharmony_ci mapped_src_nents = dma_map_sg(jrdev, req->src, src_nents, 16358c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 16368c2ecf20Sopenharmony_ci if (unlikely(!mapped_src_nents)) { 16378c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map source\n"); 16388c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 16398c2ecf20Sopenharmony_ci } 16408c2ecf20Sopenharmony_ci mapped_dst_nents = dma_map_sg(jrdev, req->dst, dst_nents, 16418c2ecf20Sopenharmony_ci DMA_FROM_DEVICE); 16428c2ecf20Sopenharmony_ci if (unlikely(!mapped_dst_nents)) { 16438c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map destination\n"); 16448c2ecf20Sopenharmony_ci dma_unmap_sg(jrdev, req->src, src_nents, DMA_TO_DEVICE); 16458c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 16468c2ecf20Sopenharmony_ci } 16478c2ecf20Sopenharmony_ci } 16488c2ecf20Sopenharmony_ci 16498c2ecf20Sopenharmony_ci if (!ivsize && mapped_src_nents == 1) 16508c2ecf20Sopenharmony_ci sec4_sg_ents = 0; // no need for an input hw s/g table 16518c2ecf20Sopenharmony_ci else 16528c2ecf20Sopenharmony_ci sec4_sg_ents = mapped_src_nents + !!ivsize; 16538c2ecf20Sopenharmony_ci dst_sg_idx = sec4_sg_ents; 16548c2ecf20Sopenharmony_ci 16558c2ecf20Sopenharmony_ci /* 16568c2ecf20Sopenharmony_ci * Input, output HW S/G tables: [IV, src][dst, IV] 16578c2ecf20Sopenharmony_ci * IV entries point to the same buffer 16588c2ecf20Sopenharmony_ci * If src == dst, S/G entries are reused (S/G tables overlap) 16598c2ecf20Sopenharmony_ci * 16608c2ecf20Sopenharmony_ci * HW reads 4 S/G entries at a time; make sure the reads don't go beyond 16618c2ecf20Sopenharmony_ci * the end of the table by allocating more S/G entries. Logic: 16628c2ecf20Sopenharmony_ci * if (output S/G) 16638c2ecf20Sopenharmony_ci * pad output S/G, if needed 16648c2ecf20Sopenharmony_ci * else if (input S/G) ... 16658c2ecf20Sopenharmony_ci * pad input S/G, if needed 16668c2ecf20Sopenharmony_ci */ 16678c2ecf20Sopenharmony_ci if (ivsize || mapped_dst_nents > 1) { 16688c2ecf20Sopenharmony_ci if (req->src == req->dst) 16698c2ecf20Sopenharmony_ci sec4_sg_ents = !!ivsize + pad_sg_nents(sec4_sg_ents); 16708c2ecf20Sopenharmony_ci else 16718c2ecf20Sopenharmony_ci sec4_sg_ents += pad_sg_nents(mapped_dst_nents + 16728c2ecf20Sopenharmony_ci !!ivsize); 16738c2ecf20Sopenharmony_ci } else { 16748c2ecf20Sopenharmony_ci sec4_sg_ents = pad_sg_nents(sec4_sg_ents); 16758c2ecf20Sopenharmony_ci } 16768c2ecf20Sopenharmony_ci 16778c2ecf20Sopenharmony_ci sec4_sg_bytes = sec4_sg_ents * sizeof(struct sec4_sg_entry); 16788c2ecf20Sopenharmony_ci 16798c2ecf20Sopenharmony_ci /* 16808c2ecf20Sopenharmony_ci * allocate space for base edesc and hw desc commands, link tables, IV 16818c2ecf20Sopenharmony_ci */ 16828c2ecf20Sopenharmony_ci edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes + ivsize, 16838c2ecf20Sopenharmony_ci GFP_DMA | flags); 16848c2ecf20Sopenharmony_ci if (!edesc) { 16858c2ecf20Sopenharmony_ci dev_err(jrdev, "could not allocate extended descriptor\n"); 16868c2ecf20Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0, 16878c2ecf20Sopenharmony_ci 0, 0, 0); 16888c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 16898c2ecf20Sopenharmony_ci } 16908c2ecf20Sopenharmony_ci 16918c2ecf20Sopenharmony_ci edesc->src_nents = src_nents; 16928c2ecf20Sopenharmony_ci edesc->dst_nents = dst_nents; 16938c2ecf20Sopenharmony_ci edesc->mapped_src_nents = mapped_src_nents; 16948c2ecf20Sopenharmony_ci edesc->mapped_dst_nents = mapped_dst_nents; 16958c2ecf20Sopenharmony_ci edesc->sec4_sg_bytes = sec4_sg_bytes; 16968c2ecf20Sopenharmony_ci edesc->sec4_sg = (struct sec4_sg_entry *)((u8 *)edesc->hw_desc + 16978c2ecf20Sopenharmony_ci desc_bytes); 16988c2ecf20Sopenharmony_ci rctx->edesc = edesc; 16998c2ecf20Sopenharmony_ci 17008c2ecf20Sopenharmony_ci /* Make sure IV is located in a DMAable area */ 17018c2ecf20Sopenharmony_ci if (ivsize) { 17028c2ecf20Sopenharmony_ci iv = (u8 *)edesc->sec4_sg + sec4_sg_bytes; 17038c2ecf20Sopenharmony_ci memcpy(iv, req->iv, ivsize); 17048c2ecf20Sopenharmony_ci 17058c2ecf20Sopenharmony_ci iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL); 17068c2ecf20Sopenharmony_ci if (dma_mapping_error(jrdev, iv_dma)) { 17078c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map IV\n"); 17088c2ecf20Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, 17098c2ecf20Sopenharmony_ci dst_nents, 0, 0, 0, 0); 17108c2ecf20Sopenharmony_ci kfree(edesc); 17118c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 17128c2ecf20Sopenharmony_ci } 17138c2ecf20Sopenharmony_ci 17148c2ecf20Sopenharmony_ci dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0); 17158c2ecf20Sopenharmony_ci } 17168c2ecf20Sopenharmony_ci if (dst_sg_idx) 17178c2ecf20Sopenharmony_ci sg_to_sec4_sg(req->src, req->cryptlen, edesc->sec4_sg + 17188c2ecf20Sopenharmony_ci !!ivsize, 0); 17198c2ecf20Sopenharmony_ci 17208c2ecf20Sopenharmony_ci if (req->src != req->dst && (ivsize || mapped_dst_nents > 1)) 17218c2ecf20Sopenharmony_ci sg_to_sec4_sg(req->dst, req->cryptlen, edesc->sec4_sg + 17228c2ecf20Sopenharmony_ci dst_sg_idx, 0); 17238c2ecf20Sopenharmony_ci 17248c2ecf20Sopenharmony_ci if (ivsize) 17258c2ecf20Sopenharmony_ci dma_to_sec4_sg_one(edesc->sec4_sg + dst_sg_idx + 17268c2ecf20Sopenharmony_ci mapped_dst_nents, iv_dma, ivsize, 0); 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ci if (ivsize || mapped_dst_nents > 1) 17298c2ecf20Sopenharmony_ci sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx + 17308c2ecf20Sopenharmony_ci mapped_dst_nents - 1 + !!ivsize); 17318c2ecf20Sopenharmony_ci 17328c2ecf20Sopenharmony_ci if (sec4_sg_bytes) { 17338c2ecf20Sopenharmony_ci edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 17348c2ecf20Sopenharmony_ci sec4_sg_bytes, 17358c2ecf20Sopenharmony_ci DMA_TO_DEVICE); 17368c2ecf20Sopenharmony_ci if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 17378c2ecf20Sopenharmony_ci dev_err(jrdev, "unable to map S/G table\n"); 17388c2ecf20Sopenharmony_ci caam_unmap(jrdev, req->src, req->dst, src_nents, 17398c2ecf20Sopenharmony_ci dst_nents, iv_dma, ivsize, 0, 0); 17408c2ecf20Sopenharmony_ci kfree(edesc); 17418c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 17428c2ecf20Sopenharmony_ci } 17438c2ecf20Sopenharmony_ci } 17448c2ecf20Sopenharmony_ci 17458c2ecf20Sopenharmony_ci edesc->iv_dma = iv_dma; 17468c2ecf20Sopenharmony_ci 17478c2ecf20Sopenharmony_ci print_hex_dump_debug("skcipher sec4_sg@" __stringify(__LINE__)": ", 17488c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg, 17498c2ecf20Sopenharmony_ci sec4_sg_bytes, 1); 17508c2ecf20Sopenharmony_ci 17518c2ecf20Sopenharmony_ci return edesc; 17528c2ecf20Sopenharmony_ci} 17538c2ecf20Sopenharmony_ci 17548c2ecf20Sopenharmony_cistatic int skcipher_do_one_req(struct crypto_engine *engine, void *areq) 17558c2ecf20Sopenharmony_ci{ 17568c2ecf20Sopenharmony_ci struct skcipher_request *req = skcipher_request_cast(areq); 17578c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); 17588c2ecf20Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 17598c2ecf20Sopenharmony_ci u32 *desc = rctx->edesc->hw_desc; 17608c2ecf20Sopenharmony_ci int ret; 17618c2ecf20Sopenharmony_ci 17628c2ecf20Sopenharmony_ci rctx->edesc->bklog = true; 17638c2ecf20Sopenharmony_ci 17648c2ecf20Sopenharmony_ci ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req); 17658c2ecf20Sopenharmony_ci 17668c2ecf20Sopenharmony_ci if (ret != -EINPROGRESS) { 17678c2ecf20Sopenharmony_ci skcipher_unmap(ctx->jrdev, rctx->edesc, req); 17688c2ecf20Sopenharmony_ci kfree(rctx->edesc); 17698c2ecf20Sopenharmony_ci } else { 17708c2ecf20Sopenharmony_ci ret = 0; 17718c2ecf20Sopenharmony_ci } 17728c2ecf20Sopenharmony_ci 17738c2ecf20Sopenharmony_ci return ret; 17748c2ecf20Sopenharmony_ci} 17758c2ecf20Sopenharmony_ci 17768c2ecf20Sopenharmony_cistatic inline bool xts_skcipher_ivsize(struct skcipher_request *req) 17778c2ecf20Sopenharmony_ci{ 17788c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 17798c2ecf20Sopenharmony_ci unsigned int ivsize = crypto_skcipher_ivsize(skcipher); 17808c2ecf20Sopenharmony_ci 17818c2ecf20Sopenharmony_ci return !!get_unaligned((u64 *)(req->iv + (ivsize / 2))); 17828c2ecf20Sopenharmony_ci} 17838c2ecf20Sopenharmony_ci 17848c2ecf20Sopenharmony_cistatic inline int skcipher_crypt(struct skcipher_request *req, bool encrypt) 17858c2ecf20Sopenharmony_ci{ 17868c2ecf20Sopenharmony_ci struct skcipher_edesc *edesc; 17878c2ecf20Sopenharmony_ci struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); 17888c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); 17898c2ecf20Sopenharmony_ci struct device *jrdev = ctx->jrdev; 17908c2ecf20Sopenharmony_ci struct caam_drv_private_jr *jrpriv = dev_get_drvdata(jrdev); 17918c2ecf20Sopenharmony_ci struct caam_drv_private *ctrlpriv = dev_get_drvdata(jrdev->parent); 17928c2ecf20Sopenharmony_ci u32 *desc; 17938c2ecf20Sopenharmony_ci int ret = 0; 17948c2ecf20Sopenharmony_ci 17958c2ecf20Sopenharmony_ci /* 17968c2ecf20Sopenharmony_ci * XTS is expected to return an error even for input length = 0 17978c2ecf20Sopenharmony_ci * Note that the case input length < block size will be caught during 17988c2ecf20Sopenharmony_ci * HW offloading and return an error. 17998c2ecf20Sopenharmony_ci */ 18008c2ecf20Sopenharmony_ci if (!req->cryptlen && !ctx->fallback) 18018c2ecf20Sopenharmony_ci return 0; 18028c2ecf20Sopenharmony_ci 18038c2ecf20Sopenharmony_ci if (ctx->fallback && ((ctrlpriv->era <= 8 && xts_skcipher_ivsize(req)) || 18048c2ecf20Sopenharmony_ci ctx->xts_key_fallback)) { 18058c2ecf20Sopenharmony_ci struct caam_skcipher_req_ctx *rctx = skcipher_request_ctx(req); 18068c2ecf20Sopenharmony_ci 18078c2ecf20Sopenharmony_ci skcipher_request_set_tfm(&rctx->fallback_req, ctx->fallback); 18088c2ecf20Sopenharmony_ci skcipher_request_set_callback(&rctx->fallback_req, 18098c2ecf20Sopenharmony_ci req->base.flags, 18108c2ecf20Sopenharmony_ci req->base.complete, 18118c2ecf20Sopenharmony_ci req->base.data); 18128c2ecf20Sopenharmony_ci skcipher_request_set_crypt(&rctx->fallback_req, req->src, 18138c2ecf20Sopenharmony_ci req->dst, req->cryptlen, req->iv); 18148c2ecf20Sopenharmony_ci 18158c2ecf20Sopenharmony_ci return encrypt ? crypto_skcipher_encrypt(&rctx->fallback_req) : 18168c2ecf20Sopenharmony_ci crypto_skcipher_decrypt(&rctx->fallback_req); 18178c2ecf20Sopenharmony_ci } 18188c2ecf20Sopenharmony_ci 18198c2ecf20Sopenharmony_ci /* allocate extended descriptor */ 18208c2ecf20Sopenharmony_ci edesc = skcipher_edesc_alloc(req, DESC_JOB_IO_LEN * CAAM_CMD_SZ); 18218c2ecf20Sopenharmony_ci if (IS_ERR(edesc)) 18228c2ecf20Sopenharmony_ci return PTR_ERR(edesc); 18238c2ecf20Sopenharmony_ci 18248c2ecf20Sopenharmony_ci /* Create and submit job descriptor*/ 18258c2ecf20Sopenharmony_ci init_skcipher_job(req, edesc, encrypt); 18268c2ecf20Sopenharmony_ci 18278c2ecf20Sopenharmony_ci print_hex_dump_debug("skcipher jobdesc@" __stringify(__LINE__)": ", 18288c2ecf20Sopenharmony_ci DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 18298c2ecf20Sopenharmony_ci desc_bytes(edesc->hw_desc), 1); 18308c2ecf20Sopenharmony_ci 18318c2ecf20Sopenharmony_ci desc = edesc->hw_desc; 18328c2ecf20Sopenharmony_ci /* 18338c2ecf20Sopenharmony_ci * Only the backlog request are sent to crypto-engine since the others 18348c2ecf20Sopenharmony_ci * can be handled by CAAM, if free, especially since JR has up to 1024 18358c2ecf20Sopenharmony_ci * entries (more than the 10 entries from crypto-engine). 18368c2ecf20Sopenharmony_ci */ 18378c2ecf20Sopenharmony_ci if (req->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG) 18388c2ecf20Sopenharmony_ci ret = crypto_transfer_skcipher_request_to_engine(jrpriv->engine, 18398c2ecf20Sopenharmony_ci req); 18408c2ecf20Sopenharmony_ci else 18418c2ecf20Sopenharmony_ci ret = caam_jr_enqueue(jrdev, desc, skcipher_crypt_done, req); 18428c2ecf20Sopenharmony_ci 18438c2ecf20Sopenharmony_ci if ((ret != -EINPROGRESS) && (ret != -EBUSY)) { 18448c2ecf20Sopenharmony_ci skcipher_unmap(jrdev, edesc, req); 18458c2ecf20Sopenharmony_ci kfree(edesc); 18468c2ecf20Sopenharmony_ci } 18478c2ecf20Sopenharmony_ci 18488c2ecf20Sopenharmony_ci return ret; 18498c2ecf20Sopenharmony_ci} 18508c2ecf20Sopenharmony_ci 18518c2ecf20Sopenharmony_cistatic int skcipher_encrypt(struct skcipher_request *req) 18528c2ecf20Sopenharmony_ci{ 18538c2ecf20Sopenharmony_ci return skcipher_crypt(req, true); 18548c2ecf20Sopenharmony_ci} 18558c2ecf20Sopenharmony_ci 18568c2ecf20Sopenharmony_cistatic int skcipher_decrypt(struct skcipher_request *req) 18578c2ecf20Sopenharmony_ci{ 18588c2ecf20Sopenharmony_ci return skcipher_crypt(req, false); 18598c2ecf20Sopenharmony_ci} 18608c2ecf20Sopenharmony_ci 18618c2ecf20Sopenharmony_cistatic struct caam_skcipher_alg driver_algs[] = { 18628c2ecf20Sopenharmony_ci { 18638c2ecf20Sopenharmony_ci .skcipher = { 18648c2ecf20Sopenharmony_ci .base = { 18658c2ecf20Sopenharmony_ci .cra_name = "cbc(aes)", 18668c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-aes-caam", 18678c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 18688c2ecf20Sopenharmony_ci }, 18698c2ecf20Sopenharmony_ci .setkey = aes_skcipher_setkey, 18708c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 18718c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 18728c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 18738c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 18748c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 18758c2ecf20Sopenharmony_ci }, 18768c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 18778c2ecf20Sopenharmony_ci }, 18788c2ecf20Sopenharmony_ci { 18798c2ecf20Sopenharmony_ci .skcipher = { 18808c2ecf20Sopenharmony_ci .base = { 18818c2ecf20Sopenharmony_ci .cra_name = "cbc(des3_ede)", 18828c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-3des-caam", 18838c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 18848c2ecf20Sopenharmony_ci }, 18858c2ecf20Sopenharmony_ci .setkey = des3_skcipher_setkey, 18868c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 18878c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 18888c2ecf20Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 18898c2ecf20Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 18908c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 18918c2ecf20Sopenharmony_ci }, 18928c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 18938c2ecf20Sopenharmony_ci }, 18948c2ecf20Sopenharmony_ci { 18958c2ecf20Sopenharmony_ci .skcipher = { 18968c2ecf20Sopenharmony_ci .base = { 18978c2ecf20Sopenharmony_ci .cra_name = "cbc(des)", 18988c2ecf20Sopenharmony_ci .cra_driver_name = "cbc-des-caam", 18998c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 19008c2ecf20Sopenharmony_ci }, 19018c2ecf20Sopenharmony_ci .setkey = des_skcipher_setkey, 19028c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19038c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19048c2ecf20Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 19058c2ecf20Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 19068c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 19078c2ecf20Sopenharmony_ci }, 19088c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 19098c2ecf20Sopenharmony_ci }, 19108c2ecf20Sopenharmony_ci { 19118c2ecf20Sopenharmony_ci .skcipher = { 19128c2ecf20Sopenharmony_ci .base = { 19138c2ecf20Sopenharmony_ci .cra_name = "ctr(aes)", 19148c2ecf20Sopenharmony_ci .cra_driver_name = "ctr-aes-caam", 19158c2ecf20Sopenharmony_ci .cra_blocksize = 1, 19168c2ecf20Sopenharmony_ci }, 19178c2ecf20Sopenharmony_ci .setkey = ctr_skcipher_setkey, 19188c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19198c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19208c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 19218c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 19228c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19238c2ecf20Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 19248c2ecf20Sopenharmony_ci }, 19258c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | 19268c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 19278c2ecf20Sopenharmony_ci }, 19288c2ecf20Sopenharmony_ci { 19298c2ecf20Sopenharmony_ci .skcipher = { 19308c2ecf20Sopenharmony_ci .base = { 19318c2ecf20Sopenharmony_ci .cra_name = "rfc3686(ctr(aes))", 19328c2ecf20Sopenharmony_ci .cra_driver_name = "rfc3686-ctr-aes-caam", 19338c2ecf20Sopenharmony_ci .cra_blocksize = 1, 19348c2ecf20Sopenharmony_ci }, 19358c2ecf20Sopenharmony_ci .setkey = rfc3686_skcipher_setkey, 19368c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19378c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19388c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE + 19398c2ecf20Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 19408c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE + 19418c2ecf20Sopenharmony_ci CTR_RFC3686_NONCE_SIZE, 19428c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 19438c2ecf20Sopenharmony_ci .chunksize = AES_BLOCK_SIZE, 19448c2ecf20Sopenharmony_ci }, 19458c2ecf20Sopenharmony_ci .caam = { 19468c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 19478c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 19488c2ecf20Sopenharmony_ci .rfc3686 = true, 19498c2ecf20Sopenharmony_ci }, 19508c2ecf20Sopenharmony_ci }, 19518c2ecf20Sopenharmony_ci { 19528c2ecf20Sopenharmony_ci .skcipher = { 19538c2ecf20Sopenharmony_ci .base = { 19548c2ecf20Sopenharmony_ci .cra_name = "xts(aes)", 19558c2ecf20Sopenharmony_ci .cra_driver_name = "xts-aes-caam", 19568c2ecf20Sopenharmony_ci .cra_flags = CRYPTO_ALG_NEED_FALLBACK, 19578c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19588c2ecf20Sopenharmony_ci }, 19598c2ecf20Sopenharmony_ci .setkey = xts_skcipher_setkey, 19608c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19618c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19628c2ecf20Sopenharmony_ci .min_keysize = 2 * AES_MIN_KEY_SIZE, 19638c2ecf20Sopenharmony_ci .max_keysize = 2 * AES_MAX_KEY_SIZE, 19648c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 19658c2ecf20Sopenharmony_ci }, 19668c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS, 19678c2ecf20Sopenharmony_ci }, 19688c2ecf20Sopenharmony_ci { 19698c2ecf20Sopenharmony_ci .skcipher = { 19708c2ecf20Sopenharmony_ci .base = { 19718c2ecf20Sopenharmony_ci .cra_name = "ecb(des)", 19728c2ecf20Sopenharmony_ci .cra_driver_name = "ecb-des-caam", 19738c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 19748c2ecf20Sopenharmony_ci }, 19758c2ecf20Sopenharmony_ci .setkey = des_skcipher_setkey, 19768c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19778c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19788c2ecf20Sopenharmony_ci .min_keysize = DES_KEY_SIZE, 19798c2ecf20Sopenharmony_ci .max_keysize = DES_KEY_SIZE, 19808c2ecf20Sopenharmony_ci }, 19818c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_ECB, 19828c2ecf20Sopenharmony_ci }, 19838c2ecf20Sopenharmony_ci { 19848c2ecf20Sopenharmony_ci .skcipher = { 19858c2ecf20Sopenharmony_ci .base = { 19868c2ecf20Sopenharmony_ci .cra_name = "ecb(aes)", 19878c2ecf20Sopenharmony_ci .cra_driver_name = "ecb-aes-caam", 19888c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 19898c2ecf20Sopenharmony_ci }, 19908c2ecf20Sopenharmony_ci .setkey = aes_skcipher_setkey, 19918c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 19928c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 19938c2ecf20Sopenharmony_ci .min_keysize = AES_MIN_KEY_SIZE, 19948c2ecf20Sopenharmony_ci .max_keysize = AES_MAX_KEY_SIZE, 19958c2ecf20Sopenharmony_ci }, 19968c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_ECB, 19978c2ecf20Sopenharmony_ci }, 19988c2ecf20Sopenharmony_ci { 19998c2ecf20Sopenharmony_ci .skcipher = { 20008c2ecf20Sopenharmony_ci .base = { 20018c2ecf20Sopenharmony_ci .cra_name = "ecb(des3_ede)", 20028c2ecf20Sopenharmony_ci .cra_driver_name = "ecb-des3-caam", 20038c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 20048c2ecf20Sopenharmony_ci }, 20058c2ecf20Sopenharmony_ci .setkey = des3_skcipher_setkey, 20068c2ecf20Sopenharmony_ci .encrypt = skcipher_encrypt, 20078c2ecf20Sopenharmony_ci .decrypt = skcipher_decrypt, 20088c2ecf20Sopenharmony_ci .min_keysize = DES3_EDE_KEY_SIZE, 20098c2ecf20Sopenharmony_ci .max_keysize = DES3_EDE_KEY_SIZE, 20108c2ecf20Sopenharmony_ci }, 20118c2ecf20Sopenharmony_ci .caam.class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_ECB, 20128c2ecf20Sopenharmony_ci }, 20138c2ecf20Sopenharmony_ci}; 20148c2ecf20Sopenharmony_ci 20158c2ecf20Sopenharmony_cistatic struct caam_aead_alg driver_aeads[] = { 20168c2ecf20Sopenharmony_ci { 20178c2ecf20Sopenharmony_ci .aead = { 20188c2ecf20Sopenharmony_ci .base = { 20198c2ecf20Sopenharmony_ci .cra_name = "rfc4106(gcm(aes))", 20208c2ecf20Sopenharmony_ci .cra_driver_name = "rfc4106-gcm-aes-caam", 20218c2ecf20Sopenharmony_ci .cra_blocksize = 1, 20228c2ecf20Sopenharmony_ci }, 20238c2ecf20Sopenharmony_ci .setkey = rfc4106_setkey, 20248c2ecf20Sopenharmony_ci .setauthsize = rfc4106_setauthsize, 20258c2ecf20Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 20268c2ecf20Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 20278c2ecf20Sopenharmony_ci .ivsize = GCM_RFC4106_IV_SIZE, 20288c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 20298c2ecf20Sopenharmony_ci }, 20308c2ecf20Sopenharmony_ci .caam = { 20318c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 20328c2ecf20Sopenharmony_ci .nodkp = true, 20338c2ecf20Sopenharmony_ci }, 20348c2ecf20Sopenharmony_ci }, 20358c2ecf20Sopenharmony_ci { 20368c2ecf20Sopenharmony_ci .aead = { 20378c2ecf20Sopenharmony_ci .base = { 20388c2ecf20Sopenharmony_ci .cra_name = "rfc4543(gcm(aes))", 20398c2ecf20Sopenharmony_ci .cra_driver_name = "rfc4543-gcm-aes-caam", 20408c2ecf20Sopenharmony_ci .cra_blocksize = 1, 20418c2ecf20Sopenharmony_ci }, 20428c2ecf20Sopenharmony_ci .setkey = rfc4543_setkey, 20438c2ecf20Sopenharmony_ci .setauthsize = rfc4543_setauthsize, 20448c2ecf20Sopenharmony_ci .encrypt = ipsec_gcm_encrypt, 20458c2ecf20Sopenharmony_ci .decrypt = ipsec_gcm_decrypt, 20468c2ecf20Sopenharmony_ci .ivsize = GCM_RFC4543_IV_SIZE, 20478c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 20488c2ecf20Sopenharmony_ci }, 20498c2ecf20Sopenharmony_ci .caam = { 20508c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 20518c2ecf20Sopenharmony_ci .nodkp = true, 20528c2ecf20Sopenharmony_ci }, 20538c2ecf20Sopenharmony_ci }, 20548c2ecf20Sopenharmony_ci /* Galois Counter Mode */ 20558c2ecf20Sopenharmony_ci { 20568c2ecf20Sopenharmony_ci .aead = { 20578c2ecf20Sopenharmony_ci .base = { 20588c2ecf20Sopenharmony_ci .cra_name = "gcm(aes)", 20598c2ecf20Sopenharmony_ci .cra_driver_name = "gcm-aes-caam", 20608c2ecf20Sopenharmony_ci .cra_blocksize = 1, 20618c2ecf20Sopenharmony_ci }, 20628c2ecf20Sopenharmony_ci .setkey = gcm_setkey, 20638c2ecf20Sopenharmony_ci .setauthsize = gcm_setauthsize, 20648c2ecf20Sopenharmony_ci .encrypt = gcm_encrypt, 20658c2ecf20Sopenharmony_ci .decrypt = gcm_decrypt, 20668c2ecf20Sopenharmony_ci .ivsize = GCM_AES_IV_SIZE, 20678c2ecf20Sopenharmony_ci .maxauthsize = AES_BLOCK_SIZE, 20688c2ecf20Sopenharmony_ci }, 20698c2ecf20Sopenharmony_ci .caam = { 20708c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 20718c2ecf20Sopenharmony_ci .nodkp = true, 20728c2ecf20Sopenharmony_ci }, 20738c2ecf20Sopenharmony_ci }, 20748c2ecf20Sopenharmony_ci /* single-pass ipsec_esp descriptor */ 20758c2ecf20Sopenharmony_ci { 20768c2ecf20Sopenharmony_ci .aead = { 20778c2ecf20Sopenharmony_ci .base = { 20788c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5)," 20798c2ecf20Sopenharmony_ci "ecb(cipher_null))", 20808c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 20818c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 20828c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 20838c2ecf20Sopenharmony_ci }, 20848c2ecf20Sopenharmony_ci .setkey = aead_setkey, 20858c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 20868c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 20878c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 20888c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 20898c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 20908c2ecf20Sopenharmony_ci }, 20918c2ecf20Sopenharmony_ci .caam = { 20928c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 20938c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 20948c2ecf20Sopenharmony_ci }, 20958c2ecf20Sopenharmony_ci }, 20968c2ecf20Sopenharmony_ci { 20978c2ecf20Sopenharmony_ci .aead = { 20988c2ecf20Sopenharmony_ci .base = { 20998c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 21008c2ecf20Sopenharmony_ci "ecb(cipher_null))", 21018c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 21028c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 21038c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 21048c2ecf20Sopenharmony_ci }, 21058c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21068c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21078c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21088c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21098c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 21108c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 21118c2ecf20Sopenharmony_ci }, 21128c2ecf20Sopenharmony_ci .caam = { 21138c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 21148c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21158c2ecf20Sopenharmony_ci }, 21168c2ecf20Sopenharmony_ci }, 21178c2ecf20Sopenharmony_ci { 21188c2ecf20Sopenharmony_ci .aead = { 21198c2ecf20Sopenharmony_ci .base = { 21208c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 21218c2ecf20Sopenharmony_ci "ecb(cipher_null))", 21228c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 21238c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 21248c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 21258c2ecf20Sopenharmony_ci }, 21268c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21278c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21288c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21298c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21308c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 21318c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 21328c2ecf20Sopenharmony_ci }, 21338c2ecf20Sopenharmony_ci .caam = { 21348c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 21358c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21368c2ecf20Sopenharmony_ci }, 21378c2ecf20Sopenharmony_ci }, 21388c2ecf20Sopenharmony_ci { 21398c2ecf20Sopenharmony_ci .aead = { 21408c2ecf20Sopenharmony_ci .base = { 21418c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 21428c2ecf20Sopenharmony_ci "ecb(cipher_null))", 21438c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 21448c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 21458c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 21468c2ecf20Sopenharmony_ci }, 21478c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21488c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21498c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21508c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21518c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 21528c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 21538c2ecf20Sopenharmony_ci }, 21548c2ecf20Sopenharmony_ci .caam = { 21558c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 21568c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21578c2ecf20Sopenharmony_ci }, 21588c2ecf20Sopenharmony_ci }, 21598c2ecf20Sopenharmony_ci { 21608c2ecf20Sopenharmony_ci .aead = { 21618c2ecf20Sopenharmony_ci .base = { 21628c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 21638c2ecf20Sopenharmony_ci "ecb(cipher_null))", 21648c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 21658c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 21668c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 21678c2ecf20Sopenharmony_ci }, 21688c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21698c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21708c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21718c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21728c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 21738c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 21748c2ecf20Sopenharmony_ci }, 21758c2ecf20Sopenharmony_ci .caam = { 21768c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 21778c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21788c2ecf20Sopenharmony_ci }, 21798c2ecf20Sopenharmony_ci }, 21808c2ecf20Sopenharmony_ci { 21818c2ecf20Sopenharmony_ci .aead = { 21828c2ecf20Sopenharmony_ci .base = { 21838c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 21848c2ecf20Sopenharmony_ci "ecb(cipher_null))", 21858c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 21868c2ecf20Sopenharmony_ci "ecb-cipher_null-caam", 21878c2ecf20Sopenharmony_ci .cra_blocksize = NULL_BLOCK_SIZE, 21888c2ecf20Sopenharmony_ci }, 21898c2ecf20Sopenharmony_ci .setkey = aead_setkey, 21908c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 21918c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 21928c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 21938c2ecf20Sopenharmony_ci .ivsize = NULL_IV_SIZE, 21948c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 21958c2ecf20Sopenharmony_ci }, 21968c2ecf20Sopenharmony_ci .caam = { 21978c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 21988c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 21998c2ecf20Sopenharmony_ci }, 22008c2ecf20Sopenharmony_ci }, 22018c2ecf20Sopenharmony_ci { 22028c2ecf20Sopenharmony_ci .aead = { 22038c2ecf20Sopenharmony_ci .base = { 22048c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(aes))", 22058c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 22068c2ecf20Sopenharmony_ci "cbc-aes-caam", 22078c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 22088c2ecf20Sopenharmony_ci }, 22098c2ecf20Sopenharmony_ci .setkey = aead_setkey, 22108c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22118c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22128c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22138c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 22148c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 22158c2ecf20Sopenharmony_ci }, 22168c2ecf20Sopenharmony_ci .caam = { 22178c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 22188c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 22198c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22208c2ecf20Sopenharmony_ci }, 22218c2ecf20Sopenharmony_ci }, 22228c2ecf20Sopenharmony_ci { 22238c2ecf20Sopenharmony_ci .aead = { 22248c2ecf20Sopenharmony_ci .base = { 22258c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 22268c2ecf20Sopenharmony_ci "cbc(aes)))", 22278c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 22288c2ecf20Sopenharmony_ci "cbc-aes-caam", 22298c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 22308c2ecf20Sopenharmony_ci }, 22318c2ecf20Sopenharmony_ci .setkey = aead_setkey, 22328c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22338c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22348c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22358c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 22368c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 22378c2ecf20Sopenharmony_ci }, 22388c2ecf20Sopenharmony_ci .caam = { 22398c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 22408c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 22418c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22428c2ecf20Sopenharmony_ci .geniv = true, 22438c2ecf20Sopenharmony_ci }, 22448c2ecf20Sopenharmony_ci }, 22458c2ecf20Sopenharmony_ci { 22468c2ecf20Sopenharmony_ci .aead = { 22478c2ecf20Sopenharmony_ci .base = { 22488c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(aes))", 22498c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 22508c2ecf20Sopenharmony_ci "cbc-aes-caam", 22518c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 22528c2ecf20Sopenharmony_ci }, 22538c2ecf20Sopenharmony_ci .setkey = aead_setkey, 22548c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22558c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22568c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22578c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 22588c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 22598c2ecf20Sopenharmony_ci }, 22608c2ecf20Sopenharmony_ci .caam = { 22618c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 22628c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 22638c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22648c2ecf20Sopenharmony_ci }, 22658c2ecf20Sopenharmony_ci }, 22668c2ecf20Sopenharmony_ci { 22678c2ecf20Sopenharmony_ci .aead = { 22688c2ecf20Sopenharmony_ci .base = { 22698c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 22708c2ecf20Sopenharmony_ci "cbc(aes)))", 22718c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 22728c2ecf20Sopenharmony_ci "hmac-sha1-cbc-aes-caam", 22738c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 22748c2ecf20Sopenharmony_ci }, 22758c2ecf20Sopenharmony_ci .setkey = aead_setkey, 22768c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22778c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 22788c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 22798c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 22808c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 22818c2ecf20Sopenharmony_ci }, 22828c2ecf20Sopenharmony_ci .caam = { 22838c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 22848c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 22858c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 22868c2ecf20Sopenharmony_ci .geniv = true, 22878c2ecf20Sopenharmony_ci }, 22888c2ecf20Sopenharmony_ci }, 22898c2ecf20Sopenharmony_ci { 22908c2ecf20Sopenharmony_ci .aead = { 22918c2ecf20Sopenharmony_ci .base = { 22928c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(aes))", 22938c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 22948c2ecf20Sopenharmony_ci "cbc-aes-caam", 22958c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 22968c2ecf20Sopenharmony_ci }, 22978c2ecf20Sopenharmony_ci .setkey = aead_setkey, 22988c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 22998c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23008c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23018c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 23028c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 23038c2ecf20Sopenharmony_ci }, 23048c2ecf20Sopenharmony_ci .caam = { 23058c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 23068c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 23078c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23088c2ecf20Sopenharmony_ci }, 23098c2ecf20Sopenharmony_ci }, 23108c2ecf20Sopenharmony_ci { 23118c2ecf20Sopenharmony_ci .aead = { 23128c2ecf20Sopenharmony_ci .base = { 23138c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 23148c2ecf20Sopenharmony_ci "cbc(aes)))", 23158c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 23168c2ecf20Sopenharmony_ci "hmac-sha224-cbc-aes-caam", 23178c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 23188c2ecf20Sopenharmony_ci }, 23198c2ecf20Sopenharmony_ci .setkey = aead_setkey, 23208c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23218c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23228c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23238c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 23248c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 23258c2ecf20Sopenharmony_ci }, 23268c2ecf20Sopenharmony_ci .caam = { 23278c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 23288c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 23298c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23308c2ecf20Sopenharmony_ci .geniv = true, 23318c2ecf20Sopenharmony_ci }, 23328c2ecf20Sopenharmony_ci }, 23338c2ecf20Sopenharmony_ci { 23348c2ecf20Sopenharmony_ci .aead = { 23358c2ecf20Sopenharmony_ci .base = { 23368c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(aes))", 23378c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 23388c2ecf20Sopenharmony_ci "cbc-aes-caam", 23398c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 23408c2ecf20Sopenharmony_ci }, 23418c2ecf20Sopenharmony_ci .setkey = aead_setkey, 23428c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23438c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23448c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23458c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 23468c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 23478c2ecf20Sopenharmony_ci }, 23488c2ecf20Sopenharmony_ci .caam = { 23498c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 23508c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 23518c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23528c2ecf20Sopenharmony_ci }, 23538c2ecf20Sopenharmony_ci }, 23548c2ecf20Sopenharmony_ci { 23558c2ecf20Sopenharmony_ci .aead = { 23568c2ecf20Sopenharmony_ci .base = { 23578c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 23588c2ecf20Sopenharmony_ci "cbc(aes)))", 23598c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 23608c2ecf20Sopenharmony_ci "hmac-sha256-cbc-aes-caam", 23618c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 23628c2ecf20Sopenharmony_ci }, 23638c2ecf20Sopenharmony_ci .setkey = aead_setkey, 23648c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23658c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23668c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23678c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 23688c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 23698c2ecf20Sopenharmony_ci }, 23708c2ecf20Sopenharmony_ci .caam = { 23718c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 23728c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 23738c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23748c2ecf20Sopenharmony_ci .geniv = true, 23758c2ecf20Sopenharmony_ci }, 23768c2ecf20Sopenharmony_ci }, 23778c2ecf20Sopenharmony_ci { 23788c2ecf20Sopenharmony_ci .aead = { 23798c2ecf20Sopenharmony_ci .base = { 23808c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(aes))", 23818c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 23828c2ecf20Sopenharmony_ci "cbc-aes-caam", 23838c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 23848c2ecf20Sopenharmony_ci }, 23858c2ecf20Sopenharmony_ci .setkey = aead_setkey, 23868c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 23878c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 23888c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 23898c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 23908c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 23918c2ecf20Sopenharmony_ci }, 23928c2ecf20Sopenharmony_ci .caam = { 23938c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 23948c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 23958c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 23968c2ecf20Sopenharmony_ci }, 23978c2ecf20Sopenharmony_ci }, 23988c2ecf20Sopenharmony_ci { 23998c2ecf20Sopenharmony_ci .aead = { 24008c2ecf20Sopenharmony_ci .base = { 24018c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 24028c2ecf20Sopenharmony_ci "cbc(aes)))", 24038c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 24048c2ecf20Sopenharmony_ci "hmac-sha384-cbc-aes-caam", 24058c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 24068c2ecf20Sopenharmony_ci }, 24078c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24088c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24098c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24108c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24118c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 24128c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 24138c2ecf20Sopenharmony_ci }, 24148c2ecf20Sopenharmony_ci .caam = { 24158c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 24168c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 24178c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24188c2ecf20Sopenharmony_ci .geniv = true, 24198c2ecf20Sopenharmony_ci }, 24208c2ecf20Sopenharmony_ci }, 24218c2ecf20Sopenharmony_ci { 24228c2ecf20Sopenharmony_ci .aead = { 24238c2ecf20Sopenharmony_ci .base = { 24248c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(aes))", 24258c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 24268c2ecf20Sopenharmony_ci "cbc-aes-caam", 24278c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 24288c2ecf20Sopenharmony_ci }, 24298c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24308c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24318c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24328c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24338c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 24348c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 24358c2ecf20Sopenharmony_ci }, 24368c2ecf20Sopenharmony_ci .caam = { 24378c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 24388c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 24398c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24408c2ecf20Sopenharmony_ci }, 24418c2ecf20Sopenharmony_ci }, 24428c2ecf20Sopenharmony_ci { 24438c2ecf20Sopenharmony_ci .aead = { 24448c2ecf20Sopenharmony_ci .base = { 24458c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 24468c2ecf20Sopenharmony_ci "cbc(aes)))", 24478c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 24488c2ecf20Sopenharmony_ci "hmac-sha512-cbc-aes-caam", 24498c2ecf20Sopenharmony_ci .cra_blocksize = AES_BLOCK_SIZE, 24508c2ecf20Sopenharmony_ci }, 24518c2ecf20Sopenharmony_ci .setkey = aead_setkey, 24528c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24538c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24548c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24558c2ecf20Sopenharmony_ci .ivsize = AES_BLOCK_SIZE, 24568c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 24578c2ecf20Sopenharmony_ci }, 24588c2ecf20Sopenharmony_ci .caam = { 24598c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 24608c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 24618c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24628c2ecf20Sopenharmony_ci .geniv = true, 24638c2ecf20Sopenharmony_ci }, 24648c2ecf20Sopenharmony_ci }, 24658c2ecf20Sopenharmony_ci { 24668c2ecf20Sopenharmony_ci .aead = { 24678c2ecf20Sopenharmony_ci .base = { 24688c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des3_ede))", 24698c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 24708c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 24718c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 24728c2ecf20Sopenharmony_ci }, 24738c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 24748c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24758c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24768c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24778c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 24788c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 24798c2ecf20Sopenharmony_ci }, 24808c2ecf20Sopenharmony_ci .caam = { 24818c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 24828c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 24838c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 24848c2ecf20Sopenharmony_ci } 24858c2ecf20Sopenharmony_ci }, 24868c2ecf20Sopenharmony_ci { 24878c2ecf20Sopenharmony_ci .aead = { 24888c2ecf20Sopenharmony_ci .base = { 24898c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 24908c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 24918c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 24928c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 24938c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 24948c2ecf20Sopenharmony_ci }, 24958c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 24968c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 24978c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 24988c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 24998c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 25008c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 25018c2ecf20Sopenharmony_ci }, 25028c2ecf20Sopenharmony_ci .caam = { 25038c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 25048c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 25058c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25068c2ecf20Sopenharmony_ci .geniv = true, 25078c2ecf20Sopenharmony_ci } 25088c2ecf20Sopenharmony_ci }, 25098c2ecf20Sopenharmony_ci { 25108c2ecf20Sopenharmony_ci .aead = { 25118c2ecf20Sopenharmony_ci .base = { 25128c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 25138c2ecf20Sopenharmony_ci "cbc(des3_ede))", 25148c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 25158c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 25168c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 25178c2ecf20Sopenharmony_ci }, 25188c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 25198c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25208c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25218c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25228c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 25238c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 25248c2ecf20Sopenharmony_ci }, 25258c2ecf20Sopenharmony_ci .caam = { 25268c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 25278c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 25288c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25298c2ecf20Sopenharmony_ci }, 25308c2ecf20Sopenharmony_ci }, 25318c2ecf20Sopenharmony_ci { 25328c2ecf20Sopenharmony_ci .aead = { 25338c2ecf20Sopenharmony_ci .base = { 25348c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 25358c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 25368c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 25378c2ecf20Sopenharmony_ci "hmac-sha1-" 25388c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 25398c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 25408c2ecf20Sopenharmony_ci }, 25418c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 25428c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25438c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25448c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25458c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 25468c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 25478c2ecf20Sopenharmony_ci }, 25488c2ecf20Sopenharmony_ci .caam = { 25498c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 25508c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 25518c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25528c2ecf20Sopenharmony_ci .geniv = true, 25538c2ecf20Sopenharmony_ci }, 25548c2ecf20Sopenharmony_ci }, 25558c2ecf20Sopenharmony_ci { 25568c2ecf20Sopenharmony_ci .aead = { 25578c2ecf20Sopenharmony_ci .base = { 25588c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 25598c2ecf20Sopenharmony_ci "cbc(des3_ede))", 25608c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 25618c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 25628c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 25638c2ecf20Sopenharmony_ci }, 25648c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 25658c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25668c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25678c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25688c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 25698c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 25708c2ecf20Sopenharmony_ci }, 25718c2ecf20Sopenharmony_ci .caam = { 25728c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 25738c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 25748c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25758c2ecf20Sopenharmony_ci }, 25768c2ecf20Sopenharmony_ci }, 25778c2ecf20Sopenharmony_ci { 25788c2ecf20Sopenharmony_ci .aead = { 25798c2ecf20Sopenharmony_ci .base = { 25808c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 25818c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 25828c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 25838c2ecf20Sopenharmony_ci "hmac-sha224-" 25848c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 25858c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 25868c2ecf20Sopenharmony_ci }, 25878c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 25888c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 25898c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 25908c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 25918c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 25928c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 25938c2ecf20Sopenharmony_ci }, 25948c2ecf20Sopenharmony_ci .caam = { 25958c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 25968c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 25978c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 25988c2ecf20Sopenharmony_ci .geniv = true, 25998c2ecf20Sopenharmony_ci }, 26008c2ecf20Sopenharmony_ci }, 26018c2ecf20Sopenharmony_ci { 26028c2ecf20Sopenharmony_ci .aead = { 26038c2ecf20Sopenharmony_ci .base = { 26048c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 26058c2ecf20Sopenharmony_ci "cbc(des3_ede))", 26068c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 26078c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 26088c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 26098c2ecf20Sopenharmony_ci }, 26108c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 26118c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26128c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26138c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26148c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 26158c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 26168c2ecf20Sopenharmony_ci }, 26178c2ecf20Sopenharmony_ci .caam = { 26188c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 26198c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 26208c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26218c2ecf20Sopenharmony_ci }, 26228c2ecf20Sopenharmony_ci }, 26238c2ecf20Sopenharmony_ci { 26248c2ecf20Sopenharmony_ci .aead = { 26258c2ecf20Sopenharmony_ci .base = { 26268c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 26278c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 26288c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 26298c2ecf20Sopenharmony_ci "hmac-sha256-" 26308c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 26318c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 26328c2ecf20Sopenharmony_ci }, 26338c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 26348c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26358c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26368c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26378c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 26388c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 26398c2ecf20Sopenharmony_ci }, 26408c2ecf20Sopenharmony_ci .caam = { 26418c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 26428c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 26438c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26448c2ecf20Sopenharmony_ci .geniv = true, 26458c2ecf20Sopenharmony_ci }, 26468c2ecf20Sopenharmony_ci }, 26478c2ecf20Sopenharmony_ci { 26488c2ecf20Sopenharmony_ci .aead = { 26498c2ecf20Sopenharmony_ci .base = { 26508c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 26518c2ecf20Sopenharmony_ci "cbc(des3_ede))", 26528c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 26538c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 26548c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 26558c2ecf20Sopenharmony_ci }, 26568c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 26578c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26588c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26598c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26608c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 26618c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 26628c2ecf20Sopenharmony_ci }, 26638c2ecf20Sopenharmony_ci .caam = { 26648c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 26658c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 26668c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26678c2ecf20Sopenharmony_ci }, 26688c2ecf20Sopenharmony_ci }, 26698c2ecf20Sopenharmony_ci { 26708c2ecf20Sopenharmony_ci .aead = { 26718c2ecf20Sopenharmony_ci .base = { 26728c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 26738c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 26748c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 26758c2ecf20Sopenharmony_ci "hmac-sha384-" 26768c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 26778c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 26788c2ecf20Sopenharmony_ci }, 26798c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 26808c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 26818c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 26828c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 26838c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 26848c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 26858c2ecf20Sopenharmony_ci }, 26868c2ecf20Sopenharmony_ci .caam = { 26878c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 26888c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 26898c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 26908c2ecf20Sopenharmony_ci .geniv = true, 26918c2ecf20Sopenharmony_ci }, 26928c2ecf20Sopenharmony_ci }, 26938c2ecf20Sopenharmony_ci { 26948c2ecf20Sopenharmony_ci .aead = { 26958c2ecf20Sopenharmony_ci .base = { 26968c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 26978c2ecf20Sopenharmony_ci "cbc(des3_ede))", 26988c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 26998c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 27008c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 27018c2ecf20Sopenharmony_ci }, 27028c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 27038c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27048c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27058c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27068c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 27078c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 27088c2ecf20Sopenharmony_ci }, 27098c2ecf20Sopenharmony_ci .caam = { 27108c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 27118c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 27128c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27138c2ecf20Sopenharmony_ci }, 27148c2ecf20Sopenharmony_ci }, 27158c2ecf20Sopenharmony_ci { 27168c2ecf20Sopenharmony_ci .aead = { 27178c2ecf20Sopenharmony_ci .base = { 27188c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 27198c2ecf20Sopenharmony_ci "cbc(des3_ede)))", 27208c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 27218c2ecf20Sopenharmony_ci "hmac-sha512-" 27228c2ecf20Sopenharmony_ci "cbc-des3_ede-caam", 27238c2ecf20Sopenharmony_ci .cra_blocksize = DES3_EDE_BLOCK_SIZE, 27248c2ecf20Sopenharmony_ci }, 27258c2ecf20Sopenharmony_ci .setkey = des3_aead_setkey, 27268c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27278c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27288c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27298c2ecf20Sopenharmony_ci .ivsize = DES3_EDE_BLOCK_SIZE, 27308c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 27318c2ecf20Sopenharmony_ci }, 27328c2ecf20Sopenharmony_ci .caam = { 27338c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 27348c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 27358c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27368c2ecf20Sopenharmony_ci .geniv = true, 27378c2ecf20Sopenharmony_ci }, 27388c2ecf20Sopenharmony_ci }, 27398c2ecf20Sopenharmony_ci { 27408c2ecf20Sopenharmony_ci .aead = { 27418c2ecf20Sopenharmony_ci .base = { 27428c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5),cbc(des))", 27438c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 27448c2ecf20Sopenharmony_ci "cbc-des-caam", 27458c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 27468c2ecf20Sopenharmony_ci }, 27478c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27488c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27498c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27508c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27518c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 27528c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 27538c2ecf20Sopenharmony_ci }, 27548c2ecf20Sopenharmony_ci .caam = { 27558c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 27568c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 27578c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27588c2ecf20Sopenharmony_ci }, 27598c2ecf20Sopenharmony_ci }, 27608c2ecf20Sopenharmony_ci { 27618c2ecf20Sopenharmony_ci .aead = { 27628c2ecf20Sopenharmony_ci .base = { 27638c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(md5)," 27648c2ecf20Sopenharmony_ci "cbc(des)))", 27658c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-hmac-md5-" 27668c2ecf20Sopenharmony_ci "cbc-des-caam", 27678c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 27688c2ecf20Sopenharmony_ci }, 27698c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27708c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27718c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27728c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27738c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 27748c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 27758c2ecf20Sopenharmony_ci }, 27768c2ecf20Sopenharmony_ci .caam = { 27778c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 27788c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 27798c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 27808c2ecf20Sopenharmony_ci .geniv = true, 27818c2ecf20Sopenharmony_ci }, 27828c2ecf20Sopenharmony_ci }, 27838c2ecf20Sopenharmony_ci { 27848c2ecf20Sopenharmony_ci .aead = { 27858c2ecf20Sopenharmony_ci .base = { 27868c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1),cbc(des))", 27878c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 27888c2ecf20Sopenharmony_ci "cbc-des-caam", 27898c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 27908c2ecf20Sopenharmony_ci }, 27918c2ecf20Sopenharmony_ci .setkey = aead_setkey, 27928c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 27938c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 27948c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 27958c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 27968c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 27978c2ecf20Sopenharmony_ci }, 27988c2ecf20Sopenharmony_ci .caam = { 27998c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 28008c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 28018c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28028c2ecf20Sopenharmony_ci }, 28038c2ecf20Sopenharmony_ci }, 28048c2ecf20Sopenharmony_ci { 28058c2ecf20Sopenharmony_ci .aead = { 28068c2ecf20Sopenharmony_ci .base = { 28078c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha1)," 28088c2ecf20Sopenharmony_ci "cbc(des)))", 28098c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 28108c2ecf20Sopenharmony_ci "hmac-sha1-cbc-des-caam", 28118c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 28128c2ecf20Sopenharmony_ci }, 28138c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28148c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28158c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28168c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28178c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 28188c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 28198c2ecf20Sopenharmony_ci }, 28208c2ecf20Sopenharmony_ci .caam = { 28218c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 28228c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 28238c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28248c2ecf20Sopenharmony_ci .geniv = true, 28258c2ecf20Sopenharmony_ci }, 28268c2ecf20Sopenharmony_ci }, 28278c2ecf20Sopenharmony_ci { 28288c2ecf20Sopenharmony_ci .aead = { 28298c2ecf20Sopenharmony_ci .base = { 28308c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224),cbc(des))", 28318c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 28328c2ecf20Sopenharmony_ci "cbc-des-caam", 28338c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 28348c2ecf20Sopenharmony_ci }, 28358c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28368c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28378c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28388c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28398c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 28408c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 28418c2ecf20Sopenharmony_ci }, 28428c2ecf20Sopenharmony_ci .caam = { 28438c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 28448c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 28458c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28468c2ecf20Sopenharmony_ci }, 28478c2ecf20Sopenharmony_ci }, 28488c2ecf20Sopenharmony_ci { 28498c2ecf20Sopenharmony_ci .aead = { 28508c2ecf20Sopenharmony_ci .base = { 28518c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha224)," 28528c2ecf20Sopenharmony_ci "cbc(des)))", 28538c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 28548c2ecf20Sopenharmony_ci "hmac-sha224-cbc-des-caam", 28558c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 28568c2ecf20Sopenharmony_ci }, 28578c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28588c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28598c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28608c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28618c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 28628c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 28638c2ecf20Sopenharmony_ci }, 28648c2ecf20Sopenharmony_ci .caam = { 28658c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 28668c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 28678c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28688c2ecf20Sopenharmony_ci .geniv = true, 28698c2ecf20Sopenharmony_ci }, 28708c2ecf20Sopenharmony_ci }, 28718c2ecf20Sopenharmony_ci { 28728c2ecf20Sopenharmony_ci .aead = { 28738c2ecf20Sopenharmony_ci .base = { 28748c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256),cbc(des))", 28758c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 28768c2ecf20Sopenharmony_ci "cbc-des-caam", 28778c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 28788c2ecf20Sopenharmony_ci }, 28798c2ecf20Sopenharmony_ci .setkey = aead_setkey, 28808c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 28818c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 28828c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 28838c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 28848c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 28858c2ecf20Sopenharmony_ci }, 28868c2ecf20Sopenharmony_ci .caam = { 28878c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 28888c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 28898c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 28908c2ecf20Sopenharmony_ci }, 28918c2ecf20Sopenharmony_ci }, 28928c2ecf20Sopenharmony_ci { 28938c2ecf20Sopenharmony_ci .aead = { 28948c2ecf20Sopenharmony_ci .base = { 28958c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha256)," 28968c2ecf20Sopenharmony_ci "cbc(des)))", 28978c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 28988c2ecf20Sopenharmony_ci "hmac-sha256-cbc-des-caam", 28998c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 29008c2ecf20Sopenharmony_ci }, 29018c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29028c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29038c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29048c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29058c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 29068c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 29078c2ecf20Sopenharmony_ci }, 29088c2ecf20Sopenharmony_ci .caam = { 29098c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29108c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 29118c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29128c2ecf20Sopenharmony_ci .geniv = true, 29138c2ecf20Sopenharmony_ci }, 29148c2ecf20Sopenharmony_ci }, 29158c2ecf20Sopenharmony_ci { 29168c2ecf20Sopenharmony_ci .aead = { 29178c2ecf20Sopenharmony_ci .base = { 29188c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384),cbc(des))", 29198c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 29208c2ecf20Sopenharmony_ci "cbc-des-caam", 29218c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 29228c2ecf20Sopenharmony_ci }, 29238c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29248c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29258c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29268c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29278c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 29288c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 29298c2ecf20Sopenharmony_ci }, 29308c2ecf20Sopenharmony_ci .caam = { 29318c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29328c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 29338c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29348c2ecf20Sopenharmony_ci }, 29358c2ecf20Sopenharmony_ci }, 29368c2ecf20Sopenharmony_ci { 29378c2ecf20Sopenharmony_ci .aead = { 29388c2ecf20Sopenharmony_ci .base = { 29398c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha384)," 29408c2ecf20Sopenharmony_ci "cbc(des)))", 29418c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 29428c2ecf20Sopenharmony_ci "hmac-sha384-cbc-des-caam", 29438c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 29448c2ecf20Sopenharmony_ci }, 29458c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29468c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29478c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29488c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29498c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 29508c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 29518c2ecf20Sopenharmony_ci }, 29528c2ecf20Sopenharmony_ci .caam = { 29538c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29548c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 29558c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29568c2ecf20Sopenharmony_ci .geniv = true, 29578c2ecf20Sopenharmony_ci }, 29588c2ecf20Sopenharmony_ci }, 29598c2ecf20Sopenharmony_ci { 29608c2ecf20Sopenharmony_ci .aead = { 29618c2ecf20Sopenharmony_ci .base = { 29628c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512),cbc(des))", 29638c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 29648c2ecf20Sopenharmony_ci "cbc-des-caam", 29658c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 29668c2ecf20Sopenharmony_ci }, 29678c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29688c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29698c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29708c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29718c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 29728c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 29738c2ecf20Sopenharmony_ci }, 29748c2ecf20Sopenharmony_ci .caam = { 29758c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29768c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 29778c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 29788c2ecf20Sopenharmony_ci }, 29798c2ecf20Sopenharmony_ci }, 29808c2ecf20Sopenharmony_ci { 29818c2ecf20Sopenharmony_ci .aead = { 29828c2ecf20Sopenharmony_ci .base = { 29838c2ecf20Sopenharmony_ci .cra_name = "echainiv(authenc(hmac(sha512)," 29848c2ecf20Sopenharmony_ci "cbc(des)))", 29858c2ecf20Sopenharmony_ci .cra_driver_name = "echainiv-authenc-" 29868c2ecf20Sopenharmony_ci "hmac-sha512-cbc-des-caam", 29878c2ecf20Sopenharmony_ci .cra_blocksize = DES_BLOCK_SIZE, 29888c2ecf20Sopenharmony_ci }, 29898c2ecf20Sopenharmony_ci .setkey = aead_setkey, 29908c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 29918c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 29928c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 29938c2ecf20Sopenharmony_ci .ivsize = DES_BLOCK_SIZE, 29948c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 29958c2ecf20Sopenharmony_ci }, 29968c2ecf20Sopenharmony_ci .caam = { 29978c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29988c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 29998c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 30008c2ecf20Sopenharmony_ci .geniv = true, 30018c2ecf20Sopenharmony_ci }, 30028c2ecf20Sopenharmony_ci }, 30038c2ecf20Sopenharmony_ci { 30048c2ecf20Sopenharmony_ci .aead = { 30058c2ecf20Sopenharmony_ci .base = { 30068c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(md5)," 30078c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 30088c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-md5-" 30098c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 30108c2ecf20Sopenharmony_ci .cra_blocksize = 1, 30118c2ecf20Sopenharmony_ci }, 30128c2ecf20Sopenharmony_ci .setkey = aead_setkey, 30138c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 30148c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 30158c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 30168c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 30178c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 30188c2ecf20Sopenharmony_ci }, 30198c2ecf20Sopenharmony_ci .caam = { 30208c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 30218c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 30228c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 30238c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 30248c2ecf20Sopenharmony_ci .rfc3686 = true, 30258c2ecf20Sopenharmony_ci }, 30268c2ecf20Sopenharmony_ci }, 30278c2ecf20Sopenharmony_ci { 30288c2ecf20Sopenharmony_ci .aead = { 30298c2ecf20Sopenharmony_ci .base = { 30308c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 30318c2ecf20Sopenharmony_ci "hmac(md5),rfc3686(ctr(aes))))", 30328c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-md5-" 30338c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 30348c2ecf20Sopenharmony_ci .cra_blocksize = 1, 30358c2ecf20Sopenharmony_ci }, 30368c2ecf20Sopenharmony_ci .setkey = aead_setkey, 30378c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 30388c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 30398c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 30408c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 30418c2ecf20Sopenharmony_ci .maxauthsize = MD5_DIGEST_SIZE, 30428c2ecf20Sopenharmony_ci }, 30438c2ecf20Sopenharmony_ci .caam = { 30448c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 30458c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 30468c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_MD5 | 30478c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 30488c2ecf20Sopenharmony_ci .rfc3686 = true, 30498c2ecf20Sopenharmony_ci .geniv = true, 30508c2ecf20Sopenharmony_ci }, 30518c2ecf20Sopenharmony_ci }, 30528c2ecf20Sopenharmony_ci { 30538c2ecf20Sopenharmony_ci .aead = { 30548c2ecf20Sopenharmony_ci .base = { 30558c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha1)," 30568c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 30578c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha1-" 30588c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 30598c2ecf20Sopenharmony_ci .cra_blocksize = 1, 30608c2ecf20Sopenharmony_ci }, 30618c2ecf20Sopenharmony_ci .setkey = aead_setkey, 30628c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 30638c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 30648c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 30658c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 30668c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 30678c2ecf20Sopenharmony_ci }, 30688c2ecf20Sopenharmony_ci .caam = { 30698c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 30708c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 30718c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 30728c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 30738c2ecf20Sopenharmony_ci .rfc3686 = true, 30748c2ecf20Sopenharmony_ci }, 30758c2ecf20Sopenharmony_ci }, 30768c2ecf20Sopenharmony_ci { 30778c2ecf20Sopenharmony_ci .aead = { 30788c2ecf20Sopenharmony_ci .base = { 30798c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 30808c2ecf20Sopenharmony_ci "hmac(sha1),rfc3686(ctr(aes))))", 30818c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha1-" 30828c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 30838c2ecf20Sopenharmony_ci .cra_blocksize = 1, 30848c2ecf20Sopenharmony_ci }, 30858c2ecf20Sopenharmony_ci .setkey = aead_setkey, 30868c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 30878c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 30888c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 30898c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 30908c2ecf20Sopenharmony_ci .maxauthsize = SHA1_DIGEST_SIZE, 30918c2ecf20Sopenharmony_ci }, 30928c2ecf20Sopenharmony_ci .caam = { 30938c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 30948c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 30958c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 30968c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 30978c2ecf20Sopenharmony_ci .rfc3686 = true, 30988c2ecf20Sopenharmony_ci .geniv = true, 30998c2ecf20Sopenharmony_ci }, 31008c2ecf20Sopenharmony_ci }, 31018c2ecf20Sopenharmony_ci { 31028c2ecf20Sopenharmony_ci .aead = { 31038c2ecf20Sopenharmony_ci .base = { 31048c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha224)," 31058c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 31068c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha224-" 31078c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 31088c2ecf20Sopenharmony_ci .cra_blocksize = 1, 31098c2ecf20Sopenharmony_ci }, 31108c2ecf20Sopenharmony_ci .setkey = aead_setkey, 31118c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 31128c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 31138c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 31148c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 31158c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 31168c2ecf20Sopenharmony_ci }, 31178c2ecf20Sopenharmony_ci .caam = { 31188c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 31198c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 31208c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 31218c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 31228c2ecf20Sopenharmony_ci .rfc3686 = true, 31238c2ecf20Sopenharmony_ci }, 31248c2ecf20Sopenharmony_ci }, 31258c2ecf20Sopenharmony_ci { 31268c2ecf20Sopenharmony_ci .aead = { 31278c2ecf20Sopenharmony_ci .base = { 31288c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(" 31298c2ecf20Sopenharmony_ci "hmac(sha224),rfc3686(ctr(aes))))", 31308c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha224-" 31318c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 31328c2ecf20Sopenharmony_ci .cra_blocksize = 1, 31338c2ecf20Sopenharmony_ci }, 31348c2ecf20Sopenharmony_ci .setkey = aead_setkey, 31358c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 31368c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 31378c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 31388c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 31398c2ecf20Sopenharmony_ci .maxauthsize = SHA224_DIGEST_SIZE, 31408c2ecf20Sopenharmony_ci }, 31418c2ecf20Sopenharmony_ci .caam = { 31428c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 31438c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 31448c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 31458c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 31468c2ecf20Sopenharmony_ci .rfc3686 = true, 31478c2ecf20Sopenharmony_ci .geniv = true, 31488c2ecf20Sopenharmony_ci }, 31498c2ecf20Sopenharmony_ci }, 31508c2ecf20Sopenharmony_ci { 31518c2ecf20Sopenharmony_ci .aead = { 31528c2ecf20Sopenharmony_ci .base = { 31538c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha256)," 31548c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 31558c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha256-" 31568c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 31578c2ecf20Sopenharmony_ci .cra_blocksize = 1, 31588c2ecf20Sopenharmony_ci }, 31598c2ecf20Sopenharmony_ci .setkey = aead_setkey, 31608c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 31618c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 31628c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 31638c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 31648c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 31658c2ecf20Sopenharmony_ci }, 31668c2ecf20Sopenharmony_ci .caam = { 31678c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 31688c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 31698c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 31708c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 31718c2ecf20Sopenharmony_ci .rfc3686 = true, 31728c2ecf20Sopenharmony_ci }, 31738c2ecf20Sopenharmony_ci }, 31748c2ecf20Sopenharmony_ci { 31758c2ecf20Sopenharmony_ci .aead = { 31768c2ecf20Sopenharmony_ci .base = { 31778c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha256)," 31788c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 31798c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha256-" 31808c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 31818c2ecf20Sopenharmony_ci .cra_blocksize = 1, 31828c2ecf20Sopenharmony_ci }, 31838c2ecf20Sopenharmony_ci .setkey = aead_setkey, 31848c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 31858c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 31868c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 31878c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 31888c2ecf20Sopenharmony_ci .maxauthsize = SHA256_DIGEST_SIZE, 31898c2ecf20Sopenharmony_ci }, 31908c2ecf20Sopenharmony_ci .caam = { 31918c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 31928c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 31938c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 31948c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 31958c2ecf20Sopenharmony_ci .rfc3686 = true, 31968c2ecf20Sopenharmony_ci .geniv = true, 31978c2ecf20Sopenharmony_ci }, 31988c2ecf20Sopenharmony_ci }, 31998c2ecf20Sopenharmony_ci { 32008c2ecf20Sopenharmony_ci .aead = { 32018c2ecf20Sopenharmony_ci .base = { 32028c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha384)," 32038c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 32048c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha384-" 32058c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 32068c2ecf20Sopenharmony_ci .cra_blocksize = 1, 32078c2ecf20Sopenharmony_ci }, 32088c2ecf20Sopenharmony_ci .setkey = aead_setkey, 32098c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 32108c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 32118c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 32128c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 32138c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 32148c2ecf20Sopenharmony_ci }, 32158c2ecf20Sopenharmony_ci .caam = { 32168c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 32178c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 32188c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 32198c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 32208c2ecf20Sopenharmony_ci .rfc3686 = true, 32218c2ecf20Sopenharmony_ci }, 32228c2ecf20Sopenharmony_ci }, 32238c2ecf20Sopenharmony_ci { 32248c2ecf20Sopenharmony_ci .aead = { 32258c2ecf20Sopenharmony_ci .base = { 32268c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha384)," 32278c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 32288c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha384-" 32298c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 32308c2ecf20Sopenharmony_ci .cra_blocksize = 1, 32318c2ecf20Sopenharmony_ci }, 32328c2ecf20Sopenharmony_ci .setkey = aead_setkey, 32338c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 32348c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 32358c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 32368c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 32378c2ecf20Sopenharmony_ci .maxauthsize = SHA384_DIGEST_SIZE, 32388c2ecf20Sopenharmony_ci }, 32398c2ecf20Sopenharmony_ci .caam = { 32408c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 32418c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 32428c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 32438c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 32448c2ecf20Sopenharmony_ci .rfc3686 = true, 32458c2ecf20Sopenharmony_ci .geniv = true, 32468c2ecf20Sopenharmony_ci }, 32478c2ecf20Sopenharmony_ci }, 32488c2ecf20Sopenharmony_ci { 32498c2ecf20Sopenharmony_ci .aead = { 32508c2ecf20Sopenharmony_ci .base = { 32518c2ecf20Sopenharmony_ci .cra_name = "authenc(hmac(sha512)," 32528c2ecf20Sopenharmony_ci "rfc3686(ctr(aes)))", 32538c2ecf20Sopenharmony_ci .cra_driver_name = "authenc-hmac-sha512-" 32548c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 32558c2ecf20Sopenharmony_ci .cra_blocksize = 1, 32568c2ecf20Sopenharmony_ci }, 32578c2ecf20Sopenharmony_ci .setkey = aead_setkey, 32588c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 32598c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 32608c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 32618c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 32628c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 32638c2ecf20Sopenharmony_ci }, 32648c2ecf20Sopenharmony_ci .caam = { 32658c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 32668c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 32678c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 32688c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 32698c2ecf20Sopenharmony_ci .rfc3686 = true, 32708c2ecf20Sopenharmony_ci }, 32718c2ecf20Sopenharmony_ci }, 32728c2ecf20Sopenharmony_ci { 32738c2ecf20Sopenharmony_ci .aead = { 32748c2ecf20Sopenharmony_ci .base = { 32758c2ecf20Sopenharmony_ci .cra_name = "seqiv(authenc(hmac(sha512)," 32768c2ecf20Sopenharmony_ci "rfc3686(ctr(aes))))", 32778c2ecf20Sopenharmony_ci .cra_driver_name = "seqiv-authenc-hmac-sha512-" 32788c2ecf20Sopenharmony_ci "rfc3686-ctr-aes-caam", 32798c2ecf20Sopenharmony_ci .cra_blocksize = 1, 32808c2ecf20Sopenharmony_ci }, 32818c2ecf20Sopenharmony_ci .setkey = aead_setkey, 32828c2ecf20Sopenharmony_ci .setauthsize = aead_setauthsize, 32838c2ecf20Sopenharmony_ci .encrypt = aead_encrypt, 32848c2ecf20Sopenharmony_ci .decrypt = aead_decrypt, 32858c2ecf20Sopenharmony_ci .ivsize = CTR_RFC3686_IV_SIZE, 32868c2ecf20Sopenharmony_ci .maxauthsize = SHA512_DIGEST_SIZE, 32878c2ecf20Sopenharmony_ci }, 32888c2ecf20Sopenharmony_ci .caam = { 32898c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_AES | 32908c2ecf20Sopenharmony_ci OP_ALG_AAI_CTR_MOD128, 32918c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 32928c2ecf20Sopenharmony_ci OP_ALG_AAI_HMAC_PRECOMP, 32938c2ecf20Sopenharmony_ci .rfc3686 = true, 32948c2ecf20Sopenharmony_ci .geniv = true, 32958c2ecf20Sopenharmony_ci }, 32968c2ecf20Sopenharmony_ci }, 32978c2ecf20Sopenharmony_ci { 32988c2ecf20Sopenharmony_ci .aead = { 32998c2ecf20Sopenharmony_ci .base = { 33008c2ecf20Sopenharmony_ci .cra_name = "rfc7539(chacha20,poly1305)", 33018c2ecf20Sopenharmony_ci .cra_driver_name = "rfc7539-chacha20-poly1305-" 33028c2ecf20Sopenharmony_ci "caam", 33038c2ecf20Sopenharmony_ci .cra_blocksize = 1, 33048c2ecf20Sopenharmony_ci }, 33058c2ecf20Sopenharmony_ci .setkey = chachapoly_setkey, 33068c2ecf20Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 33078c2ecf20Sopenharmony_ci .encrypt = chachapoly_encrypt, 33088c2ecf20Sopenharmony_ci .decrypt = chachapoly_decrypt, 33098c2ecf20Sopenharmony_ci .ivsize = CHACHAPOLY_IV_SIZE, 33108c2ecf20Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 33118c2ecf20Sopenharmony_ci }, 33128c2ecf20Sopenharmony_ci .caam = { 33138c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 33148c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 33158c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 33168c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 33178c2ecf20Sopenharmony_ci .nodkp = true, 33188c2ecf20Sopenharmony_ci }, 33198c2ecf20Sopenharmony_ci }, 33208c2ecf20Sopenharmony_ci { 33218c2ecf20Sopenharmony_ci .aead = { 33228c2ecf20Sopenharmony_ci .base = { 33238c2ecf20Sopenharmony_ci .cra_name = "rfc7539esp(chacha20,poly1305)", 33248c2ecf20Sopenharmony_ci .cra_driver_name = "rfc7539esp-chacha20-" 33258c2ecf20Sopenharmony_ci "poly1305-caam", 33268c2ecf20Sopenharmony_ci .cra_blocksize = 1, 33278c2ecf20Sopenharmony_ci }, 33288c2ecf20Sopenharmony_ci .setkey = chachapoly_setkey, 33298c2ecf20Sopenharmony_ci .setauthsize = chachapoly_setauthsize, 33308c2ecf20Sopenharmony_ci .encrypt = chachapoly_encrypt, 33318c2ecf20Sopenharmony_ci .decrypt = chachapoly_decrypt, 33328c2ecf20Sopenharmony_ci .ivsize = 8, 33338c2ecf20Sopenharmony_ci .maxauthsize = POLY1305_DIGEST_SIZE, 33348c2ecf20Sopenharmony_ci }, 33358c2ecf20Sopenharmony_ci .caam = { 33368c2ecf20Sopenharmony_ci .class1_alg_type = OP_ALG_ALGSEL_CHACHA20 | 33378c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 33388c2ecf20Sopenharmony_ci .class2_alg_type = OP_ALG_ALGSEL_POLY1305 | 33398c2ecf20Sopenharmony_ci OP_ALG_AAI_AEAD, 33408c2ecf20Sopenharmony_ci .nodkp = true, 33418c2ecf20Sopenharmony_ci }, 33428c2ecf20Sopenharmony_ci }, 33438c2ecf20Sopenharmony_ci}; 33448c2ecf20Sopenharmony_ci 33458c2ecf20Sopenharmony_cistatic int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, 33468c2ecf20Sopenharmony_ci bool uses_dkp) 33478c2ecf20Sopenharmony_ci{ 33488c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 33498c2ecf20Sopenharmony_ci struct caam_drv_private *priv; 33508c2ecf20Sopenharmony_ci const size_t sh_desc_enc_offset = offsetof(struct caam_ctx, 33518c2ecf20Sopenharmony_ci sh_desc_enc); 33528c2ecf20Sopenharmony_ci 33538c2ecf20Sopenharmony_ci ctx->jrdev = caam_jr_alloc(); 33548c2ecf20Sopenharmony_ci if (IS_ERR(ctx->jrdev)) { 33558c2ecf20Sopenharmony_ci pr_err("Job Ring Device allocation for transform failed\n"); 33568c2ecf20Sopenharmony_ci return PTR_ERR(ctx->jrdev); 33578c2ecf20Sopenharmony_ci } 33588c2ecf20Sopenharmony_ci 33598c2ecf20Sopenharmony_ci priv = dev_get_drvdata(ctx->jrdev->parent); 33608c2ecf20Sopenharmony_ci if (priv->era >= 6 && uses_dkp) 33618c2ecf20Sopenharmony_ci ctx->dir = DMA_BIDIRECTIONAL; 33628c2ecf20Sopenharmony_ci else 33638c2ecf20Sopenharmony_ci ctx->dir = DMA_TO_DEVICE; 33648c2ecf20Sopenharmony_ci 33658c2ecf20Sopenharmony_ci dma_addr = dma_map_single_attrs(ctx->jrdev, ctx->sh_desc_enc, 33668c2ecf20Sopenharmony_ci offsetof(struct caam_ctx, 33678c2ecf20Sopenharmony_ci sh_desc_enc_dma) - 33688c2ecf20Sopenharmony_ci sh_desc_enc_offset, 33698c2ecf20Sopenharmony_ci ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 33708c2ecf20Sopenharmony_ci if (dma_mapping_error(ctx->jrdev, dma_addr)) { 33718c2ecf20Sopenharmony_ci dev_err(ctx->jrdev, "unable to map key, shared descriptors\n"); 33728c2ecf20Sopenharmony_ci caam_jr_free(ctx->jrdev); 33738c2ecf20Sopenharmony_ci return -ENOMEM; 33748c2ecf20Sopenharmony_ci } 33758c2ecf20Sopenharmony_ci 33768c2ecf20Sopenharmony_ci ctx->sh_desc_enc_dma = dma_addr; 33778c2ecf20Sopenharmony_ci ctx->sh_desc_dec_dma = dma_addr + offsetof(struct caam_ctx, 33788c2ecf20Sopenharmony_ci sh_desc_dec) - 33798c2ecf20Sopenharmony_ci sh_desc_enc_offset; 33808c2ecf20Sopenharmony_ci ctx->key_dma = dma_addr + offsetof(struct caam_ctx, key) - 33818c2ecf20Sopenharmony_ci sh_desc_enc_offset; 33828c2ecf20Sopenharmony_ci 33838c2ecf20Sopenharmony_ci /* copy descriptor header template value */ 33848c2ecf20Sopenharmony_ci ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; 33858c2ecf20Sopenharmony_ci ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; 33868c2ecf20Sopenharmony_ci 33878c2ecf20Sopenharmony_ci return 0; 33888c2ecf20Sopenharmony_ci} 33898c2ecf20Sopenharmony_ci 33908c2ecf20Sopenharmony_cistatic int caam_cra_init(struct crypto_skcipher *tfm) 33918c2ecf20Sopenharmony_ci{ 33928c2ecf20Sopenharmony_ci struct skcipher_alg *alg = crypto_skcipher_alg(tfm); 33938c2ecf20Sopenharmony_ci struct caam_skcipher_alg *caam_alg = 33948c2ecf20Sopenharmony_ci container_of(alg, typeof(*caam_alg), skcipher); 33958c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); 33968c2ecf20Sopenharmony_ci u32 alg_aai = caam_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 33978c2ecf20Sopenharmony_ci int ret = 0; 33988c2ecf20Sopenharmony_ci 33998c2ecf20Sopenharmony_ci ctx->enginectx.op.do_one_request = skcipher_do_one_req; 34008c2ecf20Sopenharmony_ci 34018c2ecf20Sopenharmony_ci if (alg_aai == OP_ALG_AAI_XTS) { 34028c2ecf20Sopenharmony_ci const char *tfm_name = crypto_tfm_alg_name(&tfm->base); 34038c2ecf20Sopenharmony_ci struct crypto_skcipher *fallback; 34048c2ecf20Sopenharmony_ci 34058c2ecf20Sopenharmony_ci fallback = crypto_alloc_skcipher(tfm_name, 0, 34068c2ecf20Sopenharmony_ci CRYPTO_ALG_NEED_FALLBACK); 34078c2ecf20Sopenharmony_ci if (IS_ERR(fallback)) { 34088c2ecf20Sopenharmony_ci pr_err("Failed to allocate %s fallback: %ld\n", 34098c2ecf20Sopenharmony_ci tfm_name, PTR_ERR(fallback)); 34108c2ecf20Sopenharmony_ci return PTR_ERR(fallback); 34118c2ecf20Sopenharmony_ci } 34128c2ecf20Sopenharmony_ci 34138c2ecf20Sopenharmony_ci ctx->fallback = fallback; 34148c2ecf20Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx) + 34158c2ecf20Sopenharmony_ci crypto_skcipher_reqsize(fallback)); 34168c2ecf20Sopenharmony_ci } else { 34178c2ecf20Sopenharmony_ci crypto_skcipher_set_reqsize(tfm, sizeof(struct caam_skcipher_req_ctx)); 34188c2ecf20Sopenharmony_ci } 34198c2ecf20Sopenharmony_ci 34208c2ecf20Sopenharmony_ci ret = caam_init_common(ctx, &caam_alg->caam, false); 34218c2ecf20Sopenharmony_ci if (ret && ctx->fallback) 34228c2ecf20Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 34238c2ecf20Sopenharmony_ci 34248c2ecf20Sopenharmony_ci return ret; 34258c2ecf20Sopenharmony_ci} 34268c2ecf20Sopenharmony_ci 34278c2ecf20Sopenharmony_cistatic int caam_aead_init(struct crypto_aead *tfm) 34288c2ecf20Sopenharmony_ci{ 34298c2ecf20Sopenharmony_ci struct aead_alg *alg = crypto_aead_alg(tfm); 34308c2ecf20Sopenharmony_ci struct caam_aead_alg *caam_alg = 34318c2ecf20Sopenharmony_ci container_of(alg, struct caam_aead_alg, aead); 34328c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_aead_ctx(tfm); 34338c2ecf20Sopenharmony_ci 34348c2ecf20Sopenharmony_ci crypto_aead_set_reqsize(tfm, sizeof(struct caam_aead_req_ctx)); 34358c2ecf20Sopenharmony_ci 34368c2ecf20Sopenharmony_ci ctx->enginectx.op.do_one_request = aead_do_one_req; 34378c2ecf20Sopenharmony_ci 34388c2ecf20Sopenharmony_ci return caam_init_common(ctx, &caam_alg->caam, !caam_alg->caam.nodkp); 34398c2ecf20Sopenharmony_ci} 34408c2ecf20Sopenharmony_ci 34418c2ecf20Sopenharmony_cistatic void caam_exit_common(struct caam_ctx *ctx) 34428c2ecf20Sopenharmony_ci{ 34438c2ecf20Sopenharmony_ci dma_unmap_single_attrs(ctx->jrdev, ctx->sh_desc_enc_dma, 34448c2ecf20Sopenharmony_ci offsetof(struct caam_ctx, sh_desc_enc_dma) - 34458c2ecf20Sopenharmony_ci offsetof(struct caam_ctx, sh_desc_enc), 34468c2ecf20Sopenharmony_ci ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 34478c2ecf20Sopenharmony_ci caam_jr_free(ctx->jrdev); 34488c2ecf20Sopenharmony_ci} 34498c2ecf20Sopenharmony_ci 34508c2ecf20Sopenharmony_cistatic void caam_cra_exit(struct crypto_skcipher *tfm) 34518c2ecf20Sopenharmony_ci{ 34528c2ecf20Sopenharmony_ci struct caam_ctx *ctx = crypto_skcipher_ctx(tfm); 34538c2ecf20Sopenharmony_ci 34548c2ecf20Sopenharmony_ci if (ctx->fallback) 34558c2ecf20Sopenharmony_ci crypto_free_skcipher(ctx->fallback); 34568c2ecf20Sopenharmony_ci caam_exit_common(ctx); 34578c2ecf20Sopenharmony_ci} 34588c2ecf20Sopenharmony_ci 34598c2ecf20Sopenharmony_cistatic void caam_aead_exit(struct crypto_aead *tfm) 34608c2ecf20Sopenharmony_ci{ 34618c2ecf20Sopenharmony_ci caam_exit_common(crypto_aead_ctx(tfm)); 34628c2ecf20Sopenharmony_ci} 34638c2ecf20Sopenharmony_ci 34648c2ecf20Sopenharmony_civoid caam_algapi_exit(void) 34658c2ecf20Sopenharmony_ci{ 34668c2ecf20Sopenharmony_ci int i; 34678c2ecf20Sopenharmony_ci 34688c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 34698c2ecf20Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 34708c2ecf20Sopenharmony_ci 34718c2ecf20Sopenharmony_ci if (t_alg->registered) 34728c2ecf20Sopenharmony_ci crypto_unregister_aead(&t_alg->aead); 34738c2ecf20Sopenharmony_ci } 34748c2ecf20Sopenharmony_ci 34758c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 34768c2ecf20Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 34778c2ecf20Sopenharmony_ci 34788c2ecf20Sopenharmony_ci if (t_alg->registered) 34798c2ecf20Sopenharmony_ci crypto_unregister_skcipher(&t_alg->skcipher); 34808c2ecf20Sopenharmony_ci } 34818c2ecf20Sopenharmony_ci} 34828c2ecf20Sopenharmony_ci 34838c2ecf20Sopenharmony_cistatic void caam_skcipher_alg_init(struct caam_skcipher_alg *t_alg) 34848c2ecf20Sopenharmony_ci{ 34858c2ecf20Sopenharmony_ci struct skcipher_alg *alg = &t_alg->skcipher; 34868c2ecf20Sopenharmony_ci 34878c2ecf20Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 34888c2ecf20Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 34898c2ecf20Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx); 34908c2ecf20Sopenharmony_ci alg->base.cra_flags |= (CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 34918c2ecf20Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY); 34928c2ecf20Sopenharmony_ci 34938c2ecf20Sopenharmony_ci alg->init = caam_cra_init; 34948c2ecf20Sopenharmony_ci alg->exit = caam_cra_exit; 34958c2ecf20Sopenharmony_ci} 34968c2ecf20Sopenharmony_ci 34978c2ecf20Sopenharmony_cistatic void caam_aead_alg_init(struct caam_aead_alg *t_alg) 34988c2ecf20Sopenharmony_ci{ 34998c2ecf20Sopenharmony_ci struct aead_alg *alg = &t_alg->aead; 35008c2ecf20Sopenharmony_ci 35018c2ecf20Sopenharmony_ci alg->base.cra_module = THIS_MODULE; 35028c2ecf20Sopenharmony_ci alg->base.cra_priority = CAAM_CRA_PRIORITY; 35038c2ecf20Sopenharmony_ci alg->base.cra_ctxsize = sizeof(struct caam_ctx); 35048c2ecf20Sopenharmony_ci alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | 35058c2ecf20Sopenharmony_ci CRYPTO_ALG_KERN_DRIVER_ONLY; 35068c2ecf20Sopenharmony_ci 35078c2ecf20Sopenharmony_ci alg->init = caam_aead_init; 35088c2ecf20Sopenharmony_ci alg->exit = caam_aead_exit; 35098c2ecf20Sopenharmony_ci} 35108c2ecf20Sopenharmony_ci 35118c2ecf20Sopenharmony_ciint caam_algapi_init(struct device *ctrldev) 35128c2ecf20Sopenharmony_ci{ 35138c2ecf20Sopenharmony_ci struct caam_drv_private *priv = dev_get_drvdata(ctrldev); 35148c2ecf20Sopenharmony_ci int i = 0, err = 0; 35158c2ecf20Sopenharmony_ci u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst; 35168c2ecf20Sopenharmony_ci unsigned int md_limit = SHA512_DIGEST_SIZE; 35178c2ecf20Sopenharmony_ci bool registered = false, gcm_support; 35188c2ecf20Sopenharmony_ci 35198c2ecf20Sopenharmony_ci /* 35208c2ecf20Sopenharmony_ci * Register crypto algorithms the device supports. 35218c2ecf20Sopenharmony_ci * First, detect presence and attributes of DES, AES, and MD blocks. 35228c2ecf20Sopenharmony_ci */ 35238c2ecf20Sopenharmony_ci if (priv->era < 10) { 35248c2ecf20Sopenharmony_ci u32 cha_vid, cha_inst, aes_rn; 35258c2ecf20Sopenharmony_ci 35268c2ecf20Sopenharmony_ci cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls); 35278c2ecf20Sopenharmony_ci aes_vid = cha_vid & CHA_ID_LS_AES_MASK; 35288c2ecf20Sopenharmony_ci md_vid = (cha_vid & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 35298c2ecf20Sopenharmony_ci 35308c2ecf20Sopenharmony_ci cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls); 35318c2ecf20Sopenharmony_ci des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >> 35328c2ecf20Sopenharmony_ci CHA_ID_LS_DES_SHIFT; 35338c2ecf20Sopenharmony_ci aes_inst = cha_inst & CHA_ID_LS_AES_MASK; 35348c2ecf20Sopenharmony_ci md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 35358c2ecf20Sopenharmony_ci ccha_inst = 0; 35368c2ecf20Sopenharmony_ci ptha_inst = 0; 35378c2ecf20Sopenharmony_ci 35388c2ecf20Sopenharmony_ci aes_rn = rd_reg32(&priv->ctrl->perfmon.cha_rev_ls) & 35398c2ecf20Sopenharmony_ci CHA_ID_LS_AES_MASK; 35408c2ecf20Sopenharmony_ci gcm_support = !(aes_vid == CHA_VER_VID_AES_LP && aes_rn < 8); 35418c2ecf20Sopenharmony_ci } else { 35428c2ecf20Sopenharmony_ci u32 aesa, mdha; 35438c2ecf20Sopenharmony_ci 35448c2ecf20Sopenharmony_ci aesa = rd_reg32(&priv->ctrl->vreg.aesa); 35458c2ecf20Sopenharmony_ci mdha = rd_reg32(&priv->ctrl->vreg.mdha); 35468c2ecf20Sopenharmony_ci 35478c2ecf20Sopenharmony_ci aes_vid = (aesa & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 35488c2ecf20Sopenharmony_ci md_vid = (mdha & CHA_VER_VID_MASK) >> CHA_VER_VID_SHIFT; 35498c2ecf20Sopenharmony_ci 35508c2ecf20Sopenharmony_ci des_inst = rd_reg32(&priv->ctrl->vreg.desa) & CHA_VER_NUM_MASK; 35518c2ecf20Sopenharmony_ci aes_inst = aesa & CHA_VER_NUM_MASK; 35528c2ecf20Sopenharmony_ci md_inst = mdha & CHA_VER_NUM_MASK; 35538c2ecf20Sopenharmony_ci ccha_inst = rd_reg32(&priv->ctrl->vreg.ccha) & CHA_VER_NUM_MASK; 35548c2ecf20Sopenharmony_ci ptha_inst = rd_reg32(&priv->ctrl->vreg.ptha) & CHA_VER_NUM_MASK; 35558c2ecf20Sopenharmony_ci 35568c2ecf20Sopenharmony_ci gcm_support = aesa & CHA_VER_MISC_AES_GCM; 35578c2ecf20Sopenharmony_ci } 35588c2ecf20Sopenharmony_ci 35598c2ecf20Sopenharmony_ci /* If MD is present, limit digest size based on LP256 */ 35608c2ecf20Sopenharmony_ci if (md_inst && md_vid == CHA_VER_VID_MD_LP256) 35618c2ecf20Sopenharmony_ci md_limit = SHA256_DIGEST_SIZE; 35628c2ecf20Sopenharmony_ci 35638c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 35648c2ecf20Sopenharmony_ci struct caam_skcipher_alg *t_alg = driver_algs + i; 35658c2ecf20Sopenharmony_ci u32 alg_sel = t_alg->caam.class1_alg_type & OP_ALG_ALGSEL_MASK; 35668c2ecf20Sopenharmony_ci 35678c2ecf20Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 35688c2ecf20Sopenharmony_ci if (!des_inst && 35698c2ecf20Sopenharmony_ci ((alg_sel == OP_ALG_ALGSEL_3DES) || 35708c2ecf20Sopenharmony_ci (alg_sel == OP_ALG_ALGSEL_DES))) 35718c2ecf20Sopenharmony_ci continue; 35728c2ecf20Sopenharmony_ci 35738c2ecf20Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 35748c2ecf20Sopenharmony_ci if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 35758c2ecf20Sopenharmony_ci continue; 35768c2ecf20Sopenharmony_ci 35778c2ecf20Sopenharmony_ci /* 35788c2ecf20Sopenharmony_ci * Check support for AES modes not available 35798c2ecf20Sopenharmony_ci * on LP devices. 35808c2ecf20Sopenharmony_ci */ 35818c2ecf20Sopenharmony_ci if (aes_vid == CHA_VER_VID_AES_LP && 35828c2ecf20Sopenharmony_ci (t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK) == 35838c2ecf20Sopenharmony_ci OP_ALG_AAI_XTS) 35848c2ecf20Sopenharmony_ci continue; 35858c2ecf20Sopenharmony_ci 35868c2ecf20Sopenharmony_ci caam_skcipher_alg_init(t_alg); 35878c2ecf20Sopenharmony_ci 35888c2ecf20Sopenharmony_ci err = crypto_register_skcipher(&t_alg->skcipher); 35898c2ecf20Sopenharmony_ci if (err) { 35908c2ecf20Sopenharmony_ci pr_warn("%s alg registration failed\n", 35918c2ecf20Sopenharmony_ci t_alg->skcipher.base.cra_driver_name); 35928c2ecf20Sopenharmony_ci continue; 35938c2ecf20Sopenharmony_ci } 35948c2ecf20Sopenharmony_ci 35958c2ecf20Sopenharmony_ci t_alg->registered = true; 35968c2ecf20Sopenharmony_ci registered = true; 35978c2ecf20Sopenharmony_ci } 35988c2ecf20Sopenharmony_ci 35998c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 36008c2ecf20Sopenharmony_ci struct caam_aead_alg *t_alg = driver_aeads + i; 36018c2ecf20Sopenharmony_ci u32 c1_alg_sel = t_alg->caam.class1_alg_type & 36028c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK; 36038c2ecf20Sopenharmony_ci u32 c2_alg_sel = t_alg->caam.class2_alg_type & 36048c2ecf20Sopenharmony_ci OP_ALG_ALGSEL_MASK; 36058c2ecf20Sopenharmony_ci u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 36068c2ecf20Sopenharmony_ci 36078c2ecf20Sopenharmony_ci /* Skip DES algorithms if not supported by device */ 36088c2ecf20Sopenharmony_ci if (!des_inst && 36098c2ecf20Sopenharmony_ci ((c1_alg_sel == OP_ALG_ALGSEL_3DES) || 36108c2ecf20Sopenharmony_ci (c1_alg_sel == OP_ALG_ALGSEL_DES))) 36118c2ecf20Sopenharmony_ci continue; 36128c2ecf20Sopenharmony_ci 36138c2ecf20Sopenharmony_ci /* Skip AES algorithms if not supported by device */ 36148c2ecf20Sopenharmony_ci if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES)) 36158c2ecf20Sopenharmony_ci continue; 36168c2ecf20Sopenharmony_ci 36178c2ecf20Sopenharmony_ci /* Skip CHACHA20 algorithms if not supported by device */ 36188c2ecf20Sopenharmony_ci if (c1_alg_sel == OP_ALG_ALGSEL_CHACHA20 && !ccha_inst) 36198c2ecf20Sopenharmony_ci continue; 36208c2ecf20Sopenharmony_ci 36218c2ecf20Sopenharmony_ci /* Skip POLY1305 algorithms if not supported by device */ 36228c2ecf20Sopenharmony_ci if (c2_alg_sel == OP_ALG_ALGSEL_POLY1305 && !ptha_inst) 36238c2ecf20Sopenharmony_ci continue; 36248c2ecf20Sopenharmony_ci 36258c2ecf20Sopenharmony_ci /* Skip GCM algorithms if not supported by device */ 36268c2ecf20Sopenharmony_ci if (c1_alg_sel == OP_ALG_ALGSEL_AES && 36278c2ecf20Sopenharmony_ci alg_aai == OP_ALG_AAI_GCM && !gcm_support) 36288c2ecf20Sopenharmony_ci continue; 36298c2ecf20Sopenharmony_ci 36308c2ecf20Sopenharmony_ci /* 36318c2ecf20Sopenharmony_ci * Skip algorithms requiring message digests 36328c2ecf20Sopenharmony_ci * if MD or MD size is not supported by device. 36338c2ecf20Sopenharmony_ci */ 36348c2ecf20Sopenharmony_ci if (is_mdha(c2_alg_sel) && 36358c2ecf20Sopenharmony_ci (!md_inst || t_alg->aead.maxauthsize > md_limit)) 36368c2ecf20Sopenharmony_ci continue; 36378c2ecf20Sopenharmony_ci 36388c2ecf20Sopenharmony_ci caam_aead_alg_init(t_alg); 36398c2ecf20Sopenharmony_ci 36408c2ecf20Sopenharmony_ci err = crypto_register_aead(&t_alg->aead); 36418c2ecf20Sopenharmony_ci if (err) { 36428c2ecf20Sopenharmony_ci pr_warn("%s alg registration failed\n", 36438c2ecf20Sopenharmony_ci t_alg->aead.base.cra_driver_name); 36448c2ecf20Sopenharmony_ci continue; 36458c2ecf20Sopenharmony_ci } 36468c2ecf20Sopenharmony_ci 36478c2ecf20Sopenharmony_ci t_alg->registered = true; 36488c2ecf20Sopenharmony_ci registered = true; 36498c2ecf20Sopenharmony_ci } 36508c2ecf20Sopenharmony_ci 36518c2ecf20Sopenharmony_ci if (registered) 36528c2ecf20Sopenharmony_ci pr_info("caam algorithms registered in /proc/crypto\n"); 36538c2ecf20Sopenharmony_ci 36548c2ecf20Sopenharmony_ci return err; 36558c2ecf20Sopenharmony_ci} 3656