18e8ec596SKim Phillips /* 28e8ec596SKim Phillips * caam - Freescale FSL CAAM support for crypto API 38e8ec596SKim Phillips * 48e8ec596SKim Phillips * Copyright 2008-2011 Freescale Semiconductor, Inc. 58e8ec596SKim Phillips * 68e8ec596SKim Phillips * Based on talitos crypto API driver. 78e8ec596SKim Phillips * 88e8ec596SKim Phillips * relationship of job descriptors to shared descriptors (SteveC Dec 10 2008): 98e8ec596SKim Phillips * 108e8ec596SKim Phillips * --------------- --------------- 118e8ec596SKim Phillips * | JobDesc #1 |-------------------->| ShareDesc | 128e8ec596SKim Phillips * | *(packet 1) | | (PDB) | 138e8ec596SKim Phillips * --------------- |------------->| (hashKey) | 148e8ec596SKim Phillips * . | | (cipherKey) | 158e8ec596SKim Phillips * . | |-------->| (operation) | 168e8ec596SKim Phillips * --------------- | | --------------- 178e8ec596SKim Phillips * | JobDesc #2 |------| | 188e8ec596SKim Phillips * | *(packet 2) | | 198e8ec596SKim Phillips * --------------- | 208e8ec596SKim Phillips * . | 218e8ec596SKim Phillips * . | 228e8ec596SKim Phillips * --------------- | 238e8ec596SKim Phillips * | JobDesc #3 |------------ 248e8ec596SKim Phillips * | *(packet 3) | 258e8ec596SKim Phillips * --------------- 268e8ec596SKim Phillips * 278e8ec596SKim Phillips * The SharedDesc never changes for a connection unless rekeyed, but 288e8ec596SKim Phillips * each packet will likely be in a different place. So all we need 298e8ec596SKim Phillips * to know to process the packet is where the input is, where the 308e8ec596SKim Phillips * output goes, and what context we want to process with. Context is 318e8ec596SKim Phillips * in the SharedDesc, packet references in the JobDesc. 328e8ec596SKim Phillips * 338e8ec596SKim Phillips * So, a job desc looks like: 348e8ec596SKim Phillips * 358e8ec596SKim Phillips * --------------------- 368e8ec596SKim Phillips * | Header | 378e8ec596SKim Phillips * | ShareDesc Pointer | 388e8ec596SKim Phillips * | SEQ_OUT_PTR | 398e8ec596SKim Phillips * | (output buffer) | 406ec47334SYuan Kang * | (output length) | 418e8ec596SKim Phillips * | SEQ_IN_PTR | 428e8ec596SKim Phillips * | (input buffer) | 436ec47334SYuan Kang * | (input length) | 448e8ec596SKim Phillips * --------------------- 458e8ec596SKim Phillips */ 468e8ec596SKim Phillips 478e8ec596SKim Phillips #include "compat.h" 488e8ec596SKim Phillips 498e8ec596SKim Phillips #include "regs.h" 508e8ec596SKim Phillips #include "intern.h" 518e8ec596SKim Phillips #include "desc_constr.h" 528e8ec596SKim Phillips #include "jr.h" 538e8ec596SKim Phillips #include "error.h" 54a299c837SYuan Kang #include "sg_sw_sec4.h" 554c1ec1f9SYuan Kang #include "key_gen.h" 568e8ec596SKim Phillips 578e8ec596SKim Phillips /* 588e8ec596SKim Phillips * crypto alg 598e8ec596SKim Phillips */ 608e8ec596SKim Phillips #define CAAM_CRA_PRIORITY 3000 618e8ec596SKim Phillips /* max key is sum of AES_MAX_KEY_SIZE, max split key size */ 628e8ec596SKim Phillips #define CAAM_MAX_KEY_SIZE (AES_MAX_KEY_SIZE + \ 63daebc465SCatalin Vasile CTR_RFC3686_NONCE_SIZE + \ 648e8ec596SKim Phillips SHA512_DIGEST_SIZE * 2) 658e8ec596SKim Phillips /* max IV is max of AES_BLOCK_SIZE, DES3_EDE_BLOCK_SIZE */ 668e8ec596SKim Phillips #define CAAM_MAX_IV_LENGTH 16 678e8ec596SKim Phillips 68f2147b88SHerbert Xu #define AEAD_DESC_JOB_IO_LEN (DESC_JOB_IO_LEN + CAAM_CMD_SZ * 2) 69f2147b88SHerbert Xu #define GCM_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 70f2147b88SHerbert Xu CAAM_CMD_SZ * 4) 71479bcc7cSHerbert Xu #define AUTHENC_DESC_JOB_IO_LEN (AEAD_DESC_JOB_IO_LEN + \ 72479bcc7cSHerbert Xu CAAM_CMD_SZ * 5) 73f2147b88SHerbert Xu 744427b1b4SKim Phillips /* length of descriptors text */ 751acebad3SYuan Kang #define DESC_AEAD_BASE (4 * CAAM_CMD_SZ) 76479bcc7cSHerbert Xu #define DESC_AEAD_ENC_LEN (DESC_AEAD_BASE + 11 * CAAM_CMD_SZ) 77479bcc7cSHerbert Xu #define DESC_AEAD_DEC_LEN (DESC_AEAD_BASE + 15 * CAAM_CMD_SZ) 78479bcc7cSHerbert Xu #define DESC_AEAD_GIVENC_LEN (DESC_AEAD_ENC_LEN + 9 * CAAM_CMD_SZ) 791acebad3SYuan Kang 80daebc465SCatalin Vasile /* Note: Nonce is counted in enckeylen */ 81479bcc7cSHerbert Xu #define DESC_AEAD_CTR_RFC3686_LEN (4 * CAAM_CMD_SZ) 82daebc465SCatalin Vasile 83ae4a825fSHoria Geanta #define DESC_AEAD_NULL_BASE (3 * CAAM_CMD_SZ) 84479bcc7cSHerbert Xu #define DESC_AEAD_NULL_ENC_LEN (DESC_AEAD_NULL_BASE + 11 * CAAM_CMD_SZ) 85479bcc7cSHerbert Xu #define DESC_AEAD_NULL_DEC_LEN (DESC_AEAD_NULL_BASE + 13 * CAAM_CMD_SZ) 86ae4a825fSHoria Geanta 873ef8d945STudor Ambarus #define DESC_GCM_BASE (3 * CAAM_CMD_SZ) 88f2147b88SHerbert Xu #define DESC_GCM_ENC_LEN (DESC_GCM_BASE + 16 * CAAM_CMD_SZ) 89f2147b88SHerbert Xu #define DESC_GCM_DEC_LEN (DESC_GCM_BASE + 12 * CAAM_CMD_SZ) 903ef8d945STudor Ambarus 91bac68f2cSTudor Ambarus #define DESC_RFC4106_BASE (3 * CAAM_CMD_SZ) 924aad0cc5SHoria Geant? #define DESC_RFC4106_ENC_LEN (DESC_RFC4106_BASE + 13 * CAAM_CMD_SZ) 934aad0cc5SHoria Geant? #define DESC_RFC4106_DEC_LEN (DESC_RFC4106_BASE + 13 * CAAM_CMD_SZ) 94bac68f2cSTudor Ambarus 955d0429a3STudor Ambarus #define DESC_RFC4543_BASE (3 * CAAM_CMD_SZ) 96f2147b88SHerbert Xu #define DESC_RFC4543_ENC_LEN (DESC_RFC4543_BASE + 11 * CAAM_CMD_SZ) 97f2147b88SHerbert Xu #define DESC_RFC4543_DEC_LEN (DESC_RFC4543_BASE + 12 * CAAM_CMD_SZ) 985d0429a3STudor Ambarus 99acdca31dSYuan Kang #define DESC_ABLKCIPHER_BASE (3 * CAAM_CMD_SZ) 100acdca31dSYuan Kang #define DESC_ABLKCIPHER_ENC_LEN (DESC_ABLKCIPHER_BASE + \ 101acdca31dSYuan Kang 20 * CAAM_CMD_SZ) 102acdca31dSYuan Kang #define DESC_ABLKCIPHER_DEC_LEN (DESC_ABLKCIPHER_BASE + \ 103acdca31dSYuan Kang 15 * CAAM_CMD_SZ) 104acdca31dSYuan Kang 10587e51b07SHerbert Xu #define DESC_MAX_USED_BYTES (CAAM_DESC_BYTES_MAX - DESC_JOB_IO_LEN) 10687e51b07SHerbert Xu #define DESC_MAX_USED_LEN (DESC_MAX_USED_BYTES / CAAM_CMD_SZ) 1074427b1b4SKim Phillips 1088e8ec596SKim Phillips #ifdef DEBUG 1098e8ec596SKim Phillips /* for print_hex_dumps with line references */ 1108e8ec596SKim Phillips #define debug(format, arg...) printk(format, arg) 1118e8ec596SKim Phillips #else 1128e8ec596SKim Phillips #define debug(format, arg...) 1138e8ec596SKim Phillips #endif 114cfc6f11bSRuchika Gupta static struct list_head alg_list; 1158e8ec596SKim Phillips 116479bcc7cSHerbert Xu struct caam_alg_entry { 117479bcc7cSHerbert Xu int class1_alg_type; 118479bcc7cSHerbert Xu int class2_alg_type; 119479bcc7cSHerbert Xu int alg_op; 120479bcc7cSHerbert Xu bool rfc3686; 121479bcc7cSHerbert Xu bool geniv; 122479bcc7cSHerbert Xu }; 123479bcc7cSHerbert Xu 124479bcc7cSHerbert Xu struct caam_aead_alg { 125479bcc7cSHerbert Xu struct aead_alg aead; 126479bcc7cSHerbert Xu struct caam_alg_entry caam; 127479bcc7cSHerbert Xu bool registered; 128479bcc7cSHerbert Xu }; 129479bcc7cSHerbert Xu 1301acebad3SYuan Kang /* Set DK bit in class 1 operation if shared */ 1311acebad3SYuan Kang static inline void append_dec_op1(u32 *desc, u32 type) 1321acebad3SYuan Kang { 1331acebad3SYuan Kang u32 *jump_cmd, *uncond_jump_cmd; 1341acebad3SYuan Kang 135a60384dfSHoria Geanta /* DK bit is valid only for AES */ 136a60384dfSHoria Geanta if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) { 137a60384dfSHoria Geanta append_operation(desc, type | OP_ALG_AS_INITFINAL | 138a60384dfSHoria Geanta OP_ALG_DECRYPT); 139a60384dfSHoria Geanta return; 140a60384dfSHoria Geanta } 141a60384dfSHoria Geanta 1421acebad3SYuan Kang jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD); 1431acebad3SYuan Kang append_operation(desc, type | OP_ALG_AS_INITFINAL | 1441acebad3SYuan Kang OP_ALG_DECRYPT); 1451acebad3SYuan Kang uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL); 1461acebad3SYuan Kang set_jump_tgt_here(desc, jump_cmd); 1471acebad3SYuan Kang append_operation(desc, type | OP_ALG_AS_INITFINAL | 1481acebad3SYuan Kang OP_ALG_DECRYPT | OP_ALG_AAI_DK); 1491acebad3SYuan Kang set_jump_tgt_here(desc, uncond_jump_cmd); 1501acebad3SYuan Kang } 1511acebad3SYuan Kang 1521acebad3SYuan Kang /* 1531acebad3SYuan Kang * For aead functions, read payload and write payload, 1541acebad3SYuan Kang * both of which are specified in req->src and req->dst 1551acebad3SYuan Kang */ 1561acebad3SYuan Kang static inline void aead_append_src_dst(u32 *desc, u32 msg_type) 1571acebad3SYuan Kang { 158ae4a825fSHoria Geanta append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF); 1591acebad3SYuan Kang append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | 1601acebad3SYuan Kang KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH); 1611acebad3SYuan Kang } 1621acebad3SYuan Kang 1631acebad3SYuan Kang /* 164acdca31dSYuan Kang * For ablkcipher encrypt and decrypt, read from req->src and 165acdca31dSYuan Kang * write to req->dst 166acdca31dSYuan Kang */ 167acdca31dSYuan Kang static inline void ablkcipher_append_src_dst(u32 *desc) 168acdca31dSYuan Kang { 16970d793ccSKim Phillips append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 17070d793ccSKim Phillips append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 17170d793ccSKim Phillips append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | 17270d793ccSKim Phillips KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1); 17370d793ccSKim Phillips append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF); 174acdca31dSYuan Kang } 175acdca31dSYuan Kang 176acdca31dSYuan Kang /* 1778e8ec596SKim Phillips * per-session context 1788e8ec596SKim Phillips */ 1798e8ec596SKim Phillips struct caam_ctx { 1808e8ec596SKim Phillips struct device *jrdev; 1811acebad3SYuan Kang u32 sh_desc_enc[DESC_MAX_USED_LEN]; 1821acebad3SYuan Kang u32 sh_desc_dec[DESC_MAX_USED_LEN]; 1831acebad3SYuan Kang u32 sh_desc_givenc[DESC_MAX_USED_LEN]; 1841acebad3SYuan Kang dma_addr_t sh_desc_enc_dma; 1851acebad3SYuan Kang dma_addr_t sh_desc_dec_dma; 1861acebad3SYuan Kang dma_addr_t sh_desc_givenc_dma; 1878e8ec596SKim Phillips u32 class1_alg_type; 1888e8ec596SKim Phillips u32 class2_alg_type; 1898e8ec596SKim Phillips u32 alg_op; 1901acebad3SYuan Kang u8 key[CAAM_MAX_KEY_SIZE]; 191885e9e2fSYuan Kang dma_addr_t key_dma; 1928e8ec596SKim Phillips unsigned int enckeylen; 1938e8ec596SKim Phillips unsigned int split_key_len; 1948e8ec596SKim Phillips unsigned int split_key_pad_len; 1958e8ec596SKim Phillips unsigned int authsize; 1968e8ec596SKim Phillips }; 1978e8ec596SKim Phillips 1981acebad3SYuan Kang static void append_key_aead(u32 *desc, struct caam_ctx *ctx, 199daebc465SCatalin Vasile int keys_fit_inline, bool is_rfc3686) 2001acebad3SYuan Kang { 201daebc465SCatalin Vasile u32 *nonce; 202daebc465SCatalin Vasile unsigned int enckeylen = ctx->enckeylen; 203daebc465SCatalin Vasile 204daebc465SCatalin Vasile /* 205daebc465SCatalin Vasile * RFC3686 specific: 206daebc465SCatalin Vasile * | ctx->key = {AUTH_KEY, ENC_KEY, NONCE} 207daebc465SCatalin Vasile * | enckeylen = encryption key size + nonce size 208daebc465SCatalin Vasile */ 209daebc465SCatalin Vasile if (is_rfc3686) 210daebc465SCatalin Vasile enckeylen -= CTR_RFC3686_NONCE_SIZE; 211daebc465SCatalin Vasile 2121acebad3SYuan Kang if (keys_fit_inline) { 2131acebad3SYuan Kang append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len, 2141acebad3SYuan Kang ctx->split_key_len, CLASS_2 | 2151acebad3SYuan Kang KEY_DEST_MDHA_SPLIT | KEY_ENC); 2161acebad3SYuan Kang append_key_as_imm(desc, (void *)ctx->key + 217daebc465SCatalin Vasile ctx->split_key_pad_len, enckeylen, 218daebc465SCatalin Vasile enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 2191acebad3SYuan Kang } else { 2201acebad3SYuan Kang append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 | 2211acebad3SYuan Kang KEY_DEST_MDHA_SPLIT | KEY_ENC); 2221acebad3SYuan Kang append_key(desc, ctx->key_dma + ctx->split_key_pad_len, 223daebc465SCatalin Vasile enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 224daebc465SCatalin Vasile } 225daebc465SCatalin Vasile 226daebc465SCatalin Vasile /* Load Counter into CONTEXT1 reg */ 227daebc465SCatalin Vasile if (is_rfc3686) { 228daebc465SCatalin Vasile nonce = (u32 *)((void *)ctx->key + ctx->split_key_pad_len + 229daebc465SCatalin Vasile enckeylen); 230daebc465SCatalin Vasile append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB | 231daebc465SCatalin Vasile LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM); 232daebc465SCatalin Vasile append_move(desc, 233daebc465SCatalin Vasile MOVE_SRC_OUTFIFO | 234daebc465SCatalin Vasile MOVE_DEST_CLASS1CTX | 235daebc465SCatalin Vasile (16 << MOVE_OFFSET_SHIFT) | 236daebc465SCatalin Vasile (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT)); 2371acebad3SYuan Kang } 2381acebad3SYuan Kang } 2391acebad3SYuan Kang 2401acebad3SYuan Kang static void init_sh_desc_key_aead(u32 *desc, struct caam_ctx *ctx, 241daebc465SCatalin Vasile int keys_fit_inline, bool is_rfc3686) 2421acebad3SYuan Kang { 2431acebad3SYuan Kang u32 *key_jump_cmd; 2441acebad3SYuan Kang 245daebc465SCatalin Vasile /* Note: Context registers are saved. */ 246daebc465SCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 2471acebad3SYuan Kang 2481acebad3SYuan Kang /* Skip if already shared */ 2491acebad3SYuan Kang key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 2501acebad3SYuan Kang JUMP_COND_SHRD); 2511acebad3SYuan Kang 252daebc465SCatalin Vasile append_key_aead(desc, ctx, keys_fit_inline, is_rfc3686); 2531acebad3SYuan Kang 2541acebad3SYuan Kang set_jump_tgt_here(desc, key_jump_cmd); 2551acebad3SYuan Kang } 2561acebad3SYuan Kang 257ae4a825fSHoria Geanta static int aead_null_set_sh_desc(struct crypto_aead *aead) 258ae4a825fSHoria Geanta { 259ae4a825fSHoria Geanta struct caam_ctx *ctx = crypto_aead_ctx(aead); 260ae4a825fSHoria Geanta struct device *jrdev = ctx->jrdev; 261ae4a825fSHoria Geanta bool keys_fit_inline = false; 262ae4a825fSHoria Geanta u32 *key_jump_cmd, *jump_cmd, *read_move_cmd, *write_move_cmd; 263ae4a825fSHoria Geanta u32 *desc; 264ae4a825fSHoria Geanta 265ae4a825fSHoria Geanta /* 266ae4a825fSHoria Geanta * Job Descriptor and Shared Descriptors 267ae4a825fSHoria Geanta * must all fit into the 64-word Descriptor h/w Buffer 268ae4a825fSHoria Geanta */ 269479bcc7cSHerbert Xu if (DESC_AEAD_NULL_ENC_LEN + AEAD_DESC_JOB_IO_LEN + 270ae4a825fSHoria Geanta ctx->split_key_pad_len <= CAAM_DESC_BYTES_MAX) 271ae4a825fSHoria Geanta keys_fit_inline = true; 272ae4a825fSHoria Geanta 273479bcc7cSHerbert Xu /* aead_encrypt shared descriptor */ 274ae4a825fSHoria Geanta desc = ctx->sh_desc_enc; 275ae4a825fSHoria Geanta 276ae4a825fSHoria Geanta init_sh_desc(desc, HDR_SHARE_SERIAL); 277ae4a825fSHoria Geanta 278ae4a825fSHoria Geanta /* Skip if already shared */ 279ae4a825fSHoria Geanta key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 280ae4a825fSHoria Geanta JUMP_COND_SHRD); 281ae4a825fSHoria Geanta if (keys_fit_inline) 282ae4a825fSHoria Geanta append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len, 283ae4a825fSHoria Geanta ctx->split_key_len, CLASS_2 | 284ae4a825fSHoria Geanta KEY_DEST_MDHA_SPLIT | KEY_ENC); 285ae4a825fSHoria Geanta else 286ae4a825fSHoria Geanta append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 | 287ae4a825fSHoria Geanta KEY_DEST_MDHA_SPLIT | KEY_ENC); 288ae4a825fSHoria Geanta set_jump_tgt_here(desc, key_jump_cmd); 289ae4a825fSHoria Geanta 290479bcc7cSHerbert Xu /* assoclen + cryptlen = seqinlen */ 291479bcc7cSHerbert Xu append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ); 292ae4a825fSHoria Geanta 293479bcc7cSHerbert Xu /* Prepare to read and write cryptlen + assoclen bytes */ 294ae4a825fSHoria Geanta append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 295ae4a825fSHoria Geanta append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 296ae4a825fSHoria Geanta 297ae4a825fSHoria Geanta /* 298ae4a825fSHoria Geanta * MOVE_LEN opcode is not available in all SEC HW revisions, 299ae4a825fSHoria Geanta * thus need to do some magic, i.e. self-patch the descriptor 300ae4a825fSHoria Geanta * buffer. 301ae4a825fSHoria Geanta */ 302ae4a825fSHoria Geanta read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | 303ae4a825fSHoria Geanta MOVE_DEST_MATH3 | 304ae4a825fSHoria Geanta (0x6 << MOVE_LEN_SHIFT)); 305ae4a825fSHoria Geanta write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | 306ae4a825fSHoria Geanta MOVE_DEST_DESCBUF | 307ae4a825fSHoria Geanta MOVE_WAITCOMP | 308ae4a825fSHoria Geanta (0x8 << MOVE_LEN_SHIFT)); 309ae4a825fSHoria Geanta 310ae4a825fSHoria Geanta /* Class 2 operation */ 311ae4a825fSHoria Geanta append_operation(desc, ctx->class2_alg_type | 312ae4a825fSHoria Geanta OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 313ae4a825fSHoria Geanta 314ae4a825fSHoria Geanta /* Read and write cryptlen bytes */ 315ae4a825fSHoria Geanta aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1); 316ae4a825fSHoria Geanta 317ae4a825fSHoria Geanta set_move_tgt_here(desc, read_move_cmd); 318ae4a825fSHoria Geanta set_move_tgt_here(desc, write_move_cmd); 319ae4a825fSHoria Geanta append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 320ae4a825fSHoria Geanta append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO | 321ae4a825fSHoria Geanta MOVE_AUX_LS); 322ae4a825fSHoria Geanta 323ae4a825fSHoria Geanta /* Write ICV */ 324ae4a825fSHoria Geanta append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB | 325ae4a825fSHoria Geanta LDST_SRCDST_BYTE_CONTEXT); 326ae4a825fSHoria Geanta 327ae4a825fSHoria Geanta ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 328ae4a825fSHoria Geanta desc_bytes(desc), 329ae4a825fSHoria Geanta DMA_TO_DEVICE); 330ae4a825fSHoria Geanta if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 331ae4a825fSHoria Geanta dev_err(jrdev, "unable to map shared descriptor\n"); 332ae4a825fSHoria Geanta return -ENOMEM; 333ae4a825fSHoria Geanta } 334ae4a825fSHoria Geanta #ifdef DEBUG 335ae4a825fSHoria Geanta print_hex_dump(KERN_ERR, 336ae4a825fSHoria Geanta "aead null enc shdesc@"__stringify(__LINE__)": ", 337ae4a825fSHoria Geanta DUMP_PREFIX_ADDRESS, 16, 4, desc, 338ae4a825fSHoria Geanta desc_bytes(desc), 1); 339ae4a825fSHoria Geanta #endif 340ae4a825fSHoria Geanta 341ae4a825fSHoria Geanta /* 342ae4a825fSHoria Geanta * Job Descriptor and Shared Descriptors 343ae4a825fSHoria Geanta * must all fit into the 64-word Descriptor h/w Buffer 344ae4a825fSHoria Geanta */ 34580cd88f2SVakul Garg keys_fit_inline = false; 346ae4a825fSHoria Geanta if (DESC_AEAD_NULL_DEC_LEN + DESC_JOB_IO_LEN + 347ae4a825fSHoria Geanta ctx->split_key_pad_len <= CAAM_DESC_BYTES_MAX) 348ae4a825fSHoria Geanta keys_fit_inline = true; 349ae4a825fSHoria Geanta 350ae4a825fSHoria Geanta desc = ctx->sh_desc_dec; 351ae4a825fSHoria Geanta 352479bcc7cSHerbert Xu /* aead_decrypt shared descriptor */ 353ae4a825fSHoria Geanta init_sh_desc(desc, HDR_SHARE_SERIAL); 354ae4a825fSHoria Geanta 355ae4a825fSHoria Geanta /* Skip if already shared */ 356ae4a825fSHoria Geanta key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 357ae4a825fSHoria Geanta JUMP_COND_SHRD); 358ae4a825fSHoria Geanta if (keys_fit_inline) 359ae4a825fSHoria Geanta append_key_as_imm(desc, ctx->key, ctx->split_key_pad_len, 360ae4a825fSHoria Geanta ctx->split_key_len, CLASS_2 | 361ae4a825fSHoria Geanta KEY_DEST_MDHA_SPLIT | KEY_ENC); 362ae4a825fSHoria Geanta else 363ae4a825fSHoria Geanta append_key(desc, ctx->key_dma, ctx->split_key_len, CLASS_2 | 364ae4a825fSHoria Geanta KEY_DEST_MDHA_SPLIT | KEY_ENC); 365ae4a825fSHoria Geanta set_jump_tgt_here(desc, key_jump_cmd); 366ae4a825fSHoria Geanta 367ae4a825fSHoria Geanta /* Class 2 operation */ 368ae4a825fSHoria Geanta append_operation(desc, ctx->class2_alg_type | 369ae4a825fSHoria Geanta OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON); 370ae4a825fSHoria Geanta 371479bcc7cSHerbert Xu /* assoclen + cryptlen = seqoutlen */ 372ae4a825fSHoria Geanta append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ); 373ae4a825fSHoria Geanta 374479bcc7cSHerbert Xu /* Prepare to read and write cryptlen + assoclen bytes */ 375ae4a825fSHoria Geanta append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ); 376ae4a825fSHoria Geanta append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ); 377ae4a825fSHoria Geanta 378ae4a825fSHoria Geanta /* 379ae4a825fSHoria Geanta * MOVE_LEN opcode is not available in all SEC HW revisions, 380ae4a825fSHoria Geanta * thus need to do some magic, i.e. self-patch the descriptor 381ae4a825fSHoria Geanta * buffer. 382ae4a825fSHoria Geanta */ 383ae4a825fSHoria Geanta read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | 384ae4a825fSHoria Geanta MOVE_DEST_MATH2 | 385ae4a825fSHoria Geanta (0x6 << MOVE_LEN_SHIFT)); 386ae4a825fSHoria Geanta write_move_cmd = append_move(desc, MOVE_SRC_MATH2 | 387ae4a825fSHoria Geanta MOVE_DEST_DESCBUF | 388ae4a825fSHoria Geanta MOVE_WAITCOMP | 389ae4a825fSHoria Geanta (0x8 << MOVE_LEN_SHIFT)); 390ae4a825fSHoria Geanta 391ae4a825fSHoria Geanta /* Read and write cryptlen bytes */ 392ae4a825fSHoria Geanta aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1); 393ae4a825fSHoria Geanta 394ae4a825fSHoria Geanta /* 395ae4a825fSHoria Geanta * Insert a NOP here, since we need at least 4 instructions between 396ae4a825fSHoria Geanta * code patching the descriptor buffer and the location being patched. 397ae4a825fSHoria Geanta */ 398ae4a825fSHoria Geanta jump_cmd = append_jump(desc, JUMP_TEST_ALL); 399ae4a825fSHoria Geanta set_jump_tgt_here(desc, jump_cmd); 400ae4a825fSHoria Geanta 401ae4a825fSHoria Geanta set_move_tgt_here(desc, read_move_cmd); 402ae4a825fSHoria Geanta set_move_tgt_here(desc, write_move_cmd); 403ae4a825fSHoria Geanta append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 404ae4a825fSHoria Geanta append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO | 405ae4a825fSHoria Geanta MOVE_AUX_LS); 406ae4a825fSHoria Geanta append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO); 407ae4a825fSHoria Geanta 408ae4a825fSHoria Geanta /* Load ICV */ 409ae4a825fSHoria Geanta append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS2 | 410ae4a825fSHoria Geanta FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV); 411ae4a825fSHoria Geanta 412ae4a825fSHoria Geanta ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 413ae4a825fSHoria Geanta desc_bytes(desc), 414ae4a825fSHoria Geanta DMA_TO_DEVICE); 415ae4a825fSHoria Geanta if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 416ae4a825fSHoria Geanta dev_err(jrdev, "unable to map shared descriptor\n"); 417ae4a825fSHoria Geanta return -ENOMEM; 418ae4a825fSHoria Geanta } 419ae4a825fSHoria Geanta #ifdef DEBUG 420ae4a825fSHoria Geanta print_hex_dump(KERN_ERR, 421ae4a825fSHoria Geanta "aead null dec shdesc@"__stringify(__LINE__)": ", 422ae4a825fSHoria Geanta DUMP_PREFIX_ADDRESS, 16, 4, desc, 423ae4a825fSHoria Geanta desc_bytes(desc), 1); 424ae4a825fSHoria Geanta #endif 425ae4a825fSHoria Geanta 426ae4a825fSHoria Geanta return 0; 427ae4a825fSHoria Geanta } 428ae4a825fSHoria Geanta 4291acebad3SYuan Kang static int aead_set_sh_desc(struct crypto_aead *aead) 4301acebad3SYuan Kang { 431479bcc7cSHerbert Xu struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 432479bcc7cSHerbert Xu struct caam_aead_alg, aead); 433add86d55SHerbert Xu unsigned int ivsize = crypto_aead_ivsize(aead); 4341acebad3SYuan Kang struct caam_ctx *ctx = crypto_aead_ctx(aead); 4351acebad3SYuan Kang struct device *jrdev = ctx->jrdev; 436daebc465SCatalin Vasile bool keys_fit_inline; 4371acebad3SYuan Kang u32 geniv, moveiv; 438daebc465SCatalin Vasile u32 ctx1_iv_off = 0; 4391acebad3SYuan Kang u32 *desc; 440daebc465SCatalin Vasile const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) == 441daebc465SCatalin Vasile OP_ALG_AAI_CTR_MOD128); 442479bcc7cSHerbert Xu const bool is_rfc3686 = alg->caam.rfc3686; 4431acebad3SYuan Kang 4442fdea258SHoria Geantă if (!ctx->authsize) 4452fdea258SHoria Geantă return 0; 4462fdea258SHoria Geantă 447ae4a825fSHoria Geanta /* NULL encryption / decryption */ 448ae4a825fSHoria Geanta if (!ctx->enckeylen) 449ae4a825fSHoria Geanta return aead_null_set_sh_desc(aead); 450ae4a825fSHoria Geanta 4511acebad3SYuan Kang /* 452daebc465SCatalin Vasile * AES-CTR needs to load IV in CONTEXT1 reg 453daebc465SCatalin Vasile * at an offset of 128bits (16bytes) 454daebc465SCatalin Vasile * CONTEXT1[255:128] = IV 455daebc465SCatalin Vasile */ 456daebc465SCatalin Vasile if (ctr_mode) 457daebc465SCatalin Vasile ctx1_iv_off = 16; 458daebc465SCatalin Vasile 459daebc465SCatalin Vasile /* 460daebc465SCatalin Vasile * RFC3686 specific: 461daebc465SCatalin Vasile * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 462daebc465SCatalin Vasile */ 463daebc465SCatalin Vasile if (is_rfc3686) 464daebc465SCatalin Vasile ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 465daebc465SCatalin Vasile 466479bcc7cSHerbert Xu if (alg->caam.geniv) 467479bcc7cSHerbert Xu goto skip_enc; 468479bcc7cSHerbert Xu 469daebc465SCatalin Vasile /* 4701acebad3SYuan Kang * Job Descriptor and Shared Descriptors 4711acebad3SYuan Kang * must all fit into the 64-word Descriptor h/w Buffer 4721acebad3SYuan Kang */ 473daebc465SCatalin Vasile keys_fit_inline = false; 474479bcc7cSHerbert Xu if (DESC_AEAD_ENC_LEN + AUTHENC_DESC_JOB_IO_LEN + 475daebc465SCatalin Vasile ctx->split_key_pad_len + ctx->enckeylen + 476daebc465SCatalin Vasile (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <= 4771acebad3SYuan Kang CAAM_DESC_BYTES_MAX) 4782af8f4a2SKim Phillips keys_fit_inline = true; 4791acebad3SYuan Kang 480479bcc7cSHerbert Xu /* aead_encrypt shared descriptor */ 4811acebad3SYuan Kang desc = ctx->sh_desc_enc; 4821acebad3SYuan Kang 483daebc465SCatalin Vasile /* Note: Context registers are saved. */ 484daebc465SCatalin Vasile init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686); 4851acebad3SYuan Kang 4861acebad3SYuan Kang /* Class 2 operation */ 4871acebad3SYuan Kang append_operation(desc, ctx->class2_alg_type | 4881acebad3SYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 4891acebad3SYuan Kang 490479bcc7cSHerbert Xu /* Read and write assoclen bytes */ 491479bcc7cSHerbert Xu append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 492479bcc7cSHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 4931acebad3SYuan Kang 494479bcc7cSHerbert Xu /* Skip assoc data */ 495479bcc7cSHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 4961acebad3SYuan Kang 4971acebad3SYuan Kang /* read assoc before reading payload */ 4981acebad3SYuan Kang append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG | 499479bcc7cSHerbert Xu FIFOLDST_VLF); 500daebc465SCatalin Vasile 501daebc465SCatalin Vasile /* Load Counter into CONTEXT1 reg */ 502daebc465SCatalin Vasile if (is_rfc3686) 503daebc465SCatalin Vasile append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | 504daebc465SCatalin Vasile LDST_CLASS_1_CCB | 505daebc465SCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 506daebc465SCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 507daebc465SCatalin Vasile LDST_OFFSET_SHIFT)); 5081acebad3SYuan Kang 5091acebad3SYuan Kang /* Class 1 operation */ 5101acebad3SYuan Kang append_operation(desc, ctx->class1_alg_type | 5111acebad3SYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 5121acebad3SYuan Kang 5131acebad3SYuan Kang /* Read and write cryptlen bytes */ 514479bcc7cSHerbert Xu append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 515479bcc7cSHerbert Xu append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 5161acebad3SYuan Kang aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2); 5171acebad3SYuan Kang 5181acebad3SYuan Kang /* Write ICV */ 5191acebad3SYuan Kang append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB | 5201acebad3SYuan Kang LDST_SRCDST_BYTE_CONTEXT); 5211acebad3SYuan Kang 5221acebad3SYuan Kang ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 5231acebad3SYuan Kang desc_bytes(desc), 5241acebad3SYuan Kang DMA_TO_DEVICE); 5251acebad3SYuan Kang if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 5261acebad3SYuan Kang dev_err(jrdev, "unable to map shared descriptor\n"); 5271acebad3SYuan Kang return -ENOMEM; 5281acebad3SYuan Kang } 5291acebad3SYuan Kang #ifdef DEBUG 530514df281SAlex Porosanu print_hex_dump(KERN_ERR, "aead enc shdesc@"__stringify(__LINE__)": ", 5311acebad3SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, desc, 5321acebad3SYuan Kang desc_bytes(desc), 1); 5331acebad3SYuan Kang #endif 5341acebad3SYuan Kang 535479bcc7cSHerbert Xu skip_enc: 5361acebad3SYuan Kang /* 5371acebad3SYuan Kang * Job Descriptor and Shared Descriptors 5381acebad3SYuan Kang * must all fit into the 64-word Descriptor h/w Buffer 5391acebad3SYuan Kang */ 54080cd88f2SVakul Garg keys_fit_inline = false; 541479bcc7cSHerbert Xu if (DESC_AEAD_DEC_LEN + AUTHENC_DESC_JOB_IO_LEN + 542daebc465SCatalin Vasile ctx->split_key_pad_len + ctx->enckeylen + 543daebc465SCatalin Vasile (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <= 5441acebad3SYuan Kang CAAM_DESC_BYTES_MAX) 5452af8f4a2SKim Phillips keys_fit_inline = true; 5461acebad3SYuan Kang 547479bcc7cSHerbert Xu /* aead_decrypt shared descriptor */ 5481acebad3SYuan Kang desc = ctx->sh_desc_dec; 5491acebad3SYuan Kang 550daebc465SCatalin Vasile /* Note: Context registers are saved. */ 551daebc465SCatalin Vasile init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686); 5521acebad3SYuan Kang 5531acebad3SYuan Kang /* Class 2 operation */ 5541acebad3SYuan Kang append_operation(desc, ctx->class2_alg_type | 5551acebad3SYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON); 5561acebad3SYuan Kang 557479bcc7cSHerbert Xu /* Read and write assoclen bytes */ 558479bcc7cSHerbert Xu append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 559479bcc7cSHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 560479bcc7cSHerbert Xu 561479bcc7cSHerbert Xu /* Skip assoc data */ 562479bcc7cSHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 5631acebad3SYuan Kang 5641acebad3SYuan Kang /* read assoc before reading payload */ 5651acebad3SYuan Kang append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG | 5661acebad3SYuan Kang KEY_VLF); 5671acebad3SYuan Kang 568daebc465SCatalin Vasile /* Load Counter into CONTEXT1 reg */ 569daebc465SCatalin Vasile if (is_rfc3686) 570daebc465SCatalin Vasile append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | 571daebc465SCatalin Vasile LDST_CLASS_1_CCB | 572daebc465SCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 573daebc465SCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 574daebc465SCatalin Vasile LDST_OFFSET_SHIFT)); 575daebc465SCatalin Vasile 576daebc465SCatalin Vasile /* Choose operation */ 577daebc465SCatalin Vasile if (ctr_mode) 578daebc465SCatalin Vasile append_operation(desc, ctx->class1_alg_type | 579daebc465SCatalin Vasile OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT); 580daebc465SCatalin Vasile else 5811acebad3SYuan Kang append_dec_op1(desc, ctx->class1_alg_type); 5821acebad3SYuan Kang 5831acebad3SYuan Kang /* Read and write cryptlen bytes */ 584479bcc7cSHerbert Xu append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 585479bcc7cSHerbert Xu append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 5861acebad3SYuan Kang aead_append_src_dst(desc, FIFOLD_TYPE_MSG); 5871acebad3SYuan Kang 5881acebad3SYuan Kang /* Load ICV */ 5891acebad3SYuan Kang append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS2 | 5901acebad3SYuan Kang FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV); 5911acebad3SYuan Kang 5921acebad3SYuan Kang ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 5931acebad3SYuan Kang desc_bytes(desc), 5941acebad3SYuan Kang DMA_TO_DEVICE); 5951acebad3SYuan Kang if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 5961acebad3SYuan Kang dev_err(jrdev, "unable to map shared descriptor\n"); 5971acebad3SYuan Kang return -ENOMEM; 5981acebad3SYuan Kang } 5991acebad3SYuan Kang #ifdef DEBUG 600514df281SAlex Porosanu print_hex_dump(KERN_ERR, "aead dec shdesc@"__stringify(__LINE__)": ", 6011acebad3SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, desc, 6021acebad3SYuan Kang desc_bytes(desc), 1); 6031acebad3SYuan Kang #endif 6041acebad3SYuan Kang 605479bcc7cSHerbert Xu if (!alg->caam.geniv) 606479bcc7cSHerbert Xu goto skip_givenc; 607479bcc7cSHerbert Xu 6081acebad3SYuan Kang /* 6091acebad3SYuan Kang * Job Descriptor and Shared Descriptors 6101acebad3SYuan Kang * must all fit into the 64-word Descriptor h/w Buffer 6111acebad3SYuan Kang */ 61280cd88f2SVakul Garg keys_fit_inline = false; 613479bcc7cSHerbert Xu if (DESC_AEAD_GIVENC_LEN + AUTHENC_DESC_JOB_IO_LEN + 614daebc465SCatalin Vasile ctx->split_key_pad_len + ctx->enckeylen + 615daebc465SCatalin Vasile (is_rfc3686 ? DESC_AEAD_CTR_RFC3686_LEN : 0) <= 6161acebad3SYuan Kang CAAM_DESC_BYTES_MAX) 6172af8f4a2SKim Phillips keys_fit_inline = true; 6181acebad3SYuan Kang 6191acebad3SYuan Kang /* aead_givencrypt shared descriptor */ 6201d2d87e8SHoria Geantă desc = ctx->sh_desc_enc; 6211acebad3SYuan Kang 622daebc465SCatalin Vasile /* Note: Context registers are saved. */ 623daebc465SCatalin Vasile init_sh_desc_key_aead(desc, ctx, keys_fit_inline, is_rfc3686); 6241acebad3SYuan Kang 625479bcc7cSHerbert Xu if (is_rfc3686) 626479bcc7cSHerbert Xu goto copy_iv; 627479bcc7cSHerbert Xu 6281acebad3SYuan Kang /* Generate IV */ 6291acebad3SYuan Kang geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO | 6301acebad3SYuan Kang NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 | 631add86d55SHerbert Xu NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT); 6321acebad3SYuan Kang append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB | 6331acebad3SYuan Kang LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM); 6341acebad3SYuan Kang append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 635daebc465SCatalin Vasile append_move(desc, MOVE_WAITCOMP | 636daebc465SCatalin Vasile MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX | 637daebc465SCatalin Vasile (ctx1_iv_off << MOVE_OFFSET_SHIFT) | 638add86d55SHerbert Xu (ivsize << MOVE_LEN_SHIFT)); 6391acebad3SYuan Kang append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO); 6401acebad3SYuan Kang 641479bcc7cSHerbert Xu copy_iv: 6421acebad3SYuan Kang /* Copy IV to class 1 context */ 643daebc465SCatalin Vasile append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO | 644daebc465SCatalin Vasile (ctx1_iv_off << MOVE_OFFSET_SHIFT) | 645add86d55SHerbert Xu (ivsize << MOVE_LEN_SHIFT)); 6461acebad3SYuan Kang 6471acebad3SYuan Kang /* Return to encryption */ 6481acebad3SYuan Kang append_operation(desc, ctx->class2_alg_type | 6491acebad3SYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 6501acebad3SYuan Kang 651479bcc7cSHerbert Xu /* Read and write assoclen bytes */ 652479bcc7cSHerbert Xu append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 653479bcc7cSHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 654479bcc7cSHerbert Xu 6551d2d87e8SHoria Geantă /* ivsize + cryptlen = seqoutlen - authsize */ 6561d2d87e8SHoria Geantă append_math_sub_imm_u32(desc, REG3, SEQOUTLEN, IMM, ctx->authsize); 6571d2d87e8SHoria Geantă 658479bcc7cSHerbert Xu /* Skip assoc data */ 659479bcc7cSHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 6601acebad3SYuan Kang 6611acebad3SYuan Kang /* read assoc before reading payload */ 6621acebad3SYuan Kang append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG | 6631acebad3SYuan Kang KEY_VLF); 6641acebad3SYuan Kang 665daebc465SCatalin Vasile /* Copy iv from outfifo to class 2 fifo */ 6661acebad3SYuan Kang moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 | 667add86d55SHerbert Xu NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT); 6681acebad3SYuan Kang append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB | 6691acebad3SYuan Kang LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM); 670add86d55SHerbert Xu append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB | 6711acebad3SYuan Kang LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM); 6721acebad3SYuan Kang 673daebc465SCatalin Vasile /* Load Counter into CONTEXT1 reg */ 674daebc465SCatalin Vasile if (is_rfc3686) 675daebc465SCatalin Vasile append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | 676daebc465SCatalin Vasile LDST_CLASS_1_CCB | 677daebc465SCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 678daebc465SCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 679daebc465SCatalin Vasile LDST_OFFSET_SHIFT)); 680daebc465SCatalin Vasile 6811acebad3SYuan Kang /* Class 1 operation */ 6821acebad3SYuan Kang append_operation(desc, ctx->class1_alg_type | 6831acebad3SYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 6841acebad3SYuan Kang 6851acebad3SYuan Kang /* Will write ivsize + cryptlen */ 6861acebad3SYuan Kang append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 6871acebad3SYuan Kang 6881acebad3SYuan Kang /* Not need to reload iv */ 689add86d55SHerbert Xu append_seq_fifo_load(desc, ivsize, 6901acebad3SYuan Kang FIFOLD_CLASS_SKIP); 6911acebad3SYuan Kang 6921acebad3SYuan Kang /* Will read cryptlen */ 6931acebad3SYuan Kang append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 6941acebad3SYuan Kang aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2); 6951acebad3SYuan Kang 6961acebad3SYuan Kang /* Write ICV */ 6971acebad3SYuan Kang append_seq_store(desc, ctx->authsize, LDST_CLASS_2_CCB | 6981acebad3SYuan Kang LDST_SRCDST_BYTE_CONTEXT); 6991acebad3SYuan Kang 700479bcc7cSHerbert Xu ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 7011acebad3SYuan Kang desc_bytes(desc), 7021acebad3SYuan Kang DMA_TO_DEVICE); 7031d2d87e8SHoria Geantă if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 7041acebad3SYuan Kang dev_err(jrdev, "unable to map shared descriptor\n"); 7051acebad3SYuan Kang return -ENOMEM; 7061acebad3SYuan Kang } 7071acebad3SYuan Kang #ifdef DEBUG 708514df281SAlex Porosanu print_hex_dump(KERN_ERR, "aead givenc shdesc@"__stringify(__LINE__)": ", 7091acebad3SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, desc, 7101acebad3SYuan Kang desc_bytes(desc), 1); 7111acebad3SYuan Kang #endif 7121acebad3SYuan Kang 713479bcc7cSHerbert Xu skip_givenc: 7141acebad3SYuan Kang return 0; 7151acebad3SYuan Kang } 7161acebad3SYuan Kang 7170e479300SYuan Kang static int aead_setauthsize(struct crypto_aead *authenc, 7188e8ec596SKim Phillips unsigned int authsize) 7198e8ec596SKim Phillips { 7208e8ec596SKim Phillips struct caam_ctx *ctx = crypto_aead_ctx(authenc); 7218e8ec596SKim Phillips 7228e8ec596SKim Phillips ctx->authsize = authsize; 7231acebad3SYuan Kang aead_set_sh_desc(authenc); 7248e8ec596SKim Phillips 7258e8ec596SKim Phillips return 0; 7268e8ec596SKim Phillips } 7278e8ec596SKim Phillips 7283ef8d945STudor Ambarus static int gcm_set_sh_desc(struct crypto_aead *aead) 7293ef8d945STudor Ambarus { 7303ef8d945STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 7313ef8d945STudor Ambarus struct device *jrdev = ctx->jrdev; 7323ef8d945STudor Ambarus bool keys_fit_inline = false; 7333ef8d945STudor Ambarus u32 *key_jump_cmd, *zero_payload_jump_cmd, 7343ef8d945STudor Ambarus *zero_assoc_jump_cmd1, *zero_assoc_jump_cmd2; 7353ef8d945STudor Ambarus u32 *desc; 7363ef8d945STudor Ambarus 7373ef8d945STudor Ambarus if (!ctx->enckeylen || !ctx->authsize) 7383ef8d945STudor Ambarus return 0; 7393ef8d945STudor Ambarus 7403ef8d945STudor Ambarus /* 7413ef8d945STudor Ambarus * AES GCM encrypt shared descriptor 7423ef8d945STudor Ambarus * Job Descriptor and Shared Descriptor 7433ef8d945STudor Ambarus * must fit into the 64-word Descriptor h/w Buffer 7443ef8d945STudor Ambarus */ 745f2147b88SHerbert Xu if (DESC_GCM_ENC_LEN + GCM_DESC_JOB_IO_LEN + 7463ef8d945STudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 7473ef8d945STudor Ambarus keys_fit_inline = true; 7483ef8d945STudor Ambarus 7493ef8d945STudor Ambarus desc = ctx->sh_desc_enc; 7503ef8d945STudor Ambarus 7513ef8d945STudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 7523ef8d945STudor Ambarus 7533ef8d945STudor Ambarus /* skip key loading if they are loaded due to sharing */ 7543ef8d945STudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 7553ef8d945STudor Ambarus JUMP_COND_SHRD | JUMP_COND_SELF); 7563ef8d945STudor Ambarus if (keys_fit_inline) 7573ef8d945STudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 7583ef8d945STudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 7593ef8d945STudor Ambarus else 7603ef8d945STudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 7613ef8d945STudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 7623ef8d945STudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 7633ef8d945STudor Ambarus 7643ef8d945STudor Ambarus /* class 1 operation */ 7653ef8d945STudor Ambarus append_operation(desc, ctx->class1_alg_type | 7663ef8d945STudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 7673ef8d945STudor Ambarus 768f2147b88SHerbert Xu /* if assoclen + cryptlen is ZERO, skip to ICV write */ 769f2147b88SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 770f2147b88SHerbert Xu zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL | 7713ef8d945STudor Ambarus JUMP_COND_MATH_Z); 7723ef8d945STudor Ambarus 7733ef8d945STudor Ambarus /* if assoclen is ZERO, skip reading the assoc data */ 774f2147b88SHerbert Xu append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 7753ef8d945STudor Ambarus zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL | 7763ef8d945STudor Ambarus JUMP_COND_MATH_Z); 7773ef8d945STudor Ambarus 778f2147b88SHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 779f2147b88SHerbert Xu 780f2147b88SHerbert Xu /* skip assoc data */ 781f2147b88SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 782f2147b88SHerbert Xu 783f2147b88SHerbert Xu /* cryptlen = seqinlen - assoclen */ 784f2147b88SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ); 785f2147b88SHerbert Xu 786f2147b88SHerbert Xu /* if cryptlen is ZERO jump to zero-payload commands */ 787f2147b88SHerbert Xu zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL | 788f2147b88SHerbert Xu JUMP_COND_MATH_Z); 789f2147b88SHerbert Xu 7903ef8d945STudor Ambarus /* read assoc data */ 7913ef8d945STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 7923ef8d945STudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1); 7933ef8d945STudor Ambarus set_jump_tgt_here(desc, zero_assoc_jump_cmd1); 7943ef8d945STudor Ambarus 795f2147b88SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 7963ef8d945STudor Ambarus 7973ef8d945STudor Ambarus /* write encrypted data */ 7983ef8d945STudor Ambarus append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF); 7993ef8d945STudor Ambarus 8003ef8d945STudor Ambarus /* read payload data */ 8013ef8d945STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 8023ef8d945STudor Ambarus FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1); 8033ef8d945STudor Ambarus 8043ef8d945STudor Ambarus /* jump the zero-payload commands */ 805f2147b88SHerbert Xu append_jump(desc, JUMP_TEST_ALL | 2); 8063ef8d945STudor Ambarus 8073ef8d945STudor Ambarus /* zero-payload commands */ 8083ef8d945STudor Ambarus set_jump_tgt_here(desc, zero_payload_jump_cmd); 8093ef8d945STudor Ambarus 8103ef8d945STudor Ambarus /* read assoc data */ 8113ef8d945STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 8123ef8d945STudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1); 8133ef8d945STudor Ambarus 814f2147b88SHerbert Xu /* There is no input data */ 8153ef8d945STudor Ambarus set_jump_tgt_here(desc, zero_assoc_jump_cmd2); 8163ef8d945STudor Ambarus 8173ef8d945STudor Ambarus /* write ICV */ 8183ef8d945STudor Ambarus append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB | 8193ef8d945STudor Ambarus LDST_SRCDST_BYTE_CONTEXT); 8203ef8d945STudor Ambarus 8213ef8d945STudor Ambarus ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 8223ef8d945STudor Ambarus desc_bytes(desc), 8233ef8d945STudor Ambarus DMA_TO_DEVICE); 8243ef8d945STudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 8253ef8d945STudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 8263ef8d945STudor Ambarus return -ENOMEM; 8273ef8d945STudor Ambarus } 8283ef8d945STudor Ambarus #ifdef DEBUG 8293ef8d945STudor Ambarus print_hex_dump(KERN_ERR, "gcm enc shdesc@"__stringify(__LINE__)": ", 8303ef8d945STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 8313ef8d945STudor Ambarus desc_bytes(desc), 1); 8323ef8d945STudor Ambarus #endif 8333ef8d945STudor Ambarus 8343ef8d945STudor Ambarus /* 8353ef8d945STudor Ambarus * Job Descriptor and Shared Descriptors 8363ef8d945STudor Ambarus * must all fit into the 64-word Descriptor h/w Buffer 8373ef8d945STudor Ambarus */ 8383ef8d945STudor Ambarus keys_fit_inline = false; 839f2147b88SHerbert Xu if (DESC_GCM_DEC_LEN + GCM_DESC_JOB_IO_LEN + 8403ef8d945STudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 8413ef8d945STudor Ambarus keys_fit_inline = true; 8423ef8d945STudor Ambarus 8433ef8d945STudor Ambarus desc = ctx->sh_desc_dec; 8443ef8d945STudor Ambarus 8453ef8d945STudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 8463ef8d945STudor Ambarus 8473ef8d945STudor Ambarus /* skip key loading if they are loaded due to sharing */ 8483ef8d945STudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | 8493ef8d945STudor Ambarus JUMP_TEST_ALL | JUMP_COND_SHRD | 8503ef8d945STudor Ambarus JUMP_COND_SELF); 8513ef8d945STudor Ambarus if (keys_fit_inline) 8523ef8d945STudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 8533ef8d945STudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 8543ef8d945STudor Ambarus else 8553ef8d945STudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 8563ef8d945STudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 8573ef8d945STudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 8583ef8d945STudor Ambarus 8593ef8d945STudor Ambarus /* class 1 operation */ 8603ef8d945STudor Ambarus append_operation(desc, ctx->class1_alg_type | 8613ef8d945STudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON); 8623ef8d945STudor Ambarus 863f2147b88SHerbert Xu /* if assoclen is ZERO, skip reading the assoc data */ 864f2147b88SHerbert Xu append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ); 8653ef8d945STudor Ambarus zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL | 8663ef8d945STudor Ambarus JUMP_COND_MATH_Z); 867f2147b88SHerbert Xu 868f2147b88SHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 869f2147b88SHerbert Xu 870f2147b88SHerbert Xu /* skip assoc data */ 871f2147b88SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 872f2147b88SHerbert Xu 8733ef8d945STudor Ambarus /* read assoc data */ 8743ef8d945STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 8753ef8d945STudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1); 876f2147b88SHerbert Xu 8773ef8d945STudor Ambarus set_jump_tgt_here(desc, zero_assoc_jump_cmd1); 8783ef8d945STudor Ambarus 879f2147b88SHerbert Xu /* cryptlen = seqoutlen - assoclen */ 880f2147b88SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 881f2147b88SHerbert Xu 882f2147b88SHerbert Xu /* jump to zero-payload command if cryptlen is zero */ 883f2147b88SHerbert Xu zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL | 884f2147b88SHerbert Xu JUMP_COND_MATH_Z); 885f2147b88SHerbert Xu 886f2147b88SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 8873ef8d945STudor Ambarus 8883ef8d945STudor Ambarus /* store encrypted data */ 8893ef8d945STudor Ambarus append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF); 8903ef8d945STudor Ambarus 8913ef8d945STudor Ambarus /* read payload data */ 8923ef8d945STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 8933ef8d945STudor Ambarus FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1); 8943ef8d945STudor Ambarus 8953ef8d945STudor Ambarus /* zero-payload command */ 8963ef8d945STudor Ambarus set_jump_tgt_here(desc, zero_payload_jump_cmd); 8973ef8d945STudor Ambarus 8983ef8d945STudor Ambarus /* read ICV */ 8993ef8d945STudor Ambarus append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 | 9003ef8d945STudor Ambarus FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1); 9013ef8d945STudor Ambarus 9023ef8d945STudor Ambarus ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 9033ef8d945STudor Ambarus desc_bytes(desc), 9043ef8d945STudor Ambarus DMA_TO_DEVICE); 9053ef8d945STudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 9063ef8d945STudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 9073ef8d945STudor Ambarus return -ENOMEM; 9083ef8d945STudor Ambarus } 9093ef8d945STudor Ambarus #ifdef DEBUG 9103ef8d945STudor Ambarus print_hex_dump(KERN_ERR, "gcm dec shdesc@"__stringify(__LINE__)": ", 9113ef8d945STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 9123ef8d945STudor Ambarus desc_bytes(desc), 1); 9133ef8d945STudor Ambarus #endif 9143ef8d945STudor Ambarus 9153ef8d945STudor Ambarus return 0; 9163ef8d945STudor Ambarus } 9173ef8d945STudor Ambarus 9183ef8d945STudor Ambarus static int gcm_setauthsize(struct crypto_aead *authenc, unsigned int authsize) 9193ef8d945STudor Ambarus { 9203ef8d945STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(authenc); 9213ef8d945STudor Ambarus 9223ef8d945STudor Ambarus ctx->authsize = authsize; 9233ef8d945STudor Ambarus gcm_set_sh_desc(authenc); 9243ef8d945STudor Ambarus 9253ef8d945STudor Ambarus return 0; 9263ef8d945STudor Ambarus } 9273ef8d945STudor Ambarus 928bac68f2cSTudor Ambarus static int rfc4106_set_sh_desc(struct crypto_aead *aead) 929bac68f2cSTudor Ambarus { 930bac68f2cSTudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 931bac68f2cSTudor Ambarus struct device *jrdev = ctx->jrdev; 932bac68f2cSTudor Ambarus bool keys_fit_inline = false; 933f2147b88SHerbert Xu u32 *key_jump_cmd; 934bac68f2cSTudor Ambarus u32 *desc; 935bac68f2cSTudor Ambarus 936bac68f2cSTudor Ambarus if (!ctx->enckeylen || !ctx->authsize) 937bac68f2cSTudor Ambarus return 0; 938bac68f2cSTudor Ambarus 939bac68f2cSTudor Ambarus /* 940bac68f2cSTudor Ambarus * RFC4106 encrypt shared descriptor 941bac68f2cSTudor Ambarus * Job Descriptor and Shared Descriptor 942bac68f2cSTudor Ambarus * must fit into the 64-word Descriptor h/w Buffer 943bac68f2cSTudor Ambarus */ 944f2147b88SHerbert Xu if (DESC_RFC4106_ENC_LEN + GCM_DESC_JOB_IO_LEN + 945bac68f2cSTudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 946bac68f2cSTudor Ambarus keys_fit_inline = true; 947bac68f2cSTudor Ambarus 948bac68f2cSTudor Ambarus desc = ctx->sh_desc_enc; 949bac68f2cSTudor Ambarus 950bac68f2cSTudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 951bac68f2cSTudor Ambarus 952bac68f2cSTudor Ambarus /* Skip key loading if it is loaded due to sharing */ 953bac68f2cSTudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 954bac68f2cSTudor Ambarus JUMP_COND_SHRD); 955bac68f2cSTudor Ambarus if (keys_fit_inline) 956bac68f2cSTudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 957bac68f2cSTudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 958bac68f2cSTudor Ambarus else 959bac68f2cSTudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 960bac68f2cSTudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 961bac68f2cSTudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 962bac68f2cSTudor Ambarus 963bac68f2cSTudor Ambarus /* Class 1 operation */ 964bac68f2cSTudor Ambarus append_operation(desc, ctx->class1_alg_type | 965bac68f2cSTudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 966bac68f2cSTudor Ambarus 96746218750SHerbert Xu append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8); 968bac68f2cSTudor Ambarus append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 969bac68f2cSTudor Ambarus 970bac68f2cSTudor Ambarus /* Read assoc data */ 971bac68f2cSTudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 972bac68f2cSTudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1); 973bac68f2cSTudor Ambarus 97446218750SHerbert Xu /* Skip IV */ 97546218750SHerbert Xu append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP); 976f2147b88SHerbert Xu 977bac68f2cSTudor Ambarus /* Will read cryptlen bytes */ 978f2147b88SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 979bac68f2cSTudor Ambarus 9804aad0cc5SHoria Geant? /* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */ 9814aad0cc5SHoria Geant? append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG); 982bac68f2cSTudor Ambarus 98346218750SHerbert Xu /* Skip assoc data */ 98446218750SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 98546218750SHerbert Xu 98646218750SHerbert Xu /* cryptlen = seqoutlen - assoclen */ 9874aad0cc5SHoria Geant? append_math_sub(desc, VARSEQOUTLEN, VARSEQINLEN, REG0, CAAM_CMD_SZ); 98846218750SHerbert Xu 98946218750SHerbert Xu /* Write encrypted data */ 99046218750SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF); 99146218750SHerbert Xu 9924aad0cc5SHoria Geant? /* Read payload data */ 9934aad0cc5SHoria Geant? append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 9944aad0cc5SHoria Geant? FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1); 9954aad0cc5SHoria Geant? 996bac68f2cSTudor Ambarus /* Write ICV */ 997bac68f2cSTudor Ambarus append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB | 998bac68f2cSTudor Ambarus LDST_SRCDST_BYTE_CONTEXT); 999bac68f2cSTudor Ambarus 1000bac68f2cSTudor Ambarus ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 1001bac68f2cSTudor Ambarus desc_bytes(desc), 1002bac68f2cSTudor Ambarus DMA_TO_DEVICE); 1003bac68f2cSTudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 1004bac68f2cSTudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 1005bac68f2cSTudor Ambarus return -ENOMEM; 1006bac68f2cSTudor Ambarus } 1007bac68f2cSTudor Ambarus #ifdef DEBUG 1008bac68f2cSTudor Ambarus print_hex_dump(KERN_ERR, "rfc4106 enc shdesc@"__stringify(__LINE__)": ", 1009bac68f2cSTudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 1010bac68f2cSTudor Ambarus desc_bytes(desc), 1); 1011bac68f2cSTudor Ambarus #endif 1012bac68f2cSTudor Ambarus 1013bac68f2cSTudor Ambarus /* 1014bac68f2cSTudor Ambarus * Job Descriptor and Shared Descriptors 1015bac68f2cSTudor Ambarus * must all fit into the 64-word Descriptor h/w Buffer 1016bac68f2cSTudor Ambarus */ 1017bac68f2cSTudor Ambarus keys_fit_inline = false; 1018bac68f2cSTudor Ambarus if (DESC_RFC4106_DEC_LEN + DESC_JOB_IO_LEN + 1019bac68f2cSTudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 1020bac68f2cSTudor Ambarus keys_fit_inline = true; 1021bac68f2cSTudor Ambarus 1022bac68f2cSTudor Ambarus desc = ctx->sh_desc_dec; 1023bac68f2cSTudor Ambarus 1024bac68f2cSTudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 1025bac68f2cSTudor Ambarus 1026bac68f2cSTudor Ambarus /* Skip key loading if it is loaded due to sharing */ 1027bac68f2cSTudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | 1028bac68f2cSTudor Ambarus JUMP_TEST_ALL | JUMP_COND_SHRD); 1029bac68f2cSTudor Ambarus if (keys_fit_inline) 1030bac68f2cSTudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 1031bac68f2cSTudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 1032bac68f2cSTudor Ambarus else 1033bac68f2cSTudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 1034bac68f2cSTudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 1035bac68f2cSTudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 1036bac68f2cSTudor Ambarus 1037bac68f2cSTudor Ambarus /* Class 1 operation */ 1038bac68f2cSTudor Ambarus append_operation(desc, ctx->class1_alg_type | 1039bac68f2cSTudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON); 1040bac68f2cSTudor Ambarus 104146218750SHerbert Xu append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, 8); 1042f2147b88SHerbert Xu append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ); 1043bac68f2cSTudor Ambarus 1044bac68f2cSTudor Ambarus /* Read assoc data */ 1045bac68f2cSTudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 1046bac68f2cSTudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1); 1047bac68f2cSTudor Ambarus 104846218750SHerbert Xu /* Skip IV */ 104946218750SHerbert Xu append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP); 1050f2147b88SHerbert Xu 1051bac68f2cSTudor Ambarus /* Will read cryptlen bytes */ 105246218750SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ); 1053bac68f2cSTudor Ambarus 10544aad0cc5SHoria Geant? /* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */ 10554aad0cc5SHoria Geant? append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG); 1056bac68f2cSTudor Ambarus 105746218750SHerbert Xu /* Skip assoc data */ 105846218750SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF); 105946218750SHerbert Xu 106046218750SHerbert Xu /* Will write cryptlen bytes */ 106146218750SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 106246218750SHerbert Xu 106346218750SHerbert Xu /* Store payload data */ 106446218750SHerbert Xu append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF); 106546218750SHerbert Xu 10664aad0cc5SHoria Geant? /* Read encrypted data */ 10674aad0cc5SHoria Geant? append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF | 10684aad0cc5SHoria Geant? FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1); 10694aad0cc5SHoria Geant? 1070bac68f2cSTudor Ambarus /* Read ICV */ 1071bac68f2cSTudor Ambarus append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 | 1072bac68f2cSTudor Ambarus FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1); 1073bac68f2cSTudor Ambarus 1074bac68f2cSTudor Ambarus ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 1075bac68f2cSTudor Ambarus desc_bytes(desc), 1076bac68f2cSTudor Ambarus DMA_TO_DEVICE); 1077bac68f2cSTudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 1078bac68f2cSTudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 1079bac68f2cSTudor Ambarus return -ENOMEM; 1080bac68f2cSTudor Ambarus } 1081bac68f2cSTudor Ambarus #ifdef DEBUG 1082bac68f2cSTudor Ambarus print_hex_dump(KERN_ERR, "rfc4106 dec shdesc@"__stringify(__LINE__)": ", 1083bac68f2cSTudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 1084bac68f2cSTudor Ambarus desc_bytes(desc), 1); 1085bac68f2cSTudor Ambarus #endif 1086bac68f2cSTudor Ambarus 1087bac68f2cSTudor Ambarus return 0; 1088bac68f2cSTudor Ambarus } 1089bac68f2cSTudor Ambarus 1090bac68f2cSTudor Ambarus static int rfc4106_setauthsize(struct crypto_aead *authenc, 1091bac68f2cSTudor Ambarus unsigned int authsize) 1092bac68f2cSTudor Ambarus { 1093bac68f2cSTudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(authenc); 1094bac68f2cSTudor Ambarus 1095bac68f2cSTudor Ambarus ctx->authsize = authsize; 1096bac68f2cSTudor Ambarus rfc4106_set_sh_desc(authenc); 1097bac68f2cSTudor Ambarus 1098bac68f2cSTudor Ambarus return 0; 1099bac68f2cSTudor Ambarus } 1100bac68f2cSTudor Ambarus 11015d0429a3STudor Ambarus static int rfc4543_set_sh_desc(struct crypto_aead *aead) 11025d0429a3STudor Ambarus { 11035d0429a3STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 11045d0429a3STudor Ambarus struct device *jrdev = ctx->jrdev; 11055d0429a3STudor Ambarus bool keys_fit_inline = false; 1106f2147b88SHerbert Xu u32 *key_jump_cmd; 11075d0429a3STudor Ambarus u32 *read_move_cmd, *write_move_cmd; 11085d0429a3STudor Ambarus u32 *desc; 11095d0429a3STudor Ambarus 11105d0429a3STudor Ambarus if (!ctx->enckeylen || !ctx->authsize) 11115d0429a3STudor Ambarus return 0; 11125d0429a3STudor Ambarus 11135d0429a3STudor Ambarus /* 11145d0429a3STudor Ambarus * RFC4543 encrypt shared descriptor 11155d0429a3STudor Ambarus * Job Descriptor and Shared Descriptor 11165d0429a3STudor Ambarus * must fit into the 64-word Descriptor h/w Buffer 11175d0429a3STudor Ambarus */ 1118f2147b88SHerbert Xu if (DESC_RFC4543_ENC_LEN + GCM_DESC_JOB_IO_LEN + 11195d0429a3STudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 11205d0429a3STudor Ambarus keys_fit_inline = true; 11215d0429a3STudor Ambarus 11225d0429a3STudor Ambarus desc = ctx->sh_desc_enc; 11235d0429a3STudor Ambarus 11245d0429a3STudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 11255d0429a3STudor Ambarus 11265d0429a3STudor Ambarus /* Skip key loading if it is loaded due to sharing */ 11275d0429a3STudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 11285d0429a3STudor Ambarus JUMP_COND_SHRD); 11295d0429a3STudor Ambarus if (keys_fit_inline) 11305d0429a3STudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 11315d0429a3STudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 11325d0429a3STudor Ambarus else 11335d0429a3STudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 11345d0429a3STudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 11355d0429a3STudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 11365d0429a3STudor Ambarus 11375d0429a3STudor Ambarus /* Class 1 operation */ 11385d0429a3STudor Ambarus append_operation(desc, ctx->class1_alg_type | 11395d0429a3STudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 11405d0429a3STudor Ambarus 1141f2147b88SHerbert Xu /* assoclen + cryptlen = seqinlen */ 1142f2147b88SHerbert Xu append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ); 11435d0429a3STudor Ambarus 11445d0429a3STudor Ambarus /* 11455d0429a3STudor Ambarus * MOVE_LEN opcode is not available in all SEC HW revisions, 11465d0429a3STudor Ambarus * thus need to do some magic, i.e. self-patch the descriptor 11475d0429a3STudor Ambarus * buffer. 11485d0429a3STudor Ambarus */ 11495d0429a3STudor Ambarus read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 | 11505d0429a3STudor Ambarus (0x6 << MOVE_LEN_SHIFT)); 11515d0429a3STudor Ambarus write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF | 11525d0429a3STudor Ambarus (0x8 << MOVE_LEN_SHIFT)); 11535d0429a3STudor Ambarus 1154f2147b88SHerbert Xu /* Will read assoclen + cryptlen bytes */ 1155f2147b88SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 11565d0429a3STudor Ambarus 1157f2147b88SHerbert Xu /* Will write assoclen + cryptlen bytes */ 1158f2147b88SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ); 1159f2147b88SHerbert Xu 1160f2147b88SHerbert Xu /* Read and write assoclen + cryptlen bytes */ 11615d0429a3STudor Ambarus aead_append_src_dst(desc, FIFOLD_TYPE_AAD); 11625d0429a3STudor Ambarus 11635d0429a3STudor Ambarus set_move_tgt_here(desc, read_move_cmd); 11645d0429a3STudor Ambarus set_move_tgt_here(desc, write_move_cmd); 11655d0429a3STudor Ambarus append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 11665d0429a3STudor Ambarus /* Move payload data to OFIFO */ 11675d0429a3STudor Ambarus append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO); 11685d0429a3STudor Ambarus 11695d0429a3STudor Ambarus /* Write ICV */ 11705d0429a3STudor Ambarus append_seq_store(desc, ctx->authsize, LDST_CLASS_1_CCB | 11715d0429a3STudor Ambarus LDST_SRCDST_BYTE_CONTEXT); 11725d0429a3STudor Ambarus 11735d0429a3STudor Ambarus ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 11745d0429a3STudor Ambarus desc_bytes(desc), 11755d0429a3STudor Ambarus DMA_TO_DEVICE); 11765d0429a3STudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 11775d0429a3STudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 11785d0429a3STudor Ambarus return -ENOMEM; 11795d0429a3STudor Ambarus } 11805d0429a3STudor Ambarus #ifdef DEBUG 11815d0429a3STudor Ambarus print_hex_dump(KERN_ERR, "rfc4543 enc shdesc@"__stringify(__LINE__)": ", 11825d0429a3STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 11835d0429a3STudor Ambarus desc_bytes(desc), 1); 11845d0429a3STudor Ambarus #endif 11855d0429a3STudor Ambarus 11865d0429a3STudor Ambarus /* 11875d0429a3STudor Ambarus * Job Descriptor and Shared Descriptors 11885d0429a3STudor Ambarus * must all fit into the 64-word Descriptor h/w Buffer 11895d0429a3STudor Ambarus */ 11905d0429a3STudor Ambarus keys_fit_inline = false; 1191f2147b88SHerbert Xu if (DESC_RFC4543_DEC_LEN + GCM_DESC_JOB_IO_LEN + 11925d0429a3STudor Ambarus ctx->enckeylen <= CAAM_DESC_BYTES_MAX) 11935d0429a3STudor Ambarus keys_fit_inline = true; 11945d0429a3STudor Ambarus 11955d0429a3STudor Ambarus desc = ctx->sh_desc_dec; 11965d0429a3STudor Ambarus 11975d0429a3STudor Ambarus init_sh_desc(desc, HDR_SHARE_SERIAL); 11985d0429a3STudor Ambarus 11995d0429a3STudor Ambarus /* Skip key loading if it is loaded due to sharing */ 12005d0429a3STudor Ambarus key_jump_cmd = append_jump(desc, JUMP_JSL | 12015d0429a3STudor Ambarus JUMP_TEST_ALL | JUMP_COND_SHRD); 12025d0429a3STudor Ambarus if (keys_fit_inline) 12035d0429a3STudor Ambarus append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 12045d0429a3STudor Ambarus ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 12055d0429a3STudor Ambarus else 12065d0429a3STudor Ambarus append_key(desc, ctx->key_dma, ctx->enckeylen, 12075d0429a3STudor Ambarus CLASS_1 | KEY_DEST_CLASS_REG); 12085d0429a3STudor Ambarus set_jump_tgt_here(desc, key_jump_cmd); 12095d0429a3STudor Ambarus 12105d0429a3STudor Ambarus /* Class 1 operation */ 12115d0429a3STudor Ambarus append_operation(desc, ctx->class1_alg_type | 12125d0429a3STudor Ambarus OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT | OP_ALG_ICV_ON); 12135d0429a3STudor Ambarus 1214f2147b88SHerbert Xu /* assoclen + cryptlen = seqoutlen */ 1215f2147b88SHerbert Xu append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ); 12165d0429a3STudor Ambarus 12175d0429a3STudor Ambarus /* 12185d0429a3STudor Ambarus * MOVE_LEN opcode is not available in all SEC HW revisions, 12195d0429a3STudor Ambarus * thus need to do some magic, i.e. self-patch the descriptor 12205d0429a3STudor Ambarus * buffer. 12215d0429a3STudor Ambarus */ 12225d0429a3STudor Ambarus read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 | 12235d0429a3STudor Ambarus (0x6 << MOVE_LEN_SHIFT)); 12245d0429a3STudor Ambarus write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF | 12255d0429a3STudor Ambarus (0x8 << MOVE_LEN_SHIFT)); 12265d0429a3STudor Ambarus 1227f2147b88SHerbert Xu /* Will read assoclen + cryptlen bytes */ 1228f2147b88SHerbert Xu append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 12295d0429a3STudor Ambarus 1230f2147b88SHerbert Xu /* Will write assoclen + cryptlen bytes */ 1231f2147b88SHerbert Xu append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ); 12325d0429a3STudor Ambarus 12335d0429a3STudor Ambarus /* Store payload data */ 12345d0429a3STudor Ambarus append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF); 12355d0429a3STudor Ambarus 1236f2147b88SHerbert Xu /* In-snoop assoclen + cryptlen data */ 12375d0429a3STudor Ambarus append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF | 12385d0429a3STudor Ambarus FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1); 12395d0429a3STudor Ambarus 12405d0429a3STudor Ambarus set_move_tgt_here(desc, read_move_cmd); 12415d0429a3STudor Ambarus set_move_tgt_here(desc, write_move_cmd); 12425d0429a3STudor Ambarus append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 12435d0429a3STudor Ambarus /* Move payload data to OFIFO */ 12445d0429a3STudor Ambarus append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO); 12455d0429a3STudor Ambarus append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO); 12465d0429a3STudor Ambarus 12475d0429a3STudor Ambarus /* Read ICV */ 12485d0429a3STudor Ambarus append_seq_fifo_load(desc, ctx->authsize, FIFOLD_CLASS_CLASS1 | 12495d0429a3STudor Ambarus FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1); 12505d0429a3STudor Ambarus 12515d0429a3STudor Ambarus ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 12525d0429a3STudor Ambarus desc_bytes(desc), 12535d0429a3STudor Ambarus DMA_TO_DEVICE); 12545d0429a3STudor Ambarus if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 12555d0429a3STudor Ambarus dev_err(jrdev, "unable to map shared descriptor\n"); 12565d0429a3STudor Ambarus return -ENOMEM; 12575d0429a3STudor Ambarus } 12585d0429a3STudor Ambarus #ifdef DEBUG 12595d0429a3STudor Ambarus print_hex_dump(KERN_ERR, "rfc4543 dec shdesc@"__stringify(__LINE__)": ", 12605d0429a3STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, desc, 12615d0429a3STudor Ambarus desc_bytes(desc), 1); 12625d0429a3STudor Ambarus #endif 12635d0429a3STudor Ambarus 12645d0429a3STudor Ambarus return 0; 12655d0429a3STudor Ambarus } 12665d0429a3STudor Ambarus 12675d0429a3STudor Ambarus static int rfc4543_setauthsize(struct crypto_aead *authenc, 12685d0429a3STudor Ambarus unsigned int authsize) 12695d0429a3STudor Ambarus { 12705d0429a3STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(authenc); 12715d0429a3STudor Ambarus 12725d0429a3STudor Ambarus ctx->authsize = authsize; 12735d0429a3STudor Ambarus rfc4543_set_sh_desc(authenc); 12745d0429a3STudor Ambarus 12755d0429a3STudor Ambarus return 0; 12765d0429a3STudor Ambarus } 12775d0429a3STudor Ambarus 12784c1ec1f9SYuan Kang static u32 gen_split_aead_key(struct caam_ctx *ctx, const u8 *key_in, 12794c1ec1f9SYuan Kang u32 authkeylen) 12808e8ec596SKim Phillips { 12814c1ec1f9SYuan Kang return gen_split_key(ctx->jrdev, ctx->key, ctx->split_key_len, 12824c1ec1f9SYuan Kang ctx->split_key_pad_len, key_in, authkeylen, 12834c1ec1f9SYuan Kang ctx->alg_op); 12848e8ec596SKim Phillips } 12858e8ec596SKim Phillips 12860e479300SYuan Kang static int aead_setkey(struct crypto_aead *aead, 12878e8ec596SKim Phillips const u8 *key, unsigned int keylen) 12888e8ec596SKim Phillips { 12898e8ec596SKim Phillips /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */ 12908e8ec596SKim Phillips static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 }; 12918e8ec596SKim Phillips struct caam_ctx *ctx = crypto_aead_ctx(aead); 12928e8ec596SKim Phillips struct device *jrdev = ctx->jrdev; 12934e6e0b27SHoria Geanta struct crypto_authenc_keys keys; 12948e8ec596SKim Phillips int ret = 0; 12958e8ec596SKim Phillips 12964e6e0b27SHoria Geanta if (crypto_authenc_extractkeys(&keys, key, keylen) != 0) 12978e8ec596SKim Phillips goto badkey; 12988e8ec596SKim Phillips 12998e8ec596SKim Phillips /* Pick class 2 key length from algorithm submask */ 13008e8ec596SKim Phillips ctx->split_key_len = mdpadlen[(ctx->alg_op & OP_ALG_ALGSEL_SUBMASK) >> 13018e8ec596SKim Phillips OP_ALG_ALGSEL_SHIFT] * 2; 13028e8ec596SKim Phillips ctx->split_key_pad_len = ALIGN(ctx->split_key_len, 16); 13038e8ec596SKim Phillips 13044e6e0b27SHoria Geanta if (ctx->split_key_pad_len + keys.enckeylen > CAAM_MAX_KEY_SIZE) 13054e6e0b27SHoria Geanta goto badkey; 13064e6e0b27SHoria Geanta 13078e8ec596SKim Phillips #ifdef DEBUG 13088e8ec596SKim Phillips printk(KERN_ERR "keylen %d enckeylen %d authkeylen %d\n", 13094e6e0b27SHoria Geanta keys.authkeylen + keys.enckeylen, keys.enckeylen, 13104e6e0b27SHoria Geanta keys.authkeylen); 13118e8ec596SKim Phillips printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n", 13128e8ec596SKim Phillips ctx->split_key_len, ctx->split_key_pad_len); 1313514df281SAlex Porosanu print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ", 13148e8ec596SKim Phillips DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 13158e8ec596SKim Phillips #endif 13168e8ec596SKim Phillips 13174e6e0b27SHoria Geanta ret = gen_split_aead_key(ctx, keys.authkey, keys.authkeylen); 13188e8ec596SKim Phillips if (ret) { 13198e8ec596SKim Phillips goto badkey; 13208e8ec596SKim Phillips } 13218e8ec596SKim Phillips 13228e8ec596SKim Phillips /* postpend encryption key to auth split key */ 13234e6e0b27SHoria Geanta memcpy(ctx->key + ctx->split_key_pad_len, keys.enckey, keys.enckeylen); 13248e8ec596SKim Phillips 1325885e9e2fSYuan Kang ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->split_key_pad_len + 13264e6e0b27SHoria Geanta keys.enckeylen, DMA_TO_DEVICE); 1327885e9e2fSYuan Kang if (dma_mapping_error(jrdev, ctx->key_dma)) { 13288e8ec596SKim Phillips dev_err(jrdev, "unable to map key i/o memory\n"); 13298e8ec596SKim Phillips return -ENOMEM; 13308e8ec596SKim Phillips } 13318e8ec596SKim Phillips #ifdef DEBUG 1332514df281SAlex Porosanu print_hex_dump(KERN_ERR, "ctx.key@"__stringify(__LINE__)": ", 13338e8ec596SKim Phillips DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, 13344e6e0b27SHoria Geanta ctx->split_key_pad_len + keys.enckeylen, 1); 13358e8ec596SKim Phillips #endif 13368e8ec596SKim Phillips 13374e6e0b27SHoria Geanta ctx->enckeylen = keys.enckeylen; 13388e8ec596SKim Phillips 13391acebad3SYuan Kang ret = aead_set_sh_desc(aead); 13408e8ec596SKim Phillips if (ret) { 1341885e9e2fSYuan Kang dma_unmap_single(jrdev, ctx->key_dma, ctx->split_key_pad_len + 13424e6e0b27SHoria Geanta keys.enckeylen, DMA_TO_DEVICE); 13438e8ec596SKim Phillips } 13448e8ec596SKim Phillips 13458e8ec596SKim Phillips return ret; 13468e8ec596SKim Phillips badkey: 13478e8ec596SKim Phillips crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN); 13488e8ec596SKim Phillips return -EINVAL; 13498e8ec596SKim Phillips } 13508e8ec596SKim Phillips 13513ef8d945STudor Ambarus static int gcm_setkey(struct crypto_aead *aead, 13523ef8d945STudor Ambarus const u8 *key, unsigned int keylen) 13533ef8d945STudor Ambarus { 13543ef8d945STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 13553ef8d945STudor Ambarus struct device *jrdev = ctx->jrdev; 13563ef8d945STudor Ambarus int ret = 0; 13573ef8d945STudor Ambarus 13583ef8d945STudor Ambarus #ifdef DEBUG 13593ef8d945STudor Ambarus print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ", 13603ef8d945STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 13613ef8d945STudor Ambarus #endif 13623ef8d945STudor Ambarus 13633ef8d945STudor Ambarus memcpy(ctx->key, key, keylen); 13643ef8d945STudor Ambarus ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen, 13653ef8d945STudor Ambarus DMA_TO_DEVICE); 13663ef8d945STudor Ambarus if (dma_mapping_error(jrdev, ctx->key_dma)) { 13673ef8d945STudor Ambarus dev_err(jrdev, "unable to map key i/o memory\n"); 13683ef8d945STudor Ambarus return -ENOMEM; 13693ef8d945STudor Ambarus } 13703ef8d945STudor Ambarus ctx->enckeylen = keylen; 13713ef8d945STudor Ambarus 13723ef8d945STudor Ambarus ret = gcm_set_sh_desc(aead); 13733ef8d945STudor Ambarus if (ret) { 13743ef8d945STudor Ambarus dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen, 13753ef8d945STudor Ambarus DMA_TO_DEVICE); 13763ef8d945STudor Ambarus } 13773ef8d945STudor Ambarus 13783ef8d945STudor Ambarus return ret; 13793ef8d945STudor Ambarus } 13803ef8d945STudor Ambarus 1381bac68f2cSTudor Ambarus static int rfc4106_setkey(struct crypto_aead *aead, 1382bac68f2cSTudor Ambarus const u8 *key, unsigned int keylen) 1383bac68f2cSTudor Ambarus { 1384bac68f2cSTudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 1385bac68f2cSTudor Ambarus struct device *jrdev = ctx->jrdev; 1386bac68f2cSTudor Ambarus int ret = 0; 1387bac68f2cSTudor Ambarus 1388bac68f2cSTudor Ambarus if (keylen < 4) 1389bac68f2cSTudor Ambarus return -EINVAL; 1390bac68f2cSTudor Ambarus 1391bac68f2cSTudor Ambarus #ifdef DEBUG 1392bac68f2cSTudor Ambarus print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ", 1393bac68f2cSTudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 1394bac68f2cSTudor Ambarus #endif 1395bac68f2cSTudor Ambarus 1396bac68f2cSTudor Ambarus memcpy(ctx->key, key, keylen); 1397bac68f2cSTudor Ambarus 1398bac68f2cSTudor Ambarus /* 1399bac68f2cSTudor Ambarus * The last four bytes of the key material are used as the salt value 1400bac68f2cSTudor Ambarus * in the nonce. Update the AES key length. 1401bac68f2cSTudor Ambarus */ 1402bac68f2cSTudor Ambarus ctx->enckeylen = keylen - 4; 1403bac68f2cSTudor Ambarus 1404bac68f2cSTudor Ambarus ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->enckeylen, 1405bac68f2cSTudor Ambarus DMA_TO_DEVICE); 1406bac68f2cSTudor Ambarus if (dma_mapping_error(jrdev, ctx->key_dma)) { 1407bac68f2cSTudor Ambarus dev_err(jrdev, "unable to map key i/o memory\n"); 1408bac68f2cSTudor Ambarus return -ENOMEM; 1409bac68f2cSTudor Ambarus } 1410bac68f2cSTudor Ambarus 1411bac68f2cSTudor Ambarus ret = rfc4106_set_sh_desc(aead); 1412bac68f2cSTudor Ambarus if (ret) { 1413bac68f2cSTudor Ambarus dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen, 1414bac68f2cSTudor Ambarus DMA_TO_DEVICE); 1415bac68f2cSTudor Ambarus } 1416bac68f2cSTudor Ambarus 1417bac68f2cSTudor Ambarus return ret; 1418bac68f2cSTudor Ambarus } 1419bac68f2cSTudor Ambarus 14205d0429a3STudor Ambarus static int rfc4543_setkey(struct crypto_aead *aead, 14215d0429a3STudor Ambarus const u8 *key, unsigned int keylen) 14225d0429a3STudor Ambarus { 14235d0429a3STudor Ambarus struct caam_ctx *ctx = crypto_aead_ctx(aead); 14245d0429a3STudor Ambarus struct device *jrdev = ctx->jrdev; 14255d0429a3STudor Ambarus int ret = 0; 14265d0429a3STudor Ambarus 14275d0429a3STudor Ambarus if (keylen < 4) 14285d0429a3STudor Ambarus return -EINVAL; 14295d0429a3STudor Ambarus 14305d0429a3STudor Ambarus #ifdef DEBUG 14315d0429a3STudor Ambarus print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ", 14325d0429a3STudor Ambarus DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 14335d0429a3STudor Ambarus #endif 14345d0429a3STudor Ambarus 14355d0429a3STudor Ambarus memcpy(ctx->key, key, keylen); 14365d0429a3STudor Ambarus 14375d0429a3STudor Ambarus /* 14385d0429a3STudor Ambarus * The last four bytes of the key material are used as the salt value 14395d0429a3STudor Ambarus * in the nonce. Update the AES key length. 14405d0429a3STudor Ambarus */ 14415d0429a3STudor Ambarus ctx->enckeylen = keylen - 4; 14425d0429a3STudor Ambarus 14435d0429a3STudor Ambarus ctx->key_dma = dma_map_single(jrdev, ctx->key, ctx->enckeylen, 14445d0429a3STudor Ambarus DMA_TO_DEVICE); 14455d0429a3STudor Ambarus if (dma_mapping_error(jrdev, ctx->key_dma)) { 14465d0429a3STudor Ambarus dev_err(jrdev, "unable to map key i/o memory\n"); 14475d0429a3STudor Ambarus return -ENOMEM; 14485d0429a3STudor Ambarus } 14495d0429a3STudor Ambarus 14505d0429a3STudor Ambarus ret = rfc4543_set_sh_desc(aead); 14515d0429a3STudor Ambarus if (ret) { 14525d0429a3STudor Ambarus dma_unmap_single(jrdev, ctx->key_dma, ctx->enckeylen, 14535d0429a3STudor Ambarus DMA_TO_DEVICE); 14545d0429a3STudor Ambarus } 14555d0429a3STudor Ambarus 14565d0429a3STudor Ambarus return ret; 14575d0429a3STudor Ambarus } 14585d0429a3STudor Ambarus 1459acdca31dSYuan Kang static int ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher, 1460acdca31dSYuan Kang const u8 *key, unsigned int keylen) 1461acdca31dSYuan Kang { 1462acdca31dSYuan Kang struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 1463a5f57cffSCatalin Vasile struct ablkcipher_tfm *crt = &ablkcipher->base.crt_ablkcipher; 1464a5f57cffSCatalin Vasile struct crypto_tfm *tfm = crypto_ablkcipher_tfm(ablkcipher); 1465a5f57cffSCatalin Vasile const char *alg_name = crypto_tfm_alg_name(tfm); 1466acdca31dSYuan Kang struct device *jrdev = ctx->jrdev; 1467acdca31dSYuan Kang int ret = 0; 14684464a7d4SHoria Geanta u32 *key_jump_cmd; 1469acdca31dSYuan Kang u32 *desc; 1470a5f57cffSCatalin Vasile u32 *nonce; 14717222d1a3SCatalin Vasile u32 geniv; 14722b22f6c5SCatalin Vasile u32 ctx1_iv_off = 0; 14732b22f6c5SCatalin Vasile const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) == 14742b22f6c5SCatalin Vasile OP_ALG_AAI_CTR_MOD128); 1475a5f57cffSCatalin Vasile const bool is_rfc3686 = (ctr_mode && 1476a5f57cffSCatalin Vasile (strstr(alg_name, "rfc3686") != NULL)); 1477acdca31dSYuan Kang 1478acdca31dSYuan Kang #ifdef DEBUG 1479514df281SAlex Porosanu print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ", 1480acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1); 1481acdca31dSYuan Kang #endif 14822b22f6c5SCatalin Vasile /* 14832b22f6c5SCatalin Vasile * AES-CTR needs to load IV in CONTEXT1 reg 14842b22f6c5SCatalin Vasile * at an offset of 128bits (16bytes) 14852b22f6c5SCatalin Vasile * CONTEXT1[255:128] = IV 14862b22f6c5SCatalin Vasile */ 14872b22f6c5SCatalin Vasile if (ctr_mode) 14882b22f6c5SCatalin Vasile ctx1_iv_off = 16; 1489acdca31dSYuan Kang 1490a5f57cffSCatalin Vasile /* 1491a5f57cffSCatalin Vasile * RFC3686 specific: 1492a5f57cffSCatalin Vasile * | CONTEXT1[255:128] = {NONCE, IV, COUNTER} 1493a5f57cffSCatalin Vasile * | *key = {KEY, NONCE} 1494a5f57cffSCatalin Vasile */ 1495a5f57cffSCatalin Vasile if (is_rfc3686) { 1496a5f57cffSCatalin Vasile ctx1_iv_off = 16 + CTR_RFC3686_NONCE_SIZE; 1497a5f57cffSCatalin Vasile keylen -= CTR_RFC3686_NONCE_SIZE; 1498a5f57cffSCatalin Vasile } 1499a5f57cffSCatalin Vasile 1500acdca31dSYuan Kang memcpy(ctx->key, key, keylen); 1501acdca31dSYuan Kang ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen, 1502acdca31dSYuan Kang DMA_TO_DEVICE); 1503acdca31dSYuan Kang if (dma_mapping_error(jrdev, ctx->key_dma)) { 1504acdca31dSYuan Kang dev_err(jrdev, "unable to map key i/o memory\n"); 1505acdca31dSYuan Kang return -ENOMEM; 1506acdca31dSYuan Kang } 1507acdca31dSYuan Kang ctx->enckeylen = keylen; 1508acdca31dSYuan Kang 1509acdca31dSYuan Kang /* ablkcipher_encrypt shared descriptor */ 1510acdca31dSYuan Kang desc = ctx->sh_desc_enc; 1511a5f57cffSCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 1512acdca31dSYuan Kang /* Skip if already shared */ 1513acdca31dSYuan Kang key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 1514acdca31dSYuan Kang JUMP_COND_SHRD); 1515acdca31dSYuan Kang 1516acdca31dSYuan Kang /* Load class1 key only */ 1517acdca31dSYuan Kang append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 1518acdca31dSYuan Kang ctx->enckeylen, CLASS_1 | 1519acdca31dSYuan Kang KEY_DEST_CLASS_REG); 1520acdca31dSYuan Kang 1521a5f57cffSCatalin Vasile /* Load nonce into CONTEXT1 reg */ 1522a5f57cffSCatalin Vasile if (is_rfc3686) { 1523a5f57cffSCatalin Vasile nonce = (u32 *)(key + keylen); 1524a5f57cffSCatalin Vasile append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB | 1525a5f57cffSCatalin Vasile LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM); 1526a5f57cffSCatalin Vasile append_move(desc, MOVE_WAITCOMP | 1527a5f57cffSCatalin Vasile MOVE_SRC_OUTFIFO | 1528a5f57cffSCatalin Vasile MOVE_DEST_CLASS1CTX | 1529a5f57cffSCatalin Vasile (16 << MOVE_OFFSET_SHIFT) | 1530a5f57cffSCatalin Vasile (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT)); 1531a5f57cffSCatalin Vasile } 1532a5f57cffSCatalin Vasile 1533acdca31dSYuan Kang set_jump_tgt_here(desc, key_jump_cmd); 1534acdca31dSYuan Kang 1535acdca31dSYuan Kang /* Load iv */ 1536a5f57cffSCatalin Vasile append_seq_load(desc, crt->ivsize, LDST_SRCDST_BYTE_CONTEXT | 15372b22f6c5SCatalin Vasile LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT)); 1538acdca31dSYuan Kang 1539a5f57cffSCatalin Vasile /* Load counter into CONTEXT1 reg */ 1540a5f57cffSCatalin Vasile if (is_rfc3686) 1541a5f57cffSCatalin Vasile append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | 1542a5f57cffSCatalin Vasile LDST_CLASS_1_CCB | 1543a5f57cffSCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 1544a5f57cffSCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 1545a5f57cffSCatalin Vasile LDST_OFFSET_SHIFT)); 1546a5f57cffSCatalin Vasile 1547acdca31dSYuan Kang /* Load operation */ 1548acdca31dSYuan Kang append_operation(desc, ctx->class1_alg_type | 1549acdca31dSYuan Kang OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 1550acdca31dSYuan Kang 1551acdca31dSYuan Kang /* Perform operation */ 1552acdca31dSYuan Kang ablkcipher_append_src_dst(desc); 1553acdca31dSYuan Kang 1554acdca31dSYuan Kang ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, 1555acdca31dSYuan Kang desc_bytes(desc), 1556acdca31dSYuan Kang DMA_TO_DEVICE); 1557acdca31dSYuan Kang if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 1558acdca31dSYuan Kang dev_err(jrdev, "unable to map shared descriptor\n"); 1559acdca31dSYuan Kang return -ENOMEM; 1560acdca31dSYuan Kang } 1561acdca31dSYuan Kang #ifdef DEBUG 1562514df281SAlex Porosanu print_hex_dump(KERN_ERR, 1563514df281SAlex Porosanu "ablkcipher enc shdesc@"__stringify(__LINE__)": ", 1564acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, desc, 1565acdca31dSYuan Kang desc_bytes(desc), 1); 1566acdca31dSYuan Kang #endif 1567acdca31dSYuan Kang /* ablkcipher_decrypt shared descriptor */ 1568acdca31dSYuan Kang desc = ctx->sh_desc_dec; 1569acdca31dSYuan Kang 1570a5f57cffSCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 1571acdca31dSYuan Kang /* Skip if already shared */ 1572acdca31dSYuan Kang key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 1573acdca31dSYuan Kang JUMP_COND_SHRD); 1574acdca31dSYuan Kang 1575acdca31dSYuan Kang /* Load class1 key only */ 1576acdca31dSYuan Kang append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 1577acdca31dSYuan Kang ctx->enckeylen, CLASS_1 | 1578acdca31dSYuan Kang KEY_DEST_CLASS_REG); 1579acdca31dSYuan Kang 1580a5f57cffSCatalin Vasile /* Load nonce into CONTEXT1 reg */ 1581a5f57cffSCatalin Vasile if (is_rfc3686) { 1582a5f57cffSCatalin Vasile nonce = (u32 *)(key + keylen); 1583a5f57cffSCatalin Vasile append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB | 1584a5f57cffSCatalin Vasile LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM); 1585a5f57cffSCatalin Vasile append_move(desc, MOVE_WAITCOMP | 1586a5f57cffSCatalin Vasile MOVE_SRC_OUTFIFO | 1587a5f57cffSCatalin Vasile MOVE_DEST_CLASS1CTX | 1588a5f57cffSCatalin Vasile (16 << MOVE_OFFSET_SHIFT) | 1589a5f57cffSCatalin Vasile (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT)); 1590a5f57cffSCatalin Vasile } 1591a5f57cffSCatalin Vasile 1592acdca31dSYuan Kang set_jump_tgt_here(desc, key_jump_cmd); 1593acdca31dSYuan Kang 1594acdca31dSYuan Kang /* load IV */ 1595a5f57cffSCatalin Vasile append_seq_load(desc, crt->ivsize, LDST_SRCDST_BYTE_CONTEXT | 15962b22f6c5SCatalin Vasile LDST_CLASS_1_CCB | (ctx1_iv_off << LDST_OFFSET_SHIFT)); 1597acdca31dSYuan Kang 1598a5f57cffSCatalin Vasile /* Load counter into CONTEXT1 reg */ 1599a5f57cffSCatalin Vasile if (is_rfc3686) 1600a5f57cffSCatalin Vasile append_load_imm_u32(desc, be32_to_cpu(1), LDST_IMM | 1601a5f57cffSCatalin Vasile LDST_CLASS_1_CCB | 1602a5f57cffSCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 1603a5f57cffSCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 1604a5f57cffSCatalin Vasile LDST_OFFSET_SHIFT)); 1605a5f57cffSCatalin Vasile 1606acdca31dSYuan Kang /* Choose operation */ 16072b22f6c5SCatalin Vasile if (ctr_mode) 16082b22f6c5SCatalin Vasile append_operation(desc, ctx->class1_alg_type | 16092b22f6c5SCatalin Vasile OP_ALG_AS_INITFINAL | OP_ALG_DECRYPT); 16102b22f6c5SCatalin Vasile else 1611acdca31dSYuan Kang append_dec_op1(desc, ctx->class1_alg_type); 1612acdca31dSYuan Kang 1613acdca31dSYuan Kang /* Perform operation */ 1614acdca31dSYuan Kang ablkcipher_append_src_dst(desc); 1615acdca31dSYuan Kang 1616acdca31dSYuan Kang ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, 1617acdca31dSYuan Kang desc_bytes(desc), 1618acdca31dSYuan Kang DMA_TO_DEVICE); 161971c65f7cSHoria Geanta if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 1620acdca31dSYuan Kang dev_err(jrdev, "unable to map shared descriptor\n"); 1621acdca31dSYuan Kang return -ENOMEM; 1622acdca31dSYuan Kang } 1623acdca31dSYuan Kang 1624acdca31dSYuan Kang #ifdef DEBUG 1625514df281SAlex Porosanu print_hex_dump(KERN_ERR, 1626514df281SAlex Porosanu "ablkcipher dec shdesc@"__stringify(__LINE__)": ", 1627acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, desc, 1628acdca31dSYuan Kang desc_bytes(desc), 1); 1629acdca31dSYuan Kang #endif 16307222d1a3SCatalin Vasile /* ablkcipher_givencrypt shared descriptor */ 16317222d1a3SCatalin Vasile desc = ctx->sh_desc_givenc; 16327222d1a3SCatalin Vasile 16337222d1a3SCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 16347222d1a3SCatalin Vasile /* Skip if already shared */ 16357222d1a3SCatalin Vasile key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 16367222d1a3SCatalin Vasile JUMP_COND_SHRD); 16377222d1a3SCatalin Vasile 16387222d1a3SCatalin Vasile /* Load class1 key only */ 16397222d1a3SCatalin Vasile append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 16407222d1a3SCatalin Vasile ctx->enckeylen, CLASS_1 | 16417222d1a3SCatalin Vasile KEY_DEST_CLASS_REG); 16427222d1a3SCatalin Vasile 16437222d1a3SCatalin Vasile /* Load Nonce into CONTEXT1 reg */ 16447222d1a3SCatalin Vasile if (is_rfc3686) { 16457222d1a3SCatalin Vasile nonce = (u32 *)(key + keylen); 16467222d1a3SCatalin Vasile append_load_imm_u32(desc, *nonce, LDST_CLASS_IND_CCB | 16477222d1a3SCatalin Vasile LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM); 16487222d1a3SCatalin Vasile append_move(desc, MOVE_WAITCOMP | 16497222d1a3SCatalin Vasile MOVE_SRC_OUTFIFO | 16507222d1a3SCatalin Vasile MOVE_DEST_CLASS1CTX | 16517222d1a3SCatalin Vasile (16 << MOVE_OFFSET_SHIFT) | 16527222d1a3SCatalin Vasile (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT)); 16537222d1a3SCatalin Vasile } 16547222d1a3SCatalin Vasile set_jump_tgt_here(desc, key_jump_cmd); 16557222d1a3SCatalin Vasile 16567222d1a3SCatalin Vasile /* Generate IV */ 16577222d1a3SCatalin Vasile geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO | 16587222d1a3SCatalin Vasile NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 | 16597222d1a3SCatalin Vasile NFIFOENTRY_PTYPE_RND | (crt->ivsize << NFIFOENTRY_DLEN_SHIFT); 16607222d1a3SCatalin Vasile append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB | 16617222d1a3SCatalin Vasile LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM); 16627222d1a3SCatalin Vasile append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO); 16637222d1a3SCatalin Vasile append_move(desc, MOVE_WAITCOMP | 16647222d1a3SCatalin Vasile MOVE_SRC_INFIFO | 16657222d1a3SCatalin Vasile MOVE_DEST_CLASS1CTX | 16667222d1a3SCatalin Vasile (crt->ivsize << MOVE_LEN_SHIFT) | 16677222d1a3SCatalin Vasile (ctx1_iv_off << MOVE_OFFSET_SHIFT)); 16687222d1a3SCatalin Vasile append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO); 16697222d1a3SCatalin Vasile 16707222d1a3SCatalin Vasile /* Copy generated IV to memory */ 16717222d1a3SCatalin Vasile append_seq_store(desc, crt->ivsize, 16727222d1a3SCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB | 16737222d1a3SCatalin Vasile (ctx1_iv_off << LDST_OFFSET_SHIFT)); 16747222d1a3SCatalin Vasile 16757222d1a3SCatalin Vasile /* Load Counter into CONTEXT1 reg */ 16767222d1a3SCatalin Vasile if (is_rfc3686) 16777222d1a3SCatalin Vasile append_load_imm_u32(desc, (u32)1, LDST_IMM | 16787222d1a3SCatalin Vasile LDST_CLASS_1_CCB | 16797222d1a3SCatalin Vasile LDST_SRCDST_BYTE_CONTEXT | 16807222d1a3SCatalin Vasile ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) << 16817222d1a3SCatalin Vasile LDST_OFFSET_SHIFT)); 16827222d1a3SCatalin Vasile 16837222d1a3SCatalin Vasile if (ctx1_iv_off) 16847222d1a3SCatalin Vasile append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NCP | 16857222d1a3SCatalin Vasile (1 << JUMP_OFFSET_SHIFT)); 16867222d1a3SCatalin Vasile 16877222d1a3SCatalin Vasile /* Load operation */ 16887222d1a3SCatalin Vasile append_operation(desc, ctx->class1_alg_type | 16897222d1a3SCatalin Vasile OP_ALG_AS_INITFINAL | OP_ALG_ENCRYPT); 16907222d1a3SCatalin Vasile 16917222d1a3SCatalin Vasile /* Perform operation */ 16927222d1a3SCatalin Vasile ablkcipher_append_src_dst(desc); 16937222d1a3SCatalin Vasile 16947222d1a3SCatalin Vasile ctx->sh_desc_givenc_dma = dma_map_single(jrdev, desc, 16957222d1a3SCatalin Vasile desc_bytes(desc), 16967222d1a3SCatalin Vasile DMA_TO_DEVICE); 16977222d1a3SCatalin Vasile if (dma_mapping_error(jrdev, ctx->sh_desc_givenc_dma)) { 16987222d1a3SCatalin Vasile dev_err(jrdev, "unable to map shared descriptor\n"); 16997222d1a3SCatalin Vasile return -ENOMEM; 17007222d1a3SCatalin Vasile } 17017222d1a3SCatalin Vasile #ifdef DEBUG 17027222d1a3SCatalin Vasile print_hex_dump(KERN_ERR, 17037222d1a3SCatalin Vasile "ablkcipher givenc shdesc@" __stringify(__LINE__) ": ", 17047222d1a3SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, desc, 17057222d1a3SCatalin Vasile desc_bytes(desc), 1); 17067222d1a3SCatalin Vasile #endif 1707acdca31dSYuan Kang 1708acdca31dSYuan Kang return ret; 1709acdca31dSYuan Kang } 1710acdca31dSYuan Kang 1711c6415a60SCatalin Vasile static int xts_ablkcipher_setkey(struct crypto_ablkcipher *ablkcipher, 1712c6415a60SCatalin Vasile const u8 *key, unsigned int keylen) 1713c6415a60SCatalin Vasile { 1714c6415a60SCatalin Vasile struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 1715c6415a60SCatalin Vasile struct device *jrdev = ctx->jrdev; 1716c6415a60SCatalin Vasile u32 *key_jump_cmd, *desc; 1717c6415a60SCatalin Vasile __be64 sector_size = cpu_to_be64(512); 1718c6415a60SCatalin Vasile 1719c6415a60SCatalin Vasile if (keylen != 2 * AES_MIN_KEY_SIZE && keylen != 2 * AES_MAX_KEY_SIZE) { 1720c6415a60SCatalin Vasile crypto_ablkcipher_set_flags(ablkcipher, 1721c6415a60SCatalin Vasile CRYPTO_TFM_RES_BAD_KEY_LEN); 1722c6415a60SCatalin Vasile dev_err(jrdev, "key size mismatch\n"); 1723c6415a60SCatalin Vasile return -EINVAL; 1724c6415a60SCatalin Vasile } 1725c6415a60SCatalin Vasile 1726c6415a60SCatalin Vasile memcpy(ctx->key, key, keylen); 1727c6415a60SCatalin Vasile ctx->key_dma = dma_map_single(jrdev, ctx->key, keylen, DMA_TO_DEVICE); 1728c6415a60SCatalin Vasile if (dma_mapping_error(jrdev, ctx->key_dma)) { 1729c6415a60SCatalin Vasile dev_err(jrdev, "unable to map key i/o memory\n"); 1730c6415a60SCatalin Vasile return -ENOMEM; 1731c6415a60SCatalin Vasile } 1732c6415a60SCatalin Vasile ctx->enckeylen = keylen; 1733c6415a60SCatalin Vasile 1734c6415a60SCatalin Vasile /* xts_ablkcipher_encrypt shared descriptor */ 1735c6415a60SCatalin Vasile desc = ctx->sh_desc_enc; 1736c6415a60SCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 1737c6415a60SCatalin Vasile /* Skip if already shared */ 1738c6415a60SCatalin Vasile key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 1739c6415a60SCatalin Vasile JUMP_COND_SHRD); 1740c6415a60SCatalin Vasile 1741c6415a60SCatalin Vasile /* Load class1 keys only */ 1742c6415a60SCatalin Vasile append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 1743c6415a60SCatalin Vasile ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 1744c6415a60SCatalin Vasile 1745c6415a60SCatalin Vasile /* Load sector size with index 40 bytes (0x28) */ 1746c6415a60SCatalin Vasile append_cmd(desc, CMD_LOAD | IMMEDIATE | LDST_SRCDST_BYTE_CONTEXT | 1747c6415a60SCatalin Vasile LDST_CLASS_1_CCB | (0x28 << LDST_OFFSET_SHIFT) | 8); 1748c6415a60SCatalin Vasile append_data(desc, (void *)§or_size, 8); 1749c6415a60SCatalin Vasile 1750c6415a60SCatalin Vasile set_jump_tgt_here(desc, key_jump_cmd); 1751c6415a60SCatalin Vasile 1752c6415a60SCatalin Vasile /* 1753c6415a60SCatalin Vasile * create sequence for loading the sector index 1754c6415a60SCatalin Vasile * Upper 8B of IV - will be used as sector index 1755c6415a60SCatalin Vasile * Lower 8B of IV - will be discarded 1756c6415a60SCatalin Vasile */ 1757c6415a60SCatalin Vasile append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT | 1758c6415a60SCatalin Vasile LDST_CLASS_1_CCB | (0x20 << LDST_OFFSET_SHIFT) | 8); 1759c6415a60SCatalin Vasile append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP); 1760c6415a60SCatalin Vasile 1761c6415a60SCatalin Vasile /* Load operation */ 1762c6415a60SCatalin Vasile append_operation(desc, ctx->class1_alg_type | OP_ALG_AS_INITFINAL | 1763c6415a60SCatalin Vasile OP_ALG_ENCRYPT); 1764c6415a60SCatalin Vasile 1765c6415a60SCatalin Vasile /* Perform operation */ 1766c6415a60SCatalin Vasile ablkcipher_append_src_dst(desc); 1767c6415a60SCatalin Vasile 1768c6415a60SCatalin Vasile ctx->sh_desc_enc_dma = dma_map_single(jrdev, desc, desc_bytes(desc), 1769c6415a60SCatalin Vasile DMA_TO_DEVICE); 1770c6415a60SCatalin Vasile if (dma_mapping_error(jrdev, ctx->sh_desc_enc_dma)) { 1771c6415a60SCatalin Vasile dev_err(jrdev, "unable to map shared descriptor\n"); 1772c6415a60SCatalin Vasile return -ENOMEM; 1773c6415a60SCatalin Vasile } 1774c6415a60SCatalin Vasile #ifdef DEBUG 1775c6415a60SCatalin Vasile print_hex_dump(KERN_ERR, 1776c6415a60SCatalin Vasile "xts ablkcipher enc shdesc@" __stringify(__LINE__) ": ", 1777c6415a60SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1); 1778c6415a60SCatalin Vasile #endif 1779c6415a60SCatalin Vasile 1780c6415a60SCatalin Vasile /* xts_ablkcipher_decrypt shared descriptor */ 1781c6415a60SCatalin Vasile desc = ctx->sh_desc_dec; 1782c6415a60SCatalin Vasile 1783c6415a60SCatalin Vasile init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX); 1784c6415a60SCatalin Vasile /* Skip if already shared */ 1785c6415a60SCatalin Vasile key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | 1786c6415a60SCatalin Vasile JUMP_COND_SHRD); 1787c6415a60SCatalin Vasile 1788c6415a60SCatalin Vasile /* Load class1 key only */ 1789c6415a60SCatalin Vasile append_key_as_imm(desc, (void *)ctx->key, ctx->enckeylen, 1790c6415a60SCatalin Vasile ctx->enckeylen, CLASS_1 | KEY_DEST_CLASS_REG); 1791c6415a60SCatalin Vasile 1792c6415a60SCatalin Vasile /* Load sector size with index 40 bytes (0x28) */ 1793c6415a60SCatalin Vasile append_cmd(desc, CMD_LOAD | IMMEDIATE | LDST_SRCDST_BYTE_CONTEXT | 1794c6415a60SCatalin Vasile LDST_CLASS_1_CCB | (0x28 << LDST_OFFSET_SHIFT) | 8); 1795c6415a60SCatalin Vasile append_data(desc, (void *)§or_size, 8); 1796c6415a60SCatalin Vasile 1797c6415a60SCatalin Vasile set_jump_tgt_here(desc, key_jump_cmd); 1798c6415a60SCatalin Vasile 1799c6415a60SCatalin Vasile /* 1800c6415a60SCatalin Vasile * create sequence for loading the sector index 1801c6415a60SCatalin Vasile * Upper 8B of IV - will be used as sector index 1802c6415a60SCatalin Vasile * Lower 8B of IV - will be discarded 1803c6415a60SCatalin Vasile */ 1804c6415a60SCatalin Vasile append_cmd(desc, CMD_SEQ_LOAD | LDST_SRCDST_BYTE_CONTEXT | 1805c6415a60SCatalin Vasile LDST_CLASS_1_CCB | (0x20 << LDST_OFFSET_SHIFT) | 8); 1806c6415a60SCatalin Vasile append_seq_fifo_load(desc, 8, FIFOLD_CLASS_SKIP); 1807c6415a60SCatalin Vasile 1808c6415a60SCatalin Vasile /* Load operation */ 1809c6415a60SCatalin Vasile append_dec_op1(desc, ctx->class1_alg_type); 1810c6415a60SCatalin Vasile 1811c6415a60SCatalin Vasile /* Perform operation */ 1812c6415a60SCatalin Vasile ablkcipher_append_src_dst(desc); 1813c6415a60SCatalin Vasile 1814c6415a60SCatalin Vasile ctx->sh_desc_dec_dma = dma_map_single(jrdev, desc, desc_bytes(desc), 1815c6415a60SCatalin Vasile DMA_TO_DEVICE); 1816c6415a60SCatalin Vasile if (dma_mapping_error(jrdev, ctx->sh_desc_dec_dma)) { 1817c6415a60SCatalin Vasile dma_unmap_single(jrdev, ctx->sh_desc_enc_dma, 1818c6415a60SCatalin Vasile desc_bytes(ctx->sh_desc_enc), DMA_TO_DEVICE); 1819c6415a60SCatalin Vasile dev_err(jrdev, "unable to map shared descriptor\n"); 1820c6415a60SCatalin Vasile return -ENOMEM; 1821c6415a60SCatalin Vasile } 1822c6415a60SCatalin Vasile #ifdef DEBUG 1823c6415a60SCatalin Vasile print_hex_dump(KERN_ERR, 1824c6415a60SCatalin Vasile "xts ablkcipher dec shdesc@" __stringify(__LINE__) ": ", 1825c6415a60SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc), 1); 1826c6415a60SCatalin Vasile #endif 1827c6415a60SCatalin Vasile 1828c6415a60SCatalin Vasile return 0; 1829c6415a60SCatalin Vasile } 1830c6415a60SCatalin Vasile 18318e8ec596SKim Phillips /* 18321acebad3SYuan Kang * aead_edesc - s/w-extended aead descriptor 18331acebad3SYuan Kang * @assoc_nents: number of segments in associated data (SPI+Seq) scatterlist 18348e8ec596SKim Phillips * @src_nents: number of segments in input scatterlist 18358e8ec596SKim Phillips * @dst_nents: number of segments in output scatterlist 18361acebad3SYuan Kang * @iv_dma: dma address of iv for checking continuity and link table 18378e8ec596SKim Phillips * @desc: h/w descriptor (variable length; must not exceed MAX_CAAM_DESCSIZE) 1838a299c837SYuan Kang * @sec4_sg_bytes: length of dma mapped sec4_sg space 1839a299c837SYuan Kang * @sec4_sg_dma: bus physical mapped address of h/w link table 18408e8ec596SKim Phillips * @hw_desc: the h/w job descriptor followed by any referenced link tables 18418e8ec596SKim Phillips */ 18420e479300SYuan Kang struct aead_edesc { 18438e8ec596SKim Phillips int assoc_nents; 18448e8ec596SKim Phillips int src_nents; 18458e8ec596SKim Phillips int dst_nents; 18461acebad3SYuan Kang dma_addr_t iv_dma; 1847a299c837SYuan Kang int sec4_sg_bytes; 1848a299c837SYuan Kang dma_addr_t sec4_sg_dma; 1849a299c837SYuan Kang struct sec4_sg_entry *sec4_sg; 1850f2147b88SHerbert Xu u32 hw_desc[]; 18518e8ec596SKim Phillips }; 18528e8ec596SKim Phillips 1853acdca31dSYuan Kang /* 1854acdca31dSYuan Kang * ablkcipher_edesc - s/w-extended ablkcipher descriptor 1855acdca31dSYuan Kang * @src_nents: number of segments in input scatterlist 1856acdca31dSYuan Kang * @dst_nents: number of segments in output scatterlist 1857acdca31dSYuan Kang * @iv_dma: dma address of iv for checking continuity and link table 1858acdca31dSYuan Kang * @desc: h/w descriptor (variable length; must not exceed MAX_CAAM_DESCSIZE) 1859a299c837SYuan Kang * @sec4_sg_bytes: length of dma mapped sec4_sg space 1860a299c837SYuan Kang * @sec4_sg_dma: bus physical mapped address of h/w link table 1861acdca31dSYuan Kang * @hw_desc: the h/w job descriptor followed by any referenced link tables 1862acdca31dSYuan Kang */ 1863acdca31dSYuan Kang struct ablkcipher_edesc { 1864acdca31dSYuan Kang int src_nents; 1865acdca31dSYuan Kang int dst_nents; 1866acdca31dSYuan Kang dma_addr_t iv_dma; 1867a299c837SYuan Kang int sec4_sg_bytes; 1868a299c837SYuan Kang dma_addr_t sec4_sg_dma; 1869a299c837SYuan Kang struct sec4_sg_entry *sec4_sg; 1870acdca31dSYuan Kang u32 hw_desc[0]; 1871acdca31dSYuan Kang }; 1872acdca31dSYuan Kang 18731acebad3SYuan Kang static void caam_unmap(struct device *dev, struct scatterlist *src, 1874643b39b0SYuan Kang struct scatterlist *dst, int src_nents, 187513fb8fd7SLABBE Corentin int dst_nents, 1876a299c837SYuan Kang dma_addr_t iv_dma, int ivsize, dma_addr_t sec4_sg_dma, 1877a299c837SYuan Kang int sec4_sg_bytes) 18781acebad3SYuan Kang { 1879643b39b0SYuan Kang if (dst != src) { 188013fb8fd7SLABBE Corentin dma_unmap_sg(dev, src, src_nents ? : 1, DMA_TO_DEVICE); 188113fb8fd7SLABBE Corentin dma_unmap_sg(dev, dst, dst_nents ? : 1, DMA_FROM_DEVICE); 18821acebad3SYuan Kang } else { 188313fb8fd7SLABBE Corentin dma_unmap_sg(dev, src, src_nents ? : 1, DMA_BIDIRECTIONAL); 18841acebad3SYuan Kang } 18851acebad3SYuan Kang 18861acebad3SYuan Kang if (iv_dma) 18871acebad3SYuan Kang dma_unmap_single(dev, iv_dma, ivsize, DMA_TO_DEVICE); 1888a299c837SYuan Kang if (sec4_sg_bytes) 1889a299c837SYuan Kang dma_unmap_single(dev, sec4_sg_dma, sec4_sg_bytes, 18901acebad3SYuan Kang DMA_TO_DEVICE); 18911acebad3SYuan Kang } 18921acebad3SYuan Kang 18930e479300SYuan Kang static void aead_unmap(struct device *dev, 18940e479300SYuan Kang struct aead_edesc *edesc, 18950e479300SYuan Kang struct aead_request *req) 18968e8ec596SKim Phillips { 1897f2147b88SHerbert Xu caam_unmap(dev, req->src, req->dst, 189813fb8fd7SLABBE Corentin edesc->src_nents, edesc->dst_nents, 0, 0, 1899f2147b88SHerbert Xu edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 1900f2147b88SHerbert Xu } 1901f2147b88SHerbert Xu 1902acdca31dSYuan Kang static void ablkcipher_unmap(struct device *dev, 1903acdca31dSYuan Kang struct ablkcipher_edesc *edesc, 1904acdca31dSYuan Kang struct ablkcipher_request *req) 1905acdca31dSYuan Kang { 1906acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 1907acdca31dSYuan Kang int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 1908acdca31dSYuan Kang 1909acdca31dSYuan Kang caam_unmap(dev, req->src, req->dst, 191013fb8fd7SLABBE Corentin edesc->src_nents, edesc->dst_nents, 191113fb8fd7SLABBE Corentin edesc->iv_dma, ivsize, 1912643b39b0SYuan Kang edesc->sec4_sg_dma, edesc->sec4_sg_bytes); 1913acdca31dSYuan Kang } 1914acdca31dSYuan Kang 19150e479300SYuan Kang static void aead_encrypt_done(struct device *jrdev, u32 *desc, u32 err, 19168e8ec596SKim Phillips void *context) 19178e8ec596SKim Phillips { 19180e479300SYuan Kang struct aead_request *req = context; 19190e479300SYuan Kang struct aead_edesc *edesc; 1920f2147b88SHerbert Xu 1921f2147b88SHerbert Xu #ifdef DEBUG 1922f2147b88SHerbert Xu dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 1923f2147b88SHerbert Xu #endif 1924f2147b88SHerbert Xu 1925f2147b88SHerbert Xu edesc = container_of(desc, struct aead_edesc, hw_desc[0]); 1926f2147b88SHerbert Xu 1927f2147b88SHerbert Xu if (err) 1928f2147b88SHerbert Xu caam_jr_strstatus(jrdev, err); 1929f2147b88SHerbert Xu 1930f2147b88SHerbert Xu aead_unmap(jrdev, edesc, req); 1931f2147b88SHerbert Xu 1932f2147b88SHerbert Xu kfree(edesc); 1933f2147b88SHerbert Xu 1934f2147b88SHerbert Xu aead_request_complete(req, err); 1935f2147b88SHerbert Xu } 1936f2147b88SHerbert Xu 19370e479300SYuan Kang static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err, 19388e8ec596SKim Phillips void *context) 19398e8ec596SKim Phillips { 19400e479300SYuan Kang struct aead_request *req = context; 19410e479300SYuan Kang struct aead_edesc *edesc; 1942f2147b88SHerbert Xu 1943f2147b88SHerbert Xu #ifdef DEBUG 1944f2147b88SHerbert Xu dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 1945f2147b88SHerbert Xu #endif 1946f2147b88SHerbert Xu 1947f2147b88SHerbert Xu edesc = container_of(desc, struct aead_edesc, hw_desc[0]); 1948f2147b88SHerbert Xu 1949f2147b88SHerbert Xu if (err) 1950f2147b88SHerbert Xu caam_jr_strstatus(jrdev, err); 1951f2147b88SHerbert Xu 1952f2147b88SHerbert Xu aead_unmap(jrdev, edesc, req); 1953f2147b88SHerbert Xu 1954f2147b88SHerbert Xu /* 1955f2147b88SHerbert Xu * verify hw auth check passed else return -EBADMSG 1956f2147b88SHerbert Xu */ 1957f2147b88SHerbert Xu if ((err & JRSTA_CCBERR_ERRID_MASK) == JRSTA_CCBERR_ERRID_ICVCHK) 1958f2147b88SHerbert Xu err = -EBADMSG; 1959f2147b88SHerbert Xu 1960f2147b88SHerbert Xu kfree(edesc); 1961f2147b88SHerbert Xu 1962f2147b88SHerbert Xu aead_request_complete(req, err); 1963f2147b88SHerbert Xu } 1964f2147b88SHerbert Xu 1965acdca31dSYuan Kang static void ablkcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err, 1966acdca31dSYuan Kang void *context) 1967acdca31dSYuan Kang { 1968acdca31dSYuan Kang struct ablkcipher_request *req = context; 1969acdca31dSYuan Kang struct ablkcipher_edesc *edesc; 1970acdca31dSYuan Kang #ifdef DEBUG 1971acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 1972acdca31dSYuan Kang int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 1973acdca31dSYuan Kang 1974acdca31dSYuan Kang dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 1975acdca31dSYuan Kang #endif 1976acdca31dSYuan Kang 1977acdca31dSYuan Kang edesc = (struct ablkcipher_edesc *)((char *)desc - 1978acdca31dSYuan Kang offsetof(struct ablkcipher_edesc, hw_desc)); 1979acdca31dSYuan Kang 1980fa9659cdSMarek Vasut if (err) 1981fa9659cdSMarek Vasut caam_jr_strstatus(jrdev, err); 1982acdca31dSYuan Kang 1983acdca31dSYuan Kang #ifdef DEBUG 1984514df281SAlex Porosanu print_hex_dump(KERN_ERR, "dstiv @"__stringify(__LINE__)": ", 1985acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, req->info, 1986acdca31dSYuan Kang edesc->src_nents > 1 ? 100 : ivsize, 1); 1987514df281SAlex Porosanu print_hex_dump(KERN_ERR, "dst @"__stringify(__LINE__)": ", 1988acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src), 1989acdca31dSYuan Kang edesc->dst_nents > 1 ? 100 : req->nbytes, 1); 1990acdca31dSYuan Kang #endif 1991acdca31dSYuan Kang 1992acdca31dSYuan Kang ablkcipher_unmap(jrdev, edesc, req); 1993acdca31dSYuan Kang kfree(edesc); 1994acdca31dSYuan Kang 1995acdca31dSYuan Kang ablkcipher_request_complete(req, err); 1996acdca31dSYuan Kang } 1997acdca31dSYuan Kang 1998acdca31dSYuan Kang static void ablkcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err, 1999acdca31dSYuan Kang void *context) 2000acdca31dSYuan Kang { 2001acdca31dSYuan Kang struct ablkcipher_request *req = context; 2002acdca31dSYuan Kang struct ablkcipher_edesc *edesc; 2003acdca31dSYuan Kang #ifdef DEBUG 2004acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 2005acdca31dSYuan Kang int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 2006acdca31dSYuan Kang 2007acdca31dSYuan Kang dev_err(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err); 2008acdca31dSYuan Kang #endif 2009acdca31dSYuan Kang 2010acdca31dSYuan Kang edesc = (struct ablkcipher_edesc *)((char *)desc - 2011acdca31dSYuan Kang offsetof(struct ablkcipher_edesc, hw_desc)); 2012fa9659cdSMarek Vasut if (err) 2013fa9659cdSMarek Vasut caam_jr_strstatus(jrdev, err); 2014acdca31dSYuan Kang 2015acdca31dSYuan Kang #ifdef DEBUG 2016514df281SAlex Porosanu print_hex_dump(KERN_ERR, "dstiv @"__stringify(__LINE__)": ", 2017acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, req->info, 2018acdca31dSYuan Kang ivsize, 1); 2019514df281SAlex Porosanu print_hex_dump(KERN_ERR, "dst @"__stringify(__LINE__)": ", 2020acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src), 2021acdca31dSYuan Kang edesc->dst_nents > 1 ? 100 : req->nbytes, 1); 2022acdca31dSYuan Kang #endif 2023acdca31dSYuan Kang 2024acdca31dSYuan Kang ablkcipher_unmap(jrdev, edesc, req); 2025acdca31dSYuan Kang kfree(edesc); 2026acdca31dSYuan Kang 2027acdca31dSYuan Kang ablkcipher_request_complete(req, err); 2028acdca31dSYuan Kang } 2029acdca31dSYuan Kang 20308e8ec596SKim Phillips /* 20311acebad3SYuan Kang * Fill in aead job descriptor 20328e8ec596SKim Phillips */ 2033f2147b88SHerbert Xu static void init_aead_job(struct aead_request *req, 2034f2147b88SHerbert Xu struct aead_edesc *edesc, 2035f2147b88SHerbert Xu bool all_contig, bool encrypt) 2036f2147b88SHerbert Xu { 2037f2147b88SHerbert Xu struct crypto_aead *aead = crypto_aead_reqtfm(req); 2038f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(aead); 2039f2147b88SHerbert Xu int authsize = ctx->authsize; 2040f2147b88SHerbert Xu u32 *desc = edesc->hw_desc; 2041f2147b88SHerbert Xu u32 out_options, in_options; 2042f2147b88SHerbert Xu dma_addr_t dst_dma, src_dma; 2043f2147b88SHerbert Xu int len, sec4_sg_index = 0; 2044f2147b88SHerbert Xu dma_addr_t ptr; 2045f2147b88SHerbert Xu u32 *sh_desc; 2046f2147b88SHerbert Xu 2047f2147b88SHerbert Xu sh_desc = encrypt ? ctx->sh_desc_enc : ctx->sh_desc_dec; 2048f2147b88SHerbert Xu ptr = encrypt ? ctx->sh_desc_enc_dma : ctx->sh_desc_dec_dma; 2049f2147b88SHerbert Xu 2050f2147b88SHerbert Xu len = desc_len(sh_desc); 2051f2147b88SHerbert Xu init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 2052f2147b88SHerbert Xu 2053f2147b88SHerbert Xu if (all_contig) { 2054f2147b88SHerbert Xu src_dma = sg_dma_address(req->src); 2055f2147b88SHerbert Xu in_options = 0; 2056f2147b88SHerbert Xu } else { 2057f2147b88SHerbert Xu src_dma = edesc->sec4_sg_dma; 2058f2147b88SHerbert Xu sec4_sg_index += edesc->src_nents; 2059f2147b88SHerbert Xu in_options = LDST_SGF; 2060f2147b88SHerbert Xu } 2061f2147b88SHerbert Xu 2062f2147b88SHerbert Xu append_seq_in_ptr(desc, src_dma, req->assoclen + req->cryptlen, 2063f2147b88SHerbert Xu in_options); 2064f2147b88SHerbert Xu 2065f2147b88SHerbert Xu dst_dma = src_dma; 2066f2147b88SHerbert Xu out_options = in_options; 2067f2147b88SHerbert Xu 2068f2147b88SHerbert Xu if (unlikely(req->src != req->dst)) { 2069f2147b88SHerbert Xu if (!edesc->dst_nents) { 2070f2147b88SHerbert Xu dst_dma = sg_dma_address(req->dst); 2071f2147b88SHerbert Xu } else { 2072f2147b88SHerbert Xu dst_dma = edesc->sec4_sg_dma + 2073f2147b88SHerbert Xu sec4_sg_index * 2074f2147b88SHerbert Xu sizeof(struct sec4_sg_entry); 2075f2147b88SHerbert Xu out_options = LDST_SGF; 2076f2147b88SHerbert Xu } 2077f2147b88SHerbert Xu } 2078f2147b88SHerbert Xu 2079f2147b88SHerbert Xu if (encrypt) 2080f2147b88SHerbert Xu append_seq_out_ptr(desc, dst_dma, 2081f2147b88SHerbert Xu req->assoclen + req->cryptlen + authsize, 2082f2147b88SHerbert Xu out_options); 2083f2147b88SHerbert Xu else 2084f2147b88SHerbert Xu append_seq_out_ptr(desc, dst_dma, 2085f2147b88SHerbert Xu req->assoclen + req->cryptlen - authsize, 2086f2147b88SHerbert Xu out_options); 2087f2147b88SHerbert Xu 2088f2147b88SHerbert Xu /* REG3 = assoclen */ 2089f2147b88SHerbert Xu append_math_add_imm_u32(desc, REG3, ZERO, IMM, req->assoclen); 2090f2147b88SHerbert Xu } 2091f2147b88SHerbert Xu 2092f2147b88SHerbert Xu static void init_gcm_job(struct aead_request *req, 2093f2147b88SHerbert Xu struct aead_edesc *edesc, 2094f2147b88SHerbert Xu bool all_contig, bool encrypt) 2095f2147b88SHerbert Xu { 2096f2147b88SHerbert Xu struct crypto_aead *aead = crypto_aead_reqtfm(req); 2097f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(aead); 2098f2147b88SHerbert Xu unsigned int ivsize = crypto_aead_ivsize(aead); 2099f2147b88SHerbert Xu u32 *desc = edesc->hw_desc; 2100f2147b88SHerbert Xu bool generic_gcm = (ivsize == 12); 2101f2147b88SHerbert Xu unsigned int last; 2102f2147b88SHerbert Xu 2103f2147b88SHerbert Xu init_aead_job(req, edesc, all_contig, encrypt); 2104f2147b88SHerbert Xu 2105f2147b88SHerbert Xu /* BUG This should not be specific to generic GCM. */ 2106f2147b88SHerbert Xu last = 0; 2107f2147b88SHerbert Xu if (encrypt && generic_gcm && !(req->assoclen + req->cryptlen)) 2108f2147b88SHerbert Xu last = FIFOLD_TYPE_LAST1; 2109f2147b88SHerbert Xu 2110f2147b88SHerbert Xu /* Read GCM IV */ 2111f2147b88SHerbert Xu append_cmd(desc, CMD_FIFO_LOAD | FIFOLD_CLASS_CLASS1 | IMMEDIATE | 2112f2147b88SHerbert Xu FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 | 12 | last); 2113f2147b88SHerbert Xu /* Append Salt */ 2114f2147b88SHerbert Xu if (!generic_gcm) 2115f2147b88SHerbert Xu append_data(desc, ctx->key + ctx->enckeylen, 4); 2116f2147b88SHerbert Xu /* Append IV */ 2117f2147b88SHerbert Xu append_data(desc, req->iv, ivsize); 2118f2147b88SHerbert Xu /* End of blank commands */ 2119f2147b88SHerbert Xu } 2120f2147b88SHerbert Xu 2121479bcc7cSHerbert Xu static void init_authenc_job(struct aead_request *req, 21221acebad3SYuan Kang struct aead_edesc *edesc, 2123479bcc7cSHerbert Xu bool all_contig, bool encrypt) 21241acebad3SYuan Kang { 21251acebad3SYuan Kang struct crypto_aead *aead = crypto_aead_reqtfm(req); 2126479bcc7cSHerbert Xu struct caam_aead_alg *alg = container_of(crypto_aead_alg(aead), 2127479bcc7cSHerbert Xu struct caam_aead_alg, aead); 2128479bcc7cSHerbert Xu unsigned int ivsize = crypto_aead_ivsize(aead); 21291acebad3SYuan Kang struct caam_ctx *ctx = crypto_aead_ctx(aead); 2130479bcc7cSHerbert Xu const bool ctr_mode = ((ctx->class1_alg_type & OP_ALG_AAI_MASK) == 2131479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128); 2132479bcc7cSHerbert Xu const bool is_rfc3686 = alg->caam.rfc3686; 21331acebad3SYuan Kang u32 *desc = edesc->hw_desc; 2134479bcc7cSHerbert Xu u32 ivoffset = 0; 21358e8ec596SKim Phillips 2136479bcc7cSHerbert Xu /* 2137479bcc7cSHerbert Xu * AES-CTR needs to load IV in CONTEXT1 reg 2138479bcc7cSHerbert Xu * at an offset of 128bits (16bytes) 2139479bcc7cSHerbert Xu * CONTEXT1[255:128] = IV 2140479bcc7cSHerbert Xu */ 2141479bcc7cSHerbert Xu if (ctr_mode) 2142479bcc7cSHerbert Xu ivoffset = 16; 21438e8ec596SKim Phillips 2144479bcc7cSHerbert Xu /* 2145479bcc7cSHerbert Xu * RFC3686 specific: 2146479bcc7cSHerbert Xu * CONTEXT1[255:128] = {NONCE, IV, COUNTER} 2147479bcc7cSHerbert Xu */ 2148479bcc7cSHerbert Xu if (is_rfc3686) 2149479bcc7cSHerbert Xu ivoffset = 16 + CTR_RFC3686_NONCE_SIZE; 2150bac68f2cSTudor Ambarus 2151479bcc7cSHerbert Xu init_aead_job(req, edesc, all_contig, encrypt); 21521acebad3SYuan Kang 2153479bcc7cSHerbert Xu if (ivsize && (is_rfc3686 || !(alg->caam.geniv && encrypt))) 2154479bcc7cSHerbert Xu append_load_as_imm(desc, req->iv, ivsize, 2155479bcc7cSHerbert Xu LDST_CLASS_1_CCB | 2156479bcc7cSHerbert Xu LDST_SRCDST_BYTE_CONTEXT | 2157479bcc7cSHerbert Xu (ivoffset << LDST_OFFSET_SHIFT)); 21588e8ec596SKim Phillips } 21598e8ec596SKim Phillips 21608e8ec596SKim Phillips /* 2161acdca31dSYuan Kang * Fill in ablkcipher job descriptor 2162acdca31dSYuan Kang */ 2163acdca31dSYuan Kang static void init_ablkcipher_job(u32 *sh_desc, dma_addr_t ptr, 2164acdca31dSYuan Kang struct ablkcipher_edesc *edesc, 2165acdca31dSYuan Kang struct ablkcipher_request *req, 2166acdca31dSYuan Kang bool iv_contig) 2167acdca31dSYuan Kang { 2168acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 2169acdca31dSYuan Kang int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 2170acdca31dSYuan Kang u32 *desc = edesc->hw_desc; 2171acdca31dSYuan Kang u32 out_options = 0, in_options; 2172acdca31dSYuan Kang dma_addr_t dst_dma, src_dma; 2173a299c837SYuan Kang int len, sec4_sg_index = 0; 2174acdca31dSYuan Kang 2175acdca31dSYuan Kang #ifdef DEBUG 2176514df281SAlex Porosanu print_hex_dump(KERN_ERR, "presciv@"__stringify(__LINE__)": ", 2177acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, req->info, 2178acdca31dSYuan Kang ivsize, 1); 2179514df281SAlex Porosanu print_hex_dump(KERN_ERR, "src @"__stringify(__LINE__)": ", 2180acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src), 2181acdca31dSYuan Kang edesc->src_nents ? 100 : req->nbytes, 1); 2182acdca31dSYuan Kang #endif 2183acdca31dSYuan Kang 2184acdca31dSYuan Kang len = desc_len(sh_desc); 2185acdca31dSYuan Kang init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 2186acdca31dSYuan Kang 2187acdca31dSYuan Kang if (iv_contig) { 2188acdca31dSYuan Kang src_dma = edesc->iv_dma; 2189acdca31dSYuan Kang in_options = 0; 2190acdca31dSYuan Kang } else { 2191a299c837SYuan Kang src_dma = edesc->sec4_sg_dma; 219235b82e55SCristian Stoica sec4_sg_index += edesc->src_nents + 1; 2193acdca31dSYuan Kang in_options = LDST_SGF; 2194acdca31dSYuan Kang } 2195acdca31dSYuan Kang append_seq_in_ptr(desc, src_dma, req->nbytes + ivsize, in_options); 2196acdca31dSYuan Kang 2197acdca31dSYuan Kang if (likely(req->src == req->dst)) { 2198acdca31dSYuan Kang if (!edesc->src_nents && iv_contig) { 2199acdca31dSYuan Kang dst_dma = sg_dma_address(req->src); 2200acdca31dSYuan Kang } else { 2201a299c837SYuan Kang dst_dma = edesc->sec4_sg_dma + 2202a299c837SYuan Kang sizeof(struct sec4_sg_entry); 2203acdca31dSYuan Kang out_options = LDST_SGF; 2204acdca31dSYuan Kang } 2205acdca31dSYuan Kang } else { 2206acdca31dSYuan Kang if (!edesc->dst_nents) { 2207acdca31dSYuan Kang dst_dma = sg_dma_address(req->dst); 2208acdca31dSYuan Kang } else { 2209a299c837SYuan Kang dst_dma = edesc->sec4_sg_dma + 2210a299c837SYuan Kang sec4_sg_index * sizeof(struct sec4_sg_entry); 2211acdca31dSYuan Kang out_options = LDST_SGF; 2212acdca31dSYuan Kang } 2213acdca31dSYuan Kang } 2214acdca31dSYuan Kang append_seq_out_ptr(desc, dst_dma, req->nbytes, out_options); 2215acdca31dSYuan Kang } 2216acdca31dSYuan Kang 2217acdca31dSYuan Kang /* 22187222d1a3SCatalin Vasile * Fill in ablkcipher givencrypt job descriptor 22197222d1a3SCatalin Vasile */ 22207222d1a3SCatalin Vasile static void init_ablkcipher_giv_job(u32 *sh_desc, dma_addr_t ptr, 22217222d1a3SCatalin Vasile struct ablkcipher_edesc *edesc, 22227222d1a3SCatalin Vasile struct ablkcipher_request *req, 22237222d1a3SCatalin Vasile bool iv_contig) 22247222d1a3SCatalin Vasile { 22257222d1a3SCatalin Vasile struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 22267222d1a3SCatalin Vasile int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 22277222d1a3SCatalin Vasile u32 *desc = edesc->hw_desc; 22287222d1a3SCatalin Vasile u32 out_options, in_options; 22297222d1a3SCatalin Vasile dma_addr_t dst_dma, src_dma; 22307222d1a3SCatalin Vasile int len, sec4_sg_index = 0; 22317222d1a3SCatalin Vasile 22327222d1a3SCatalin Vasile #ifdef DEBUG 22337222d1a3SCatalin Vasile print_hex_dump(KERN_ERR, "presciv@" __stringify(__LINE__) ": ", 22347222d1a3SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, req->info, 22357222d1a3SCatalin Vasile ivsize, 1); 22367222d1a3SCatalin Vasile print_hex_dump(KERN_ERR, "src @" __stringify(__LINE__) ": ", 22377222d1a3SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src), 22387222d1a3SCatalin Vasile edesc->src_nents ? 100 : req->nbytes, 1); 22397222d1a3SCatalin Vasile #endif 22407222d1a3SCatalin Vasile 22417222d1a3SCatalin Vasile len = desc_len(sh_desc); 22427222d1a3SCatalin Vasile init_job_desc_shared(desc, ptr, len, HDR_SHARE_DEFER | HDR_REVERSE); 22437222d1a3SCatalin Vasile 22447222d1a3SCatalin Vasile if (!edesc->src_nents) { 22457222d1a3SCatalin Vasile src_dma = sg_dma_address(req->src); 22467222d1a3SCatalin Vasile in_options = 0; 22477222d1a3SCatalin Vasile } else { 22487222d1a3SCatalin Vasile src_dma = edesc->sec4_sg_dma; 22497222d1a3SCatalin Vasile sec4_sg_index += edesc->src_nents; 22507222d1a3SCatalin Vasile in_options = LDST_SGF; 22517222d1a3SCatalin Vasile } 22527222d1a3SCatalin Vasile append_seq_in_ptr(desc, src_dma, req->nbytes, in_options); 22537222d1a3SCatalin Vasile 22547222d1a3SCatalin Vasile if (iv_contig) { 22557222d1a3SCatalin Vasile dst_dma = edesc->iv_dma; 22567222d1a3SCatalin Vasile out_options = 0; 22577222d1a3SCatalin Vasile } else { 22587222d1a3SCatalin Vasile dst_dma = edesc->sec4_sg_dma + 22597222d1a3SCatalin Vasile sec4_sg_index * sizeof(struct sec4_sg_entry); 22607222d1a3SCatalin Vasile out_options = LDST_SGF; 22617222d1a3SCatalin Vasile } 22627222d1a3SCatalin Vasile append_seq_out_ptr(desc, dst_dma, req->nbytes + ivsize, out_options); 22637222d1a3SCatalin Vasile } 22647222d1a3SCatalin Vasile 22657222d1a3SCatalin Vasile /* 22661acebad3SYuan Kang * allocate and map the aead extended descriptor 22678e8ec596SKim Phillips */ 2268f2147b88SHerbert Xu static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, 2269f2147b88SHerbert Xu int desc_bytes, bool *all_contig_ptr, 2270f2147b88SHerbert Xu bool encrypt) 2271f2147b88SHerbert Xu { 2272f2147b88SHerbert Xu struct crypto_aead *aead = crypto_aead_reqtfm(req); 2273f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(aead); 2274f2147b88SHerbert Xu struct device *jrdev = ctx->jrdev; 2275f2147b88SHerbert Xu gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG | 2276f2147b88SHerbert Xu CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC; 2277f2147b88SHerbert Xu int src_nents, dst_nents = 0; 2278f2147b88SHerbert Xu struct aead_edesc *edesc; 2279f2147b88SHerbert Xu int sgc; 2280f2147b88SHerbert Xu bool all_contig = true; 2281f2147b88SHerbert Xu int sec4_sg_index, sec4_sg_len = 0, sec4_sg_bytes; 2282f2147b88SHerbert Xu unsigned int authsize = ctx->authsize; 2283f2147b88SHerbert Xu 2284f2147b88SHerbert Xu if (unlikely(req->dst != req->src)) { 228513fb8fd7SLABBE Corentin src_nents = sg_count(req->src, req->assoclen + req->cryptlen); 2286f2147b88SHerbert Xu dst_nents = sg_count(req->dst, 2287f2147b88SHerbert Xu req->assoclen + req->cryptlen + 228813fb8fd7SLABBE Corentin (encrypt ? authsize : (-authsize))); 2289f2147b88SHerbert Xu } else { 2290f2147b88SHerbert Xu src_nents = sg_count(req->src, 2291f2147b88SHerbert Xu req->assoclen + req->cryptlen + 229213fb8fd7SLABBE Corentin (encrypt ? authsize : 0)); 2293f2147b88SHerbert Xu } 2294f2147b88SHerbert Xu 2295f2147b88SHerbert Xu /* Check if data are contiguous. */ 2296f2147b88SHerbert Xu all_contig = !src_nents; 2297f2147b88SHerbert Xu if (!all_contig) { 2298f2147b88SHerbert Xu src_nents = src_nents ? : 1; 2299f2147b88SHerbert Xu sec4_sg_len = src_nents; 2300f2147b88SHerbert Xu } 2301f2147b88SHerbert Xu 2302f2147b88SHerbert Xu sec4_sg_len += dst_nents; 2303f2147b88SHerbert Xu 2304f2147b88SHerbert Xu sec4_sg_bytes = sec4_sg_len * sizeof(struct sec4_sg_entry); 2305f2147b88SHerbert Xu 2306f2147b88SHerbert Xu /* allocate space for base edesc and hw desc commands, link tables */ 2307dde20ae9SVictoria Milhoan edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, 2308dde20ae9SVictoria Milhoan GFP_DMA | flags); 2309f2147b88SHerbert Xu if (!edesc) { 2310f2147b88SHerbert Xu dev_err(jrdev, "could not allocate extended descriptor\n"); 2311f2147b88SHerbert Xu return ERR_PTR(-ENOMEM); 2312f2147b88SHerbert Xu } 2313f2147b88SHerbert Xu 2314f2147b88SHerbert Xu if (likely(req->src == req->dst)) { 231513fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 231613fb8fd7SLABBE Corentin DMA_BIDIRECTIONAL); 2317f2147b88SHerbert Xu if (unlikely(!sgc)) { 2318f2147b88SHerbert Xu dev_err(jrdev, "unable to map source\n"); 2319f2147b88SHerbert Xu kfree(edesc); 2320f2147b88SHerbert Xu return ERR_PTR(-ENOMEM); 2321f2147b88SHerbert Xu } 2322f2147b88SHerbert Xu } else { 232313fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 232413fb8fd7SLABBE Corentin DMA_TO_DEVICE); 2325f2147b88SHerbert Xu if (unlikely(!sgc)) { 2326f2147b88SHerbert Xu dev_err(jrdev, "unable to map source\n"); 2327f2147b88SHerbert Xu kfree(edesc); 2328f2147b88SHerbert Xu return ERR_PTR(-ENOMEM); 2329f2147b88SHerbert Xu } 2330f2147b88SHerbert Xu 233113fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1, 233213fb8fd7SLABBE Corentin DMA_FROM_DEVICE); 2333f2147b88SHerbert Xu if (unlikely(!sgc)) { 2334f2147b88SHerbert Xu dev_err(jrdev, "unable to map destination\n"); 233513fb8fd7SLABBE Corentin dma_unmap_sg(jrdev, req->src, src_nents ? : 1, 233613fb8fd7SLABBE Corentin DMA_TO_DEVICE); 2337f2147b88SHerbert Xu kfree(edesc); 2338f2147b88SHerbert Xu return ERR_PTR(-ENOMEM); 2339f2147b88SHerbert Xu } 2340f2147b88SHerbert Xu } 2341f2147b88SHerbert Xu 2342f2147b88SHerbert Xu edesc->src_nents = src_nents; 2343f2147b88SHerbert Xu edesc->dst_nents = dst_nents; 2344f2147b88SHerbert Xu edesc->sec4_sg = (void *)edesc + sizeof(struct aead_edesc) + 2345f2147b88SHerbert Xu desc_bytes; 2346f2147b88SHerbert Xu *all_contig_ptr = all_contig; 2347f2147b88SHerbert Xu 2348f2147b88SHerbert Xu sec4_sg_index = 0; 2349f2147b88SHerbert Xu if (!all_contig) { 23507793bda8SHerbert Xu sg_to_sec4_sg_last(req->src, src_nents, 2351f2147b88SHerbert Xu edesc->sec4_sg + sec4_sg_index, 0); 2352f2147b88SHerbert Xu sec4_sg_index += src_nents; 2353f2147b88SHerbert Xu } 2354f2147b88SHerbert Xu if (dst_nents) { 2355f2147b88SHerbert Xu sg_to_sec4_sg_last(req->dst, dst_nents, 2356f2147b88SHerbert Xu edesc->sec4_sg + sec4_sg_index, 0); 2357f2147b88SHerbert Xu } 2358f2147b88SHerbert Xu 2359f2147b88SHerbert Xu if (!sec4_sg_bytes) 2360f2147b88SHerbert Xu return edesc; 2361f2147b88SHerbert Xu 2362f2147b88SHerbert Xu edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 2363f2147b88SHerbert Xu sec4_sg_bytes, DMA_TO_DEVICE); 2364f2147b88SHerbert Xu if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 2365f2147b88SHerbert Xu dev_err(jrdev, "unable to map S/G table\n"); 2366f2147b88SHerbert Xu aead_unmap(jrdev, edesc, req); 2367f2147b88SHerbert Xu kfree(edesc); 2368f2147b88SHerbert Xu return ERR_PTR(-ENOMEM); 2369f2147b88SHerbert Xu } 2370f2147b88SHerbert Xu 2371f2147b88SHerbert Xu edesc->sec4_sg_bytes = sec4_sg_bytes; 2372f2147b88SHerbert Xu 2373f2147b88SHerbert Xu return edesc; 2374f2147b88SHerbert Xu } 2375f2147b88SHerbert Xu 2376f2147b88SHerbert Xu static int gcm_encrypt(struct aead_request *req) 23778e8ec596SKim Phillips { 23780e479300SYuan Kang struct aead_edesc *edesc; 23798e8ec596SKim Phillips struct crypto_aead *aead = crypto_aead_reqtfm(req); 23808e8ec596SKim Phillips struct caam_ctx *ctx = crypto_aead_ctx(aead); 23818e8ec596SKim Phillips struct device *jrdev = ctx->jrdev; 23821acebad3SYuan Kang bool all_contig; 23838e8ec596SKim Phillips u32 *desc; 23841acebad3SYuan Kang int ret = 0; 23851acebad3SYuan Kang 23868e8ec596SKim Phillips /* allocate extended descriptor */ 2387f2147b88SHerbert Xu edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, true); 23888e8ec596SKim Phillips if (IS_ERR(edesc)) 23898e8ec596SKim Phillips return PTR_ERR(edesc); 23908e8ec596SKim Phillips 23911acebad3SYuan Kang /* Create and submit job descriptor */ 2392f2147b88SHerbert Xu init_gcm_job(req, edesc, all_contig, true); 23931acebad3SYuan Kang #ifdef DEBUG 2394514df281SAlex Porosanu print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ", 23951acebad3SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 23961acebad3SYuan Kang desc_bytes(edesc->hw_desc), 1); 23971acebad3SYuan Kang #endif 23981acebad3SYuan Kang 23998e8ec596SKim Phillips desc = edesc->hw_desc; 24001acebad3SYuan Kang ret = caam_jr_enqueue(jrdev, desc, aead_encrypt_done, req); 24011acebad3SYuan Kang if (!ret) { 24021acebad3SYuan Kang ret = -EINPROGRESS; 24031acebad3SYuan Kang } else { 24041acebad3SYuan Kang aead_unmap(jrdev, edesc, req); 24051acebad3SYuan Kang kfree(edesc); 24061acebad3SYuan Kang } 24078e8ec596SKim Phillips 24081acebad3SYuan Kang return ret; 24098e8ec596SKim Phillips } 24108e8ec596SKim Phillips 241146218750SHerbert Xu static int ipsec_gcm_encrypt(struct aead_request *req) 241246218750SHerbert Xu { 241346218750SHerbert Xu if (req->assoclen < 8) 241446218750SHerbert Xu return -EINVAL; 241546218750SHerbert Xu 241646218750SHerbert Xu return gcm_encrypt(req); 241746218750SHerbert Xu } 241846218750SHerbert Xu 2419479bcc7cSHerbert Xu static int aead_encrypt(struct aead_request *req) 24208e8ec596SKim Phillips { 24211acebad3SYuan Kang struct aead_edesc *edesc; 24220e479300SYuan Kang struct crypto_aead *aead = crypto_aead_reqtfm(req); 24230e479300SYuan Kang struct caam_ctx *ctx = crypto_aead_ctx(aead); 24240e479300SYuan Kang struct device *jrdev = ctx->jrdev; 24251acebad3SYuan Kang bool all_contig; 24260e479300SYuan Kang u32 *desc; 24271acebad3SYuan Kang int ret = 0; 24280e479300SYuan Kang 24290e479300SYuan Kang /* allocate extended descriptor */ 2430479bcc7cSHerbert Xu edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN, 2431479bcc7cSHerbert Xu &all_contig, true); 24320e479300SYuan Kang if (IS_ERR(edesc)) 24330e479300SYuan Kang return PTR_ERR(edesc); 24340e479300SYuan Kang 2435f2147b88SHerbert Xu /* Create and submit job descriptor */ 2436479bcc7cSHerbert Xu init_authenc_job(req, edesc, all_contig, true); 24371acebad3SYuan Kang #ifdef DEBUG 2438f2147b88SHerbert Xu print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ", 2439f2147b88SHerbert Xu DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 2440f2147b88SHerbert Xu desc_bytes(edesc->hw_desc), 1); 24411acebad3SYuan Kang #endif 24421acebad3SYuan Kang 2443f2147b88SHerbert Xu desc = edesc->hw_desc; 2444479bcc7cSHerbert Xu ret = caam_jr_enqueue(jrdev, desc, aead_encrypt_done, req); 2445f2147b88SHerbert Xu if (!ret) { 2446f2147b88SHerbert Xu ret = -EINPROGRESS; 2447f2147b88SHerbert Xu } else { 2448479bcc7cSHerbert Xu aead_unmap(jrdev, edesc, req); 2449f2147b88SHerbert Xu kfree(edesc); 2450f2147b88SHerbert Xu } 2451f2147b88SHerbert Xu 2452f2147b88SHerbert Xu return ret; 2453f2147b88SHerbert Xu } 2454f2147b88SHerbert Xu 2455f2147b88SHerbert Xu static int gcm_decrypt(struct aead_request *req) 2456f2147b88SHerbert Xu { 2457f2147b88SHerbert Xu struct aead_edesc *edesc; 2458f2147b88SHerbert Xu struct crypto_aead *aead = crypto_aead_reqtfm(req); 2459f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(aead); 2460f2147b88SHerbert Xu struct device *jrdev = ctx->jrdev; 2461f2147b88SHerbert Xu bool all_contig; 2462f2147b88SHerbert Xu u32 *desc; 2463f2147b88SHerbert Xu int ret = 0; 2464f2147b88SHerbert Xu 2465f2147b88SHerbert Xu /* allocate extended descriptor */ 2466f2147b88SHerbert Xu edesc = aead_edesc_alloc(req, GCM_DESC_JOB_IO_LEN, &all_contig, false); 2467f2147b88SHerbert Xu if (IS_ERR(edesc)) 2468f2147b88SHerbert Xu return PTR_ERR(edesc); 2469f2147b88SHerbert Xu 24701acebad3SYuan Kang /* Create and submit job descriptor*/ 2471f2147b88SHerbert Xu init_gcm_job(req, edesc, all_contig, false); 24721acebad3SYuan Kang #ifdef DEBUG 2473514df281SAlex Porosanu print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ", 24741acebad3SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 24751acebad3SYuan Kang desc_bytes(edesc->hw_desc), 1); 24761acebad3SYuan Kang #endif 24771acebad3SYuan Kang 24780e479300SYuan Kang desc = edesc->hw_desc; 24791acebad3SYuan Kang ret = caam_jr_enqueue(jrdev, desc, aead_decrypt_done, req); 24801acebad3SYuan Kang if (!ret) { 24811acebad3SYuan Kang ret = -EINPROGRESS; 24821acebad3SYuan Kang } else { 24831acebad3SYuan Kang aead_unmap(jrdev, edesc, req); 24841acebad3SYuan Kang kfree(edesc); 24851acebad3SYuan Kang } 24860e479300SYuan Kang 24871acebad3SYuan Kang return ret; 24881acebad3SYuan Kang } 24890e479300SYuan Kang 249046218750SHerbert Xu static int ipsec_gcm_decrypt(struct aead_request *req) 249146218750SHerbert Xu { 249246218750SHerbert Xu if (req->assoclen < 8) 249346218750SHerbert Xu return -EINVAL; 249446218750SHerbert Xu 249546218750SHerbert Xu return gcm_decrypt(req); 249646218750SHerbert Xu } 249746218750SHerbert Xu 2498479bcc7cSHerbert Xu static int aead_decrypt(struct aead_request *req) 2499f2147b88SHerbert Xu { 2500f2147b88SHerbert Xu struct aead_edesc *edesc; 2501f2147b88SHerbert Xu struct crypto_aead *aead = crypto_aead_reqtfm(req); 2502f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(aead); 2503f2147b88SHerbert Xu struct device *jrdev = ctx->jrdev; 2504f2147b88SHerbert Xu bool all_contig; 2505f2147b88SHerbert Xu u32 *desc; 2506f2147b88SHerbert Xu int ret = 0; 2507f2147b88SHerbert Xu 2508f2147b88SHerbert Xu /* allocate extended descriptor */ 2509479bcc7cSHerbert Xu edesc = aead_edesc_alloc(req, AUTHENC_DESC_JOB_IO_LEN, 2510479bcc7cSHerbert Xu &all_contig, false); 2511f2147b88SHerbert Xu if (IS_ERR(edesc)) 2512f2147b88SHerbert Xu return PTR_ERR(edesc); 2513f2147b88SHerbert Xu 2514f2147b88SHerbert Xu #ifdef DEBUG 2515f2147b88SHerbert Xu print_hex_dump(KERN_ERR, "dec src@"__stringify(__LINE__)": ", 2516f2147b88SHerbert Xu DUMP_PREFIX_ADDRESS, 16, 4, sg_virt(req->src), 2517479bcc7cSHerbert Xu req->assoclen + req->cryptlen, 1); 2518f2147b88SHerbert Xu #endif 2519f2147b88SHerbert Xu 2520f2147b88SHerbert Xu /* Create and submit job descriptor*/ 2521479bcc7cSHerbert Xu init_authenc_job(req, edesc, all_contig, false); 2522f2147b88SHerbert Xu #ifdef DEBUG 2523f2147b88SHerbert Xu print_hex_dump(KERN_ERR, "aead jobdesc@"__stringify(__LINE__)": ", 2524f2147b88SHerbert Xu DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 2525f2147b88SHerbert Xu desc_bytes(edesc->hw_desc), 1); 2526f2147b88SHerbert Xu #endif 2527f2147b88SHerbert Xu 2528f2147b88SHerbert Xu desc = edesc->hw_desc; 2529479bcc7cSHerbert Xu ret = caam_jr_enqueue(jrdev, desc, aead_decrypt_done, req); 2530f2147b88SHerbert Xu if (!ret) { 2531f2147b88SHerbert Xu ret = -EINPROGRESS; 2532f2147b88SHerbert Xu } else { 2533479bcc7cSHerbert Xu aead_unmap(jrdev, edesc, req); 2534f2147b88SHerbert Xu kfree(edesc); 2535f2147b88SHerbert Xu } 2536f2147b88SHerbert Xu 2537f2147b88SHerbert Xu return ret; 2538f2147b88SHerbert Xu } 2539f2147b88SHerbert Xu 2540479bcc7cSHerbert Xu static int aead_givdecrypt(struct aead_request *req) 25411acebad3SYuan Kang { 25421acebad3SYuan Kang struct crypto_aead *aead = crypto_aead_reqtfm(req); 2543479bcc7cSHerbert Xu unsigned int ivsize = crypto_aead_ivsize(aead); 25440e479300SYuan Kang 2545479bcc7cSHerbert Xu if (req->cryptlen < ivsize) 2546479bcc7cSHerbert Xu return -EINVAL; 25470e479300SYuan Kang 2548479bcc7cSHerbert Xu req->cryptlen -= ivsize; 2549479bcc7cSHerbert Xu req->assoclen += ivsize; 25501acebad3SYuan Kang 2551479bcc7cSHerbert Xu return aead_decrypt(req); 2552ae4a825fSHoria Geanta } 2553ae4a825fSHoria Geanta 2554acdca31dSYuan Kang /* 2555acdca31dSYuan Kang * allocate and map the ablkcipher extended descriptor for ablkcipher 2556acdca31dSYuan Kang */ 2557acdca31dSYuan Kang static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request 2558acdca31dSYuan Kang *req, int desc_bytes, 2559acdca31dSYuan Kang bool *iv_contig_out) 2560acdca31dSYuan Kang { 2561acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 2562acdca31dSYuan Kang struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 2563acdca31dSYuan Kang struct device *jrdev = ctx->jrdev; 2564acdca31dSYuan Kang gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG | 2565acdca31dSYuan Kang CRYPTO_TFM_REQ_MAY_SLEEP)) ? 2566acdca31dSYuan Kang GFP_KERNEL : GFP_ATOMIC; 2567a299c837SYuan Kang int src_nents, dst_nents = 0, sec4_sg_bytes; 2568acdca31dSYuan Kang struct ablkcipher_edesc *edesc; 2569acdca31dSYuan Kang dma_addr_t iv_dma = 0; 2570acdca31dSYuan Kang bool iv_contig = false; 2571acdca31dSYuan Kang int sgc; 2572acdca31dSYuan Kang int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 2573a299c837SYuan Kang int sec4_sg_index; 2574acdca31dSYuan Kang 257513fb8fd7SLABBE Corentin src_nents = sg_count(req->src, req->nbytes); 2576acdca31dSYuan Kang 2577643b39b0SYuan Kang if (req->dst != req->src) 257813fb8fd7SLABBE Corentin dst_nents = sg_count(req->dst, req->nbytes); 2579acdca31dSYuan Kang 2580acdca31dSYuan Kang if (likely(req->src == req->dst)) { 258113fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 258213fb8fd7SLABBE Corentin DMA_BIDIRECTIONAL); 2583acdca31dSYuan Kang } else { 258413fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 258513fb8fd7SLABBE Corentin DMA_TO_DEVICE); 258613fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1, 258713fb8fd7SLABBE Corentin DMA_FROM_DEVICE); 2588acdca31dSYuan Kang } 2589acdca31dSYuan Kang 2590ce572085SHoria Geanta iv_dma = dma_map_single(jrdev, req->info, ivsize, DMA_TO_DEVICE); 2591ce572085SHoria Geanta if (dma_mapping_error(jrdev, iv_dma)) { 2592ce572085SHoria Geanta dev_err(jrdev, "unable to map IV\n"); 2593ce572085SHoria Geanta return ERR_PTR(-ENOMEM); 2594ce572085SHoria Geanta } 2595ce572085SHoria Geanta 2596acdca31dSYuan Kang /* 2597acdca31dSYuan Kang * Check if iv can be contiguous with source and destination. 2598acdca31dSYuan Kang * If so, include it. If not, create scatterlist. 2599acdca31dSYuan Kang */ 2600acdca31dSYuan Kang if (!src_nents && iv_dma + ivsize == sg_dma_address(req->src)) 2601acdca31dSYuan Kang iv_contig = true; 2602acdca31dSYuan Kang else 2603acdca31dSYuan Kang src_nents = src_nents ? : 1; 2604a299c837SYuan Kang sec4_sg_bytes = ((iv_contig ? 0 : 1) + src_nents + dst_nents) * 2605a299c837SYuan Kang sizeof(struct sec4_sg_entry); 2606acdca31dSYuan Kang 2607acdca31dSYuan Kang /* allocate space for base edesc and hw desc commands, link tables */ 2608dde20ae9SVictoria Milhoan edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, 2609dde20ae9SVictoria Milhoan GFP_DMA | flags); 2610acdca31dSYuan Kang if (!edesc) { 2611acdca31dSYuan Kang dev_err(jrdev, "could not allocate extended descriptor\n"); 2612acdca31dSYuan Kang return ERR_PTR(-ENOMEM); 2613acdca31dSYuan Kang } 2614acdca31dSYuan Kang 2615acdca31dSYuan Kang edesc->src_nents = src_nents; 2616acdca31dSYuan Kang edesc->dst_nents = dst_nents; 2617a299c837SYuan Kang edesc->sec4_sg_bytes = sec4_sg_bytes; 2618a299c837SYuan Kang edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) + 2619acdca31dSYuan Kang desc_bytes; 2620acdca31dSYuan Kang 2621a299c837SYuan Kang sec4_sg_index = 0; 2622acdca31dSYuan Kang if (!iv_contig) { 2623a299c837SYuan Kang dma_to_sec4_sg_one(edesc->sec4_sg, iv_dma, ivsize, 0); 2624a299c837SYuan Kang sg_to_sec4_sg_last(req->src, src_nents, 2625a299c837SYuan Kang edesc->sec4_sg + 1, 0); 2626a299c837SYuan Kang sec4_sg_index += 1 + src_nents; 2627acdca31dSYuan Kang } 2628acdca31dSYuan Kang 2629643b39b0SYuan Kang if (dst_nents) { 2630a299c837SYuan Kang sg_to_sec4_sg_last(req->dst, dst_nents, 2631a299c837SYuan Kang edesc->sec4_sg + sec4_sg_index, 0); 2632acdca31dSYuan Kang } 2633acdca31dSYuan Kang 2634a299c837SYuan Kang edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 2635a299c837SYuan Kang sec4_sg_bytes, DMA_TO_DEVICE); 2636ce572085SHoria Geanta if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 2637ce572085SHoria Geanta dev_err(jrdev, "unable to map S/G table\n"); 2638ce572085SHoria Geanta return ERR_PTR(-ENOMEM); 2639ce572085SHoria Geanta } 2640ce572085SHoria Geanta 2641acdca31dSYuan Kang edesc->iv_dma = iv_dma; 2642acdca31dSYuan Kang 2643acdca31dSYuan Kang #ifdef DEBUG 2644514df281SAlex Porosanu print_hex_dump(KERN_ERR, "ablkcipher sec4_sg@"__stringify(__LINE__)": ", 2645a299c837SYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg, 2646a299c837SYuan Kang sec4_sg_bytes, 1); 2647acdca31dSYuan Kang #endif 2648acdca31dSYuan Kang 2649acdca31dSYuan Kang *iv_contig_out = iv_contig; 2650acdca31dSYuan Kang return edesc; 2651acdca31dSYuan Kang } 2652acdca31dSYuan Kang 2653acdca31dSYuan Kang static int ablkcipher_encrypt(struct ablkcipher_request *req) 2654acdca31dSYuan Kang { 2655acdca31dSYuan Kang struct ablkcipher_edesc *edesc; 2656acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 2657acdca31dSYuan Kang struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 2658acdca31dSYuan Kang struct device *jrdev = ctx->jrdev; 2659acdca31dSYuan Kang bool iv_contig; 2660acdca31dSYuan Kang u32 *desc; 2661acdca31dSYuan Kang int ret = 0; 2662acdca31dSYuan Kang 2663acdca31dSYuan Kang /* allocate extended descriptor */ 2664acdca31dSYuan Kang edesc = ablkcipher_edesc_alloc(req, DESC_JOB_IO_LEN * 2665acdca31dSYuan Kang CAAM_CMD_SZ, &iv_contig); 2666acdca31dSYuan Kang if (IS_ERR(edesc)) 2667acdca31dSYuan Kang return PTR_ERR(edesc); 2668acdca31dSYuan Kang 2669acdca31dSYuan Kang /* Create and submit job descriptor*/ 2670acdca31dSYuan Kang init_ablkcipher_job(ctx->sh_desc_enc, 2671acdca31dSYuan Kang ctx->sh_desc_enc_dma, edesc, req, iv_contig); 2672acdca31dSYuan Kang #ifdef DEBUG 2673514df281SAlex Porosanu print_hex_dump(KERN_ERR, "ablkcipher jobdesc@"__stringify(__LINE__)": ", 2674acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 2675acdca31dSYuan Kang desc_bytes(edesc->hw_desc), 1); 2676acdca31dSYuan Kang #endif 2677acdca31dSYuan Kang desc = edesc->hw_desc; 2678acdca31dSYuan Kang ret = caam_jr_enqueue(jrdev, desc, ablkcipher_encrypt_done, req); 2679acdca31dSYuan Kang 2680acdca31dSYuan Kang if (!ret) { 2681acdca31dSYuan Kang ret = -EINPROGRESS; 2682acdca31dSYuan Kang } else { 2683acdca31dSYuan Kang ablkcipher_unmap(jrdev, edesc, req); 2684acdca31dSYuan Kang kfree(edesc); 2685acdca31dSYuan Kang } 2686acdca31dSYuan Kang 2687acdca31dSYuan Kang return ret; 2688acdca31dSYuan Kang } 2689acdca31dSYuan Kang 2690acdca31dSYuan Kang static int ablkcipher_decrypt(struct ablkcipher_request *req) 2691acdca31dSYuan Kang { 2692acdca31dSYuan Kang struct ablkcipher_edesc *edesc; 2693acdca31dSYuan Kang struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 2694acdca31dSYuan Kang struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 2695acdca31dSYuan Kang struct device *jrdev = ctx->jrdev; 2696acdca31dSYuan Kang bool iv_contig; 2697acdca31dSYuan Kang u32 *desc; 2698acdca31dSYuan Kang int ret = 0; 2699acdca31dSYuan Kang 2700acdca31dSYuan Kang /* allocate extended descriptor */ 2701acdca31dSYuan Kang edesc = ablkcipher_edesc_alloc(req, DESC_JOB_IO_LEN * 2702acdca31dSYuan Kang CAAM_CMD_SZ, &iv_contig); 2703acdca31dSYuan Kang if (IS_ERR(edesc)) 2704acdca31dSYuan Kang return PTR_ERR(edesc); 2705acdca31dSYuan Kang 2706acdca31dSYuan Kang /* Create and submit job descriptor*/ 2707acdca31dSYuan Kang init_ablkcipher_job(ctx->sh_desc_dec, 2708acdca31dSYuan Kang ctx->sh_desc_dec_dma, edesc, req, iv_contig); 2709acdca31dSYuan Kang desc = edesc->hw_desc; 2710acdca31dSYuan Kang #ifdef DEBUG 2711514df281SAlex Porosanu print_hex_dump(KERN_ERR, "ablkcipher jobdesc@"__stringify(__LINE__)": ", 2712acdca31dSYuan Kang DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 2713acdca31dSYuan Kang desc_bytes(edesc->hw_desc), 1); 2714acdca31dSYuan Kang #endif 2715acdca31dSYuan Kang 2716acdca31dSYuan Kang ret = caam_jr_enqueue(jrdev, desc, ablkcipher_decrypt_done, req); 2717acdca31dSYuan Kang if (!ret) { 2718acdca31dSYuan Kang ret = -EINPROGRESS; 2719acdca31dSYuan Kang } else { 2720acdca31dSYuan Kang ablkcipher_unmap(jrdev, edesc, req); 2721acdca31dSYuan Kang kfree(edesc); 2722acdca31dSYuan Kang } 2723acdca31dSYuan Kang 2724acdca31dSYuan Kang return ret; 2725acdca31dSYuan Kang } 2726acdca31dSYuan Kang 27277222d1a3SCatalin Vasile /* 27287222d1a3SCatalin Vasile * allocate and map the ablkcipher extended descriptor 27297222d1a3SCatalin Vasile * for ablkcipher givencrypt 27307222d1a3SCatalin Vasile */ 27317222d1a3SCatalin Vasile static struct ablkcipher_edesc *ablkcipher_giv_edesc_alloc( 27327222d1a3SCatalin Vasile struct skcipher_givcrypt_request *greq, 27337222d1a3SCatalin Vasile int desc_bytes, 27347222d1a3SCatalin Vasile bool *iv_contig_out) 27357222d1a3SCatalin Vasile { 27367222d1a3SCatalin Vasile struct ablkcipher_request *req = &greq->creq; 27377222d1a3SCatalin Vasile struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 27387222d1a3SCatalin Vasile struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 27397222d1a3SCatalin Vasile struct device *jrdev = ctx->jrdev; 27407222d1a3SCatalin Vasile gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG | 27417222d1a3SCatalin Vasile CRYPTO_TFM_REQ_MAY_SLEEP)) ? 27427222d1a3SCatalin Vasile GFP_KERNEL : GFP_ATOMIC; 27437222d1a3SCatalin Vasile int src_nents, dst_nents = 0, sec4_sg_bytes; 27447222d1a3SCatalin Vasile struct ablkcipher_edesc *edesc; 27457222d1a3SCatalin Vasile dma_addr_t iv_dma = 0; 27467222d1a3SCatalin Vasile bool iv_contig = false; 27477222d1a3SCatalin Vasile int sgc; 27487222d1a3SCatalin Vasile int ivsize = crypto_ablkcipher_ivsize(ablkcipher); 27497222d1a3SCatalin Vasile int sec4_sg_index; 27507222d1a3SCatalin Vasile 275113fb8fd7SLABBE Corentin src_nents = sg_count(req->src, req->nbytes); 27527222d1a3SCatalin Vasile 27537222d1a3SCatalin Vasile if (unlikely(req->dst != req->src)) 275413fb8fd7SLABBE Corentin dst_nents = sg_count(req->dst, req->nbytes); 27557222d1a3SCatalin Vasile 27567222d1a3SCatalin Vasile if (likely(req->src == req->dst)) { 275713fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 275813fb8fd7SLABBE Corentin DMA_BIDIRECTIONAL); 27597222d1a3SCatalin Vasile } else { 276013fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->src, src_nents ? : 1, 276113fb8fd7SLABBE Corentin DMA_TO_DEVICE); 276213fb8fd7SLABBE Corentin sgc = dma_map_sg(jrdev, req->dst, dst_nents ? : 1, 276313fb8fd7SLABBE Corentin DMA_FROM_DEVICE); 27647222d1a3SCatalin Vasile } 27657222d1a3SCatalin Vasile 27667222d1a3SCatalin Vasile /* 27677222d1a3SCatalin Vasile * Check if iv can be contiguous with source and destination. 27687222d1a3SCatalin Vasile * If so, include it. If not, create scatterlist. 27697222d1a3SCatalin Vasile */ 27707222d1a3SCatalin Vasile iv_dma = dma_map_single(jrdev, greq->giv, ivsize, DMA_TO_DEVICE); 27717222d1a3SCatalin Vasile if (dma_mapping_error(jrdev, iv_dma)) { 27727222d1a3SCatalin Vasile dev_err(jrdev, "unable to map IV\n"); 27737222d1a3SCatalin Vasile return ERR_PTR(-ENOMEM); 27747222d1a3SCatalin Vasile } 27757222d1a3SCatalin Vasile 27767222d1a3SCatalin Vasile if (!dst_nents && iv_dma + ivsize == sg_dma_address(req->dst)) 27777222d1a3SCatalin Vasile iv_contig = true; 27787222d1a3SCatalin Vasile else 27797222d1a3SCatalin Vasile dst_nents = dst_nents ? : 1; 27807222d1a3SCatalin Vasile sec4_sg_bytes = ((iv_contig ? 0 : 1) + src_nents + dst_nents) * 27817222d1a3SCatalin Vasile sizeof(struct sec4_sg_entry); 27827222d1a3SCatalin Vasile 27837222d1a3SCatalin Vasile /* allocate space for base edesc and hw desc commands, link tables */ 2784dde20ae9SVictoria Milhoan edesc = kzalloc(sizeof(*edesc) + desc_bytes + sec4_sg_bytes, 2785dde20ae9SVictoria Milhoan GFP_DMA | flags); 27867222d1a3SCatalin Vasile if (!edesc) { 27877222d1a3SCatalin Vasile dev_err(jrdev, "could not allocate extended descriptor\n"); 27887222d1a3SCatalin Vasile return ERR_PTR(-ENOMEM); 27897222d1a3SCatalin Vasile } 27907222d1a3SCatalin Vasile 27917222d1a3SCatalin Vasile edesc->src_nents = src_nents; 27927222d1a3SCatalin Vasile edesc->dst_nents = dst_nents; 27937222d1a3SCatalin Vasile edesc->sec4_sg_bytes = sec4_sg_bytes; 27947222d1a3SCatalin Vasile edesc->sec4_sg = (void *)edesc + sizeof(struct ablkcipher_edesc) + 27957222d1a3SCatalin Vasile desc_bytes; 27967222d1a3SCatalin Vasile 27977222d1a3SCatalin Vasile sec4_sg_index = 0; 27987222d1a3SCatalin Vasile if (src_nents) { 27997222d1a3SCatalin Vasile sg_to_sec4_sg_last(req->src, src_nents, edesc->sec4_sg, 0); 28007222d1a3SCatalin Vasile sec4_sg_index += src_nents; 28017222d1a3SCatalin Vasile } 28027222d1a3SCatalin Vasile 28037222d1a3SCatalin Vasile if (!iv_contig) { 28047222d1a3SCatalin Vasile dma_to_sec4_sg_one(edesc->sec4_sg + sec4_sg_index, 28057222d1a3SCatalin Vasile iv_dma, ivsize, 0); 28067222d1a3SCatalin Vasile sec4_sg_index += 1; 28077222d1a3SCatalin Vasile sg_to_sec4_sg_last(req->dst, dst_nents, 28087222d1a3SCatalin Vasile edesc->sec4_sg + sec4_sg_index, 0); 28097222d1a3SCatalin Vasile } 28107222d1a3SCatalin Vasile 28117222d1a3SCatalin Vasile edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg, 28127222d1a3SCatalin Vasile sec4_sg_bytes, DMA_TO_DEVICE); 28137222d1a3SCatalin Vasile if (dma_mapping_error(jrdev, edesc->sec4_sg_dma)) { 28147222d1a3SCatalin Vasile dev_err(jrdev, "unable to map S/G table\n"); 28157222d1a3SCatalin Vasile return ERR_PTR(-ENOMEM); 28167222d1a3SCatalin Vasile } 28177222d1a3SCatalin Vasile edesc->iv_dma = iv_dma; 28187222d1a3SCatalin Vasile 28197222d1a3SCatalin Vasile #ifdef DEBUG 28207222d1a3SCatalin Vasile print_hex_dump(KERN_ERR, 28217222d1a3SCatalin Vasile "ablkcipher sec4_sg@" __stringify(__LINE__) ": ", 28227222d1a3SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, edesc->sec4_sg, 28237222d1a3SCatalin Vasile sec4_sg_bytes, 1); 28247222d1a3SCatalin Vasile #endif 28257222d1a3SCatalin Vasile 28267222d1a3SCatalin Vasile *iv_contig_out = iv_contig; 28277222d1a3SCatalin Vasile return edesc; 28287222d1a3SCatalin Vasile } 28297222d1a3SCatalin Vasile 28307222d1a3SCatalin Vasile static int ablkcipher_givencrypt(struct skcipher_givcrypt_request *creq) 28317222d1a3SCatalin Vasile { 28327222d1a3SCatalin Vasile struct ablkcipher_request *req = &creq->creq; 28337222d1a3SCatalin Vasile struct ablkcipher_edesc *edesc; 28347222d1a3SCatalin Vasile struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req); 28357222d1a3SCatalin Vasile struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher); 28367222d1a3SCatalin Vasile struct device *jrdev = ctx->jrdev; 28377222d1a3SCatalin Vasile bool iv_contig; 28387222d1a3SCatalin Vasile u32 *desc; 28397222d1a3SCatalin Vasile int ret = 0; 28407222d1a3SCatalin Vasile 28417222d1a3SCatalin Vasile /* allocate extended descriptor */ 28427222d1a3SCatalin Vasile edesc = ablkcipher_giv_edesc_alloc(creq, DESC_JOB_IO_LEN * 28437222d1a3SCatalin Vasile CAAM_CMD_SZ, &iv_contig); 28447222d1a3SCatalin Vasile if (IS_ERR(edesc)) 28457222d1a3SCatalin Vasile return PTR_ERR(edesc); 28467222d1a3SCatalin Vasile 28477222d1a3SCatalin Vasile /* Create and submit job descriptor*/ 28487222d1a3SCatalin Vasile init_ablkcipher_giv_job(ctx->sh_desc_givenc, ctx->sh_desc_givenc_dma, 28497222d1a3SCatalin Vasile edesc, req, iv_contig); 28507222d1a3SCatalin Vasile #ifdef DEBUG 28517222d1a3SCatalin Vasile print_hex_dump(KERN_ERR, 28527222d1a3SCatalin Vasile "ablkcipher jobdesc@" __stringify(__LINE__) ": ", 28537222d1a3SCatalin Vasile DUMP_PREFIX_ADDRESS, 16, 4, edesc->hw_desc, 28547222d1a3SCatalin Vasile desc_bytes(edesc->hw_desc), 1); 28557222d1a3SCatalin Vasile #endif 28567222d1a3SCatalin Vasile desc = edesc->hw_desc; 28577222d1a3SCatalin Vasile ret = caam_jr_enqueue(jrdev, desc, ablkcipher_encrypt_done, req); 28587222d1a3SCatalin Vasile 28597222d1a3SCatalin Vasile if (!ret) { 28607222d1a3SCatalin Vasile ret = -EINPROGRESS; 28617222d1a3SCatalin Vasile } else { 28627222d1a3SCatalin Vasile ablkcipher_unmap(jrdev, edesc, req); 28637222d1a3SCatalin Vasile kfree(edesc); 28647222d1a3SCatalin Vasile } 28657222d1a3SCatalin Vasile 28667222d1a3SCatalin Vasile return ret; 28677222d1a3SCatalin Vasile } 28687222d1a3SCatalin Vasile 2869885e9e2fSYuan Kang #define template_aead template_u.aead 2870acdca31dSYuan Kang #define template_ablkcipher template_u.ablkcipher 28718e8ec596SKim Phillips struct caam_alg_template { 28728e8ec596SKim Phillips char name[CRYPTO_MAX_ALG_NAME]; 28738e8ec596SKim Phillips char driver_name[CRYPTO_MAX_ALG_NAME]; 28748e8ec596SKim Phillips unsigned int blocksize; 2875885e9e2fSYuan Kang u32 type; 2876885e9e2fSYuan Kang union { 2877885e9e2fSYuan Kang struct ablkcipher_alg ablkcipher; 2878885e9e2fSYuan Kang } template_u; 28798e8ec596SKim Phillips u32 class1_alg_type; 28808e8ec596SKim Phillips u32 class2_alg_type; 28818e8ec596SKim Phillips u32 alg_op; 28828e8ec596SKim Phillips }; 28838e8ec596SKim Phillips 28848e8ec596SKim Phillips static struct caam_alg_template driver_algs[] = { 2885acdca31dSYuan Kang /* ablkcipher descriptor */ 2886acdca31dSYuan Kang { 2887acdca31dSYuan Kang .name = "cbc(aes)", 2888acdca31dSYuan Kang .driver_name = "cbc-aes-caam", 2889acdca31dSYuan Kang .blocksize = AES_BLOCK_SIZE, 28907222d1a3SCatalin Vasile .type = CRYPTO_ALG_TYPE_GIVCIPHER, 2891acdca31dSYuan Kang .template_ablkcipher = { 2892acdca31dSYuan Kang .setkey = ablkcipher_setkey, 2893acdca31dSYuan Kang .encrypt = ablkcipher_encrypt, 2894acdca31dSYuan Kang .decrypt = ablkcipher_decrypt, 28957222d1a3SCatalin Vasile .givencrypt = ablkcipher_givencrypt, 28967222d1a3SCatalin Vasile .geniv = "<built-in>", 2897acdca31dSYuan Kang .min_keysize = AES_MIN_KEY_SIZE, 2898acdca31dSYuan Kang .max_keysize = AES_MAX_KEY_SIZE, 2899acdca31dSYuan Kang .ivsize = AES_BLOCK_SIZE, 2900acdca31dSYuan Kang }, 2901acdca31dSYuan Kang .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 2902acdca31dSYuan Kang }, 2903acdca31dSYuan Kang { 2904acdca31dSYuan Kang .name = "cbc(des3_ede)", 2905acdca31dSYuan Kang .driver_name = "cbc-3des-caam", 2906acdca31dSYuan Kang .blocksize = DES3_EDE_BLOCK_SIZE, 2907ff2c3a3bSCatalin Vasile .type = CRYPTO_ALG_TYPE_GIVCIPHER, 2908acdca31dSYuan Kang .template_ablkcipher = { 2909acdca31dSYuan Kang .setkey = ablkcipher_setkey, 2910acdca31dSYuan Kang .encrypt = ablkcipher_encrypt, 2911acdca31dSYuan Kang .decrypt = ablkcipher_decrypt, 2912ff2c3a3bSCatalin Vasile .givencrypt = ablkcipher_givencrypt, 2913ff2c3a3bSCatalin Vasile .geniv = "<built-in>", 2914acdca31dSYuan Kang .min_keysize = DES3_EDE_KEY_SIZE, 2915acdca31dSYuan Kang .max_keysize = DES3_EDE_KEY_SIZE, 2916acdca31dSYuan Kang .ivsize = DES3_EDE_BLOCK_SIZE, 2917acdca31dSYuan Kang }, 2918acdca31dSYuan Kang .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 2919acdca31dSYuan Kang }, 2920acdca31dSYuan Kang { 2921acdca31dSYuan Kang .name = "cbc(des)", 2922acdca31dSYuan Kang .driver_name = "cbc-des-caam", 2923acdca31dSYuan Kang .blocksize = DES_BLOCK_SIZE, 2924ff2c3a3bSCatalin Vasile .type = CRYPTO_ALG_TYPE_GIVCIPHER, 2925acdca31dSYuan Kang .template_ablkcipher = { 2926acdca31dSYuan Kang .setkey = ablkcipher_setkey, 2927acdca31dSYuan Kang .encrypt = ablkcipher_encrypt, 2928acdca31dSYuan Kang .decrypt = ablkcipher_decrypt, 2929ff2c3a3bSCatalin Vasile .givencrypt = ablkcipher_givencrypt, 2930ff2c3a3bSCatalin Vasile .geniv = "<built-in>", 2931acdca31dSYuan Kang .min_keysize = DES_KEY_SIZE, 2932acdca31dSYuan Kang .max_keysize = DES_KEY_SIZE, 2933acdca31dSYuan Kang .ivsize = DES_BLOCK_SIZE, 2934acdca31dSYuan Kang }, 2935acdca31dSYuan Kang .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 29362b22f6c5SCatalin Vasile }, 29372b22f6c5SCatalin Vasile { 29382b22f6c5SCatalin Vasile .name = "ctr(aes)", 29392b22f6c5SCatalin Vasile .driver_name = "ctr-aes-caam", 29402b22f6c5SCatalin Vasile .blocksize = 1, 29412b22f6c5SCatalin Vasile .type = CRYPTO_ALG_TYPE_ABLKCIPHER, 29422b22f6c5SCatalin Vasile .template_ablkcipher = { 29432b22f6c5SCatalin Vasile .setkey = ablkcipher_setkey, 29442b22f6c5SCatalin Vasile .encrypt = ablkcipher_encrypt, 29452b22f6c5SCatalin Vasile .decrypt = ablkcipher_decrypt, 29462b22f6c5SCatalin Vasile .geniv = "chainiv", 29472b22f6c5SCatalin Vasile .min_keysize = AES_MIN_KEY_SIZE, 29482b22f6c5SCatalin Vasile .max_keysize = AES_MAX_KEY_SIZE, 29492b22f6c5SCatalin Vasile .ivsize = AES_BLOCK_SIZE, 29502b22f6c5SCatalin Vasile }, 29512b22f6c5SCatalin Vasile .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CTR_MOD128, 2952a5f57cffSCatalin Vasile }, 2953a5f57cffSCatalin Vasile { 2954a5f57cffSCatalin Vasile .name = "rfc3686(ctr(aes))", 2955a5f57cffSCatalin Vasile .driver_name = "rfc3686-ctr-aes-caam", 2956a5f57cffSCatalin Vasile .blocksize = 1, 29577222d1a3SCatalin Vasile .type = CRYPTO_ALG_TYPE_GIVCIPHER, 2958a5f57cffSCatalin Vasile .template_ablkcipher = { 2959a5f57cffSCatalin Vasile .setkey = ablkcipher_setkey, 2960a5f57cffSCatalin Vasile .encrypt = ablkcipher_encrypt, 2961a5f57cffSCatalin Vasile .decrypt = ablkcipher_decrypt, 29627222d1a3SCatalin Vasile .givencrypt = ablkcipher_givencrypt, 29637222d1a3SCatalin Vasile .geniv = "<built-in>", 2964a5f57cffSCatalin Vasile .min_keysize = AES_MIN_KEY_SIZE + 2965a5f57cffSCatalin Vasile CTR_RFC3686_NONCE_SIZE, 2966a5f57cffSCatalin Vasile .max_keysize = AES_MAX_KEY_SIZE + 2967a5f57cffSCatalin Vasile CTR_RFC3686_NONCE_SIZE, 2968a5f57cffSCatalin Vasile .ivsize = CTR_RFC3686_IV_SIZE, 2969a5f57cffSCatalin Vasile }, 2970a5f57cffSCatalin Vasile .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CTR_MOD128, 2971c6415a60SCatalin Vasile }, 2972c6415a60SCatalin Vasile { 2973c6415a60SCatalin Vasile .name = "xts(aes)", 2974c6415a60SCatalin Vasile .driver_name = "xts-aes-caam", 2975c6415a60SCatalin Vasile .blocksize = AES_BLOCK_SIZE, 2976c6415a60SCatalin Vasile .type = CRYPTO_ALG_TYPE_ABLKCIPHER, 2977c6415a60SCatalin Vasile .template_ablkcipher = { 2978c6415a60SCatalin Vasile .setkey = xts_ablkcipher_setkey, 2979c6415a60SCatalin Vasile .encrypt = ablkcipher_encrypt, 2980c6415a60SCatalin Vasile .decrypt = ablkcipher_decrypt, 2981c6415a60SCatalin Vasile .geniv = "eseqiv", 2982c6415a60SCatalin Vasile .min_keysize = 2 * AES_MIN_KEY_SIZE, 2983c6415a60SCatalin Vasile .max_keysize = 2 * AES_MAX_KEY_SIZE, 2984c6415a60SCatalin Vasile .ivsize = AES_BLOCK_SIZE, 2985c6415a60SCatalin Vasile }, 2986c6415a60SCatalin Vasile .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_XTS, 2987c6415a60SCatalin Vasile }, 29888e8ec596SKim Phillips }; 29898e8ec596SKim Phillips 2990f2147b88SHerbert Xu static struct caam_aead_alg driver_aeads[] = { 2991f2147b88SHerbert Xu { 2992f2147b88SHerbert Xu .aead = { 2993f2147b88SHerbert Xu .base = { 2994f2147b88SHerbert Xu .cra_name = "rfc4106(gcm(aes))", 2995f2147b88SHerbert Xu .cra_driver_name = "rfc4106-gcm-aes-caam", 2996f2147b88SHerbert Xu .cra_blocksize = 1, 2997f2147b88SHerbert Xu }, 2998f2147b88SHerbert Xu .setkey = rfc4106_setkey, 2999f2147b88SHerbert Xu .setauthsize = rfc4106_setauthsize, 300046218750SHerbert Xu .encrypt = ipsec_gcm_encrypt, 300146218750SHerbert Xu .decrypt = ipsec_gcm_decrypt, 3002f2147b88SHerbert Xu .ivsize = 8, 3003f2147b88SHerbert Xu .maxauthsize = AES_BLOCK_SIZE, 3004f2147b88SHerbert Xu }, 3005f2147b88SHerbert Xu .caam = { 3006f2147b88SHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 3007f2147b88SHerbert Xu }, 3008f2147b88SHerbert Xu }, 3009f2147b88SHerbert Xu { 3010f2147b88SHerbert Xu .aead = { 3011f2147b88SHerbert Xu .base = { 3012f2147b88SHerbert Xu .cra_name = "rfc4543(gcm(aes))", 3013f2147b88SHerbert Xu .cra_driver_name = "rfc4543-gcm-aes-caam", 3014f2147b88SHerbert Xu .cra_blocksize = 1, 3015f2147b88SHerbert Xu }, 3016f2147b88SHerbert Xu .setkey = rfc4543_setkey, 3017f2147b88SHerbert Xu .setauthsize = rfc4543_setauthsize, 301846218750SHerbert Xu .encrypt = ipsec_gcm_encrypt, 301946218750SHerbert Xu .decrypt = ipsec_gcm_decrypt, 3020f2147b88SHerbert Xu .ivsize = 8, 3021f2147b88SHerbert Xu .maxauthsize = AES_BLOCK_SIZE, 3022f2147b88SHerbert Xu }, 3023f2147b88SHerbert Xu .caam = { 3024f2147b88SHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 3025f2147b88SHerbert Xu }, 3026f2147b88SHerbert Xu }, 3027f2147b88SHerbert Xu /* Galois Counter Mode */ 3028f2147b88SHerbert Xu { 3029f2147b88SHerbert Xu .aead = { 3030f2147b88SHerbert Xu .base = { 3031f2147b88SHerbert Xu .cra_name = "gcm(aes)", 3032f2147b88SHerbert Xu .cra_driver_name = "gcm-aes-caam", 3033f2147b88SHerbert Xu .cra_blocksize = 1, 3034f2147b88SHerbert Xu }, 3035f2147b88SHerbert Xu .setkey = gcm_setkey, 3036f2147b88SHerbert Xu .setauthsize = gcm_setauthsize, 3037f2147b88SHerbert Xu .encrypt = gcm_encrypt, 3038f2147b88SHerbert Xu .decrypt = gcm_decrypt, 3039f2147b88SHerbert Xu .ivsize = 12, 3040f2147b88SHerbert Xu .maxauthsize = AES_BLOCK_SIZE, 3041f2147b88SHerbert Xu }, 3042f2147b88SHerbert Xu .caam = { 3043f2147b88SHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_GCM, 3044f2147b88SHerbert Xu }, 3045f2147b88SHerbert Xu }, 3046479bcc7cSHerbert Xu /* single-pass ipsec_esp descriptor */ 3047479bcc7cSHerbert Xu { 3048479bcc7cSHerbert Xu .aead = { 3049479bcc7cSHerbert Xu .base = { 3050479bcc7cSHerbert Xu .cra_name = "authenc(hmac(md5)," 3051479bcc7cSHerbert Xu "ecb(cipher_null))", 3052479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-md5-" 3053479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3054479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3055479bcc7cSHerbert Xu }, 3056479bcc7cSHerbert Xu .setkey = aead_setkey, 3057479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3058479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3059479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3060479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3061479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3062479bcc7cSHerbert Xu }, 3063479bcc7cSHerbert Xu .caam = { 3064479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3065479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3066479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3067479bcc7cSHerbert Xu }, 3068479bcc7cSHerbert Xu }, 3069479bcc7cSHerbert Xu { 3070479bcc7cSHerbert Xu .aead = { 3071479bcc7cSHerbert Xu .base = { 3072479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha1)," 3073479bcc7cSHerbert Xu "ecb(cipher_null))", 3074479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha1-" 3075479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3076479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3077479bcc7cSHerbert Xu }, 3078479bcc7cSHerbert Xu .setkey = aead_setkey, 3079479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3080479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3081479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3082479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3083479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3084479bcc7cSHerbert Xu }, 3085479bcc7cSHerbert Xu .caam = { 3086479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3087479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3088479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3089479bcc7cSHerbert Xu }, 3090479bcc7cSHerbert Xu }, 3091479bcc7cSHerbert Xu { 3092479bcc7cSHerbert Xu .aead = { 3093479bcc7cSHerbert Xu .base = { 3094479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha224)," 3095479bcc7cSHerbert Xu "ecb(cipher_null))", 3096479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha224-" 3097479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3098479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3099479bcc7cSHerbert Xu }, 3100479bcc7cSHerbert Xu .setkey = aead_setkey, 3101479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3102479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3103479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3104479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3105479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3106479bcc7cSHerbert Xu }, 3107479bcc7cSHerbert Xu .caam = { 3108479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3109479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3110479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3111479bcc7cSHerbert Xu }, 3112479bcc7cSHerbert Xu }, 3113479bcc7cSHerbert Xu { 3114479bcc7cSHerbert Xu .aead = { 3115479bcc7cSHerbert Xu .base = { 3116479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha256)," 3117479bcc7cSHerbert Xu "ecb(cipher_null))", 3118479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha256-" 3119479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3120479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3121479bcc7cSHerbert Xu }, 3122479bcc7cSHerbert Xu .setkey = aead_setkey, 3123479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3124479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3125479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3126479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3127479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3128479bcc7cSHerbert Xu }, 3129479bcc7cSHerbert Xu .caam = { 3130479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3131479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3132479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3133479bcc7cSHerbert Xu }, 3134479bcc7cSHerbert Xu }, 3135479bcc7cSHerbert Xu { 3136479bcc7cSHerbert Xu .aead = { 3137479bcc7cSHerbert Xu .base = { 3138479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha384)," 3139479bcc7cSHerbert Xu "ecb(cipher_null))", 3140479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha384-" 3141479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3142479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3143479bcc7cSHerbert Xu }, 3144479bcc7cSHerbert Xu .setkey = aead_setkey, 3145479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3146479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3147479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3148479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3149479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3150479bcc7cSHerbert Xu }, 3151479bcc7cSHerbert Xu .caam = { 3152479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3153479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3154479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3155479bcc7cSHerbert Xu }, 3156479bcc7cSHerbert Xu }, 3157479bcc7cSHerbert Xu { 3158479bcc7cSHerbert Xu .aead = { 3159479bcc7cSHerbert Xu .base = { 3160479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha512)," 3161479bcc7cSHerbert Xu "ecb(cipher_null))", 3162479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha512-" 3163479bcc7cSHerbert Xu "ecb-cipher_null-caam", 3164479bcc7cSHerbert Xu .cra_blocksize = NULL_BLOCK_SIZE, 3165479bcc7cSHerbert Xu }, 3166479bcc7cSHerbert Xu .setkey = aead_setkey, 3167479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3168479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3169479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3170479bcc7cSHerbert Xu .ivsize = NULL_IV_SIZE, 3171479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3172479bcc7cSHerbert Xu }, 3173479bcc7cSHerbert Xu .caam = { 3174479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3175479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3176479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3177479bcc7cSHerbert Xu }, 3178479bcc7cSHerbert Xu }, 3179479bcc7cSHerbert Xu { 3180479bcc7cSHerbert Xu .aead = { 3181479bcc7cSHerbert Xu .base = { 3182479bcc7cSHerbert Xu .cra_name = "authenc(hmac(md5),cbc(aes))", 3183479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-md5-" 3184479bcc7cSHerbert Xu "cbc-aes-caam", 3185479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3186479bcc7cSHerbert Xu }, 3187479bcc7cSHerbert Xu .setkey = aead_setkey, 3188479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3189479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3190479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3191479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3192479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3193479bcc7cSHerbert Xu }, 3194479bcc7cSHerbert Xu .caam = { 3195479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3196479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3197479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3198479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3199479bcc7cSHerbert Xu }, 3200479bcc7cSHerbert Xu }, 3201479bcc7cSHerbert Xu { 3202479bcc7cSHerbert Xu .aead = { 3203479bcc7cSHerbert Xu .base = { 3204479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(md5)," 3205479bcc7cSHerbert Xu "cbc(aes)))", 3206479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-hmac-md5-" 3207479bcc7cSHerbert Xu "cbc-aes-caam", 3208479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3209479bcc7cSHerbert Xu }, 3210479bcc7cSHerbert Xu .setkey = aead_setkey, 3211479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3212479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3213479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3214479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3215479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3216479bcc7cSHerbert Xu }, 3217479bcc7cSHerbert Xu .caam = { 3218479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3219479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3220479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3221479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3222479bcc7cSHerbert Xu .geniv = true, 3223479bcc7cSHerbert Xu }, 3224479bcc7cSHerbert Xu }, 3225479bcc7cSHerbert Xu { 3226479bcc7cSHerbert Xu .aead = { 3227479bcc7cSHerbert Xu .base = { 3228479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha1),cbc(aes))", 3229479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha1-" 3230479bcc7cSHerbert Xu "cbc-aes-caam", 3231479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3232479bcc7cSHerbert Xu }, 3233479bcc7cSHerbert Xu .setkey = aead_setkey, 3234479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3235479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3236479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3237479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3238479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3239479bcc7cSHerbert Xu }, 3240479bcc7cSHerbert Xu .caam = { 3241479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3242479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3243479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3244479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3245479bcc7cSHerbert Xu }, 3246479bcc7cSHerbert Xu }, 3247479bcc7cSHerbert Xu { 3248479bcc7cSHerbert Xu .aead = { 3249479bcc7cSHerbert Xu .base = { 3250479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha1)," 3251479bcc7cSHerbert Xu "cbc(aes)))", 3252479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3253479bcc7cSHerbert Xu "hmac-sha1-cbc-aes-caam", 3254479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3255479bcc7cSHerbert Xu }, 3256479bcc7cSHerbert Xu .setkey = aead_setkey, 3257479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3258479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3259479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3260479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3261479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3262479bcc7cSHerbert Xu }, 3263479bcc7cSHerbert Xu .caam = { 3264479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3265479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3266479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3267479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3268479bcc7cSHerbert Xu .geniv = true, 3269479bcc7cSHerbert Xu }, 3270479bcc7cSHerbert Xu }, 3271479bcc7cSHerbert Xu { 3272479bcc7cSHerbert Xu .aead = { 3273479bcc7cSHerbert Xu .base = { 3274479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha224),cbc(aes))", 3275479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha224-" 3276479bcc7cSHerbert Xu "cbc-aes-caam", 3277479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3278479bcc7cSHerbert Xu }, 3279479bcc7cSHerbert Xu .setkey = aead_setkey, 3280479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3281479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3282479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3283479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3284479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3285479bcc7cSHerbert Xu }, 3286479bcc7cSHerbert Xu .caam = { 3287479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3288479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3289479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3290479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3291479bcc7cSHerbert Xu }, 3292479bcc7cSHerbert Xu }, 3293479bcc7cSHerbert Xu { 3294479bcc7cSHerbert Xu .aead = { 3295479bcc7cSHerbert Xu .base = { 3296479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha224)," 3297479bcc7cSHerbert Xu "cbc(aes)))", 3298479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3299479bcc7cSHerbert Xu "hmac-sha224-cbc-aes-caam", 3300479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3301479bcc7cSHerbert Xu }, 3302479bcc7cSHerbert Xu .setkey = aead_setkey, 3303479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3304479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3305479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3306479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3307479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3308479bcc7cSHerbert Xu }, 3309479bcc7cSHerbert Xu .caam = { 3310479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3311479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3312479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3313479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3314479bcc7cSHerbert Xu .geniv = true, 3315479bcc7cSHerbert Xu }, 3316479bcc7cSHerbert Xu }, 3317479bcc7cSHerbert Xu { 3318479bcc7cSHerbert Xu .aead = { 3319479bcc7cSHerbert Xu .base = { 3320479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha256),cbc(aes))", 3321479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha256-" 3322479bcc7cSHerbert Xu "cbc-aes-caam", 3323479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3324479bcc7cSHerbert Xu }, 3325479bcc7cSHerbert Xu .setkey = aead_setkey, 3326479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3327479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3328479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3329479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3330479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3331479bcc7cSHerbert Xu }, 3332479bcc7cSHerbert Xu .caam = { 3333479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3334479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3335479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3336479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3337479bcc7cSHerbert Xu }, 3338479bcc7cSHerbert Xu }, 3339479bcc7cSHerbert Xu { 3340479bcc7cSHerbert Xu .aead = { 3341479bcc7cSHerbert Xu .base = { 3342479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha256)," 3343479bcc7cSHerbert Xu "cbc(aes)))", 3344479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3345479bcc7cSHerbert Xu "hmac-sha256-cbc-aes-caam", 3346479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3347479bcc7cSHerbert Xu }, 3348479bcc7cSHerbert Xu .setkey = aead_setkey, 3349479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3350479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3351479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3352479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3353479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3354479bcc7cSHerbert Xu }, 3355479bcc7cSHerbert Xu .caam = { 3356479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3357479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3358479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3359479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3360479bcc7cSHerbert Xu .geniv = true, 3361479bcc7cSHerbert Xu }, 3362479bcc7cSHerbert Xu }, 3363479bcc7cSHerbert Xu { 3364479bcc7cSHerbert Xu .aead = { 3365479bcc7cSHerbert Xu .base = { 3366479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha384),cbc(aes))", 3367479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha384-" 3368479bcc7cSHerbert Xu "cbc-aes-caam", 3369479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3370479bcc7cSHerbert Xu }, 3371479bcc7cSHerbert Xu .setkey = aead_setkey, 3372479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3373479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3374479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3375479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3376479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3377479bcc7cSHerbert Xu }, 3378479bcc7cSHerbert Xu .caam = { 3379479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3380479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3381479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3382479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3383479bcc7cSHerbert Xu }, 3384479bcc7cSHerbert Xu }, 3385479bcc7cSHerbert Xu { 3386479bcc7cSHerbert Xu .aead = { 3387479bcc7cSHerbert Xu .base = { 3388479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha384)," 3389479bcc7cSHerbert Xu "cbc(aes)))", 3390479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3391479bcc7cSHerbert Xu "hmac-sha384-cbc-aes-caam", 3392479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3393479bcc7cSHerbert Xu }, 3394479bcc7cSHerbert Xu .setkey = aead_setkey, 3395479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3396479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3397479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3398479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3399479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3400479bcc7cSHerbert Xu }, 3401479bcc7cSHerbert Xu .caam = { 3402479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3403479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3404479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3405479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3406479bcc7cSHerbert Xu .geniv = true, 3407479bcc7cSHerbert Xu }, 3408479bcc7cSHerbert Xu }, 3409479bcc7cSHerbert Xu { 3410479bcc7cSHerbert Xu .aead = { 3411479bcc7cSHerbert Xu .base = { 3412479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha512),cbc(aes))", 3413479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha512-" 3414479bcc7cSHerbert Xu "cbc-aes-caam", 3415479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3416479bcc7cSHerbert Xu }, 3417479bcc7cSHerbert Xu .setkey = aead_setkey, 3418479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3419479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3420479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3421479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3422479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3423479bcc7cSHerbert Xu }, 3424479bcc7cSHerbert Xu .caam = { 3425479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3426479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3427479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3428479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3429479bcc7cSHerbert Xu }, 3430479bcc7cSHerbert Xu }, 3431479bcc7cSHerbert Xu { 3432479bcc7cSHerbert Xu .aead = { 3433479bcc7cSHerbert Xu .base = { 3434479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha512)," 3435479bcc7cSHerbert Xu "cbc(aes)))", 3436479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3437479bcc7cSHerbert Xu "hmac-sha512-cbc-aes-caam", 3438479bcc7cSHerbert Xu .cra_blocksize = AES_BLOCK_SIZE, 3439479bcc7cSHerbert Xu }, 3440479bcc7cSHerbert Xu .setkey = aead_setkey, 3441479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3442479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3443479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3444479bcc7cSHerbert Xu .ivsize = AES_BLOCK_SIZE, 3445479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3446479bcc7cSHerbert Xu }, 3447479bcc7cSHerbert Xu .caam = { 3448479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | OP_ALG_AAI_CBC, 3449479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3450479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3451479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3452479bcc7cSHerbert Xu .geniv = true, 3453479bcc7cSHerbert Xu }, 3454479bcc7cSHerbert Xu }, 3455479bcc7cSHerbert Xu { 3456479bcc7cSHerbert Xu .aead = { 3457479bcc7cSHerbert Xu .base = { 3458479bcc7cSHerbert Xu .cra_name = "authenc(hmac(md5),cbc(des3_ede))", 3459479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-md5-" 3460479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3461479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3462479bcc7cSHerbert Xu }, 3463479bcc7cSHerbert Xu .setkey = aead_setkey, 3464479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3465479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3466479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3467479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3468479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3469479bcc7cSHerbert Xu }, 3470479bcc7cSHerbert Xu .caam = { 3471479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3472479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3473479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3474479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3475479bcc7cSHerbert Xu } 3476479bcc7cSHerbert Xu }, 3477479bcc7cSHerbert Xu { 3478479bcc7cSHerbert Xu .aead = { 3479479bcc7cSHerbert Xu .base = { 3480479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(md5)," 3481479bcc7cSHerbert Xu "cbc(des3_ede)))", 3482479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-hmac-md5-" 3483479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3484479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3485479bcc7cSHerbert Xu }, 3486479bcc7cSHerbert Xu .setkey = aead_setkey, 3487479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3488479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3489479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3490479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3491479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3492479bcc7cSHerbert Xu }, 3493479bcc7cSHerbert Xu .caam = { 3494479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3495479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3496479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3497479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3498479bcc7cSHerbert Xu .geniv = true, 3499479bcc7cSHerbert Xu } 3500479bcc7cSHerbert Xu }, 3501479bcc7cSHerbert Xu { 3502479bcc7cSHerbert Xu .aead = { 3503479bcc7cSHerbert Xu .base = { 3504479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha1)," 3505479bcc7cSHerbert Xu "cbc(des3_ede))", 3506479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha1-" 3507479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3508479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3509479bcc7cSHerbert Xu }, 3510479bcc7cSHerbert Xu .setkey = aead_setkey, 3511479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3512479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3513479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3514479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3515479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3516479bcc7cSHerbert Xu }, 3517479bcc7cSHerbert Xu .caam = { 3518479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3519479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3520479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3521479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3522479bcc7cSHerbert Xu }, 3523479bcc7cSHerbert Xu }, 3524479bcc7cSHerbert Xu { 3525479bcc7cSHerbert Xu .aead = { 3526479bcc7cSHerbert Xu .base = { 3527479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha1)," 3528479bcc7cSHerbert Xu "cbc(des3_ede)))", 3529479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3530479bcc7cSHerbert Xu "hmac-sha1-" 3531479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3532479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3533479bcc7cSHerbert Xu }, 3534479bcc7cSHerbert Xu .setkey = aead_setkey, 3535479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3536479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3537479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3538479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3539479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3540479bcc7cSHerbert Xu }, 3541479bcc7cSHerbert Xu .caam = { 3542479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3543479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3544479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3545479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3546479bcc7cSHerbert Xu .geniv = true, 3547479bcc7cSHerbert Xu }, 3548479bcc7cSHerbert Xu }, 3549479bcc7cSHerbert Xu { 3550479bcc7cSHerbert Xu .aead = { 3551479bcc7cSHerbert Xu .base = { 3552479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha224)," 3553479bcc7cSHerbert Xu "cbc(des3_ede))", 3554479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha224-" 3555479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3556479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3557479bcc7cSHerbert Xu }, 3558479bcc7cSHerbert Xu .setkey = aead_setkey, 3559479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3560479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3561479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3562479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3563479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3564479bcc7cSHerbert Xu }, 3565479bcc7cSHerbert Xu .caam = { 3566479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3567479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3568479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3569479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3570479bcc7cSHerbert Xu }, 3571479bcc7cSHerbert Xu }, 3572479bcc7cSHerbert Xu { 3573479bcc7cSHerbert Xu .aead = { 3574479bcc7cSHerbert Xu .base = { 3575479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha224)," 3576479bcc7cSHerbert Xu "cbc(des3_ede)))", 3577479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3578479bcc7cSHerbert Xu "hmac-sha224-" 3579479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3580479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3581479bcc7cSHerbert Xu }, 3582479bcc7cSHerbert Xu .setkey = aead_setkey, 3583479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3584479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3585479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3586479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3587479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3588479bcc7cSHerbert Xu }, 3589479bcc7cSHerbert Xu .caam = { 3590479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3591479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3592479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3593479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3594479bcc7cSHerbert Xu .geniv = true, 3595479bcc7cSHerbert Xu }, 3596479bcc7cSHerbert Xu }, 3597479bcc7cSHerbert Xu { 3598479bcc7cSHerbert Xu .aead = { 3599479bcc7cSHerbert Xu .base = { 3600479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha256)," 3601479bcc7cSHerbert Xu "cbc(des3_ede))", 3602479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha256-" 3603479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3604479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3605479bcc7cSHerbert Xu }, 3606479bcc7cSHerbert Xu .setkey = aead_setkey, 3607479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3608479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3609479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3610479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3611479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3612479bcc7cSHerbert Xu }, 3613479bcc7cSHerbert Xu .caam = { 3614479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3615479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3616479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3617479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3618479bcc7cSHerbert Xu }, 3619479bcc7cSHerbert Xu }, 3620479bcc7cSHerbert Xu { 3621479bcc7cSHerbert Xu .aead = { 3622479bcc7cSHerbert Xu .base = { 3623479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha256)," 3624479bcc7cSHerbert Xu "cbc(des3_ede)))", 3625479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3626479bcc7cSHerbert Xu "hmac-sha256-" 3627479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3628479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3629479bcc7cSHerbert Xu }, 3630479bcc7cSHerbert Xu .setkey = aead_setkey, 3631479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3632479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3633479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3634479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3635479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3636479bcc7cSHerbert Xu }, 3637479bcc7cSHerbert Xu .caam = { 3638479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3639479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3640479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3641479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3642479bcc7cSHerbert Xu .geniv = true, 3643479bcc7cSHerbert Xu }, 3644479bcc7cSHerbert Xu }, 3645479bcc7cSHerbert Xu { 3646479bcc7cSHerbert Xu .aead = { 3647479bcc7cSHerbert Xu .base = { 3648479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha384)," 3649479bcc7cSHerbert Xu "cbc(des3_ede))", 3650479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha384-" 3651479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3652479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3653479bcc7cSHerbert Xu }, 3654479bcc7cSHerbert Xu .setkey = aead_setkey, 3655479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3656479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3657479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3658479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3659479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3660479bcc7cSHerbert Xu }, 3661479bcc7cSHerbert Xu .caam = { 3662479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3663479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3664479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3665479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3666479bcc7cSHerbert Xu }, 3667479bcc7cSHerbert Xu }, 3668479bcc7cSHerbert Xu { 3669479bcc7cSHerbert Xu .aead = { 3670479bcc7cSHerbert Xu .base = { 3671479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha384)," 3672479bcc7cSHerbert Xu "cbc(des3_ede)))", 3673479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3674479bcc7cSHerbert Xu "hmac-sha384-" 3675479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3676479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3677479bcc7cSHerbert Xu }, 3678479bcc7cSHerbert Xu .setkey = aead_setkey, 3679479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3680479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3681479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3682479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3683479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3684479bcc7cSHerbert Xu }, 3685479bcc7cSHerbert Xu .caam = { 3686479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3687479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3688479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3689479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3690479bcc7cSHerbert Xu .geniv = true, 3691479bcc7cSHerbert Xu }, 3692479bcc7cSHerbert Xu }, 3693479bcc7cSHerbert Xu { 3694479bcc7cSHerbert Xu .aead = { 3695479bcc7cSHerbert Xu .base = { 3696479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha512)," 3697479bcc7cSHerbert Xu "cbc(des3_ede))", 3698479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha512-" 3699479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3700479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3701479bcc7cSHerbert Xu }, 3702479bcc7cSHerbert Xu .setkey = aead_setkey, 3703479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3704479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3705479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3706479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3707479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3708479bcc7cSHerbert Xu }, 3709479bcc7cSHerbert Xu .caam = { 3710479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3711479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3712479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3713479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3714479bcc7cSHerbert Xu }, 3715479bcc7cSHerbert Xu }, 3716479bcc7cSHerbert Xu { 3717479bcc7cSHerbert Xu .aead = { 3718479bcc7cSHerbert Xu .base = { 3719479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha512)," 3720479bcc7cSHerbert Xu "cbc(des3_ede)))", 3721479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3722479bcc7cSHerbert Xu "hmac-sha512-" 3723479bcc7cSHerbert Xu "cbc-des3_ede-caam", 3724479bcc7cSHerbert Xu .cra_blocksize = DES3_EDE_BLOCK_SIZE, 3725479bcc7cSHerbert Xu }, 3726479bcc7cSHerbert Xu .setkey = aead_setkey, 3727479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3728479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3729479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3730479bcc7cSHerbert Xu .ivsize = DES3_EDE_BLOCK_SIZE, 3731479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3732479bcc7cSHerbert Xu }, 3733479bcc7cSHerbert Xu .caam = { 3734479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_3DES | OP_ALG_AAI_CBC, 3735479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3736479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3737479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3738479bcc7cSHerbert Xu .geniv = true, 3739479bcc7cSHerbert Xu }, 3740479bcc7cSHerbert Xu }, 3741479bcc7cSHerbert Xu { 3742479bcc7cSHerbert Xu .aead = { 3743479bcc7cSHerbert Xu .base = { 3744479bcc7cSHerbert Xu .cra_name = "authenc(hmac(md5),cbc(des))", 3745479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-md5-" 3746479bcc7cSHerbert Xu "cbc-des-caam", 3747479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3748479bcc7cSHerbert Xu }, 3749479bcc7cSHerbert Xu .setkey = aead_setkey, 3750479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3751479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3752479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3753479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3754479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3755479bcc7cSHerbert Xu }, 3756479bcc7cSHerbert Xu .caam = { 3757479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3758479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3759479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3760479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3761479bcc7cSHerbert Xu }, 3762479bcc7cSHerbert Xu }, 3763479bcc7cSHerbert Xu { 3764479bcc7cSHerbert Xu .aead = { 3765479bcc7cSHerbert Xu .base = { 3766479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(md5)," 3767479bcc7cSHerbert Xu "cbc(des)))", 3768479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-hmac-md5-" 3769479bcc7cSHerbert Xu "cbc-des-caam", 3770479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3771479bcc7cSHerbert Xu }, 3772479bcc7cSHerbert Xu .setkey = aead_setkey, 3773479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3774479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3775479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3776479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3777479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 3778479bcc7cSHerbert Xu }, 3779479bcc7cSHerbert Xu .caam = { 3780479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3781479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 3782479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3783479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 3784479bcc7cSHerbert Xu .geniv = true, 3785479bcc7cSHerbert Xu }, 3786479bcc7cSHerbert Xu }, 3787479bcc7cSHerbert Xu { 3788479bcc7cSHerbert Xu .aead = { 3789479bcc7cSHerbert Xu .base = { 3790479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha1),cbc(des))", 3791479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha1-" 3792479bcc7cSHerbert Xu "cbc-des-caam", 3793479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3794479bcc7cSHerbert Xu }, 3795479bcc7cSHerbert Xu .setkey = aead_setkey, 3796479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3797479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3798479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3799479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3800479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3801479bcc7cSHerbert Xu }, 3802479bcc7cSHerbert Xu .caam = { 3803479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3804479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3805479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3806479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3807479bcc7cSHerbert Xu }, 3808479bcc7cSHerbert Xu }, 3809479bcc7cSHerbert Xu { 3810479bcc7cSHerbert Xu .aead = { 3811479bcc7cSHerbert Xu .base = { 3812479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha1)," 3813479bcc7cSHerbert Xu "cbc(des)))", 3814479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3815479bcc7cSHerbert Xu "hmac-sha1-cbc-des-caam", 3816479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3817479bcc7cSHerbert Xu }, 3818479bcc7cSHerbert Xu .setkey = aead_setkey, 3819479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3820479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3821479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3822479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3823479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 3824479bcc7cSHerbert Xu }, 3825479bcc7cSHerbert Xu .caam = { 3826479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3827479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 3828479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3829479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 3830479bcc7cSHerbert Xu .geniv = true, 3831479bcc7cSHerbert Xu }, 3832479bcc7cSHerbert Xu }, 3833479bcc7cSHerbert Xu { 3834479bcc7cSHerbert Xu .aead = { 3835479bcc7cSHerbert Xu .base = { 3836479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha224),cbc(des))", 3837479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha224-" 3838479bcc7cSHerbert Xu "cbc-des-caam", 3839479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3840479bcc7cSHerbert Xu }, 3841479bcc7cSHerbert Xu .setkey = aead_setkey, 3842479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3843479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3844479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3845479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3846479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3847479bcc7cSHerbert Xu }, 3848479bcc7cSHerbert Xu .caam = { 3849479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3850479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3851479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3852479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3853479bcc7cSHerbert Xu }, 3854479bcc7cSHerbert Xu }, 3855479bcc7cSHerbert Xu { 3856479bcc7cSHerbert Xu .aead = { 3857479bcc7cSHerbert Xu .base = { 3858479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha224)," 3859479bcc7cSHerbert Xu "cbc(des)))", 3860479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3861479bcc7cSHerbert Xu "hmac-sha224-cbc-des-caam", 3862479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3863479bcc7cSHerbert Xu }, 3864479bcc7cSHerbert Xu .setkey = aead_setkey, 3865479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3866479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3867479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3868479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3869479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 3870479bcc7cSHerbert Xu }, 3871479bcc7cSHerbert Xu .caam = { 3872479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3873479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 3874479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3875479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 3876479bcc7cSHerbert Xu .geniv = true, 3877479bcc7cSHerbert Xu }, 3878479bcc7cSHerbert Xu }, 3879479bcc7cSHerbert Xu { 3880479bcc7cSHerbert Xu .aead = { 3881479bcc7cSHerbert Xu .base = { 3882479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha256),cbc(des))", 3883479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha256-" 3884479bcc7cSHerbert Xu "cbc-des-caam", 3885479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3886479bcc7cSHerbert Xu }, 3887479bcc7cSHerbert Xu .setkey = aead_setkey, 3888479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3889479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3890479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3891479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3892479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3893479bcc7cSHerbert Xu }, 3894479bcc7cSHerbert Xu .caam = { 3895479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3896479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3897479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3898479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3899479bcc7cSHerbert Xu }, 3900479bcc7cSHerbert Xu }, 3901479bcc7cSHerbert Xu { 3902479bcc7cSHerbert Xu .aead = { 3903479bcc7cSHerbert Xu .base = { 3904479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha256)," 3905479bcc7cSHerbert Xu "cbc(des)))", 3906479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3907479bcc7cSHerbert Xu "hmac-sha256-cbc-des-caam", 3908479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3909479bcc7cSHerbert Xu }, 3910479bcc7cSHerbert Xu .setkey = aead_setkey, 3911479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3912479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3913479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3914479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3915479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 3916479bcc7cSHerbert Xu }, 3917479bcc7cSHerbert Xu .caam = { 3918479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3919479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 3920479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3921479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 3922479bcc7cSHerbert Xu .geniv = true, 3923479bcc7cSHerbert Xu }, 3924479bcc7cSHerbert Xu }, 3925479bcc7cSHerbert Xu { 3926479bcc7cSHerbert Xu .aead = { 3927479bcc7cSHerbert Xu .base = { 3928479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha384),cbc(des))", 3929479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha384-" 3930479bcc7cSHerbert Xu "cbc-des-caam", 3931479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3932479bcc7cSHerbert Xu }, 3933479bcc7cSHerbert Xu .setkey = aead_setkey, 3934479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3935479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3936479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3937479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3938479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3939479bcc7cSHerbert Xu }, 3940479bcc7cSHerbert Xu .caam = { 3941479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3942479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3943479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3944479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3945479bcc7cSHerbert Xu }, 3946479bcc7cSHerbert Xu }, 3947479bcc7cSHerbert Xu { 3948479bcc7cSHerbert Xu .aead = { 3949479bcc7cSHerbert Xu .base = { 3950479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha384)," 3951479bcc7cSHerbert Xu "cbc(des)))", 3952479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3953479bcc7cSHerbert Xu "hmac-sha384-cbc-des-caam", 3954479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3955479bcc7cSHerbert Xu }, 3956479bcc7cSHerbert Xu .setkey = aead_setkey, 3957479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3958479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3959479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 3960479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3961479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 3962479bcc7cSHerbert Xu }, 3963479bcc7cSHerbert Xu .caam = { 3964479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3965479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 3966479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3967479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 3968479bcc7cSHerbert Xu .geniv = true, 3969479bcc7cSHerbert Xu }, 3970479bcc7cSHerbert Xu }, 3971479bcc7cSHerbert Xu { 3972479bcc7cSHerbert Xu .aead = { 3973479bcc7cSHerbert Xu .base = { 3974479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha512),cbc(des))", 3975479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha512-" 3976479bcc7cSHerbert Xu "cbc-des-caam", 3977479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 3978479bcc7cSHerbert Xu }, 3979479bcc7cSHerbert Xu .setkey = aead_setkey, 3980479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 3981479bcc7cSHerbert Xu .encrypt = aead_encrypt, 3982479bcc7cSHerbert Xu .decrypt = aead_decrypt, 3983479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 3984479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 3985479bcc7cSHerbert Xu }, 3986479bcc7cSHerbert Xu .caam = { 3987479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 3988479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 3989479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 3990479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 3991479bcc7cSHerbert Xu }, 3992479bcc7cSHerbert Xu }, 3993479bcc7cSHerbert Xu { 3994479bcc7cSHerbert Xu .aead = { 3995479bcc7cSHerbert Xu .base = { 3996479bcc7cSHerbert Xu .cra_name = "echainiv(authenc(hmac(sha512)," 3997479bcc7cSHerbert Xu "cbc(des)))", 3998479bcc7cSHerbert Xu .cra_driver_name = "echainiv-authenc-" 3999479bcc7cSHerbert Xu "hmac-sha512-cbc-des-caam", 4000479bcc7cSHerbert Xu .cra_blocksize = DES_BLOCK_SIZE, 4001479bcc7cSHerbert Xu }, 4002479bcc7cSHerbert Xu .setkey = aead_setkey, 4003479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4004479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4005479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4006479bcc7cSHerbert Xu .ivsize = DES_BLOCK_SIZE, 4007479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 4008479bcc7cSHerbert Xu }, 4009479bcc7cSHerbert Xu .caam = { 4010479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_DES | OP_ALG_AAI_CBC, 4011479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 4012479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4013479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 4014479bcc7cSHerbert Xu .geniv = true, 4015479bcc7cSHerbert Xu }, 4016479bcc7cSHerbert Xu }, 4017479bcc7cSHerbert Xu { 4018479bcc7cSHerbert Xu .aead = { 4019479bcc7cSHerbert Xu .base = { 4020479bcc7cSHerbert Xu .cra_name = "authenc(hmac(md5)," 4021479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4022479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-md5-" 4023479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4024479bcc7cSHerbert Xu .cra_blocksize = 1, 4025479bcc7cSHerbert Xu }, 4026479bcc7cSHerbert Xu .setkey = aead_setkey, 4027479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4028479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4029479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4030479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4031479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 4032479bcc7cSHerbert Xu }, 4033479bcc7cSHerbert Xu .caam = { 4034479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4035479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4036479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 4037479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4038479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 4039479bcc7cSHerbert Xu .rfc3686 = true, 4040479bcc7cSHerbert Xu }, 4041479bcc7cSHerbert Xu }, 4042479bcc7cSHerbert Xu { 4043479bcc7cSHerbert Xu .aead = { 4044479bcc7cSHerbert Xu .base = { 4045479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(" 4046479bcc7cSHerbert Xu "hmac(md5),rfc3686(ctr(aes))))", 4047479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-md5-" 4048479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4049479bcc7cSHerbert Xu .cra_blocksize = 1, 4050479bcc7cSHerbert Xu }, 4051479bcc7cSHerbert Xu .setkey = aead_setkey, 4052479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4053479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4054479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4055479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4056479bcc7cSHerbert Xu .maxauthsize = MD5_DIGEST_SIZE, 4057479bcc7cSHerbert Xu }, 4058479bcc7cSHerbert Xu .caam = { 4059479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4060479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4061479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_MD5 | 4062479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4063479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_MD5 | OP_ALG_AAI_HMAC, 4064479bcc7cSHerbert Xu .rfc3686 = true, 4065479bcc7cSHerbert Xu .geniv = true, 4066479bcc7cSHerbert Xu }, 4067479bcc7cSHerbert Xu }, 4068479bcc7cSHerbert Xu { 4069479bcc7cSHerbert Xu .aead = { 4070479bcc7cSHerbert Xu .base = { 4071479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha1)," 4072479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4073479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha1-" 4074479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4075479bcc7cSHerbert Xu .cra_blocksize = 1, 4076479bcc7cSHerbert Xu }, 4077479bcc7cSHerbert Xu .setkey = aead_setkey, 4078479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4079479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4080479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4081479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4082479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 4083479bcc7cSHerbert Xu }, 4084479bcc7cSHerbert Xu .caam = { 4085479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4086479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4087479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 4088479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4089479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 4090479bcc7cSHerbert Xu .rfc3686 = true, 4091479bcc7cSHerbert Xu }, 4092479bcc7cSHerbert Xu }, 4093479bcc7cSHerbert Xu { 4094479bcc7cSHerbert Xu .aead = { 4095479bcc7cSHerbert Xu .base = { 4096479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(" 4097479bcc7cSHerbert Xu "hmac(sha1),rfc3686(ctr(aes))))", 4098479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-sha1-" 4099479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4100479bcc7cSHerbert Xu .cra_blocksize = 1, 4101479bcc7cSHerbert Xu }, 4102479bcc7cSHerbert Xu .setkey = aead_setkey, 4103479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4104479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4105479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4106479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4107479bcc7cSHerbert Xu .maxauthsize = SHA1_DIGEST_SIZE, 4108479bcc7cSHerbert Xu }, 4109479bcc7cSHerbert Xu .caam = { 4110479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4111479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4112479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA1 | 4113479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4114479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA1 | OP_ALG_AAI_HMAC, 4115479bcc7cSHerbert Xu .rfc3686 = true, 4116479bcc7cSHerbert Xu .geniv = true, 4117479bcc7cSHerbert Xu }, 4118479bcc7cSHerbert Xu }, 4119479bcc7cSHerbert Xu { 4120479bcc7cSHerbert Xu .aead = { 4121479bcc7cSHerbert Xu .base = { 4122479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha224)," 4123479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4124479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha224-" 4125479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4126479bcc7cSHerbert Xu .cra_blocksize = 1, 4127479bcc7cSHerbert Xu }, 4128479bcc7cSHerbert Xu .setkey = aead_setkey, 4129479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4130479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4131479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4132479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4133479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 4134479bcc7cSHerbert Xu }, 4135479bcc7cSHerbert Xu .caam = { 4136479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4137479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4138479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 4139479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4140479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 4141479bcc7cSHerbert Xu .rfc3686 = true, 4142479bcc7cSHerbert Xu }, 4143479bcc7cSHerbert Xu }, 4144479bcc7cSHerbert Xu { 4145479bcc7cSHerbert Xu .aead = { 4146479bcc7cSHerbert Xu .base = { 4147479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(" 4148479bcc7cSHerbert Xu "hmac(sha224),rfc3686(ctr(aes))))", 4149479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-sha224-" 4150479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4151479bcc7cSHerbert Xu .cra_blocksize = 1, 4152479bcc7cSHerbert Xu }, 4153479bcc7cSHerbert Xu .setkey = aead_setkey, 4154479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4155479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4156479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4157479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4158479bcc7cSHerbert Xu .maxauthsize = SHA224_DIGEST_SIZE, 4159479bcc7cSHerbert Xu }, 4160479bcc7cSHerbert Xu .caam = { 4161479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4162479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4163479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA224 | 4164479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4165479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA224 | OP_ALG_AAI_HMAC, 4166479bcc7cSHerbert Xu .rfc3686 = true, 4167479bcc7cSHerbert Xu .geniv = true, 4168479bcc7cSHerbert Xu }, 4169479bcc7cSHerbert Xu }, 4170479bcc7cSHerbert Xu { 4171479bcc7cSHerbert Xu .aead = { 4172479bcc7cSHerbert Xu .base = { 4173479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha256)," 4174479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4175479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha256-" 4176479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4177479bcc7cSHerbert Xu .cra_blocksize = 1, 4178479bcc7cSHerbert Xu }, 4179479bcc7cSHerbert Xu .setkey = aead_setkey, 4180479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4181479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4182479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4183479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4184479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 4185479bcc7cSHerbert Xu }, 4186479bcc7cSHerbert Xu .caam = { 4187479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4188479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4189479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 4190479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4191479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 4192479bcc7cSHerbert Xu .rfc3686 = true, 4193479bcc7cSHerbert Xu }, 4194479bcc7cSHerbert Xu }, 4195479bcc7cSHerbert Xu { 4196479bcc7cSHerbert Xu .aead = { 4197479bcc7cSHerbert Xu .base = { 4198479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(hmac(sha256)," 4199479bcc7cSHerbert Xu "rfc3686(ctr(aes))))", 4200479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-sha256-" 4201479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4202479bcc7cSHerbert Xu .cra_blocksize = 1, 4203479bcc7cSHerbert Xu }, 4204479bcc7cSHerbert Xu .setkey = aead_setkey, 4205479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4206479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4207479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4208479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4209479bcc7cSHerbert Xu .maxauthsize = SHA256_DIGEST_SIZE, 4210479bcc7cSHerbert Xu }, 4211479bcc7cSHerbert Xu .caam = { 4212479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4213479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4214479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA256 | 4215479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4216479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA256 | OP_ALG_AAI_HMAC, 4217479bcc7cSHerbert Xu .rfc3686 = true, 4218479bcc7cSHerbert Xu .geniv = true, 4219479bcc7cSHerbert Xu }, 4220479bcc7cSHerbert Xu }, 4221479bcc7cSHerbert Xu { 4222479bcc7cSHerbert Xu .aead = { 4223479bcc7cSHerbert Xu .base = { 4224479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha384)," 4225479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4226479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha384-" 4227479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4228479bcc7cSHerbert Xu .cra_blocksize = 1, 4229479bcc7cSHerbert Xu }, 4230479bcc7cSHerbert Xu .setkey = aead_setkey, 4231479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4232479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4233479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4234479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4235479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 4236479bcc7cSHerbert Xu }, 4237479bcc7cSHerbert Xu .caam = { 4238479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4239479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4240479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 4241479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4242479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 4243479bcc7cSHerbert Xu .rfc3686 = true, 4244479bcc7cSHerbert Xu }, 4245479bcc7cSHerbert Xu }, 4246479bcc7cSHerbert Xu { 4247479bcc7cSHerbert Xu .aead = { 4248479bcc7cSHerbert Xu .base = { 4249479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(hmac(sha384)," 4250479bcc7cSHerbert Xu "rfc3686(ctr(aes))))", 4251479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-sha384-" 4252479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4253479bcc7cSHerbert Xu .cra_blocksize = 1, 4254479bcc7cSHerbert Xu }, 4255479bcc7cSHerbert Xu .setkey = aead_setkey, 4256479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4257479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4258479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4259479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4260479bcc7cSHerbert Xu .maxauthsize = SHA384_DIGEST_SIZE, 4261479bcc7cSHerbert Xu }, 4262479bcc7cSHerbert Xu .caam = { 4263479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4264479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4265479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA384 | 4266479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4267479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA384 | OP_ALG_AAI_HMAC, 4268479bcc7cSHerbert Xu .rfc3686 = true, 4269479bcc7cSHerbert Xu .geniv = true, 4270479bcc7cSHerbert Xu }, 4271479bcc7cSHerbert Xu }, 4272479bcc7cSHerbert Xu { 4273479bcc7cSHerbert Xu .aead = { 4274479bcc7cSHerbert Xu .base = { 4275479bcc7cSHerbert Xu .cra_name = "authenc(hmac(sha512)," 4276479bcc7cSHerbert Xu "rfc3686(ctr(aes)))", 4277479bcc7cSHerbert Xu .cra_driver_name = "authenc-hmac-sha512-" 4278479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4279479bcc7cSHerbert Xu .cra_blocksize = 1, 4280479bcc7cSHerbert Xu }, 4281479bcc7cSHerbert Xu .setkey = aead_setkey, 4282479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4283479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4284479bcc7cSHerbert Xu .decrypt = aead_decrypt, 4285479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4286479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 4287479bcc7cSHerbert Xu }, 4288479bcc7cSHerbert Xu .caam = { 4289479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4290479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4291479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 4292479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4293479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 4294479bcc7cSHerbert Xu .rfc3686 = true, 4295479bcc7cSHerbert Xu }, 4296479bcc7cSHerbert Xu }, 4297479bcc7cSHerbert Xu { 4298479bcc7cSHerbert Xu .aead = { 4299479bcc7cSHerbert Xu .base = { 4300479bcc7cSHerbert Xu .cra_name = "seqiv(authenc(hmac(sha512)," 4301479bcc7cSHerbert Xu "rfc3686(ctr(aes))))", 4302479bcc7cSHerbert Xu .cra_driver_name = "seqiv-authenc-hmac-sha512-" 4303479bcc7cSHerbert Xu "rfc3686-ctr-aes-caam", 4304479bcc7cSHerbert Xu .cra_blocksize = 1, 4305479bcc7cSHerbert Xu }, 4306479bcc7cSHerbert Xu .setkey = aead_setkey, 4307479bcc7cSHerbert Xu .setauthsize = aead_setauthsize, 4308479bcc7cSHerbert Xu .encrypt = aead_encrypt, 4309479bcc7cSHerbert Xu .decrypt = aead_givdecrypt, 4310479bcc7cSHerbert Xu .ivsize = CTR_RFC3686_IV_SIZE, 4311479bcc7cSHerbert Xu .maxauthsize = SHA512_DIGEST_SIZE, 4312479bcc7cSHerbert Xu }, 4313479bcc7cSHerbert Xu .caam = { 4314479bcc7cSHerbert Xu .class1_alg_type = OP_ALG_ALGSEL_AES | 4315479bcc7cSHerbert Xu OP_ALG_AAI_CTR_MOD128, 4316479bcc7cSHerbert Xu .class2_alg_type = OP_ALG_ALGSEL_SHA512 | 4317479bcc7cSHerbert Xu OP_ALG_AAI_HMAC_PRECOMP, 4318479bcc7cSHerbert Xu .alg_op = OP_ALG_ALGSEL_SHA512 | OP_ALG_AAI_HMAC, 4319479bcc7cSHerbert Xu .rfc3686 = true, 4320479bcc7cSHerbert Xu .geniv = true, 4321479bcc7cSHerbert Xu }, 4322479bcc7cSHerbert Xu }, 4323f2147b88SHerbert Xu }; 4324f2147b88SHerbert Xu 4325f2147b88SHerbert Xu struct caam_crypto_alg { 4326f2147b88SHerbert Xu struct crypto_alg crypto_alg; 4327f2147b88SHerbert Xu struct list_head entry; 4328f2147b88SHerbert Xu struct caam_alg_entry caam; 4329f2147b88SHerbert Xu }; 4330f2147b88SHerbert Xu 4331f2147b88SHerbert Xu static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam) 4332f2147b88SHerbert Xu { 4333f2147b88SHerbert Xu ctx->jrdev = caam_jr_alloc(); 4334f2147b88SHerbert Xu if (IS_ERR(ctx->jrdev)) { 4335f2147b88SHerbert Xu pr_err("Job Ring Device allocation for transform failed\n"); 4336f2147b88SHerbert Xu return PTR_ERR(ctx->jrdev); 4337f2147b88SHerbert Xu } 4338f2147b88SHerbert Xu 4339f2147b88SHerbert Xu /* copy descriptor header template value */ 4340f2147b88SHerbert Xu ctx->class1_alg_type = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; 4341f2147b88SHerbert Xu ctx->class2_alg_type = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; 4342f2147b88SHerbert Xu ctx->alg_op = OP_TYPE_CLASS2_ALG | caam->alg_op; 4343f2147b88SHerbert Xu 4344f2147b88SHerbert Xu return 0; 4345f2147b88SHerbert Xu } 4346f2147b88SHerbert Xu 43478e8ec596SKim Phillips static int caam_cra_init(struct crypto_tfm *tfm) 43488e8ec596SKim Phillips { 43498e8ec596SKim Phillips struct crypto_alg *alg = tfm->__crt_alg; 43508e8ec596SKim Phillips struct caam_crypto_alg *caam_alg = 43518e8ec596SKim Phillips container_of(alg, struct caam_crypto_alg, crypto_alg); 43528e8ec596SKim Phillips struct caam_ctx *ctx = crypto_tfm_ctx(tfm); 43538e8ec596SKim Phillips 4354f2147b88SHerbert Xu return caam_init_common(ctx, &caam_alg->caam); 4355cfc6f11bSRuchika Gupta } 43568e8ec596SKim Phillips 4357f2147b88SHerbert Xu static int caam_aead_init(struct crypto_aead *tfm) 43588e8ec596SKim Phillips { 4359f2147b88SHerbert Xu struct aead_alg *alg = crypto_aead_alg(tfm); 4360f2147b88SHerbert Xu struct caam_aead_alg *caam_alg = 4361f2147b88SHerbert Xu container_of(alg, struct caam_aead_alg, aead); 4362f2147b88SHerbert Xu struct caam_ctx *ctx = crypto_aead_ctx(tfm); 43638e8ec596SKim Phillips 4364f2147b88SHerbert Xu return caam_init_common(ctx, &caam_alg->caam); 4365f2147b88SHerbert Xu } 4366f2147b88SHerbert Xu 4367f2147b88SHerbert Xu static void caam_exit_common(struct caam_ctx *ctx) 4368f2147b88SHerbert Xu { 43691acebad3SYuan Kang if (ctx->sh_desc_enc_dma && 43701acebad3SYuan Kang !dma_mapping_error(ctx->jrdev, ctx->sh_desc_enc_dma)) 43711acebad3SYuan Kang dma_unmap_single(ctx->jrdev, ctx->sh_desc_enc_dma, 43721acebad3SYuan Kang desc_bytes(ctx->sh_desc_enc), DMA_TO_DEVICE); 43731acebad3SYuan Kang if (ctx->sh_desc_dec_dma && 43741acebad3SYuan Kang !dma_mapping_error(ctx->jrdev, ctx->sh_desc_dec_dma)) 43751acebad3SYuan Kang dma_unmap_single(ctx->jrdev, ctx->sh_desc_dec_dma, 43761acebad3SYuan Kang desc_bytes(ctx->sh_desc_dec), DMA_TO_DEVICE); 43771acebad3SYuan Kang if (ctx->sh_desc_givenc_dma && 43781acebad3SYuan Kang !dma_mapping_error(ctx->jrdev, ctx->sh_desc_givenc_dma)) 43791acebad3SYuan Kang dma_unmap_single(ctx->jrdev, ctx->sh_desc_givenc_dma, 43801acebad3SYuan Kang desc_bytes(ctx->sh_desc_givenc), 43814427b1b4SKim Phillips DMA_TO_DEVICE); 4382ec31eed7SHoria Geanta if (ctx->key_dma && 4383ec31eed7SHoria Geanta !dma_mapping_error(ctx->jrdev, ctx->key_dma)) 4384ec31eed7SHoria Geanta dma_unmap_single(ctx->jrdev, ctx->key_dma, 4385ec31eed7SHoria Geanta ctx->enckeylen + ctx->split_key_pad_len, 4386ec31eed7SHoria Geanta DMA_TO_DEVICE); 4387cfc6f11bSRuchika Gupta 4388cfc6f11bSRuchika Gupta caam_jr_free(ctx->jrdev); 43898e8ec596SKim Phillips } 43908e8ec596SKim Phillips 4391f2147b88SHerbert Xu static void caam_cra_exit(struct crypto_tfm *tfm) 4392f2147b88SHerbert Xu { 4393f2147b88SHerbert Xu caam_exit_common(crypto_tfm_ctx(tfm)); 4394f2147b88SHerbert Xu } 4395f2147b88SHerbert Xu 4396f2147b88SHerbert Xu static void caam_aead_exit(struct crypto_aead *tfm) 4397f2147b88SHerbert Xu { 4398f2147b88SHerbert Xu caam_exit_common(crypto_aead_ctx(tfm)); 4399f2147b88SHerbert Xu } 4400f2147b88SHerbert Xu 44018e8ec596SKim Phillips static void __exit caam_algapi_exit(void) 44028e8ec596SKim Phillips { 44038e8ec596SKim Phillips 44048e8ec596SKim Phillips struct caam_crypto_alg *t_alg, *n; 4405f2147b88SHerbert Xu int i; 4406f2147b88SHerbert Xu 4407f2147b88SHerbert Xu for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 4408f2147b88SHerbert Xu struct caam_aead_alg *t_alg = driver_aeads + i; 4409f2147b88SHerbert Xu 4410f2147b88SHerbert Xu if (t_alg->registered) 4411f2147b88SHerbert Xu crypto_unregister_aead(&t_alg->aead); 4412f2147b88SHerbert Xu } 44138e8ec596SKim Phillips 4414cfc6f11bSRuchika Gupta if (!alg_list.next) 44158e8ec596SKim Phillips return; 44168e8ec596SKim Phillips 4417cfc6f11bSRuchika Gupta list_for_each_entry_safe(t_alg, n, &alg_list, entry) { 44188e8ec596SKim Phillips crypto_unregister_alg(&t_alg->crypto_alg); 44198e8ec596SKim Phillips list_del(&t_alg->entry); 44208e8ec596SKim Phillips kfree(t_alg); 44218e8ec596SKim Phillips } 44228e8ec596SKim Phillips } 44238e8ec596SKim Phillips 4424cfc6f11bSRuchika Gupta static struct caam_crypto_alg *caam_alg_alloc(struct caam_alg_template 44258e8ec596SKim Phillips *template) 44268e8ec596SKim Phillips { 44278e8ec596SKim Phillips struct caam_crypto_alg *t_alg; 44288e8ec596SKim Phillips struct crypto_alg *alg; 44298e8ec596SKim Phillips 44309c4f9733SFabio Estevam t_alg = kzalloc(sizeof(*t_alg), GFP_KERNEL); 44318e8ec596SKim Phillips if (!t_alg) { 4432cfc6f11bSRuchika Gupta pr_err("failed to allocate t_alg\n"); 44338e8ec596SKim Phillips return ERR_PTR(-ENOMEM); 44348e8ec596SKim Phillips } 44358e8ec596SKim Phillips 44368e8ec596SKim Phillips alg = &t_alg->crypto_alg; 44378e8ec596SKim Phillips 44388e8ec596SKim Phillips snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s", template->name); 44398e8ec596SKim Phillips snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s", 44408e8ec596SKim Phillips template->driver_name); 44418e8ec596SKim Phillips alg->cra_module = THIS_MODULE; 44428e8ec596SKim Phillips alg->cra_init = caam_cra_init; 44438e8ec596SKim Phillips alg->cra_exit = caam_cra_exit; 44448e8ec596SKim Phillips alg->cra_priority = CAAM_CRA_PRIORITY; 44458e8ec596SKim Phillips alg->cra_blocksize = template->blocksize; 44468e8ec596SKim Phillips alg->cra_alignmask = 0; 44478e8ec596SKim Phillips alg->cra_ctxsize = sizeof(struct caam_ctx); 4448d912bb76SNikos Mavrogiannopoulos alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY | 4449d912bb76SNikos Mavrogiannopoulos template->type; 4450885e9e2fSYuan Kang switch (template->type) { 44517222d1a3SCatalin Vasile case CRYPTO_ALG_TYPE_GIVCIPHER: 44527222d1a3SCatalin Vasile alg->cra_type = &crypto_givcipher_type; 44537222d1a3SCatalin Vasile alg->cra_ablkcipher = template->template_ablkcipher; 44547222d1a3SCatalin Vasile break; 4455acdca31dSYuan Kang case CRYPTO_ALG_TYPE_ABLKCIPHER: 4456acdca31dSYuan Kang alg->cra_type = &crypto_ablkcipher_type; 4457acdca31dSYuan Kang alg->cra_ablkcipher = template->template_ablkcipher; 4458acdca31dSYuan Kang break; 4459885e9e2fSYuan Kang } 44608e8ec596SKim Phillips 4461f2147b88SHerbert Xu t_alg->caam.class1_alg_type = template->class1_alg_type; 4462f2147b88SHerbert Xu t_alg->caam.class2_alg_type = template->class2_alg_type; 4463f2147b88SHerbert Xu t_alg->caam.alg_op = template->alg_op; 44648e8ec596SKim Phillips 44658e8ec596SKim Phillips return t_alg; 44668e8ec596SKim Phillips } 44678e8ec596SKim Phillips 4468f2147b88SHerbert Xu static void caam_aead_alg_init(struct caam_aead_alg *t_alg) 4469f2147b88SHerbert Xu { 4470f2147b88SHerbert Xu struct aead_alg *alg = &t_alg->aead; 4471f2147b88SHerbert Xu 4472f2147b88SHerbert Xu alg->base.cra_module = THIS_MODULE; 4473f2147b88SHerbert Xu alg->base.cra_priority = CAAM_CRA_PRIORITY; 4474f2147b88SHerbert Xu alg->base.cra_ctxsize = sizeof(struct caam_ctx); 44755e4b8c1fSHerbert Xu alg->base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY; 4476f2147b88SHerbert Xu 4477f2147b88SHerbert Xu alg->init = caam_aead_init; 4478f2147b88SHerbert Xu alg->exit = caam_aead_exit; 4479f2147b88SHerbert Xu } 4480f2147b88SHerbert Xu 44818e8ec596SKim Phillips static int __init caam_algapi_init(void) 44828e8ec596SKim Phillips { 448335af6403SRuchika Gupta struct device_node *dev_node; 448435af6403SRuchika Gupta struct platform_device *pdev; 448535af6403SRuchika Gupta struct device *ctrldev; 4486bf83490eSVictoria Milhoan struct caam_drv_private *priv; 44878e8ec596SKim Phillips int i = 0, err = 0; 4488bf83490eSVictoria Milhoan u32 cha_vid, cha_inst, des_inst, aes_inst, md_inst; 4489bf83490eSVictoria Milhoan unsigned int md_limit = SHA512_DIGEST_SIZE; 4490f2147b88SHerbert Xu bool registered = false; 44918e8ec596SKim Phillips 449235af6403SRuchika Gupta dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); 449335af6403SRuchika Gupta if (!dev_node) { 449435af6403SRuchika Gupta dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); 449535af6403SRuchika Gupta if (!dev_node) 449635af6403SRuchika Gupta return -ENODEV; 449735af6403SRuchika Gupta } 449835af6403SRuchika Gupta 449935af6403SRuchika Gupta pdev = of_find_device_by_node(dev_node); 450035af6403SRuchika Gupta if (!pdev) { 450135af6403SRuchika Gupta of_node_put(dev_node); 450235af6403SRuchika Gupta return -ENODEV; 450335af6403SRuchika Gupta } 450435af6403SRuchika Gupta 450535af6403SRuchika Gupta ctrldev = &pdev->dev; 450635af6403SRuchika Gupta priv = dev_get_drvdata(ctrldev); 450735af6403SRuchika Gupta of_node_put(dev_node); 450835af6403SRuchika Gupta 450935af6403SRuchika Gupta /* 451035af6403SRuchika Gupta * If priv is NULL, it's probably because the caam driver wasn't 451135af6403SRuchika Gupta * properly initialized (e.g. RNG4 init failed). Thus, bail out here. 451235af6403SRuchika Gupta */ 451335af6403SRuchika Gupta if (!priv) 451435af6403SRuchika Gupta return -ENODEV; 451535af6403SRuchika Gupta 451635af6403SRuchika Gupta 4517cfc6f11bSRuchika Gupta INIT_LIST_HEAD(&alg_list); 45188e8ec596SKim Phillips 4519bf83490eSVictoria Milhoan /* 4520bf83490eSVictoria Milhoan * Register crypto algorithms the device supports. 4521bf83490eSVictoria Milhoan * First, detect presence and attributes of DES, AES, and MD blocks. 4522bf83490eSVictoria Milhoan */ 4523bf83490eSVictoria Milhoan cha_vid = rd_reg32(&priv->ctrl->perfmon.cha_id_ls); 4524bf83490eSVictoria Milhoan cha_inst = rd_reg32(&priv->ctrl->perfmon.cha_num_ls); 4525bf83490eSVictoria Milhoan des_inst = (cha_inst & CHA_ID_LS_DES_MASK) >> CHA_ID_LS_DES_SHIFT; 4526bf83490eSVictoria Milhoan aes_inst = (cha_inst & CHA_ID_LS_AES_MASK) >> CHA_ID_LS_AES_SHIFT; 4527bf83490eSVictoria Milhoan md_inst = (cha_inst & CHA_ID_LS_MD_MASK) >> CHA_ID_LS_MD_SHIFT; 45288e8ec596SKim Phillips 4529bf83490eSVictoria Milhoan /* If MD is present, limit digest size based on LP256 */ 4530bf83490eSVictoria Milhoan if (md_inst && ((cha_vid & CHA_ID_LS_MD_MASK) == CHA_ID_LS_MD_LP256)) 4531bf83490eSVictoria Milhoan md_limit = SHA256_DIGEST_SIZE; 4532bf83490eSVictoria Milhoan 4533bf83490eSVictoria Milhoan for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { 4534bf83490eSVictoria Milhoan struct caam_crypto_alg *t_alg; 4535bf83490eSVictoria Milhoan struct caam_alg_template *alg = driver_algs + i; 4536bf83490eSVictoria Milhoan u32 alg_sel = alg->class1_alg_type & OP_ALG_ALGSEL_MASK; 4537bf83490eSVictoria Milhoan 4538bf83490eSVictoria Milhoan /* Skip DES algorithms if not supported by device */ 4539bf83490eSVictoria Milhoan if (!des_inst && 4540bf83490eSVictoria Milhoan ((alg_sel == OP_ALG_ALGSEL_3DES) || 4541bf83490eSVictoria Milhoan (alg_sel == OP_ALG_ALGSEL_DES))) 4542bf83490eSVictoria Milhoan continue; 4543bf83490eSVictoria Milhoan 4544bf83490eSVictoria Milhoan /* Skip AES algorithms if not supported by device */ 4545bf83490eSVictoria Milhoan if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 4546bf83490eSVictoria Milhoan continue; 4547bf83490eSVictoria Milhoan 4548bf83490eSVictoria Milhoan t_alg = caam_alg_alloc(alg); 45498e8ec596SKim Phillips if (IS_ERR(t_alg)) { 45508e8ec596SKim Phillips err = PTR_ERR(t_alg); 4551bf83490eSVictoria Milhoan pr_warn("%s alg allocation failed\n", alg->driver_name); 45528e8ec596SKim Phillips continue; 45538e8ec596SKim Phillips } 45548e8ec596SKim Phillips 45558e8ec596SKim Phillips err = crypto_register_alg(&t_alg->crypto_alg); 45568e8ec596SKim Phillips if (err) { 4557cfc6f11bSRuchika Gupta pr_warn("%s alg registration failed\n", 45588e8ec596SKim Phillips t_alg->crypto_alg.cra_driver_name); 45598e8ec596SKim Phillips kfree(t_alg); 4560f2147b88SHerbert Xu continue; 45618e8ec596SKim Phillips } 4562f2147b88SHerbert Xu 4563f2147b88SHerbert Xu list_add_tail(&t_alg->entry, &alg_list); 4564f2147b88SHerbert Xu registered = true; 4565f2147b88SHerbert Xu } 4566f2147b88SHerbert Xu 4567f2147b88SHerbert Xu for (i = 0; i < ARRAY_SIZE(driver_aeads); i++) { 4568f2147b88SHerbert Xu struct caam_aead_alg *t_alg = driver_aeads + i; 4569bf83490eSVictoria Milhoan u32 c1_alg_sel = t_alg->caam.class1_alg_type & 4570bf83490eSVictoria Milhoan OP_ALG_ALGSEL_MASK; 4571bf83490eSVictoria Milhoan u32 c2_alg_sel = t_alg->caam.class2_alg_type & 4572bf83490eSVictoria Milhoan OP_ALG_ALGSEL_MASK; 4573bf83490eSVictoria Milhoan u32 alg_aai = t_alg->caam.class1_alg_type & OP_ALG_AAI_MASK; 4574bf83490eSVictoria Milhoan 4575bf83490eSVictoria Milhoan /* Skip DES algorithms if not supported by device */ 4576bf83490eSVictoria Milhoan if (!des_inst && 4577bf83490eSVictoria Milhoan ((c1_alg_sel == OP_ALG_ALGSEL_3DES) || 4578bf83490eSVictoria Milhoan (c1_alg_sel == OP_ALG_ALGSEL_DES))) 4579bf83490eSVictoria Milhoan continue; 4580bf83490eSVictoria Milhoan 4581bf83490eSVictoria Milhoan /* Skip AES algorithms if not supported by device */ 4582bf83490eSVictoria Milhoan if (!aes_inst && (c1_alg_sel == OP_ALG_ALGSEL_AES)) 4583bf83490eSVictoria Milhoan continue; 4584bf83490eSVictoria Milhoan 4585bf83490eSVictoria Milhoan /* 4586bf83490eSVictoria Milhoan * Check support for AES algorithms not available 4587bf83490eSVictoria Milhoan * on LP devices. 4588bf83490eSVictoria Milhoan */ 4589bf83490eSVictoria Milhoan if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP) 4590bf83490eSVictoria Milhoan if (alg_aai == OP_ALG_AAI_GCM) 4591bf83490eSVictoria Milhoan continue; 4592bf83490eSVictoria Milhoan 4593bf83490eSVictoria Milhoan /* 4594bf83490eSVictoria Milhoan * Skip algorithms requiring message digests 4595bf83490eSVictoria Milhoan * if MD or MD size is not supported by device. 4596bf83490eSVictoria Milhoan */ 4597bf83490eSVictoria Milhoan if (c2_alg_sel && 4598bf83490eSVictoria Milhoan (!md_inst || (t_alg->aead.maxauthsize > md_limit))) 4599bf83490eSVictoria Milhoan continue; 4600f2147b88SHerbert Xu 4601f2147b88SHerbert Xu caam_aead_alg_init(t_alg); 4602f2147b88SHerbert Xu 4603f2147b88SHerbert Xu err = crypto_register_aead(&t_alg->aead); 4604f2147b88SHerbert Xu if (err) { 4605f2147b88SHerbert Xu pr_warn("%s alg registration failed\n", 4606f2147b88SHerbert Xu t_alg->aead.base.cra_driver_name); 4607f2147b88SHerbert Xu continue; 4608f2147b88SHerbert Xu } 4609f2147b88SHerbert Xu 4610f2147b88SHerbert Xu t_alg->registered = true; 4611f2147b88SHerbert Xu registered = true; 4612f2147b88SHerbert Xu } 4613f2147b88SHerbert Xu 4614f2147b88SHerbert Xu if (registered) 4615cfc6f11bSRuchika Gupta pr_info("caam algorithms registered in /proc/crypto\n"); 46168e8ec596SKim Phillips 46178e8ec596SKim Phillips return err; 46188e8ec596SKim Phillips } 46198e8ec596SKim Phillips 46208e8ec596SKim Phillips module_init(caam_algapi_init); 46218e8ec596SKim Phillips module_exit(caam_algapi_exit); 46228e8ec596SKim Phillips 46238e8ec596SKim Phillips MODULE_LICENSE("GPL"); 46248e8ec596SKim Phillips MODULE_DESCRIPTION("FSL CAAM support for crypto API"); 46258e8ec596SKim Phillips MODULE_AUTHOR("Freescale Semiconductor - NMG/STC"); 4626