brintos

brintos / linux-shallow public Read only

0
0
Text · 4.6 KiB · 6195645 Raw
146 lines · c
1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)2/*3 * Shared descriptors for ahash algorithms4 *5 * Copyright 2017-2019 NXP6 */7 8#include "compat.h"9#include "desc_constr.h"10#include "caamhash_desc.h"11 12/**13 * cnstr_shdsc_ahash - ahash shared descriptor14 * @desc: pointer to buffer used for descriptor construction15 * @adata: pointer to authentication transform definitions.16 *         A split key is required for SEC Era < 6; the size of the split key17 *         is specified in this case.18 *         Valid algorithm values - one of OP_ALG_ALGSEL_{MD5, SHA1, SHA224,19 *         SHA256, SHA384, SHA512}.20 * @state: algorithm state OP_ALG_AS_{INIT, FINALIZE, INITFINALIZE, UPDATE}21 * @digestsize: algorithm's digest size22 * @ctx_len: size of Context Register23 * @import_ctx: true if previous Context Register needs to be restored24 *              must be true for ahash update and final25 *              must be false for ahash first and digest26 * @era: SEC Era27 */28void cnstr_shdsc_ahash(u32 * const desc, struct alginfo *adata, u32 state,29		       int digestsize, int ctx_len, bool import_ctx, int era)30{31	u32 op = adata->algtype;32 33	init_sh_desc(desc, HDR_SHARE_SERIAL);34 35	/* Append key if it has been set; ahash update excluded */36	if (state != OP_ALG_AS_UPDATE && adata->keylen) {37		u32 *skip_key_load;38 39		/* Skip key loading if already shared */40		skip_key_load = append_jump(desc, JUMP_JSL | JUMP_TEST_ALL |41					    JUMP_COND_SHRD);42 43		if (era < 6)44			append_key_as_imm(desc, adata->key_virt,45					  adata->keylen_pad,46					  adata->keylen, CLASS_2 |47					  KEY_DEST_MDHA_SPLIT | KEY_ENC);48		else49			append_proto_dkp(desc, adata);50 51		set_jump_tgt_here(desc, skip_key_load);52 53		op |= OP_ALG_AAI_HMAC_PRECOMP;54	}55 56	/* If needed, import context from software */57	if (import_ctx)58		append_seq_load(desc, ctx_len, LDST_CLASS_2_CCB |59				LDST_SRCDST_BYTE_CONTEXT);60 61	/* Class 2 operation */62	append_operation(desc, op | state | OP_ALG_ENCRYPT);63 64	/*65	 * Load from buf and/or src and write to req->result or state->context66	 * Calculate remaining bytes to read67	 */68	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);69	/* Read remaining bytes */70	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS2 | FIFOLD_TYPE_LAST2 |71			     FIFOLD_TYPE_MSG | KEY_VLF);72	/* Store class2 context bytes */73	append_seq_store(desc, digestsize, LDST_CLASS_2_CCB |74			 LDST_SRCDST_BYTE_CONTEXT);75}76EXPORT_SYMBOL(cnstr_shdsc_ahash);77 78/**79 * cnstr_shdsc_sk_hash - shared descriptor for symmetric key cipher-based80 *                       hash algorithms81 * @desc: pointer to buffer used for descriptor construction82 * @adata: pointer to authentication transform definitions.83 * @state: algorithm state OP_ALG_AS_{INIT, FINALIZE, INITFINALIZE, UPDATE}84 * @digestsize: algorithm's digest size85 * @ctx_len: size of Context Register86 */87void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state,88			 int digestsize, int ctx_len)89{90	u32 *skip_key_load;91 92	init_sh_desc(desc, HDR_SHARE_SERIAL | HDR_SAVECTX);93 94	/* Skip loading of key, context if already shared */95	skip_key_load = append_jump(desc, JUMP_TEST_ALL | JUMP_COND_SHRD);96 97	if (state == OP_ALG_AS_INIT || state == OP_ALG_AS_INITFINAL) {98		append_key_as_imm(desc, adata->key_virt, adata->keylen,99				  adata->keylen, CLASS_1 | KEY_DEST_CLASS_REG);100	} else { /* UPDATE, FINALIZE */101		if (is_xcbc_aes(adata->algtype))102			/* Load K1 */103			append_key(desc, adata->key_dma, adata->keylen,104				   CLASS_1 | KEY_DEST_CLASS_REG | KEY_ENC);105		else /* CMAC */106			append_key_as_imm(desc, adata->key_virt, adata->keylen,107					  adata->keylen, CLASS_1 |108					  KEY_DEST_CLASS_REG);109		/* Restore context */110		append_seq_load(desc, ctx_len, LDST_CLASS_1_CCB |111				LDST_SRCDST_BYTE_CONTEXT);112	}113 114	set_jump_tgt_here(desc, skip_key_load);115 116	/* Class 1 operation */117	append_operation(desc, adata->algtype | state | OP_ALG_ENCRYPT);118 119	/*120	 * Load from buf and/or src and write to req->result or state->context121	 * Calculate remaining bytes to read122	 */123	append_math_add(desc, VARSEQINLEN, SEQINLEN, REG0, CAAM_CMD_SZ);124 125	/* Read remaining bytes */126	append_seq_fifo_load(desc, 0, FIFOLD_CLASS_CLASS1 | FIFOLD_TYPE_LAST1 |127			     FIFOLD_TYPE_MSG | FIFOLDST_VLF);128 129	/*130	 * Save context:131	 * - xcbc: partial hash, keys K2 and K3132	 * - cmac: partial hash, constant L = E(K,0)133	 */134	append_seq_store(desc, digestsize, LDST_CLASS_1_CCB |135			 LDST_SRCDST_BYTE_CONTEXT);136	if (is_xcbc_aes(adata->algtype) && state == OP_ALG_AS_INIT)137		/* Save K1 */138		append_fifo_store(desc, adata->key_dma, adata->keylen,139				  LDST_CLASS_1_CCB | FIFOST_TYPE_KEY_KEK);140}141EXPORT_SYMBOL(cnstr_shdsc_sk_hash);142 143MODULE_LICENSE("Dual BSD/GPL");144MODULE_DESCRIPTION("FSL CAAM ahash descriptors support");145MODULE_AUTHOR("NXP Semiconductors");146