1 /* SPDX-License-Identifier: GPL-2.0
2  *
3  * Copyright (C) 2019 - 2021
4  *
5  * Richard van Schagen <vschagen@icloud.com>
6  * Christian Marangi <ansuelsmth@gmail.com
7  */
8 #ifndef _EIP93_HASH_H_
9 #define _EIP93_HASH_H_
10 
11 #include <crypto/sha2.h>
12 
13 #include "eip93-main.h"
14 #include "eip93-regs.h"
15 
16 struct eip93_hash_ctx {
17 	struct eip93_device	*eip93;
18 	u32			flags;
19 
20 	u8			ipad[SHA256_BLOCK_SIZE] __aligned(sizeof(u32));
21 	u8			opad[SHA256_DIGEST_SIZE] __aligned(sizeof(u32));
22 };
23 
24 struct eip93_hash_reqctx {
25 	/* Placement is important for DMA align */
26 	struct {
27 		struct sa_record	sa_record;
28 		struct sa_record	sa_record_hmac;
29 		struct sa_state		sa_state;
30 	} __aligned(CRYPTO_DMA_ALIGN);
31 
32 	dma_addr_t		sa_record_base;
33 	dma_addr_t		sa_record_hmac_base;
34 	dma_addr_t		sa_state_base;
35 
36 	/* Don't enable HASH_FINALIZE when last block is sent */
37 	bool			partial_hash;
38 
39 	/* Set to signal interrupt is for final packet */
40 	bool			finalize;
41 
42 	/*
43 	 * EIP93 requires data to be accumulated in block of 64 bytes
44 	 * for intermediate hash calculation.
45 	 */
46 	u64			len;
47 	u32			data_used;
48 
49 	u8			data[SHA256_BLOCK_SIZE] __aligned(sizeof(u32));
50 	dma_addr_t		data_dma;
51 
52 	struct list_head	blocks;
53 };
54 
55 struct mkt_hash_block {
56 	struct list_head	list;
57 	u8			data[SHA256_BLOCK_SIZE] __aligned(sizeof(u32));
58 	dma_addr_t		data_dma;
59 };
60 
61 struct eip93_hash_export_state {
62 	u64			len;
63 	u32			data_used;
64 
65 	u32			state_len[2];
66 	u8			state_hash[SHA256_DIGEST_SIZE] __aligned(sizeof(u32));
67 
68 	u8			data[SHA256_BLOCK_SIZE] __aligned(sizeof(u32));
69 };
70 
71 void eip93_hash_handle_result(struct crypto_async_request *async, int err);
72 
73 extern struct eip93_alg_template eip93_alg_md5;
74 extern struct eip93_alg_template eip93_alg_sha1;
75 extern struct eip93_alg_template eip93_alg_sha224;
76 extern struct eip93_alg_template eip93_alg_sha256;
77 extern struct eip93_alg_template eip93_alg_hmac_md5;
78 extern struct eip93_alg_template eip93_alg_hmac_sha1;
79 extern struct eip93_alg_template eip93_alg_hmac_sha224;
80 extern struct eip93_alg_template eip93_alg_hmac_sha256;
81 
82 #endif /* _EIP93_HASH_H_ */
83