^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Shared descriptors for aead, skcipher algorithms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2016-2019 NXP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "compat.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "desc_constr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "caamalg_desc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * For aead functions, read payload and write payload,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * both of which are specified in req->src and req->dst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static inline void aead_append_src_dst(u32 *desc, u32 msg_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) KEY_VLF | msg_type | FIFOLD_TYPE_LASTBOTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* Set DK bit in class 1 operation if shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static inline void append_dec_op1(u32 *desc, u32 type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) u32 *jump_cmd, *uncond_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* DK bit is valid only for AES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if ((type & OP_ALG_ALGSEL_MASK) != OP_ALG_ALGSEL_AES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) append_operation(desc, type | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) jump_cmd = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) uncond_jump_cmd = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) set_jump_tgt_here(desc, jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) append_operation(desc, type | OP_ALG_AS_INIT | OP_ALG_DECRYPT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) OP_ALG_AAI_DK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) set_jump_tgt_here(desc, uncond_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * cnstr_shdsc_aead_null_encap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * (non-protocol) with no (null) encryption.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) void cnstr_shdsc_aead_null_encap(u32 * const desc, struct alginfo *adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned int icvsize, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /* assoclen + cryptlen = seqinlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* Prepare to read and write cryptlen + assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) write_move_cmd = append_move(desc, MOVE_SRC_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) (0x8 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) MOVE_AUX_LS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) print_hex_dump_debug("aead null enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) EXPORT_SYMBOL(cnstr_shdsc_aead_null_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * cnstr_shdsc_aead_null_decap - IPSec ESP decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * (non-protocol) with no (null) decryption.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) void cnstr_shdsc_aead_null_decap(u32 * const desc, struct alginfo *adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) unsigned int icvsize, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd, *jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* assoclen + cryptlen = seqoutlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) append_math_sub(desc, REG2, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* Prepare to read and write cryptlen + assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) append_math_add(desc, VARSEQINLEN, ZERO, REG2, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) append_math_add(desc, VARSEQOUTLEN, ZERO, REG2, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) MOVE_DEST_MATH2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) write_move_cmd = append_move(desc, MOVE_SRC_MATH2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) (0x8 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) aead_append_src_dst(desc, FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) * Insert a NOP here, since we need at least 4 instructions between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * code patching the descriptor buffer and the location being patched.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) jump_cmd = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) set_jump_tgt_here(desc, jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) MOVE_AUX_LS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* Load ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) print_hex_dump_debug("aead null dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) EXPORT_SYMBOL(cnstr_shdsc_aead_null_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static void init_sh_desc_key_aead(u32 * const desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct alginfo * const cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct alginfo * const adata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) const bool is_rfc3686, u32 *nonce, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) unsigned int enckeylen = cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) /* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) * RFC3686 specific:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * | key = {AUTH_KEY, ENC_KEY, NONCE}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) * | enckeylen = encryption key size + nonce size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) enckeylen -= CTR_RFC3686_NONCE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) if (era < 6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) if (adata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) append_key_as_imm(desc, adata->key_virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) adata->keylen_pad, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) CLASS_2 | KEY_DEST_MDHA_SPLIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) append_key(desc, adata->key_dma, adata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) CLASS_2 | KEY_DEST_MDHA_SPLIT | KEY_ENC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) append_proto_dkp(desc, adata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) append_key_as_imm(desc, cdata->key_virt, enckeylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) enckeylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) append_key(desc, cdata->key_dma, enckeylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) append_move(desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) MOVE_DEST_CLASS1CTX |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * cnstr_shdsc_aead_encap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) * Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) * A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) * is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) * OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) * with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) void cnstr_shdsc_aead_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) unsigned int icvsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) u32 *nonce, const u32 ctx1_iv_off, const bool is_qi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) /* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) (ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) /* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) print_hex_dump_debug("aead enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) EXPORT_SYMBOL(cnstr_shdsc_aead_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) * cnstr_shdsc_aead_decap - IPSec ESP decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) * Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) * with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) * A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) * is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) * OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * @geniv: whether to generate Encrypted Chain IV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) void cnstr_shdsc_aead_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) unsigned int icvsize, const bool geniv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) const bool is_rfc3686, u32 *nonce,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) const u32 ctx1_iv_off, const bool is_qi, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* Class 2 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (!geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) (ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) /* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) append_math_add_imm_u32(desc, VARSEQOUTLEN, REG3, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (geniv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) append_math_add_imm_u32(desc, VARSEQOUTLEN, DPOVRD, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) /* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (geniv) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) (ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_CLASS2INFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) (ctx1_iv_off << MOVE_OFFSET_SHIFT) | ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) /* Choose operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) if (ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /* Load ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) print_hex_dump_debug("aead dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) EXPORT_SYMBOL(cnstr_shdsc_aead_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * cnstr_shdsc_aead_givencap - IPSec ESP encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) * (non-protocol) with HW-generated initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) * vector.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) * Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) * with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) * @adata: pointer to authentication transform definitions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * A split key is required for SEC Era < 6; the size of the split key
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * is specified in this case. Valid algorithm values - one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * OP_ALG_ALGSEL_{MD5, SHA1, SHA224, SHA256, SHA384, SHA512} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) * with OP_ALG_AAI_HMAC_PRECOMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) * @nonce: pointer to rfc3686 nonce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) * @era: SEC Era
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) void cnstr_shdsc_aead_givencap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) unsigned int icvsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) u32 *nonce, const u32 ctx1_iv_off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) const bool is_qi, int era)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) u32 geniv, moveiv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) u32 *wait_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) /* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) init_sh_desc_key_aead(desc, cdata, adata, is_rfc3686, nonce, era);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) (ctx1_iv_off << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) goto copy_iv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) /* Generate IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) NFIFOENTRY_DTYPE_MSG | NFIFOENTRY_LC1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) NFIFOENTRY_PTYPE_RND | (ivsize << NFIFOENTRY_DLEN_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) append_load_imm_u32(desc, geniv, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) append_move(desc, MOVE_WAITCOMP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) MOVE_SRC_INFIFO | MOVE_DEST_CLASS1CTX |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) (ivsize << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) copy_iv:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) /* Copy IV to class 1 context */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) append_move(desc, MOVE_SRC_CLASS1CTX | MOVE_DEST_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) (ctx1_iv_off << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) (ivsize << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /* Return to encryption */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) /* Read and write assoclen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) if (is_qi || era < 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) append_math_add(desc, VARSEQINLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) append_math_add(desc, VARSEQOUTLEN, ZERO, DPOVRD, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) /* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /* read assoc before reading payload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_MSG |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) /* Copy iv from outfifo to class 2 fifo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) moveiv = NFIFOENTRY_STYPE_OFIFO | NFIFOENTRY_DEST_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) NFIFOENTRY_DTYPE_MSG | (ivsize << NFIFOENTRY_DLEN_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) append_load_imm_u32(desc, moveiv, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) LDST_SRCDST_WORD_INFO_FIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) append_load_imm_u32(desc, ivsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) LDST_SRCDST_WORD_DATASZ_REG | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) /* Load Counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) /* Will write ivsize + cryptlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) /* Not need to reload iv */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) append_seq_fifo_load(desc, ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) /* Will read cryptlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) * Wait for IV transfer (ofifo -> class2) to finish before starting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) * ciphertext transfer (ofifo -> external memory).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL | JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) set_jump_tgt_here(desc, wait_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | KEY_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) FIFOLD_TYPE_MSG1OUT2 | FIFOLD_TYPE_LASTBOTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) print_hex_dump_debug("aead givenc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) EXPORT_SYMBOL(cnstr_shdsc_aead_givencap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) * cnstr_shdsc_gcm_encap - gcm encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) void cnstr_shdsc_gcm_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) *zero_assoc_jump_cmd2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) /* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) /* class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) append_math_sub_imm_u32(desc, VARSEQOUTLEN, SEQINLEN, IMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) /* if assoclen + cryptlen is ZERO, skip to ICV write */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) zero_assoc_jump_cmd2 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* if assoclen is ZERO, skip reading the assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) /* skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /* cryptlen = seqinlen - assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) /* if cryptlen is ZERO jump to zero-payload commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) /* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) /* write encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) /* read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) /* jump to ICV writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) append_jump(desc, JUMP_TEST_ALL | 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) append_jump(desc, JUMP_TEST_ALL | 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) /* zero-payload commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) set_jump_tgt_here(desc, zero_payload_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) /* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) /* jump to ICV writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) append_jump(desc, JUMP_TEST_ALL | 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) /* There is no input data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) set_jump_tgt_here(desc, zero_assoc_jump_cmd2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) /* write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) print_hex_dump_debug("gcm enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) EXPORT_SYMBOL(cnstr_shdsc_gcm_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * cnstr_shdsc_gcm_decap - gcm decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) void cnstr_shdsc_gcm_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) u32 *key_jump_cmd, *zero_payload_jump_cmd, *zero_assoc_jump_cmd1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) key_jump_cmd = append_jump(desc, JUMP_JSL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) JUMP_TEST_ALL | JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /* class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /* if assoclen is ZERO, skip reading the assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) zero_assoc_jump_cmd1 = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) /* skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) /* read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) set_jump_tgt_here(desc, zero_assoc_jump_cmd1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) /* cryptlen = seqoutlen - assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) /* jump to zero-payload command if cryptlen is zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) zero_payload_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) /* store encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) /* read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /* zero-payload command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) set_jump_tgt_here(desc, zero_payload_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) /* read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) print_hex_dump_debug("gcm dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) EXPORT_SYMBOL(cnstr_shdsc_gcm_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) * cnstr_shdsc_rfc4106_encap - IPSec ESP gcm encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) * Input sequence: AAD | PTXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) * Output sequence: AAD | CTXT | ICV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) * AAD length (assoclen), which includes the IV length, is available in Math3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) void cnstr_shdsc_rfc4106_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) u32 *key_jump_cmd, *zero_cryptlen_jump_cmd, *skip_instructions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /* Skip AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) /* Read cryptlen and set this value into VARSEQOUTLEN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) /* If cryptlen is ZERO jump to AAD command */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) zero_cryptlen_jump_cmd = append_jump(desc, JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) JUMP_COND_MATH_Z);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) /* Read AAD data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) /* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) /* Skip IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) append_math_add(desc, VARSEQINLEN, VARSEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /* Write encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* Read payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) /* Jump instructions to avoid double reading of AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) skip_instructions = append_jump(desc, JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) /* There is no input data, cryptlen = 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) set_jump_tgt_here(desc, zero_cryptlen_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) /* Read AAD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) set_jump_tgt_here(desc, skip_instructions);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) print_hex_dump_debug("rfc4106 enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) EXPORT_SYMBOL(cnstr_shdsc_rfc4106_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) * cnstr_shdsc_rfc4106_decap - IPSec ESP gcm decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) void cnstr_shdsc_rfc4106_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) /* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) (4 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) /* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) append_math_sub_imm_u32(desc, VARSEQINLEN, REG3, IMM, ivsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) /* Read assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) FIFOLD_TYPE_AAD | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) /* Skip IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) /* Will read cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) /* Workaround for erratum A-005473 (simultaneous SEQ FIFO skips) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) /* Skip assoc data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) append_seq_fifo_store(desc, 0, FIFOST_TYPE_SKIP | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) /* Will write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* Store payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) /* Read encrypted data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) FIFOLD_TYPE_MSG | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) /* Read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) print_hex_dump_debug("rfc4106 dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) EXPORT_SYMBOL(cnstr_shdsc_rfc4106_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) * cnstr_shdsc_rfc4543_encap - IPSec ESP gmac encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) void cnstr_shdsc_rfc4543_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) /* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) /* assoclen is not needed, skip it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) /* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) /* assoclen + cryptlen = seqinlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) append_math_sub(desc, REG3, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) /* Will read assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) append_math_sub(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) /* Will write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) append_math_sub(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) /* Read and write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) aead_append_src_dst(desc, FIFOLD_TYPE_AAD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) /* Move payload data to OFIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) append_seq_store(desc, icvsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) print_hex_dump_debug("rfc4543 enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) EXPORT_SYMBOL(cnstr_shdsc_rfc4543_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) * cnstr_shdsc_rfc4543_decap - IPSec ESP gmac decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) * (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_GCM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) void cnstr_shdsc_rfc4543_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) unsigned int ivsize, unsigned int icvsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) u32 *key_jump_cmd, *read_move_cmd, *write_move_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) init_sh_desc(desc, HDR_SHARE_SERIAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) /* Skip key loading if it is loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (cdata->key_inline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) append_key(desc, cdata->key_dma, cdata->keylen, CLASS_1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /* Class 1 operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) /* assoclen is not needed, skip it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) append_seq_fifo_load(desc, 4, FIFOLD_CLASS_SKIP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) /* Read salt and IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) append_fifo_load_as_imm(desc, (void *)(cdata->key_virt +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) cdata->keylen), 4, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) FIFOLD_TYPE_IV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) append_seq_fifo_load(desc, ivsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) FIFOLD_TYPE_IV | FIFOLD_TYPE_FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) /* assoclen + cryptlen = seqoutlen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) append_math_sub(desc, REG3, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) * MOVE_LEN opcode is not available in all SEC HW revisions,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * thus need to do some magic, i.e. self-patch the descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) read_move_cmd = append_move(desc, MOVE_SRC_DESCBUF | MOVE_DEST_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) (0x6 << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) write_move_cmd = append_move(desc, MOVE_SRC_MATH3 | MOVE_DEST_DESCBUF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) (0x8 << MOVE_LEN_SHIFT) | MOVE_WAITCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) /* Will read assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) append_math_sub(desc, VARSEQINLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) /* Will write assoclen + cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) append_math_sub(desc, VARSEQOUTLEN, SEQOUTLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) /* Store payload data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | FIFOLDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) /* In-snoop assoclen + cryptlen data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_BOTH | FIFOLDST_VLF |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) FIFOLD_TYPE_AAD | FIFOLD_TYPE_LAST2FLUSH1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) set_move_tgt_here(desc, read_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) set_move_tgt_here(desc, write_move_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) append_cmd(desc, CMD_LOAD | DISABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) /* Move payload data to OFIFO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) append_move(desc, MOVE_SRC_INFIFO_CL | MOVE_DEST_OUTFIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) append_cmd(desc, CMD_LOAD | ENABLE_AUTO_INFO_FIFO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) /* Read ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) FIFOLD_TYPE_ICV | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) print_hex_dump_debug("rfc4543 dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) EXPORT_SYMBOL(cnstr_shdsc_rfc4543_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) * cnstr_shdsc_chachapoly - Chacha20 + Poly1305 generic AEAD (rfc7539) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * IPsec ESP (rfc7634, a.k.a. rfc7539esp) shared
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * descriptor (non-protocol).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * Valid algorithm values - OP_ALG_ALGSEL_CHACHA20 ANDed with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * OP_ALG_AAI_AEAD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) * @adata: pointer to authentication transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * Valid algorithm values - OP_ALG_ALGSEL_POLY1305 ANDed with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) * OP_ALG_AAI_AEAD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) * @icvsize: integrity check value (ICV) size (truncated or full)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * @encap: true if encapsulation, false if decapsulation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) * @is_qi: true when called from caam/qi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) void cnstr_shdsc_chachapoly(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) struct alginfo *adata, unsigned int ivsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) unsigned int icvsize, const bool encap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) const bool is_qi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) u32 *key_jump_cmd, *wait_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) u32 nfifo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) const bool is_ipsec = (ivsize != CHACHAPOLY_IV_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) /* Note: Context registers are saved. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) /* skip key loading if they are loaded due to sharing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) append_key_as_imm(desc, cdata->key_virt, cdata->keylen, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) /* For IPsec load the salt from keymat in the context register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (is_ipsec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) append_load_as_imm(desc, cdata->key_virt + cdata->keylen, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) LDST_CLASS_1_CCB | LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 4 << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) /* Class 2 and 1 operations: Poly & ChaCha */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) if (encap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) append_operation(desc, adata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) OP_ALG_DECRYPT | OP_ALG_ICV_ON);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) if (is_qi) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) u32 *wait_load_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) u32 ctx1_iv_off = is_ipsec ? 8 : 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) /* REG3 = assoclen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) append_seq_load(desc, 4, LDST_CLASS_DECO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) LDST_SRCDST_WORD_DECO_MATH3 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 4 << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) wait_load_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) JUMP_COND_CALM | JUMP_COND_NCP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) JUMP_COND_NOP | JUMP_COND_NIP |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) JUMP_COND_NIFP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) set_jump_tgt_here(desc, wait_load_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) append_seq_load(desc, ivsize, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) ctx1_iv_off << LDST_OFFSET_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) * MAGIC with NFIFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) * Read associated data from the input and send them to class1 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) * class2 alignment blocks. From class1 send data to output fifo and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) * then write it to memory since we don't need to encrypt AD.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) nfifo = NFIFOENTRY_DEST_BOTH | NFIFOENTRY_FC1 | NFIFOENTRY_FC2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) NFIFOENTRY_DTYPE_POLY | NFIFOENTRY_BND;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) append_load_imm_u32(desc, nfifo, LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) LDST_SRCDST_WORD_INFO_FIFO_SM | LDLEN_MATH3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) append_math_add(desc, VARSEQINLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) append_math_add(desc, VARSEQOUTLEN, ZERO, REG3, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) append_seq_fifo_load(desc, 0, FIFOLD_TYPE_NOINFOFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) FIFOLD_CLASS_CLASS1 | LDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) append_move_len(desc, MOVE_AUX_LS | MOVE_SRC_AUX_ABLK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) MOVE_DEST_OUTFIFO | MOVELEN_MRSEL_MATH3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | LDST_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) /* IPsec - copy IV at the output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) if (is_ipsec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) append_seq_fifo_store(desc, ivsize, FIFOST_TYPE_METADATA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 0x2 << 25);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) wait_cmd = append_jump(desc, JUMP_JSL | JUMP_TYPE_LOCAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) JUMP_COND_NOP | JUMP_TEST_ALL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) set_jump_tgt_here(desc, wait_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) if (encap) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) aead_append_src_dst(desc, FIFOLD_TYPE_MSG1OUT2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) /* Write ICV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) append_seq_store(desc, icvsize, LDST_CLASS_2_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) LDST_SRCDST_BYTE_CONTEXT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) /* Read and write cryptlen bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) append_math_add(desc, VARSEQINLEN, SEQOUTLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) append_math_add(desc, VARSEQOUTLEN, SEQOUTLEN, REG0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) aead_append_src_dst(desc, FIFOLD_TYPE_MSG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) /* Load ICV for verification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) append_seq_fifo_load(desc, icvsize, FIFOLD_CLASS_CLASS2 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) FIFOLD_TYPE_LAST2 | FIFOLD_TYPE_ICV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) print_hex_dump_debug("chachapoly shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) EXPORT_SYMBOL(cnstr_shdsc_chachapoly);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) /* For skcipher encrypt and decrypt, read from req->src and write to req->dst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) static inline void skcipher_append_src_dst(u32 *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) append_math_add(desc, VARSEQOUTLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) KEY_VLF | FIFOLD_TYPE_MSG | FIFOLD_TYPE_LAST1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) append_seq_fifo_store(desc, 0, FIFOST_TYPE_MESSAGE_DATA | KEY_VLF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) * cnstr_shdsc_skcipher_encap - skcipher encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) * Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) * - OP_ALG_ALGSEL_CHACHA20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) void cnstr_shdsc_skcipher_encap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) unsigned int ivsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) const u32 ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) u32 options = cdata->algtype | OP_ALG_AS_INIT | OP_ALG_ENCRYPT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) OP_ALG_ALGSEL_CHACHA20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) /* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) /* Load nonce into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) const u8 *nonce = cdata->key_virt + cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) /* Load IV, if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) if (ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) /* Load counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) /* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (is_chacha20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) options |= OP_ALG_AS_FINALIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) append_operation(desc, options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) /* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) /* Store IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) if (!is_chacha20 && ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) print_hex_dump_debug("skcipher enc shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) EXPORT_SYMBOL(cnstr_shdsc_skcipher_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) * cnstr_shdsc_skcipher_decap - skcipher decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) * Valid algorithm values - one of OP_ALG_ALGSEL_{AES, DES, 3DES} ANDed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) * with OP_ALG_AAI_CBC or OP_ALG_AAI_CTR_MOD128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) * - OP_ALG_ALGSEL_CHACHA20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) * @ivsize: initialization vector size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) * @ctx1_iv_off: IV offset in CONTEXT1 register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) void cnstr_shdsc_skcipher_decap(u32 * const desc, struct alginfo *cdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) unsigned int ivsize, const bool is_rfc3686,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) const u32 ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) bool is_chacha20 = ((cdata->algtype & OP_ALG_ALGSEL_MASK) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) OP_ALG_ALGSEL_CHACHA20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) /* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) /* Load nonce into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) if (is_rfc3686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) const u8 *nonce = cdata->key_virt + cdata->keylen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) append_load_as_imm(desc, nonce, CTR_RFC3686_NONCE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) LDST_CLASS_IND_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) LDST_SRCDST_BYTE_OUTFIFO | LDST_IMM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) append_move(desc, MOVE_WAITCOMP | MOVE_SRC_OUTFIFO |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) MOVE_DEST_CLASS1CTX | (16 << MOVE_OFFSET_SHIFT) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) (CTR_RFC3686_NONCE_SIZE << MOVE_LEN_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) /* Load IV, if there is one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) if (ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) append_seq_load(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) /* Load counter into CONTEXT1 reg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) if (is_rfc3686)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) append_load_imm_be32(desc, 1, LDST_IMM | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) ((ctx1_iv_off + CTR_RFC3686_IV_SIZE) <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) /* Choose operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) if (ctx1_iv_off)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) append_operation(desc, cdata->algtype | OP_ALG_AS_INIT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) OP_ALG_DECRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) /* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) /* Store IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) if (!is_chacha20 && ivsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) append_seq_store(desc, ivsize, LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) LDST_CLASS_1_CCB | (ctx1_iv_off <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) print_hex_dump_debug("skcipher dec shdesc@" __stringify(__LINE__)": ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) DUMP_PREFIX_ADDRESS, 16, 4, desc, desc_bytes(desc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) EXPORT_SYMBOL(cnstr_shdsc_skcipher_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) * cnstr_shdsc_xts_skcipher_encap - xts skcipher encapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) void cnstr_shdsc_xts_skcipher_encap(u32 * const desc, struct alginfo *cdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) * Set sector size to a big value, practically disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) * sector size segmentation in xts implementation. We cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) * take full advantage of this HW feature with existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) * crypto API / dm-crypt SW architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) __be64 sector_size = cpu_to_be64(BIT(15));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) /* Load class1 keys only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) /* Load sector size with index 40 bytes (0x28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) append_load_as_imm(desc, (void *)§or_size, 8, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) (0x28 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) * create sequence for loading the sector index / 16B tweak value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) * Lower 8B of IV - sector index / tweak lower half
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) * Upper 8B of IV - upper half of 16B tweak
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) /* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) append_operation(desc, cdata->algtype | OP_ALG_AS_INITFINAL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) OP_ALG_ENCRYPT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) /* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) /* Store lower 8B and upper 8B of IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) print_hex_dump_debug("xts skcipher enc shdesc@" __stringify(__LINE__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) ": ", DUMP_PREFIX_ADDRESS, 16, 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) desc, desc_bytes(desc), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) EXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_encap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * cnstr_shdsc_xts_skcipher_decap - xts skcipher decapsulation shared descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) * @desc: pointer to buffer used for descriptor construction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) * @cdata: pointer to block cipher transform definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) * Valid algorithm values - OP_ALG_ALGSEL_AES ANDed with OP_ALG_AAI_XTS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) void cnstr_shdsc_xts_skcipher_decap(u32 * const desc, struct alginfo *cdata)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) * Set sector size to a big value, practically disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) * sector size segmentation in xts implementation. We cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) * take full advantage of this HW feature with existing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) * crypto API / dm-crypt SW architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) __be64 sector_size = cpu_to_be64(BIT(15));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) u32 *key_jump_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) /* Skip if already shared */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) key_jump_cmd = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) JUMP_COND_SHRD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) /* Load class1 key only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) append_key_as_imm(desc, cdata->key_virt, cdata->keylen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) cdata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) /* Load sector size with index 40 bytes (0x28) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) append_load_as_imm(desc, (void *)§or_size, 8, LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) LDST_SRCDST_BYTE_CONTEXT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) (0x28 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) set_jump_tgt_here(desc, key_jump_cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) * create sequence for loading the sector index / 16B tweak value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) * Lower 8B of IV - sector index / tweak lower half
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) * Upper 8B of IV - upper half of 16B tweak
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) append_seq_load(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) /* Load operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) append_dec_op1(desc, cdata->algtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) /* Perform operation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) skcipher_append_src_dst(desc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) /* Store lower 8B and upper 8B of IV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) (0x20 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) append_seq_store(desc, 8, LDST_SRCDST_BYTE_CONTEXT | LDST_CLASS_1_CCB |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) (0x30 << LDST_OFFSET_SHIFT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) print_hex_dump_debug("xts skcipher dec shdesc@" __stringify(__LINE__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) ": ", DUMP_PREFIX_ADDRESS, 16, 4, desc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) desc_bytes(desc), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) EXPORT_SYMBOL(cnstr_shdsc_xts_skcipher_decap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) MODULE_DESCRIPTION("FSL CAAM descriptor support");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) MODULE_AUTHOR("Freescale Semiconductor - NMG/STC");