xref: /linux/drivers/crypto/inside-secure/eip93/eip93-hash.c (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
19739f5f9SChristian Marangi // SPDX-License-Identifier: GPL-2.0
29739f5f9SChristian Marangi /*
39739f5f9SChristian Marangi  * Copyright (C) 2024
49739f5f9SChristian Marangi  *
59739f5f9SChristian Marangi  * Christian Marangi <ansuelsmth@gmail.com
69739f5f9SChristian Marangi  */
79739f5f9SChristian Marangi 
89739f5f9SChristian Marangi #include <crypto/sha1.h>
99739f5f9SChristian Marangi #include <crypto/sha2.h>
109739f5f9SChristian Marangi #include <crypto/md5.h>
119739f5f9SChristian Marangi #include <crypto/hmac.h>
129739f5f9SChristian Marangi #include <linux/dma-mapping.h>
139739f5f9SChristian Marangi #include <linux/delay.h>
149739f5f9SChristian Marangi 
159739f5f9SChristian Marangi #include "eip93-cipher.h"
169739f5f9SChristian Marangi #include "eip93-hash.h"
179739f5f9SChristian Marangi #include "eip93-main.h"
189739f5f9SChristian Marangi #include "eip93-common.h"
199739f5f9SChristian Marangi #include "eip93-regs.h"
209739f5f9SChristian Marangi 
219739f5f9SChristian Marangi static void eip93_hash_free_data_blocks(struct ahash_request *req)
229739f5f9SChristian Marangi {
239739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
249739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
259739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
269739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
279739f5f9SChristian Marangi 	struct mkt_hash_block *block, *tmp;
289739f5f9SChristian Marangi 
299739f5f9SChristian Marangi 	list_for_each_entry_safe(block, tmp, &rctx->blocks, list) {
309739f5f9SChristian Marangi 		dma_unmap_single(eip93->dev, block->data_dma,
319739f5f9SChristian Marangi 				 SHA256_BLOCK_SIZE, DMA_TO_DEVICE);
329739f5f9SChristian Marangi 		kfree(block);
339739f5f9SChristian Marangi 	}
349739f5f9SChristian Marangi 	if (!list_empty(&rctx->blocks))
359739f5f9SChristian Marangi 		INIT_LIST_HEAD(&rctx->blocks);
369739f5f9SChristian Marangi 
379739f5f9SChristian Marangi 	if (rctx->finalize)
389739f5f9SChristian Marangi 		dma_unmap_single(eip93->dev, rctx->data_dma,
399739f5f9SChristian Marangi 				 rctx->data_used,
409739f5f9SChristian Marangi 				 DMA_TO_DEVICE);
419739f5f9SChristian Marangi }
429739f5f9SChristian Marangi 
439739f5f9SChristian Marangi static void eip93_hash_free_sa_record(struct ahash_request *req)
449739f5f9SChristian Marangi {
459739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
469739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
479739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
489739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
499739f5f9SChristian Marangi 
509739f5f9SChristian Marangi 	if (IS_HMAC(ctx->flags))
519739f5f9SChristian Marangi 		dma_unmap_single(eip93->dev, rctx->sa_record_hmac_base,
529739f5f9SChristian Marangi 				 sizeof(rctx->sa_record_hmac), DMA_TO_DEVICE);
539739f5f9SChristian Marangi 
549739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_record_base,
559739f5f9SChristian Marangi 			 sizeof(rctx->sa_record), DMA_TO_DEVICE);
569739f5f9SChristian Marangi }
579739f5f9SChristian Marangi 
589739f5f9SChristian Marangi void eip93_hash_handle_result(struct crypto_async_request *async, int err)
599739f5f9SChristian Marangi {
609739f5f9SChristian Marangi 	struct ahash_request *req = ahash_request_cast(async);
619739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
629739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
639739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
649739f5f9SChristian Marangi 	int digestsize = crypto_ahash_digestsize(ahash);
659739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
669739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
679739f5f9SChristian Marangi 	int i;
689739f5f9SChristian Marangi 
699739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_state_base,
709739f5f9SChristian Marangi 			 sizeof(*sa_state), DMA_FROM_DEVICE);
719739f5f9SChristian Marangi 
729739f5f9SChristian Marangi 	/*
739739f5f9SChristian Marangi 	 * With partial_hash assume SHA256_DIGEST_SIZE buffer is passed.
749739f5f9SChristian Marangi 	 * This is to handle SHA224 that have a 32 byte intermediate digest.
759739f5f9SChristian Marangi 	 */
769739f5f9SChristian Marangi 	if (rctx->partial_hash)
779739f5f9SChristian Marangi 		digestsize = SHA256_DIGEST_SIZE;
789739f5f9SChristian Marangi 
799739f5f9SChristian Marangi 	if (rctx->finalize || rctx->partial_hash) {
809739f5f9SChristian Marangi 		/* bytes needs to be swapped for req->result */
819739f5f9SChristian Marangi 		if (!IS_HASH_MD5(ctx->flags)) {
829739f5f9SChristian Marangi 			for (i = 0; i < digestsize / sizeof(u32); i++) {
839739f5f9SChristian Marangi 				u32 *digest = (u32 *)sa_state->state_i_digest;
849739f5f9SChristian Marangi 
859739f5f9SChristian Marangi 				digest[i] = be32_to_cpu((__be32 __force)digest[i]);
869739f5f9SChristian Marangi 			}
879739f5f9SChristian Marangi 		}
889739f5f9SChristian Marangi 
899739f5f9SChristian Marangi 		memcpy(req->result, sa_state->state_i_digest, digestsize);
909739f5f9SChristian Marangi 	}
919739f5f9SChristian Marangi 
929739f5f9SChristian Marangi 	eip93_hash_free_sa_record(req);
939739f5f9SChristian Marangi 	eip93_hash_free_data_blocks(req);
949739f5f9SChristian Marangi 
959739f5f9SChristian Marangi 	ahash_request_complete(req, err);
969739f5f9SChristian Marangi }
979739f5f9SChristian Marangi 
989739f5f9SChristian Marangi static void eip93_hash_init_sa_state_digest(u32 hash, u8 *digest)
999739f5f9SChristian Marangi {
100*83366bccSColin Ian King 	static const u32 sha256_init[] = {
101*83366bccSColin Ian King 		SHA256_H0, SHA256_H1, SHA256_H2, SHA256_H3,
102*83366bccSColin Ian King 		SHA256_H4, SHA256_H5, SHA256_H6, SHA256_H7
103*83366bccSColin Ian King 	};
104*83366bccSColin Ian King 	static const u32 sha224_init[] = {
105*83366bccSColin Ian King 		SHA224_H0, SHA224_H1, SHA224_H2, SHA224_H3,
106*83366bccSColin Ian King 		SHA224_H4, SHA224_H5, SHA224_H6, SHA224_H7
107*83366bccSColin Ian King 	};
108*83366bccSColin Ian King 	static const u32 sha1_init[] = {
109*83366bccSColin Ian King 		SHA1_H0, SHA1_H1, SHA1_H2, SHA1_H3, SHA1_H4
110*83366bccSColin Ian King 	};
111*83366bccSColin Ian King 	static const u32 md5_init[] = {
112*83366bccSColin Ian King 		MD5_H0, MD5_H1, MD5_H2, MD5_H3
113*83366bccSColin Ian King 	};
1149739f5f9SChristian Marangi 
1159739f5f9SChristian Marangi 	/* Init HASH constant */
1169739f5f9SChristian Marangi 	switch (hash) {
1179739f5f9SChristian Marangi 	case EIP93_HASH_SHA256:
1189739f5f9SChristian Marangi 		memcpy(digest, sha256_init, sizeof(sha256_init));
1199739f5f9SChristian Marangi 		return;
1209739f5f9SChristian Marangi 	case EIP93_HASH_SHA224:
1219739f5f9SChristian Marangi 		memcpy(digest, sha224_init, sizeof(sha224_init));
1229739f5f9SChristian Marangi 		return;
1239739f5f9SChristian Marangi 	case EIP93_HASH_SHA1:
1249739f5f9SChristian Marangi 		memcpy(digest, sha1_init, sizeof(sha1_init));
1259739f5f9SChristian Marangi 		return;
1269739f5f9SChristian Marangi 	case EIP93_HASH_MD5:
1279739f5f9SChristian Marangi 		memcpy(digest, md5_init, sizeof(md5_init));
1289739f5f9SChristian Marangi 		return;
1299739f5f9SChristian Marangi 	default: /* Impossible */
1309739f5f9SChristian Marangi 		return;
1319739f5f9SChristian Marangi 	}
1329739f5f9SChristian Marangi }
1339739f5f9SChristian Marangi 
1349739f5f9SChristian Marangi static void eip93_hash_export_sa_state(struct ahash_request *req,
1359739f5f9SChristian Marangi 				       struct eip93_hash_export_state *state)
1369739f5f9SChristian Marangi {
1379739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
1389739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
1399739f5f9SChristian Marangi 
1409739f5f9SChristian Marangi 	/*
1419739f5f9SChristian Marangi 	 * EIP93 have special handling for state_byte_cnt in sa_state.
1429739f5f9SChristian Marangi 	 * Even if a zero packet is passed (and a BADMSG is returned),
1439739f5f9SChristian Marangi 	 * state_byte_cnt is incremented to the digest handled (with the hash
1449739f5f9SChristian Marangi 	 * primitive). This is problematic with export/import as EIP93
1459739f5f9SChristian Marangi 	 * expect 0 state_byte_cnt for the very first iteration.
1469739f5f9SChristian Marangi 	 */
1479739f5f9SChristian Marangi 	if (!rctx->len)
1489739f5f9SChristian Marangi 		memset(state->state_len, 0, sizeof(u32) * 2);
1499739f5f9SChristian Marangi 	else
1509739f5f9SChristian Marangi 		memcpy(state->state_len, sa_state->state_byte_cnt,
1519739f5f9SChristian Marangi 		       sizeof(u32) * 2);
1529739f5f9SChristian Marangi 	memcpy(state->state_hash, sa_state->state_i_digest,
1539739f5f9SChristian Marangi 	       SHA256_DIGEST_SIZE);
1549739f5f9SChristian Marangi 	state->len = rctx->len;
1559739f5f9SChristian Marangi 	state->data_used = rctx->data_used;
1569739f5f9SChristian Marangi }
1579739f5f9SChristian Marangi 
1589739f5f9SChristian Marangi static void __eip93_hash_init(struct ahash_request *req)
1599739f5f9SChristian Marangi {
1609739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
1619739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1629739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1639739f5f9SChristian Marangi 	struct sa_record *sa_record = &rctx->sa_record;
1649739f5f9SChristian Marangi 	int digestsize;
1659739f5f9SChristian Marangi 
1669739f5f9SChristian Marangi 	digestsize = crypto_ahash_digestsize(ahash);
1679739f5f9SChristian Marangi 
1689739f5f9SChristian Marangi 	eip93_set_sa_record(sa_record, 0, ctx->flags);
1699739f5f9SChristian Marangi 	sa_record->sa_cmd0_word |= EIP93_SA_CMD_HASH_FROM_STATE;
1709739f5f9SChristian Marangi 	sa_record->sa_cmd0_word |= EIP93_SA_CMD_SAVE_HASH;
1719739f5f9SChristian Marangi 	sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_OPCODE;
1729739f5f9SChristian Marangi 	sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_OPCODE,
1739739f5f9SChristian Marangi 					      EIP93_SA_CMD_OPCODE_BASIC_OUT_HASH);
1749739f5f9SChristian Marangi 	sa_record->sa_cmd0_word &= ~EIP93_SA_CMD_DIGEST_LENGTH;
1759739f5f9SChristian Marangi 	sa_record->sa_cmd0_word |= FIELD_PREP(EIP93_SA_CMD_DIGEST_LENGTH,
1769739f5f9SChristian Marangi 					      digestsize / sizeof(u32));
1779739f5f9SChristian Marangi 
1789739f5f9SChristian Marangi 	/*
1799739f5f9SChristian Marangi 	 * HMAC special handling
1809739f5f9SChristian Marangi 	 * Enabling CMD_HMAC force the inner hash to be always finalized.
1819739f5f9SChristian Marangi 	 * This cause problems on handling message > 64 byte as we
1829739f5f9SChristian Marangi 	 * need to produce intermediate inner hash on sending intermediate
1839739f5f9SChristian Marangi 	 * 64 bytes blocks.
1849739f5f9SChristian Marangi 	 *
1859739f5f9SChristian Marangi 	 * To handle this, enable CMD_HMAC only on the last block.
1869739f5f9SChristian Marangi 	 * We make a duplicate of sa_record and on the last descriptor,
1879739f5f9SChristian Marangi 	 * we pass a dedicated sa_record with CMD_HMAC enabled to make
1889739f5f9SChristian Marangi 	 * EIP93 apply the outer hash.
1899739f5f9SChristian Marangi 	 */
1909739f5f9SChristian Marangi 	if (IS_HMAC(ctx->flags)) {
1919739f5f9SChristian Marangi 		struct sa_record *sa_record_hmac = &rctx->sa_record_hmac;
1929739f5f9SChristian Marangi 
1939739f5f9SChristian Marangi 		memcpy(sa_record_hmac, sa_record, sizeof(*sa_record));
1949739f5f9SChristian Marangi 		/* Copy pre-hashed opad for HMAC */
1959739f5f9SChristian Marangi 		memcpy(sa_record_hmac->sa_o_digest, ctx->opad, SHA256_DIGEST_SIZE);
1969739f5f9SChristian Marangi 
1979739f5f9SChristian Marangi 		/* Disable HMAC for hash normal sa_record */
1989739f5f9SChristian Marangi 		sa_record->sa_cmd1_word &= ~EIP93_SA_CMD_HMAC;
1999739f5f9SChristian Marangi 	}
2009739f5f9SChristian Marangi 
2019739f5f9SChristian Marangi 	rctx->len = 0;
2029739f5f9SChristian Marangi 	rctx->data_used = 0;
2039739f5f9SChristian Marangi 	rctx->partial_hash = false;
2049739f5f9SChristian Marangi 	rctx->finalize = false;
2059739f5f9SChristian Marangi 	INIT_LIST_HEAD(&rctx->blocks);
2069739f5f9SChristian Marangi }
2079739f5f9SChristian Marangi 
2089739f5f9SChristian Marangi static int eip93_send_hash_req(struct crypto_async_request *async, u8 *data,
2099739f5f9SChristian Marangi 			       dma_addr_t *data_dma, u32 len, bool last)
2109739f5f9SChristian Marangi {
2119739f5f9SChristian Marangi 	struct ahash_request *req = ahash_request_cast(async);
2129739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
2139739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
2149739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
2159739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
2169739f5f9SChristian Marangi 	struct eip93_descriptor cdesc = { };
2179739f5f9SChristian Marangi 	dma_addr_t src_addr;
2189739f5f9SChristian Marangi 	int ret;
2199739f5f9SChristian Marangi 
2209739f5f9SChristian Marangi 	/* Map block data to DMA */
2219739f5f9SChristian Marangi 	src_addr = dma_map_single(eip93->dev, data, len, DMA_TO_DEVICE);
2229739f5f9SChristian Marangi 	ret = dma_mapping_error(eip93->dev, src_addr);
2239739f5f9SChristian Marangi 	if (ret)
2249739f5f9SChristian Marangi 		return ret;
2259739f5f9SChristian Marangi 
2269739f5f9SChristian Marangi 	cdesc.pe_ctrl_stat_word = FIELD_PREP(EIP93_PE_CTRL_PE_READY_DES_TRING_OWN,
2279739f5f9SChristian Marangi 					     EIP93_PE_CTRL_HOST_READY);
2289739f5f9SChristian Marangi 	cdesc.sa_addr = rctx->sa_record_base;
2299739f5f9SChristian Marangi 	cdesc.arc4_addr = 0;
2309739f5f9SChristian Marangi 
2319739f5f9SChristian Marangi 	cdesc.state_addr = rctx->sa_state_base;
2329739f5f9SChristian Marangi 	cdesc.src_addr = src_addr;
2339739f5f9SChristian Marangi 	cdesc.pe_length_word = FIELD_PREP(EIP93_PE_LENGTH_HOST_PE_READY,
2349739f5f9SChristian Marangi 					  EIP93_PE_LENGTH_HOST_READY);
2359739f5f9SChristian Marangi 	cdesc.pe_length_word |= FIELD_PREP(EIP93_PE_LENGTH_LENGTH,
2369739f5f9SChristian Marangi 					   len);
2379739f5f9SChristian Marangi 
2389739f5f9SChristian Marangi 	cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_HASH);
2399739f5f9SChristian Marangi 
2409739f5f9SChristian Marangi 	if (last) {
2419739f5f9SChristian Marangi 		int crypto_async_idr;
2429739f5f9SChristian Marangi 
2439739f5f9SChristian Marangi 		if (rctx->finalize && !rctx->partial_hash) {
2449739f5f9SChristian Marangi 			/* For last block, pass sa_record with CMD_HMAC enabled */
2459739f5f9SChristian Marangi 			if (IS_HMAC(ctx->flags)) {
2469739f5f9SChristian Marangi 				struct sa_record *sa_record_hmac = &rctx->sa_record_hmac;
2479739f5f9SChristian Marangi 
2489739f5f9SChristian Marangi 				rctx->sa_record_hmac_base = dma_map_single(eip93->dev,
2499739f5f9SChristian Marangi 									   sa_record_hmac,
2509739f5f9SChristian Marangi 									   sizeof(*sa_record_hmac),
2519739f5f9SChristian Marangi 									   DMA_TO_DEVICE);
2529739f5f9SChristian Marangi 				ret = dma_mapping_error(eip93->dev, rctx->sa_record_hmac_base);
2539739f5f9SChristian Marangi 				if (ret)
2549739f5f9SChristian Marangi 					return ret;
2559739f5f9SChristian Marangi 
2569739f5f9SChristian Marangi 				cdesc.sa_addr = rctx->sa_record_hmac_base;
2579739f5f9SChristian Marangi 			}
2589739f5f9SChristian Marangi 
2599739f5f9SChristian Marangi 			cdesc.pe_ctrl_stat_word |= EIP93_PE_CTRL_PE_HASH_FINAL;
2609739f5f9SChristian Marangi 		}
2619739f5f9SChristian Marangi 
2629739f5f9SChristian Marangi 		scoped_guard(spinlock_bh, &eip93->ring->idr_lock)
2639739f5f9SChristian Marangi 			crypto_async_idr = idr_alloc(&eip93->ring->crypto_async_idr, async, 0,
2649739f5f9SChristian Marangi 						     EIP93_RING_NUM - 1, GFP_ATOMIC);
2659739f5f9SChristian Marangi 
2669739f5f9SChristian Marangi 		cdesc.user_id |= FIELD_PREP(EIP93_PE_USER_ID_CRYPTO_IDR, (u16)crypto_async_idr) |
2679739f5f9SChristian Marangi 				 FIELD_PREP(EIP93_PE_USER_ID_DESC_FLAGS, EIP93_DESC_LAST);
2689739f5f9SChristian Marangi 	}
2699739f5f9SChristian Marangi 
2709739f5f9SChristian Marangi again:
27112e0b15bSChristian Marangi 	scoped_guard(spinlock_irqsave, &eip93->ring->write_lock)
2729739f5f9SChristian Marangi 		ret = eip93_put_descriptor(eip93, &cdesc);
2739739f5f9SChristian Marangi 	if (ret) {
2749739f5f9SChristian Marangi 		usleep_range(EIP93_RING_BUSY_DELAY,
2759739f5f9SChristian Marangi 			     EIP93_RING_BUSY_DELAY * 2);
2769739f5f9SChristian Marangi 		goto again;
2779739f5f9SChristian Marangi 	}
2789739f5f9SChristian Marangi 
2799739f5f9SChristian Marangi 	/* Writing new descriptor count starts DMA action */
2809739f5f9SChristian Marangi 	writel(1, eip93->base + EIP93_REG_PE_CD_COUNT);
2819739f5f9SChristian Marangi 
2829739f5f9SChristian Marangi 	*data_dma = src_addr;
2839739f5f9SChristian Marangi 	return 0;
2849739f5f9SChristian Marangi }
2859739f5f9SChristian Marangi 
2869739f5f9SChristian Marangi static int eip93_hash_init(struct ahash_request *req)
2879739f5f9SChristian Marangi {
2889739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
2899739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
2909739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
2919739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
2929739f5f9SChristian Marangi 
2939739f5f9SChristian Marangi 	memset(sa_state->state_byte_cnt, 0, sizeof(u32) * 2);
2949739f5f9SChristian Marangi 	eip93_hash_init_sa_state_digest(ctx->flags & EIP93_HASH_MASK,
2959739f5f9SChristian Marangi 					sa_state->state_i_digest);
2969739f5f9SChristian Marangi 
2979739f5f9SChristian Marangi 	__eip93_hash_init(req);
2989739f5f9SChristian Marangi 
2999739f5f9SChristian Marangi 	/* For HMAC setup the initial block for ipad */
3009739f5f9SChristian Marangi 	if (IS_HMAC(ctx->flags)) {
3019739f5f9SChristian Marangi 		memcpy(rctx->data, ctx->ipad, SHA256_BLOCK_SIZE);
3029739f5f9SChristian Marangi 
3039739f5f9SChristian Marangi 		rctx->data_used = SHA256_BLOCK_SIZE;
3049739f5f9SChristian Marangi 		rctx->len += SHA256_BLOCK_SIZE;
3059739f5f9SChristian Marangi 	}
3069739f5f9SChristian Marangi 
3079739f5f9SChristian Marangi 	return 0;
3089739f5f9SChristian Marangi }
3099739f5f9SChristian Marangi 
3109739f5f9SChristian Marangi /*
3119739f5f9SChristian Marangi  * With complete_req true, we wait for the engine to consume all the block in list,
3129739f5f9SChristian Marangi  * else we just queue the block to the engine as final() will wait. This is useful
3139739f5f9SChristian Marangi  * for finup().
3149739f5f9SChristian Marangi  */
3159739f5f9SChristian Marangi static int __eip93_hash_update(struct ahash_request *req, bool complete_req)
3169739f5f9SChristian Marangi {
3179739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
3189739f5f9SChristian Marangi 	struct crypto_async_request *async = &req->base;
3199739f5f9SChristian Marangi 	unsigned int read, to_consume = req->nbytes;
3209739f5f9SChristian Marangi 	unsigned int max_read, consumed = 0;
3219739f5f9SChristian Marangi 	struct mkt_hash_block *block;
3229739f5f9SChristian Marangi 	bool wait_req = false;
3239739f5f9SChristian Marangi 	int offset;
3249739f5f9SChristian Marangi 	int ret;
3259739f5f9SChristian Marangi 
3269739f5f9SChristian Marangi 	/* Get the offset and available space to fill req data */
3279739f5f9SChristian Marangi 	offset = rctx->data_used;
3289739f5f9SChristian Marangi 	max_read = SHA256_BLOCK_SIZE - offset;
3299739f5f9SChristian Marangi 
3309739f5f9SChristian Marangi 	/* Consume req in block of SHA256_BLOCK_SIZE.
3319739f5f9SChristian Marangi 	 * to_read is initially set to space available in the req data
3329739f5f9SChristian Marangi 	 * and then reset to SHA256_BLOCK_SIZE.
3339739f5f9SChristian Marangi 	 */
3349739f5f9SChristian Marangi 	while (to_consume > max_read) {
3359739f5f9SChristian Marangi 		block = kzalloc(sizeof(*block), GFP_ATOMIC);
3369739f5f9SChristian Marangi 		if (!block) {
3379739f5f9SChristian Marangi 			ret = -ENOMEM;
3389739f5f9SChristian Marangi 			goto free_blocks;
3399739f5f9SChristian Marangi 		}
3409739f5f9SChristian Marangi 
3419739f5f9SChristian Marangi 		read = sg_pcopy_to_buffer(req->src, sg_nents(req->src),
3429739f5f9SChristian Marangi 					  block->data + offset,
3439739f5f9SChristian Marangi 					  max_read, consumed);
3449739f5f9SChristian Marangi 
3459739f5f9SChristian Marangi 		/*
3469739f5f9SChristian Marangi 		 * For first iteration only, copy req data to block
3479739f5f9SChristian Marangi 		 * and reset offset and max_read for next iteration.
3489739f5f9SChristian Marangi 		 */
3499739f5f9SChristian Marangi 		if (offset > 0) {
3509739f5f9SChristian Marangi 			memcpy(block->data, rctx->data, offset);
3519739f5f9SChristian Marangi 			offset = 0;
3529739f5f9SChristian Marangi 			max_read = SHA256_BLOCK_SIZE;
3539739f5f9SChristian Marangi 		}
3549739f5f9SChristian Marangi 
3559739f5f9SChristian Marangi 		list_add(&block->list, &rctx->blocks);
3569739f5f9SChristian Marangi 		to_consume -= read;
3579739f5f9SChristian Marangi 		consumed += read;
3589739f5f9SChristian Marangi 	}
3599739f5f9SChristian Marangi 
3609739f5f9SChristian Marangi 	/* Write the remaining data to req data */
3619739f5f9SChristian Marangi 	read = sg_pcopy_to_buffer(req->src, sg_nents(req->src),
3629739f5f9SChristian Marangi 				  rctx->data + offset, to_consume,
3639739f5f9SChristian Marangi 				  consumed);
3649739f5f9SChristian Marangi 	rctx->data_used = offset + read;
3659739f5f9SChristian Marangi 
3669739f5f9SChristian Marangi 	/* Update counter with processed bytes */
3679739f5f9SChristian Marangi 	rctx->len += read + consumed;
3689739f5f9SChristian Marangi 
3699739f5f9SChristian Marangi 	/* Consume all the block added to list */
3709739f5f9SChristian Marangi 	list_for_each_entry_reverse(block, &rctx->blocks, list) {
3719739f5f9SChristian Marangi 		wait_req = complete_req &&
3729739f5f9SChristian Marangi 			    list_is_first(&block->list, &rctx->blocks);
3739739f5f9SChristian Marangi 
3749739f5f9SChristian Marangi 		ret = eip93_send_hash_req(async, block->data,
3759739f5f9SChristian Marangi 					  &block->data_dma,
3769739f5f9SChristian Marangi 					  SHA256_BLOCK_SIZE, wait_req);
3779739f5f9SChristian Marangi 		if (ret)
3789739f5f9SChristian Marangi 			goto free_blocks;
3799739f5f9SChristian Marangi 	}
3809739f5f9SChristian Marangi 
3819739f5f9SChristian Marangi 	return wait_req ? -EINPROGRESS : 0;
3829739f5f9SChristian Marangi 
3839739f5f9SChristian Marangi free_blocks:
3849739f5f9SChristian Marangi 	eip93_hash_free_data_blocks(req);
3859739f5f9SChristian Marangi 
3869739f5f9SChristian Marangi 	return ret;
3879739f5f9SChristian Marangi }
3889739f5f9SChristian Marangi 
3899739f5f9SChristian Marangi static int eip93_hash_update(struct ahash_request *req)
3909739f5f9SChristian Marangi {
3919739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
3929739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
3939739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
3949739f5f9SChristian Marangi 	struct sa_record *sa_record = &rctx->sa_record;
3959739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
3969739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
3979739f5f9SChristian Marangi 	int ret;
3989739f5f9SChristian Marangi 
3999739f5f9SChristian Marangi 	if (!req->nbytes)
4009739f5f9SChristian Marangi 		return 0;
4019739f5f9SChristian Marangi 
4029739f5f9SChristian Marangi 	rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,
4039739f5f9SChristian Marangi 					     sizeof(*sa_state),
4049739f5f9SChristian Marangi 					     DMA_TO_DEVICE);
4059739f5f9SChristian Marangi 	ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);
4069739f5f9SChristian Marangi 	if (ret)
4079739f5f9SChristian Marangi 		return ret;
4089739f5f9SChristian Marangi 
4099739f5f9SChristian Marangi 	rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,
4109739f5f9SChristian Marangi 					      sizeof(*sa_record),
4119739f5f9SChristian Marangi 					      DMA_TO_DEVICE);
4129739f5f9SChristian Marangi 	ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);
4139739f5f9SChristian Marangi 	if (ret)
4149739f5f9SChristian Marangi 		goto free_sa_state;
4159739f5f9SChristian Marangi 
4169739f5f9SChristian Marangi 	ret = __eip93_hash_update(req, true);
4179739f5f9SChristian Marangi 	if (ret && ret != -EINPROGRESS)
4189739f5f9SChristian Marangi 		goto free_sa_record;
4199739f5f9SChristian Marangi 
4209739f5f9SChristian Marangi 	return ret;
4219739f5f9SChristian Marangi 
4229739f5f9SChristian Marangi free_sa_record:
4239739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_record_base,
4249739f5f9SChristian Marangi 			 sizeof(*sa_record), DMA_TO_DEVICE);
4259739f5f9SChristian Marangi 
4269739f5f9SChristian Marangi free_sa_state:
4279739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_state_base,
4289739f5f9SChristian Marangi 			 sizeof(*sa_state), DMA_TO_DEVICE);
4299739f5f9SChristian Marangi 
4309739f5f9SChristian Marangi 	return ret;
4319739f5f9SChristian Marangi }
4329739f5f9SChristian Marangi 
4339739f5f9SChristian Marangi /*
4349739f5f9SChristian Marangi  * With map_data true, we map the sa_record and sa_state. This is needed
4359739f5f9SChristian Marangi  * for finup() as the they are mapped before calling update()
4369739f5f9SChristian Marangi  */
4379739f5f9SChristian Marangi static int __eip93_hash_final(struct ahash_request *req, bool map_dma)
4389739f5f9SChristian Marangi {
4399739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
4409739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
4419739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
4429739f5f9SChristian Marangi 	struct crypto_async_request *async = &req->base;
4439739f5f9SChristian Marangi 	struct sa_record *sa_record = &rctx->sa_record;
4449739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
4459739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
4469739f5f9SChristian Marangi 	int ret;
4479739f5f9SChristian Marangi 
4489739f5f9SChristian Marangi 	/* EIP93 can't handle zero bytes hash */
4499739f5f9SChristian Marangi 	if (!rctx->len && !IS_HMAC(ctx->flags)) {
4509739f5f9SChristian Marangi 		switch ((ctx->flags & EIP93_HASH_MASK)) {
4519739f5f9SChristian Marangi 		case EIP93_HASH_SHA256:
4529739f5f9SChristian Marangi 			memcpy(req->result, sha256_zero_message_hash,
4539739f5f9SChristian Marangi 			       SHA256_DIGEST_SIZE);
4549739f5f9SChristian Marangi 			break;
4559739f5f9SChristian Marangi 		case EIP93_HASH_SHA224:
4569739f5f9SChristian Marangi 			memcpy(req->result, sha224_zero_message_hash,
4579739f5f9SChristian Marangi 			       SHA224_DIGEST_SIZE);
4589739f5f9SChristian Marangi 			break;
4599739f5f9SChristian Marangi 		case EIP93_HASH_SHA1:
4609739f5f9SChristian Marangi 			memcpy(req->result, sha1_zero_message_hash,
4619739f5f9SChristian Marangi 			       SHA1_DIGEST_SIZE);
4629739f5f9SChristian Marangi 			break;
4639739f5f9SChristian Marangi 		case EIP93_HASH_MD5:
4649739f5f9SChristian Marangi 			memcpy(req->result, md5_zero_message_hash,
4659739f5f9SChristian Marangi 			       MD5_DIGEST_SIZE);
4669739f5f9SChristian Marangi 			break;
4679739f5f9SChristian Marangi 		default: /* Impossible */
4689739f5f9SChristian Marangi 			return -EINVAL;
4699739f5f9SChristian Marangi 		}
4709739f5f9SChristian Marangi 
4719739f5f9SChristian Marangi 		return 0;
4729739f5f9SChristian Marangi 	}
4739739f5f9SChristian Marangi 
4749739f5f9SChristian Marangi 	/* Signal interrupt from engine is for last block */
4759739f5f9SChristian Marangi 	rctx->finalize = true;
4769739f5f9SChristian Marangi 
4779739f5f9SChristian Marangi 	if (map_dma) {
4789739f5f9SChristian Marangi 		rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,
4799739f5f9SChristian Marangi 						     sizeof(*sa_state),
4809739f5f9SChristian Marangi 						     DMA_TO_DEVICE);
4819739f5f9SChristian Marangi 		ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);
4829739f5f9SChristian Marangi 		if (ret)
4839739f5f9SChristian Marangi 			return ret;
4849739f5f9SChristian Marangi 
4859739f5f9SChristian Marangi 		rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,
4869739f5f9SChristian Marangi 						      sizeof(*sa_record),
4879739f5f9SChristian Marangi 						      DMA_TO_DEVICE);
4889739f5f9SChristian Marangi 		ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);
4899739f5f9SChristian Marangi 		if (ret)
4909739f5f9SChristian Marangi 			goto free_sa_state;
4919739f5f9SChristian Marangi 	}
4929739f5f9SChristian Marangi 
4939739f5f9SChristian Marangi 	/* Send last block */
4949739f5f9SChristian Marangi 	ret = eip93_send_hash_req(async, rctx->data, &rctx->data_dma,
4959739f5f9SChristian Marangi 				  rctx->data_used, true);
4969739f5f9SChristian Marangi 	if (ret)
4979739f5f9SChristian Marangi 		goto free_blocks;
4989739f5f9SChristian Marangi 
4999739f5f9SChristian Marangi 	return -EINPROGRESS;
5009739f5f9SChristian Marangi 
5019739f5f9SChristian Marangi free_blocks:
5029739f5f9SChristian Marangi 	eip93_hash_free_data_blocks(req);
5039739f5f9SChristian Marangi 
5049739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_record_base,
5059739f5f9SChristian Marangi 			 sizeof(*sa_record), DMA_TO_DEVICE);
5069739f5f9SChristian Marangi 
5079739f5f9SChristian Marangi free_sa_state:
5089739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_state_base,
5099739f5f9SChristian Marangi 			 sizeof(*sa_state), DMA_TO_DEVICE);
5109739f5f9SChristian Marangi 
5119739f5f9SChristian Marangi 	return ret;
5129739f5f9SChristian Marangi }
5139739f5f9SChristian Marangi 
5149739f5f9SChristian Marangi static int eip93_hash_final(struct ahash_request *req)
5159739f5f9SChristian Marangi {
5169739f5f9SChristian Marangi 	return __eip93_hash_final(req, true);
5179739f5f9SChristian Marangi }
5189739f5f9SChristian Marangi 
5199739f5f9SChristian Marangi static int eip93_hash_finup(struct ahash_request *req)
5209739f5f9SChristian Marangi {
5219739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
5229739f5f9SChristian Marangi 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
5239739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_ahash_ctx(ahash);
5249739f5f9SChristian Marangi 	struct sa_record *sa_record = &rctx->sa_record;
5259739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
5269739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
5279739f5f9SChristian Marangi 	int ret;
5289739f5f9SChristian Marangi 
5299739f5f9SChristian Marangi 	if (rctx->len + req->nbytes || IS_HMAC(ctx->flags)) {
5309739f5f9SChristian Marangi 		rctx->sa_state_base = dma_map_single(eip93->dev, sa_state,
5319739f5f9SChristian Marangi 						     sizeof(*sa_state),
5329739f5f9SChristian Marangi 						     DMA_TO_DEVICE);
5339739f5f9SChristian Marangi 		ret = dma_mapping_error(eip93->dev, rctx->sa_state_base);
5349739f5f9SChristian Marangi 		if (ret)
5359739f5f9SChristian Marangi 			return ret;
5369739f5f9SChristian Marangi 
5379739f5f9SChristian Marangi 		rctx->sa_record_base = dma_map_single(eip93->dev, sa_record,
5389739f5f9SChristian Marangi 						      sizeof(*sa_record),
5399739f5f9SChristian Marangi 						      DMA_TO_DEVICE);
5409739f5f9SChristian Marangi 		ret = dma_mapping_error(eip93->dev, rctx->sa_record_base);
5419739f5f9SChristian Marangi 		if (ret)
5429739f5f9SChristian Marangi 			goto free_sa_state;
5439739f5f9SChristian Marangi 
5449739f5f9SChristian Marangi 		ret = __eip93_hash_update(req, false);
5459739f5f9SChristian Marangi 		if (ret)
5469739f5f9SChristian Marangi 			goto free_sa_record;
5479739f5f9SChristian Marangi 	}
5489739f5f9SChristian Marangi 
5499739f5f9SChristian Marangi 	return __eip93_hash_final(req, false);
5509739f5f9SChristian Marangi 
5519739f5f9SChristian Marangi free_sa_record:
5529739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_record_base,
5539739f5f9SChristian Marangi 			 sizeof(*sa_record), DMA_TO_DEVICE);
5549739f5f9SChristian Marangi free_sa_state:
5559739f5f9SChristian Marangi 	dma_unmap_single(eip93->dev, rctx->sa_state_base,
5569739f5f9SChristian Marangi 			 sizeof(*sa_state), DMA_TO_DEVICE);
5579739f5f9SChristian Marangi 
5589739f5f9SChristian Marangi 	return ret;
5599739f5f9SChristian Marangi }
5609739f5f9SChristian Marangi 
5619739f5f9SChristian Marangi static int eip93_hash_hmac_setkey(struct crypto_ahash *ahash, const u8 *key,
5629739f5f9SChristian Marangi 				  u32 keylen)
5639739f5f9SChristian Marangi {
5649739f5f9SChristian Marangi 	unsigned int digestsize = crypto_ahash_digestsize(ahash);
5659739f5f9SChristian Marangi 	struct crypto_tfm *tfm = crypto_ahash_tfm(ahash);
5669739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm);
5679739f5f9SChristian Marangi 
5689739f5f9SChristian Marangi 	return eip93_hmac_setkey(ctx->flags, key, keylen, digestsize,
5699739f5f9SChristian Marangi 				 ctx->ipad, ctx->opad, true);
5709739f5f9SChristian Marangi }
5719739f5f9SChristian Marangi 
5729739f5f9SChristian Marangi static int eip93_hash_cra_init(struct crypto_tfm *tfm)
5739739f5f9SChristian Marangi {
5749739f5f9SChristian Marangi 	struct eip93_hash_ctx *ctx = crypto_tfm_ctx(tfm);
5759739f5f9SChristian Marangi 	struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,
5769739f5f9SChristian Marangi 				struct eip93_alg_template, alg.ahash.halg.base);
5779739f5f9SChristian Marangi 
5789739f5f9SChristian Marangi 	crypto_ahash_set_reqsize_dma(__crypto_ahash_cast(tfm),
5799739f5f9SChristian Marangi 				     sizeof(struct eip93_hash_reqctx));
5809739f5f9SChristian Marangi 
5819739f5f9SChristian Marangi 	ctx->eip93 = tmpl->eip93;
5829739f5f9SChristian Marangi 	ctx->flags = tmpl->flags;
5839739f5f9SChristian Marangi 
5849739f5f9SChristian Marangi 	return 0;
5859739f5f9SChristian Marangi }
5869739f5f9SChristian Marangi 
5879739f5f9SChristian Marangi static int eip93_hash_digest(struct ahash_request *req)
5889739f5f9SChristian Marangi {
5899739f5f9SChristian Marangi 	int ret;
5909739f5f9SChristian Marangi 
5919739f5f9SChristian Marangi 	ret = eip93_hash_init(req);
5929739f5f9SChristian Marangi 	if (ret)
5939739f5f9SChristian Marangi 		return ret;
5949739f5f9SChristian Marangi 
5959739f5f9SChristian Marangi 	return eip93_hash_finup(req);
5969739f5f9SChristian Marangi }
5979739f5f9SChristian Marangi 
5989739f5f9SChristian Marangi static int eip93_hash_import(struct ahash_request *req, const void *in)
5999739f5f9SChristian Marangi {
6009739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
6019739f5f9SChristian Marangi 	const struct eip93_hash_export_state *state = in;
6029739f5f9SChristian Marangi 	struct sa_state *sa_state = &rctx->sa_state;
6039739f5f9SChristian Marangi 
6049739f5f9SChristian Marangi 	memcpy(sa_state->state_byte_cnt, state->state_len, sizeof(u32) * 2);
6059739f5f9SChristian Marangi 	memcpy(sa_state->state_i_digest, state->state_hash, SHA256_DIGEST_SIZE);
6069739f5f9SChristian Marangi 
6079739f5f9SChristian Marangi 	__eip93_hash_init(req);
6089739f5f9SChristian Marangi 
6099739f5f9SChristian Marangi 	rctx->len = state->len;
6109739f5f9SChristian Marangi 	rctx->data_used = state->data_used;
6119739f5f9SChristian Marangi 
6129739f5f9SChristian Marangi 	/* Skip copying data if we have nothing to copy */
6139739f5f9SChristian Marangi 	if (rctx->len)
6149739f5f9SChristian Marangi 		memcpy(rctx->data, state->data, rctx->data_used);
6159739f5f9SChristian Marangi 
6169739f5f9SChristian Marangi 	return 0;
6179739f5f9SChristian Marangi }
6189739f5f9SChristian Marangi 
6199739f5f9SChristian Marangi static int eip93_hash_export(struct ahash_request *req, void *out)
6209739f5f9SChristian Marangi {
6219739f5f9SChristian Marangi 	struct eip93_hash_reqctx *rctx = ahash_request_ctx_dma(req);
6229739f5f9SChristian Marangi 	struct eip93_hash_export_state *state = out;
6239739f5f9SChristian Marangi 
6249739f5f9SChristian Marangi 	/* Save the first block in state data */
6259739f5f9SChristian Marangi 	if (rctx->len)
6269739f5f9SChristian Marangi 		memcpy(state->data, rctx->data, rctx->data_used);
6279739f5f9SChristian Marangi 
6289739f5f9SChristian Marangi 	eip93_hash_export_sa_state(req, state);
6299739f5f9SChristian Marangi 
6309739f5f9SChristian Marangi 	return 0;
6319739f5f9SChristian Marangi }
6329739f5f9SChristian Marangi 
6339739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_md5 = {
6349739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
6359739f5f9SChristian Marangi 	.flags = EIP93_HASH_MD5,
6369739f5f9SChristian Marangi 	.alg.ahash = {
6379739f5f9SChristian Marangi 		.init = eip93_hash_init,
6389739f5f9SChristian Marangi 		.update = eip93_hash_update,
6399739f5f9SChristian Marangi 		.final = eip93_hash_final,
6409739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
6419739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
6429739f5f9SChristian Marangi 		.export = eip93_hash_export,
6439739f5f9SChristian Marangi 		.import = eip93_hash_import,
6449739f5f9SChristian Marangi 		.halg = {
6459739f5f9SChristian Marangi 			.digestsize = MD5_DIGEST_SIZE,
6469739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
6479739f5f9SChristian Marangi 			.base = {
6489739f5f9SChristian Marangi 				.cra_name = "md5",
6499739f5f9SChristian Marangi 				.cra_driver_name = "md5-eip93",
6509739f5f9SChristian Marangi 				.cra_priority = 300,
6519739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
6529739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
6539739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
6549739f5f9SChristian Marangi 				.cra_blocksize = MD5_HMAC_BLOCK_SIZE,
6559739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
6569739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
6579739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
6589739f5f9SChristian Marangi 			},
6599739f5f9SChristian Marangi 		},
6609739f5f9SChristian Marangi 	},
6619739f5f9SChristian Marangi };
6629739f5f9SChristian Marangi 
6639739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha1 = {
6649739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
6659739f5f9SChristian Marangi 	.flags = EIP93_HASH_SHA1,
6669739f5f9SChristian Marangi 	.alg.ahash = {
6679739f5f9SChristian Marangi 		.init = eip93_hash_init,
6689739f5f9SChristian Marangi 		.update = eip93_hash_update,
6699739f5f9SChristian Marangi 		.final = eip93_hash_final,
6709739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
6719739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
6729739f5f9SChristian Marangi 		.export = eip93_hash_export,
6739739f5f9SChristian Marangi 		.import = eip93_hash_import,
6749739f5f9SChristian Marangi 		.halg = {
6759739f5f9SChristian Marangi 			.digestsize = SHA1_DIGEST_SIZE,
6769739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
6779739f5f9SChristian Marangi 			.base = {
6789739f5f9SChristian Marangi 				.cra_name = "sha1",
6799739f5f9SChristian Marangi 				.cra_driver_name = "sha1-eip93",
6809739f5f9SChristian Marangi 				.cra_priority = 300,
6819739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
6829739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
6839739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
6849739f5f9SChristian Marangi 				.cra_blocksize = SHA1_BLOCK_SIZE,
6859739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
6869739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
6879739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
6889739f5f9SChristian Marangi 			},
6899739f5f9SChristian Marangi 		},
6909739f5f9SChristian Marangi 	},
6919739f5f9SChristian Marangi };
6929739f5f9SChristian Marangi 
6939739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha224 = {
6949739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
6959739f5f9SChristian Marangi 	.flags = EIP93_HASH_SHA224,
6969739f5f9SChristian Marangi 	.alg.ahash = {
6979739f5f9SChristian Marangi 		.init = eip93_hash_init,
6989739f5f9SChristian Marangi 		.update = eip93_hash_update,
6999739f5f9SChristian Marangi 		.final = eip93_hash_final,
7009739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
7019739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
7029739f5f9SChristian Marangi 		.export = eip93_hash_export,
7039739f5f9SChristian Marangi 		.import = eip93_hash_import,
7049739f5f9SChristian Marangi 		.halg = {
7059739f5f9SChristian Marangi 			.digestsize = SHA224_DIGEST_SIZE,
7069739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
7079739f5f9SChristian Marangi 			.base = {
7089739f5f9SChristian Marangi 				.cra_name = "sha224",
7099739f5f9SChristian Marangi 				.cra_driver_name = "sha224-eip93",
7109739f5f9SChristian Marangi 				.cra_priority = 300,
7119739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
7129739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
7139739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
7149739f5f9SChristian Marangi 				.cra_blocksize = SHA224_BLOCK_SIZE,
7159739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
7169739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
7179739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
7189739f5f9SChristian Marangi 			},
7199739f5f9SChristian Marangi 		},
7209739f5f9SChristian Marangi 	},
7219739f5f9SChristian Marangi };
7229739f5f9SChristian Marangi 
7239739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_sha256 = {
7249739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
7259739f5f9SChristian Marangi 	.flags = EIP93_HASH_SHA256,
7269739f5f9SChristian Marangi 	.alg.ahash = {
7279739f5f9SChristian Marangi 		.init = eip93_hash_init,
7289739f5f9SChristian Marangi 		.update = eip93_hash_update,
7299739f5f9SChristian Marangi 		.final = eip93_hash_final,
7309739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
7319739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
7329739f5f9SChristian Marangi 		.export = eip93_hash_export,
7339739f5f9SChristian Marangi 		.import = eip93_hash_import,
7349739f5f9SChristian Marangi 		.halg = {
7359739f5f9SChristian Marangi 			.digestsize = SHA256_DIGEST_SIZE,
7369739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
7379739f5f9SChristian Marangi 			.base = {
7389739f5f9SChristian Marangi 				.cra_name = "sha256",
7399739f5f9SChristian Marangi 				.cra_driver_name = "sha256-eip93",
7409739f5f9SChristian Marangi 				.cra_priority = 300,
7419739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
7429739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
7439739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
7449739f5f9SChristian Marangi 				.cra_blocksize = SHA256_BLOCK_SIZE,
7459739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
7469739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
7479739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
7489739f5f9SChristian Marangi 			},
7499739f5f9SChristian Marangi 		},
7509739f5f9SChristian Marangi 	},
7519739f5f9SChristian Marangi };
7529739f5f9SChristian Marangi 
7539739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_md5 = {
7549739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
7559739f5f9SChristian Marangi 	.flags = EIP93_HASH_HMAC | EIP93_HASH_MD5,
7569739f5f9SChristian Marangi 	.alg.ahash = {
7579739f5f9SChristian Marangi 		.init = eip93_hash_init,
7589739f5f9SChristian Marangi 		.update = eip93_hash_update,
7599739f5f9SChristian Marangi 		.final = eip93_hash_final,
7609739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
7619739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
7629739f5f9SChristian Marangi 		.setkey = eip93_hash_hmac_setkey,
7639739f5f9SChristian Marangi 		.export = eip93_hash_export,
7649739f5f9SChristian Marangi 		.import = eip93_hash_import,
7659739f5f9SChristian Marangi 		.halg = {
7669739f5f9SChristian Marangi 			.digestsize = MD5_DIGEST_SIZE,
7679739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
7689739f5f9SChristian Marangi 			.base = {
7699739f5f9SChristian Marangi 				.cra_name = "hmac(md5)",
7709739f5f9SChristian Marangi 				.cra_driver_name = "hmac(md5-eip93)",
7719739f5f9SChristian Marangi 				.cra_priority = 300,
7729739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
7739739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
7749739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
7759739f5f9SChristian Marangi 				.cra_blocksize = MD5_HMAC_BLOCK_SIZE,
7769739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
7779739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
7789739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
7799739f5f9SChristian Marangi 			},
7809739f5f9SChristian Marangi 		},
7819739f5f9SChristian Marangi 	},
7829739f5f9SChristian Marangi };
7839739f5f9SChristian Marangi 
7849739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha1 = {
7859739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
7869739f5f9SChristian Marangi 	.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA1,
7879739f5f9SChristian Marangi 	.alg.ahash = {
7889739f5f9SChristian Marangi 		.init = eip93_hash_init,
7899739f5f9SChristian Marangi 		.update = eip93_hash_update,
7909739f5f9SChristian Marangi 		.final = eip93_hash_final,
7919739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
7929739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
7939739f5f9SChristian Marangi 		.setkey = eip93_hash_hmac_setkey,
7949739f5f9SChristian Marangi 		.export = eip93_hash_export,
7959739f5f9SChristian Marangi 		.import = eip93_hash_import,
7969739f5f9SChristian Marangi 		.halg = {
7979739f5f9SChristian Marangi 			.digestsize = SHA1_DIGEST_SIZE,
7989739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
7999739f5f9SChristian Marangi 			.base = {
8009739f5f9SChristian Marangi 				.cra_name = "hmac(sha1)",
8019739f5f9SChristian Marangi 				.cra_driver_name = "hmac(sha1-eip93)",
8029739f5f9SChristian Marangi 				.cra_priority = 300,
8039739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
8049739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
8059739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
8069739f5f9SChristian Marangi 				.cra_blocksize = SHA1_BLOCK_SIZE,
8079739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
8089739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
8099739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
8109739f5f9SChristian Marangi 			},
8119739f5f9SChristian Marangi 		},
8129739f5f9SChristian Marangi 	},
8139739f5f9SChristian Marangi };
8149739f5f9SChristian Marangi 
8159739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha224 = {
8169739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
8179739f5f9SChristian Marangi 	.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA224,
8189739f5f9SChristian Marangi 	.alg.ahash = {
8199739f5f9SChristian Marangi 		.init = eip93_hash_init,
8209739f5f9SChristian Marangi 		.update = eip93_hash_update,
8219739f5f9SChristian Marangi 		.final = eip93_hash_final,
8229739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
8239739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
8249739f5f9SChristian Marangi 		.setkey = eip93_hash_hmac_setkey,
8259739f5f9SChristian Marangi 		.export = eip93_hash_export,
8269739f5f9SChristian Marangi 		.import = eip93_hash_import,
8279739f5f9SChristian Marangi 		.halg = {
8289739f5f9SChristian Marangi 			.digestsize = SHA224_DIGEST_SIZE,
8299739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
8309739f5f9SChristian Marangi 			.base = {
8319739f5f9SChristian Marangi 				.cra_name = "hmac(sha224)",
8329739f5f9SChristian Marangi 				.cra_driver_name = "hmac(sha224-eip93)",
8339739f5f9SChristian Marangi 				.cra_priority = 300,
8349739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
8359739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
8369739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
8379739f5f9SChristian Marangi 				.cra_blocksize = SHA224_BLOCK_SIZE,
8389739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
8399739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
8409739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
8419739f5f9SChristian Marangi 			},
8429739f5f9SChristian Marangi 		},
8439739f5f9SChristian Marangi 	},
8449739f5f9SChristian Marangi };
8459739f5f9SChristian Marangi 
8469739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_hmac_sha256 = {
8479739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_HASH,
8489739f5f9SChristian Marangi 	.flags = EIP93_HASH_HMAC | EIP93_HASH_SHA256,
8499739f5f9SChristian Marangi 	.alg.ahash = {
8509739f5f9SChristian Marangi 		.init = eip93_hash_init,
8519739f5f9SChristian Marangi 		.update = eip93_hash_update,
8529739f5f9SChristian Marangi 		.final = eip93_hash_final,
8539739f5f9SChristian Marangi 		.finup = eip93_hash_finup,
8549739f5f9SChristian Marangi 		.digest = eip93_hash_digest,
8559739f5f9SChristian Marangi 		.setkey = eip93_hash_hmac_setkey,
8569739f5f9SChristian Marangi 		.export = eip93_hash_export,
8579739f5f9SChristian Marangi 		.import = eip93_hash_import,
8589739f5f9SChristian Marangi 		.halg = {
8599739f5f9SChristian Marangi 			.digestsize = SHA256_DIGEST_SIZE,
8609739f5f9SChristian Marangi 			.statesize = sizeof(struct eip93_hash_export_state),
8619739f5f9SChristian Marangi 			.base = {
8629739f5f9SChristian Marangi 				.cra_name = "hmac(sha256)",
8639739f5f9SChristian Marangi 				.cra_driver_name = "hmac(sha256-eip93)",
8649739f5f9SChristian Marangi 				.cra_priority = 300,
8659739f5f9SChristian Marangi 				.cra_flags = CRYPTO_ALG_ASYNC |
8669739f5f9SChristian Marangi 						CRYPTO_ALG_KERN_DRIVER_ONLY |
8679739f5f9SChristian Marangi 						CRYPTO_ALG_ALLOCATES_MEMORY,
8689739f5f9SChristian Marangi 				.cra_blocksize = SHA256_BLOCK_SIZE,
8699739f5f9SChristian Marangi 				.cra_ctxsize = sizeof(struct eip93_hash_ctx),
8709739f5f9SChristian Marangi 				.cra_init = eip93_hash_cra_init,
8719739f5f9SChristian Marangi 				.cra_module = THIS_MODULE,
8729739f5f9SChristian Marangi 			},
8739739f5f9SChristian Marangi 		},
8749739f5f9SChristian Marangi 	},
8759739f5f9SChristian Marangi };
876