1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2012-2019 ARM Limited (or its affiliates). */
3 
4 #include <linux/kernel.h>
5 #include <linux/module.h>
6 #include <crypto/algapi.h>
7 #include <crypto/hash.h>
8 #include <crypto/md5.h>
9 #include <crypto/sm3.h>
10 #include <crypto/internal/hash.h>
11 
12 #include "cc_driver.h"
13 #include "cc_request_mgr.h"
14 #include "cc_buffer_mgr.h"
15 #include "cc_hash.h"
16 #include "cc_sram_mgr.h"
17 
18 #define CC_MAX_HASH_SEQ_LEN 12
19 #define CC_MAX_OPAD_KEYS_SIZE CC_MAX_HASH_BLCK_SIZE
20 #define CC_SM3_HASH_LEN_SIZE 8
21 
22 struct cc_hash_handle {
23 	u32 digest_len_sram_addr;	/* const value in SRAM*/
24 	u32 larval_digest_sram_addr;   /* const value in SRAM */
25 	struct list_head hash_list;
26 };
27 
28 static const u32 cc_digest_len_init[] = {
29 	0x00000040, 0x00000000, 0x00000000, 0x00000000 };
30 static const u32 cc_md5_init[] = {
31 	SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
32 static const u32 cc_sha1_init[] = {
33 	SHA1_H4, SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
34 static const u32 cc_sha224_init[] = {
35 	SHA224_H7, SHA224_H6, SHA224_H5, SHA224_H4,
36 	SHA224_H3, SHA224_H2, SHA224_H1, SHA224_H0 };
37 static const u32 cc_sha256_init[] = {
38 	SHA256_H7, SHA256_H6, SHA256_H5, SHA256_H4,
39 	SHA256_H3, SHA256_H2, SHA256_H1, SHA256_H0 };
40 static const u32 cc_digest_len_sha512_init[] = {
41 	0x00000080, 0x00000000, 0x00000000, 0x00000000 };
42 
43 /*
44  * Due to the way the HW works, every double word in the SHA384 and SHA512
45  * larval hashes must be stored in hi/lo order
46  */
47 #define hilo(x)	upper_32_bits(x), lower_32_bits(x)
48 static const u32 cc_sha384_init[] = {
49 	hilo(SHA384_H7), hilo(SHA384_H6), hilo(SHA384_H5), hilo(SHA384_H4),
50 	hilo(SHA384_H3), hilo(SHA384_H2), hilo(SHA384_H1), hilo(SHA384_H0) };
51 static const u32 cc_sha512_init[] = {
52 	hilo(SHA512_H7), hilo(SHA512_H6), hilo(SHA512_H5), hilo(SHA512_H4),
53 	hilo(SHA512_H3), hilo(SHA512_H2), hilo(SHA512_H1), hilo(SHA512_H0) };
54 
55 static const u32 cc_sm3_init[] = {
56 	SM3_IVH, SM3_IVG, SM3_IVF, SM3_IVE,
57 	SM3_IVD, SM3_IVC, SM3_IVB, SM3_IVA };
58 
59 static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
60 			  unsigned int *seq_size);
61 
62 static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
63 			  unsigned int *seq_size);
64 
65 static const void *cc_larval_digest(struct device *dev, u32 mode);
66 
67 struct cc_hash_alg {
68 	struct list_head entry;
69 	int hash_mode;
70 	int hw_mode;
71 	int inter_digestsize;
72 	struct cc_drvdata *drvdata;
73 	struct ahash_alg ahash_alg;
74 };
75 
76 struct hash_key_req_ctx {
77 	u32 keylen;
78 	dma_addr_t key_dma_addr;
79 	u8 *key;
80 };
81 
82 /* hash per-session context */
83 struct cc_hash_ctx {
84 	struct cc_drvdata *drvdata;
85 	/* holds the origin digest; the digest after "setkey" if HMAC,*
86 	 * the initial digest if HASH.
87 	 */
88 	u8 digest_buff[CC_MAX_HASH_DIGEST_SIZE]  ____cacheline_aligned;
89 	u8 opad_tmp_keys_buff[CC_MAX_OPAD_KEYS_SIZE]  ____cacheline_aligned;
90 
91 	dma_addr_t opad_tmp_keys_dma_addr  ____cacheline_aligned;
92 	dma_addr_t digest_buff_dma_addr;
93 	/* use for hmac with key large then mode block size */
94 	struct hash_key_req_ctx key_params;
95 	int hash_mode;
96 	int hw_mode;
97 	int inter_digestsize;
98 	unsigned int hash_len;
99 	struct completion setkey_comp;
100 	bool is_hmac;
101 };
102 
103 static void cc_set_desc(struct ahash_req_ctx *areq_ctx, struct cc_hash_ctx *ctx,
104 			unsigned int flow_mode, struct cc_hw_desc desc[],
105 			bool is_not_last_data, unsigned int *seq_size);
106 
cc_set_endianity(u32 mode,struct cc_hw_desc * desc)107 static void cc_set_endianity(u32 mode, struct cc_hw_desc *desc)
108 {
109 	if (mode == DRV_HASH_MD5 || mode == DRV_HASH_SHA384 ||
110 	    mode == DRV_HASH_SHA512) {
111 		set_bytes_swap(desc, 1);
112 	} else {
113 		set_cipher_config0(desc, HASH_DIGEST_RESULT_LITTLE_ENDIAN);
114 	}
115 }
116 
cc_map_result(struct device * dev,struct ahash_req_ctx * state,unsigned int digestsize)117 static int cc_map_result(struct device *dev, struct ahash_req_ctx *state,
118 			 unsigned int digestsize)
119 {
120 	state->digest_result_dma_addr =
121 		dma_map_single(dev, state->digest_result_buff,
122 			       digestsize, DMA_BIDIRECTIONAL);
123 	if (dma_mapping_error(dev, state->digest_result_dma_addr)) {
124 		dev_err(dev, "Mapping digest result buffer %u B for DMA failed\n",
125 			digestsize);
126 		return -ENOMEM;
127 	}
128 	dev_dbg(dev, "Mapped digest result buffer %u B at va=%pK to dma=%pad\n",
129 		digestsize, state->digest_result_buff,
130 		&state->digest_result_dma_addr);
131 
132 	return 0;
133 }
134 
cc_init_req(struct device * dev,struct ahash_req_ctx * state,struct cc_hash_ctx * ctx)135 static void cc_init_req(struct device *dev, struct ahash_req_ctx *state,
136 			struct cc_hash_ctx *ctx)
137 {
138 	bool is_hmac = ctx->is_hmac;
139 
140 	memset(state, 0, sizeof(*state));
141 
142 	if (is_hmac) {
143 		if (ctx->hw_mode != DRV_CIPHER_XCBC_MAC &&
144 		    ctx->hw_mode != DRV_CIPHER_CMAC) {
145 			dma_sync_single_for_cpu(dev, ctx->digest_buff_dma_addr,
146 						ctx->inter_digestsize,
147 						DMA_BIDIRECTIONAL);
148 
149 			memcpy(state->digest_buff, ctx->digest_buff,
150 			       ctx->inter_digestsize);
151 			if (ctx->hash_mode == DRV_HASH_SHA512 ||
152 			    ctx->hash_mode == DRV_HASH_SHA384)
153 				memcpy(state->digest_bytes_len,
154 				       cc_digest_len_sha512_init,
155 				       ctx->hash_len);
156 			else
157 				memcpy(state->digest_bytes_len,
158 				       cc_digest_len_init,
159 				       ctx->hash_len);
160 		}
161 
162 		if (ctx->hash_mode != DRV_HASH_NULL) {
163 			dma_sync_single_for_cpu(dev,
164 						ctx->opad_tmp_keys_dma_addr,
165 						ctx->inter_digestsize,
166 						DMA_BIDIRECTIONAL);
167 			memcpy(state->opad_digest_buff,
168 			       ctx->opad_tmp_keys_buff, ctx->inter_digestsize);
169 		}
170 	} else { /*hash*/
171 		/* Copy the initial digests if hash flow. */
172 		const void *larval = cc_larval_digest(dev, ctx->hash_mode);
173 
174 		memcpy(state->digest_buff, larval, ctx->inter_digestsize);
175 	}
176 }
177 
cc_map_req(struct device * dev,struct ahash_req_ctx * state,struct cc_hash_ctx * ctx)178 static int cc_map_req(struct device *dev, struct ahash_req_ctx *state,
179 		      struct cc_hash_ctx *ctx)
180 {
181 	bool is_hmac = ctx->is_hmac;
182 
183 	state->digest_buff_dma_addr =
184 		dma_map_single(dev, state->digest_buff,
185 			       ctx->inter_digestsize, DMA_BIDIRECTIONAL);
186 	if (dma_mapping_error(dev, state->digest_buff_dma_addr)) {
187 		dev_err(dev, "Mapping digest len %d B at va=%pK for DMA failed\n",
188 			ctx->inter_digestsize, state->digest_buff);
189 		return -EINVAL;
190 	}
191 	dev_dbg(dev, "Mapped digest %d B at va=%pK to dma=%pad\n",
192 		ctx->inter_digestsize, state->digest_buff,
193 		&state->digest_buff_dma_addr);
194 
195 	if (ctx->hw_mode != DRV_CIPHER_XCBC_MAC) {
196 		state->digest_bytes_len_dma_addr =
197 			dma_map_single(dev, state->digest_bytes_len,
198 				       HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
199 		if (dma_mapping_error(dev, state->digest_bytes_len_dma_addr)) {
200 			dev_err(dev, "Mapping digest len %u B at va=%pK for DMA failed\n",
201 				HASH_MAX_LEN_SIZE, state->digest_bytes_len);
202 			goto unmap_digest_buf;
203 		}
204 		dev_dbg(dev, "Mapped digest len %u B at va=%pK to dma=%pad\n",
205 			HASH_MAX_LEN_SIZE, state->digest_bytes_len,
206 			&state->digest_bytes_len_dma_addr);
207 	}
208 
209 	if (is_hmac && ctx->hash_mode != DRV_HASH_NULL) {
210 		state->opad_digest_dma_addr =
211 			dma_map_single(dev, state->opad_digest_buff,
212 				       ctx->inter_digestsize,
213 				       DMA_BIDIRECTIONAL);
214 		if (dma_mapping_error(dev, state->opad_digest_dma_addr)) {
215 			dev_err(dev, "Mapping opad digest %d B at va=%pK for DMA failed\n",
216 				ctx->inter_digestsize,
217 				state->opad_digest_buff);
218 			goto unmap_digest_len;
219 		}
220 		dev_dbg(dev, "Mapped opad digest %d B at va=%pK to dma=%pad\n",
221 			ctx->inter_digestsize, state->opad_digest_buff,
222 			&state->opad_digest_dma_addr);
223 	}
224 
225 	return 0;
226 
227 unmap_digest_len:
228 	if (state->digest_bytes_len_dma_addr) {
229 		dma_unmap_single(dev, state->digest_bytes_len_dma_addr,
230 				 HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
231 		state->digest_bytes_len_dma_addr = 0;
232 	}
233 unmap_digest_buf:
234 	if (state->digest_buff_dma_addr) {
235 		dma_unmap_single(dev, state->digest_buff_dma_addr,
236 				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
237 		state->digest_buff_dma_addr = 0;
238 	}
239 
240 	return -EINVAL;
241 }
242 
cc_unmap_req(struct device * dev,struct ahash_req_ctx * state,struct cc_hash_ctx * ctx)243 static void cc_unmap_req(struct device *dev, struct ahash_req_ctx *state,
244 			 struct cc_hash_ctx *ctx)
245 {
246 	if (state->digest_buff_dma_addr) {
247 		dma_unmap_single(dev, state->digest_buff_dma_addr,
248 				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
249 		dev_dbg(dev, "Unmapped digest-buffer: digest_buff_dma_addr=%pad\n",
250 			&state->digest_buff_dma_addr);
251 		state->digest_buff_dma_addr = 0;
252 	}
253 	if (state->digest_bytes_len_dma_addr) {
254 		dma_unmap_single(dev, state->digest_bytes_len_dma_addr,
255 				 HASH_MAX_LEN_SIZE, DMA_BIDIRECTIONAL);
256 		dev_dbg(dev, "Unmapped digest-bytes-len buffer: digest_bytes_len_dma_addr=%pad\n",
257 			&state->digest_bytes_len_dma_addr);
258 		state->digest_bytes_len_dma_addr = 0;
259 	}
260 	if (state->opad_digest_dma_addr) {
261 		dma_unmap_single(dev, state->opad_digest_dma_addr,
262 				 ctx->inter_digestsize, DMA_BIDIRECTIONAL);
263 		dev_dbg(dev, "Unmapped opad-digest: opad_digest_dma_addr=%pad\n",
264 			&state->opad_digest_dma_addr);
265 		state->opad_digest_dma_addr = 0;
266 	}
267 }
268 
cc_unmap_result(struct device * dev,struct ahash_req_ctx * state,unsigned int digestsize,u8 * result)269 static void cc_unmap_result(struct device *dev, struct ahash_req_ctx *state,
270 			    unsigned int digestsize, u8 *result)
271 {
272 	if (state->digest_result_dma_addr) {
273 		dma_unmap_single(dev, state->digest_result_dma_addr, digestsize,
274 				 DMA_BIDIRECTIONAL);
275 		dev_dbg(dev, "unmpa digest result buffer va (%pK) pa (%pad) len %u\n",
276 			state->digest_result_buff,
277 			&state->digest_result_dma_addr, digestsize);
278 		memcpy(result, state->digest_result_buff, digestsize);
279 	}
280 	state->digest_result_dma_addr = 0;
281 }
282 
cc_update_complete(struct device * dev,void * cc_req,int err)283 static void cc_update_complete(struct device *dev, void *cc_req, int err)
284 {
285 	struct ahash_request *req = (struct ahash_request *)cc_req;
286 	struct ahash_req_ctx *state = ahash_request_ctx(req);
287 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
288 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
289 
290 	dev_dbg(dev, "req=%pK\n", req);
291 
292 	if (err != -EINPROGRESS) {
293 		/* Not a BACKLOG notification */
294 		cc_unmap_hash_request(dev, state, req->src, false);
295 		cc_unmap_req(dev, state, ctx);
296 	}
297 
298 	ahash_request_complete(req, err);
299 }
300 
cc_digest_complete(struct device * dev,void * cc_req,int err)301 static void cc_digest_complete(struct device *dev, void *cc_req, int err)
302 {
303 	struct ahash_request *req = (struct ahash_request *)cc_req;
304 	struct ahash_req_ctx *state = ahash_request_ctx(req);
305 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
306 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
307 	u32 digestsize = crypto_ahash_digestsize(tfm);
308 
309 	dev_dbg(dev, "req=%pK\n", req);
310 
311 	if (err != -EINPROGRESS) {
312 		/* Not a BACKLOG notification */
313 		cc_unmap_hash_request(dev, state, req->src, false);
314 		cc_unmap_result(dev, state, digestsize, req->result);
315 		cc_unmap_req(dev, state, ctx);
316 	}
317 
318 	ahash_request_complete(req, err);
319 }
320 
cc_hash_complete(struct device * dev,void * cc_req,int err)321 static void cc_hash_complete(struct device *dev, void *cc_req, int err)
322 {
323 	struct ahash_request *req = (struct ahash_request *)cc_req;
324 	struct ahash_req_ctx *state = ahash_request_ctx(req);
325 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
326 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
327 	u32 digestsize = crypto_ahash_digestsize(tfm);
328 
329 	dev_dbg(dev, "req=%pK\n", req);
330 
331 	if (err != -EINPROGRESS) {
332 		/* Not a BACKLOG notification */
333 		cc_unmap_hash_request(dev, state, req->src, false);
334 		cc_unmap_result(dev, state, digestsize, req->result);
335 		cc_unmap_req(dev, state, ctx);
336 	}
337 
338 	ahash_request_complete(req, err);
339 }
340 
cc_fin_result(struct cc_hw_desc * desc,struct ahash_request * req,int idx)341 static int cc_fin_result(struct cc_hw_desc *desc, struct ahash_request *req,
342 			 int idx)
343 {
344 	struct ahash_req_ctx *state = ahash_request_ctx(req);
345 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
346 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
347 	u32 digestsize = crypto_ahash_digestsize(tfm);
348 
349 	/* Get final MAC result */
350 	hw_desc_init(&desc[idx]);
351 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
352 	set_dout_dlli(&desc[idx], state->digest_result_dma_addr, digestsize,
353 		      NS_BIT, 1);
354 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
355 	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
356 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
357 	set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
358 	cc_set_endianity(ctx->hash_mode, &desc[idx]);
359 	idx++;
360 
361 	return idx;
362 }
363 
cc_fin_hmac(struct cc_hw_desc * desc,struct ahash_request * req,int idx)364 static int cc_fin_hmac(struct cc_hw_desc *desc, struct ahash_request *req,
365 		       int idx)
366 {
367 	struct ahash_req_ctx *state = ahash_request_ctx(req);
368 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
369 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
370 	u32 digestsize = crypto_ahash_digestsize(tfm);
371 
372 	/* store the hash digest result in the context */
373 	hw_desc_init(&desc[idx]);
374 	set_cipher_mode(&desc[idx], ctx->hw_mode);
375 	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr, digestsize,
376 		      NS_BIT, 0);
377 	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
378 	cc_set_endianity(ctx->hash_mode, &desc[idx]);
379 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
380 	idx++;
381 
382 	/* Loading hash opad xor key state */
383 	hw_desc_init(&desc[idx]);
384 	set_cipher_mode(&desc[idx], ctx->hw_mode);
385 	set_din_type(&desc[idx], DMA_DLLI, state->opad_digest_dma_addr,
386 		     ctx->inter_digestsize, NS_BIT);
387 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
388 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
389 	idx++;
390 
391 	/* Load the hash current length */
392 	hw_desc_init(&desc[idx]);
393 	set_cipher_mode(&desc[idx], ctx->hw_mode);
394 	set_din_sram(&desc[idx],
395 		     cc_digest_len_addr(ctx->drvdata, ctx->hash_mode),
396 		     ctx->hash_len);
397 	set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
398 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
399 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
400 	idx++;
401 
402 	/* Memory Barrier: wait for IPAD/OPAD axi write to complete */
403 	hw_desc_init(&desc[idx]);
404 	set_din_no_dma(&desc[idx], 0, 0xfffff0);
405 	set_dout_no_dma(&desc[idx], 0, 0, 1);
406 	idx++;
407 
408 	/* Perform HASH update */
409 	hw_desc_init(&desc[idx]);
410 	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
411 		     digestsize, NS_BIT);
412 	set_flow_mode(&desc[idx], DIN_HASH);
413 	idx++;
414 
415 	return idx;
416 }
417 
cc_hash_digest(struct ahash_request * req)418 static int cc_hash_digest(struct ahash_request *req)
419 {
420 	struct ahash_req_ctx *state = ahash_request_ctx(req);
421 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
422 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
423 	u32 digestsize = crypto_ahash_digestsize(tfm);
424 	struct scatterlist *src = req->src;
425 	unsigned int nbytes = req->nbytes;
426 	u8 *result = req->result;
427 	struct device *dev = drvdata_to_dev(ctx->drvdata);
428 	bool is_hmac = ctx->is_hmac;
429 	struct cc_crypto_req cc_req = {};
430 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
431 	u32 larval_digest_addr;
432 	int idx = 0;
433 	int rc = 0;
434 	gfp_t flags = cc_gfp_flags(&req->base);
435 
436 	dev_dbg(dev, "===== %s-digest (%d) ====\n", is_hmac ? "hmac" : "hash",
437 		nbytes);
438 
439 	cc_init_req(dev, state, ctx);
440 
441 	if (cc_map_req(dev, state, ctx)) {
442 		dev_err(dev, "map_ahash_source() failed\n");
443 		return -ENOMEM;
444 	}
445 
446 	if (cc_map_result(dev, state, digestsize)) {
447 		dev_err(dev, "map_ahash_digest() failed\n");
448 		cc_unmap_req(dev, state, ctx);
449 		return -ENOMEM;
450 	}
451 
452 	if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, 1,
453 				      flags)) {
454 		dev_err(dev, "map_ahash_request_final() failed\n");
455 		cc_unmap_result(dev, state, digestsize, result);
456 		cc_unmap_req(dev, state, ctx);
457 		return -ENOMEM;
458 	}
459 
460 	/* Setup request structure */
461 	cc_req.user_cb = cc_digest_complete;
462 	cc_req.user_arg = req;
463 
464 	/* If HMAC then load hash IPAD xor key, if HASH then load initial
465 	 * digest
466 	 */
467 	hw_desc_init(&desc[idx]);
468 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
469 	if (is_hmac) {
470 		set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
471 			     ctx->inter_digestsize, NS_BIT);
472 	} else {
473 		larval_digest_addr = cc_larval_digest_addr(ctx->drvdata,
474 							   ctx->hash_mode);
475 		set_din_sram(&desc[idx], larval_digest_addr,
476 			     ctx->inter_digestsize);
477 	}
478 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
479 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
480 	idx++;
481 
482 	/* Load the hash current length */
483 	hw_desc_init(&desc[idx]);
484 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
485 
486 	if (is_hmac) {
487 		set_din_type(&desc[idx], DMA_DLLI,
488 			     state->digest_bytes_len_dma_addr,
489 			     ctx->hash_len, NS_BIT);
490 	} else {
491 		set_din_const(&desc[idx], 0, ctx->hash_len);
492 		if (nbytes)
493 			set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
494 		else
495 			set_cipher_do(&desc[idx], DO_PAD);
496 	}
497 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
498 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
499 	idx++;
500 
501 	cc_set_desc(state, ctx, DIN_HASH, desc, false, &idx);
502 
503 	if (is_hmac) {
504 		/* HW last hash block padding (aka. "DO_PAD") */
505 		hw_desc_init(&desc[idx]);
506 		set_cipher_mode(&desc[idx], ctx->hw_mode);
507 		set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
508 			      ctx->hash_len, NS_BIT, 0);
509 		set_flow_mode(&desc[idx], S_HASH_to_DOUT);
510 		set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
511 		set_cipher_do(&desc[idx], DO_PAD);
512 		idx++;
513 
514 		idx = cc_fin_hmac(desc, req, idx);
515 	}
516 
517 	idx = cc_fin_result(desc, req, idx);
518 
519 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
520 	if (rc != -EINPROGRESS && rc != -EBUSY) {
521 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
522 		cc_unmap_hash_request(dev, state, src, true);
523 		cc_unmap_result(dev, state, digestsize, result);
524 		cc_unmap_req(dev, state, ctx);
525 	}
526 	return rc;
527 }
528 
cc_restore_hash(struct cc_hw_desc * desc,struct cc_hash_ctx * ctx,struct ahash_req_ctx * state,unsigned int idx)529 static int cc_restore_hash(struct cc_hw_desc *desc, struct cc_hash_ctx *ctx,
530 			   struct ahash_req_ctx *state, unsigned int idx)
531 {
532 	/* Restore hash digest */
533 	hw_desc_init(&desc[idx]);
534 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
535 	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
536 		     ctx->inter_digestsize, NS_BIT);
537 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
538 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
539 	idx++;
540 
541 	/* Restore hash current length */
542 	hw_desc_init(&desc[idx]);
543 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
544 	set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
545 	set_din_type(&desc[idx], DMA_DLLI, state->digest_bytes_len_dma_addr,
546 		     ctx->hash_len, NS_BIT);
547 	set_flow_mode(&desc[idx], S_DIN_to_HASH);
548 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
549 	idx++;
550 
551 	cc_set_desc(state, ctx, DIN_HASH, desc, false, &idx);
552 
553 	return idx;
554 }
555 
cc_hash_update(struct ahash_request * req)556 static int cc_hash_update(struct ahash_request *req)
557 {
558 	struct ahash_req_ctx *state = ahash_request_ctx(req);
559 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
560 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
561 	unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
562 	struct scatterlist *src = req->src;
563 	unsigned int nbytes = req->nbytes;
564 	struct device *dev = drvdata_to_dev(ctx->drvdata);
565 	struct cc_crypto_req cc_req = {};
566 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
567 	u32 idx = 0;
568 	int rc;
569 	gfp_t flags = cc_gfp_flags(&req->base);
570 
571 	dev_dbg(dev, "===== %s-update (%d) ====\n", ctx->is_hmac ?
572 		"hmac" : "hash", nbytes);
573 
574 	if (nbytes == 0) {
575 		/* no real updates required */
576 		return 0;
577 	}
578 
579 	rc = cc_map_hash_request_update(ctx->drvdata, state, src, nbytes,
580 					block_size, flags);
581 	if (rc) {
582 		if (rc == 1) {
583 			dev_dbg(dev, " data size not require HW update %x\n",
584 				nbytes);
585 			/* No hardware updates are required */
586 			return 0;
587 		}
588 		dev_err(dev, "map_ahash_request_update() failed\n");
589 		return -ENOMEM;
590 	}
591 
592 	if (cc_map_req(dev, state, ctx)) {
593 		dev_err(dev, "map_ahash_source() failed\n");
594 		cc_unmap_hash_request(dev, state, src, true);
595 		return -EINVAL;
596 	}
597 
598 	/* Setup request structure */
599 	cc_req.user_cb = cc_update_complete;
600 	cc_req.user_arg = req;
601 
602 	idx = cc_restore_hash(desc, ctx, state, idx);
603 
604 	/* store the hash digest result in context */
605 	hw_desc_init(&desc[idx]);
606 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
607 	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
608 		      ctx->inter_digestsize, NS_BIT, 0);
609 	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
610 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
611 	idx++;
612 
613 	/* store current hash length in context */
614 	hw_desc_init(&desc[idx]);
615 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
616 	set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
617 		      ctx->hash_len, NS_BIT, 1);
618 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
619 	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
620 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
621 	idx++;
622 
623 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
624 	if (rc != -EINPROGRESS && rc != -EBUSY) {
625 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
626 		cc_unmap_hash_request(dev, state, src, true);
627 		cc_unmap_req(dev, state, ctx);
628 	}
629 	return rc;
630 }
631 
cc_do_finup(struct ahash_request * req,bool update)632 static int cc_do_finup(struct ahash_request *req, bool update)
633 {
634 	struct ahash_req_ctx *state = ahash_request_ctx(req);
635 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
636 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
637 	u32 digestsize = crypto_ahash_digestsize(tfm);
638 	struct scatterlist *src = req->src;
639 	unsigned int nbytes = req->nbytes;
640 	u8 *result = req->result;
641 	struct device *dev = drvdata_to_dev(ctx->drvdata);
642 	bool is_hmac = ctx->is_hmac;
643 	struct cc_crypto_req cc_req = {};
644 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
645 	unsigned int idx = 0;
646 	int rc;
647 	gfp_t flags = cc_gfp_flags(&req->base);
648 
649 	dev_dbg(dev, "===== %s-%s (%d) ====\n", is_hmac ? "hmac" : "hash",
650 		update ? "finup" : "final", nbytes);
651 
652 	if (cc_map_req(dev, state, ctx)) {
653 		dev_err(dev, "map_ahash_source() failed\n");
654 		return -EINVAL;
655 	}
656 
657 	if (cc_map_hash_request_final(ctx->drvdata, state, src, nbytes, update,
658 				      flags)) {
659 		dev_err(dev, "map_ahash_request_final() failed\n");
660 		cc_unmap_req(dev, state, ctx);
661 		return -ENOMEM;
662 	}
663 	if (cc_map_result(dev, state, digestsize)) {
664 		dev_err(dev, "map_ahash_digest() failed\n");
665 		cc_unmap_hash_request(dev, state, src, true);
666 		cc_unmap_req(dev, state, ctx);
667 		return -ENOMEM;
668 	}
669 
670 	/* Setup request structure */
671 	cc_req.user_cb = cc_hash_complete;
672 	cc_req.user_arg = req;
673 
674 	idx = cc_restore_hash(desc, ctx, state, idx);
675 
676 	/* Pad the hash */
677 	hw_desc_init(&desc[idx]);
678 	set_cipher_do(&desc[idx], DO_PAD);
679 	set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
680 	set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
681 		      ctx->hash_len, NS_BIT, 0);
682 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
683 	set_flow_mode(&desc[idx], S_HASH_to_DOUT);
684 	idx++;
685 
686 	if (is_hmac)
687 		idx = cc_fin_hmac(desc, req, idx);
688 
689 	idx = cc_fin_result(desc, req, idx);
690 
691 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
692 	if (rc != -EINPROGRESS && rc != -EBUSY) {
693 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
694 		cc_unmap_hash_request(dev, state, src, true);
695 		cc_unmap_result(dev, state, digestsize, result);
696 		cc_unmap_req(dev, state, ctx);
697 	}
698 	return rc;
699 }
700 
cc_hash_finup(struct ahash_request * req)701 static int cc_hash_finup(struct ahash_request *req)
702 {
703 	return cc_do_finup(req, true);
704 }
705 
706 
cc_hash_final(struct ahash_request * req)707 static int cc_hash_final(struct ahash_request *req)
708 {
709 	return cc_do_finup(req, false);
710 }
711 
cc_hash_init(struct ahash_request * req)712 static int cc_hash_init(struct ahash_request *req)
713 {
714 	struct ahash_req_ctx *state = ahash_request_ctx(req);
715 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
716 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
717 	struct device *dev = drvdata_to_dev(ctx->drvdata);
718 
719 	dev_dbg(dev, "===== init (%d) ====\n", req->nbytes);
720 
721 	cc_init_req(dev, state, ctx);
722 
723 	return 0;
724 }
725 
cc_hash_setkey(struct crypto_ahash * ahash,const u8 * key,unsigned int keylen)726 static int cc_hash_setkey(struct crypto_ahash *ahash, const u8 *key,
727 			  unsigned int keylen)
728 {
729 	unsigned int hmac_pad_const[2] = { HMAC_IPAD_CONST, HMAC_OPAD_CONST };
730 	struct cc_crypto_req cc_req = {};
731 	struct cc_hash_ctx *ctx = NULL;
732 	int blocksize = 0;
733 	int digestsize = 0;
734 	int i, idx = 0, rc = 0;
735 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
736 	u32 larval_addr;
737 	struct device *dev;
738 
739 	ctx = crypto_ahash_ctx(ahash);
740 	dev = drvdata_to_dev(ctx->drvdata);
741 	dev_dbg(dev, "start keylen: %d", keylen);
742 
743 	blocksize = crypto_tfm_alg_blocksize(&ahash->base);
744 	digestsize = crypto_ahash_digestsize(ahash);
745 
746 	larval_addr = cc_larval_digest_addr(ctx->drvdata, ctx->hash_mode);
747 
748 	/* The keylen value distinguishes HASH in case keylen is ZERO bytes,
749 	 * any NON-ZERO value utilizes HMAC flow
750 	 */
751 	ctx->key_params.keylen = keylen;
752 	ctx->key_params.key_dma_addr = 0;
753 	ctx->is_hmac = true;
754 	ctx->key_params.key = NULL;
755 
756 	if (keylen) {
757 		ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
758 		if (!ctx->key_params.key)
759 			return -ENOMEM;
760 
761 		ctx->key_params.key_dma_addr =
762 			dma_map_single(dev, ctx->key_params.key, keylen,
763 				       DMA_TO_DEVICE);
764 		if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
765 			dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
766 				ctx->key_params.key, keylen);
767 			kfree_sensitive(ctx->key_params.key);
768 			return -ENOMEM;
769 		}
770 		dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
771 			&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
772 
773 		if (keylen > blocksize) {
774 			/* Load hash initial state */
775 			hw_desc_init(&desc[idx]);
776 			set_cipher_mode(&desc[idx], ctx->hw_mode);
777 			set_din_sram(&desc[idx], larval_addr,
778 				     ctx->inter_digestsize);
779 			set_flow_mode(&desc[idx], S_DIN_to_HASH);
780 			set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
781 			idx++;
782 
783 			/* Load the hash current length*/
784 			hw_desc_init(&desc[idx]);
785 			set_cipher_mode(&desc[idx], ctx->hw_mode);
786 			set_din_const(&desc[idx], 0, ctx->hash_len);
787 			set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
788 			set_flow_mode(&desc[idx], S_DIN_to_HASH);
789 			set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
790 			idx++;
791 
792 			hw_desc_init(&desc[idx]);
793 			set_din_type(&desc[idx], DMA_DLLI,
794 				     ctx->key_params.key_dma_addr, keylen,
795 				     NS_BIT);
796 			set_flow_mode(&desc[idx], DIN_HASH);
797 			idx++;
798 
799 			/* Get hashed key */
800 			hw_desc_init(&desc[idx]);
801 			set_cipher_mode(&desc[idx], ctx->hw_mode);
802 			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
803 				      digestsize, NS_BIT, 0);
804 			set_flow_mode(&desc[idx], S_HASH_to_DOUT);
805 			set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
806 			set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
807 			cc_set_endianity(ctx->hash_mode, &desc[idx]);
808 			idx++;
809 
810 			hw_desc_init(&desc[idx]);
811 			set_din_const(&desc[idx], 0, (blocksize - digestsize));
812 			set_flow_mode(&desc[idx], BYPASS);
813 			set_dout_dlli(&desc[idx],
814 				      (ctx->opad_tmp_keys_dma_addr +
815 				       digestsize),
816 				      (blocksize - digestsize), NS_BIT, 0);
817 			idx++;
818 		} else {
819 			hw_desc_init(&desc[idx]);
820 			set_din_type(&desc[idx], DMA_DLLI,
821 				     ctx->key_params.key_dma_addr, keylen,
822 				     NS_BIT);
823 			set_flow_mode(&desc[idx], BYPASS);
824 			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
825 				      keylen, NS_BIT, 0);
826 			idx++;
827 
828 			if ((blocksize - keylen)) {
829 				hw_desc_init(&desc[idx]);
830 				set_din_const(&desc[idx], 0,
831 					      (blocksize - keylen));
832 				set_flow_mode(&desc[idx], BYPASS);
833 				set_dout_dlli(&desc[idx],
834 					      (ctx->opad_tmp_keys_dma_addr +
835 					       keylen), (blocksize - keylen),
836 					      NS_BIT, 0);
837 				idx++;
838 			}
839 		}
840 	} else {
841 		hw_desc_init(&desc[idx]);
842 		set_din_const(&desc[idx], 0, blocksize);
843 		set_flow_mode(&desc[idx], BYPASS);
844 		set_dout_dlli(&desc[idx], (ctx->opad_tmp_keys_dma_addr),
845 			      blocksize, NS_BIT, 0);
846 		idx++;
847 	}
848 
849 	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
850 	if (rc) {
851 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
852 		goto out;
853 	}
854 
855 	/* calc derived HMAC key */
856 	for (idx = 0, i = 0; i < 2; i++) {
857 		/* Load hash initial state */
858 		hw_desc_init(&desc[idx]);
859 		set_cipher_mode(&desc[idx], ctx->hw_mode);
860 		set_din_sram(&desc[idx], larval_addr, ctx->inter_digestsize);
861 		set_flow_mode(&desc[idx], S_DIN_to_HASH);
862 		set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
863 		idx++;
864 
865 		/* Load the hash current length*/
866 		hw_desc_init(&desc[idx]);
867 		set_cipher_mode(&desc[idx], ctx->hw_mode);
868 		set_din_const(&desc[idx], 0, ctx->hash_len);
869 		set_flow_mode(&desc[idx], S_DIN_to_HASH);
870 		set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
871 		idx++;
872 
873 		/* Prepare ipad key */
874 		hw_desc_init(&desc[idx]);
875 		set_xor_val(&desc[idx], hmac_pad_const[i]);
876 		set_cipher_mode(&desc[idx], ctx->hw_mode);
877 		set_flow_mode(&desc[idx], S_DIN_to_HASH);
878 		set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
879 		idx++;
880 
881 		/* Perform HASH update */
882 		hw_desc_init(&desc[idx]);
883 		set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
884 			     blocksize, NS_BIT);
885 		set_cipher_mode(&desc[idx], ctx->hw_mode);
886 		set_xor_active(&desc[idx]);
887 		set_flow_mode(&desc[idx], DIN_HASH);
888 		idx++;
889 
890 		/* Get the IPAD/OPAD xor key (Note, IPAD is the initial digest
891 		 * of the first HASH "update" state)
892 		 */
893 		hw_desc_init(&desc[idx]);
894 		set_cipher_mode(&desc[idx], ctx->hw_mode);
895 		if (i > 0) /* Not first iteration */
896 			set_dout_dlli(&desc[idx], ctx->opad_tmp_keys_dma_addr,
897 				      ctx->inter_digestsize, NS_BIT, 0);
898 		else /* First iteration */
899 			set_dout_dlli(&desc[idx], ctx->digest_buff_dma_addr,
900 				      ctx->inter_digestsize, NS_BIT, 0);
901 		set_flow_mode(&desc[idx], S_HASH_to_DOUT);
902 		set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
903 		idx++;
904 	}
905 
906 	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
907 
908 out:
909 	if (ctx->key_params.key_dma_addr) {
910 		dma_unmap_single(dev, ctx->key_params.key_dma_addr,
911 				 ctx->key_params.keylen, DMA_TO_DEVICE);
912 		dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
913 			&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
914 	}
915 
916 	kfree_sensitive(ctx->key_params.key);
917 
918 	return rc;
919 }
920 
cc_xcbc_setkey(struct crypto_ahash * ahash,const u8 * key,unsigned int keylen)921 static int cc_xcbc_setkey(struct crypto_ahash *ahash,
922 			  const u8 *key, unsigned int keylen)
923 {
924 	struct cc_crypto_req cc_req = {};
925 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
926 	struct device *dev = drvdata_to_dev(ctx->drvdata);
927 	int rc = 0;
928 	unsigned int idx = 0;
929 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
930 
931 	dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
932 
933 	switch (keylen) {
934 	case AES_KEYSIZE_128:
935 	case AES_KEYSIZE_192:
936 	case AES_KEYSIZE_256:
937 		break;
938 	default:
939 		return -EINVAL;
940 	}
941 
942 	ctx->key_params.keylen = keylen;
943 
944 	ctx->key_params.key = kmemdup(key, keylen, GFP_KERNEL);
945 	if (!ctx->key_params.key)
946 		return -ENOMEM;
947 
948 	ctx->key_params.key_dma_addr =
949 		dma_map_single(dev, ctx->key_params.key, keylen, DMA_TO_DEVICE);
950 	if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
951 		dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
952 			key, keylen);
953 		kfree_sensitive(ctx->key_params.key);
954 		return -ENOMEM;
955 	}
956 	dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
957 		&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
958 
959 	ctx->is_hmac = true;
960 	/* 1. Load the AES key */
961 	hw_desc_init(&desc[idx]);
962 	set_din_type(&desc[idx], DMA_DLLI, ctx->key_params.key_dma_addr,
963 		     keylen, NS_BIT);
964 	set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
965 	set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_ENCRYPT);
966 	set_key_size_aes(&desc[idx], keylen);
967 	set_flow_mode(&desc[idx], S_DIN_to_AES);
968 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
969 	idx++;
970 
971 	hw_desc_init(&desc[idx]);
972 	set_din_const(&desc[idx], 0x01010101, CC_AES_128_BIT_KEY_SIZE);
973 	set_flow_mode(&desc[idx], DIN_AES_DOUT);
974 	set_dout_dlli(&desc[idx],
975 		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
976 		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
977 	idx++;
978 
979 	hw_desc_init(&desc[idx]);
980 	set_din_const(&desc[idx], 0x02020202, CC_AES_128_BIT_KEY_SIZE);
981 	set_flow_mode(&desc[idx], DIN_AES_DOUT);
982 	set_dout_dlli(&desc[idx],
983 		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
984 		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
985 	idx++;
986 
987 	hw_desc_init(&desc[idx]);
988 	set_din_const(&desc[idx], 0x03030303, CC_AES_128_BIT_KEY_SIZE);
989 	set_flow_mode(&desc[idx], DIN_AES_DOUT);
990 	set_dout_dlli(&desc[idx],
991 		      (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
992 		      CC_AES_128_BIT_KEY_SIZE, NS_BIT, 0);
993 	idx++;
994 
995 	rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
996 
997 	dma_unmap_single(dev, ctx->key_params.key_dma_addr,
998 			 ctx->key_params.keylen, DMA_TO_DEVICE);
999 	dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
1000 		&ctx->key_params.key_dma_addr, ctx->key_params.keylen);
1001 
1002 	kfree_sensitive(ctx->key_params.key);
1003 
1004 	return rc;
1005 }
1006 
cc_cmac_setkey(struct crypto_ahash * ahash,const u8 * key,unsigned int keylen)1007 static int cc_cmac_setkey(struct crypto_ahash *ahash,
1008 			  const u8 *key, unsigned int keylen)
1009 {
1010 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1011 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1012 
1013 	dev_dbg(dev, "===== setkey (%d) ====\n", keylen);
1014 
1015 	ctx->is_hmac = true;
1016 
1017 	switch (keylen) {
1018 	case AES_KEYSIZE_128:
1019 	case AES_KEYSIZE_192:
1020 	case AES_KEYSIZE_256:
1021 		break;
1022 	default:
1023 		return -EINVAL;
1024 	}
1025 
1026 	ctx->key_params.keylen = keylen;
1027 
1028 	/* STAT_PHASE_1: Copy key to ctx */
1029 
1030 	dma_sync_single_for_cpu(dev, ctx->opad_tmp_keys_dma_addr,
1031 				keylen, DMA_TO_DEVICE);
1032 
1033 	memcpy(ctx->opad_tmp_keys_buff, key, keylen);
1034 	if (keylen == 24) {
1035 		memset(ctx->opad_tmp_keys_buff + 24, 0,
1036 		       CC_AES_KEY_SIZE_MAX - 24);
1037 	}
1038 
1039 	dma_sync_single_for_device(dev, ctx->opad_tmp_keys_dma_addr,
1040 				   keylen, DMA_TO_DEVICE);
1041 
1042 	ctx->key_params.keylen = keylen;
1043 
1044 	return 0;
1045 }
1046 
cc_free_ctx(struct cc_hash_ctx * ctx)1047 static void cc_free_ctx(struct cc_hash_ctx *ctx)
1048 {
1049 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1050 
1051 	if (ctx->digest_buff_dma_addr) {
1052 		dma_unmap_single(dev, ctx->digest_buff_dma_addr,
1053 				 sizeof(ctx->digest_buff), DMA_BIDIRECTIONAL);
1054 		dev_dbg(dev, "Unmapped digest-buffer: digest_buff_dma_addr=%pad\n",
1055 			&ctx->digest_buff_dma_addr);
1056 		ctx->digest_buff_dma_addr = 0;
1057 	}
1058 	if (ctx->opad_tmp_keys_dma_addr) {
1059 		dma_unmap_single(dev, ctx->opad_tmp_keys_dma_addr,
1060 				 sizeof(ctx->opad_tmp_keys_buff),
1061 				 DMA_BIDIRECTIONAL);
1062 		dev_dbg(dev, "Unmapped opad-digest: opad_tmp_keys_dma_addr=%pad\n",
1063 			&ctx->opad_tmp_keys_dma_addr);
1064 		ctx->opad_tmp_keys_dma_addr = 0;
1065 	}
1066 
1067 	ctx->key_params.keylen = 0;
1068 }
1069 
cc_alloc_ctx(struct cc_hash_ctx * ctx)1070 static int cc_alloc_ctx(struct cc_hash_ctx *ctx)
1071 {
1072 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1073 
1074 	ctx->key_params.keylen = 0;
1075 
1076 	ctx->digest_buff_dma_addr =
1077 		dma_map_single(dev, ctx->digest_buff, sizeof(ctx->digest_buff),
1078 			       DMA_BIDIRECTIONAL);
1079 	if (dma_mapping_error(dev, ctx->digest_buff_dma_addr)) {
1080 		dev_err(dev, "Mapping digest len %zu B at va=%pK for DMA failed\n",
1081 			sizeof(ctx->digest_buff), ctx->digest_buff);
1082 		goto fail;
1083 	}
1084 	dev_dbg(dev, "Mapped digest %zu B at va=%pK to dma=%pad\n",
1085 		sizeof(ctx->digest_buff), ctx->digest_buff,
1086 		&ctx->digest_buff_dma_addr);
1087 
1088 	ctx->opad_tmp_keys_dma_addr =
1089 		dma_map_single(dev, ctx->opad_tmp_keys_buff,
1090 			       sizeof(ctx->opad_tmp_keys_buff),
1091 			       DMA_BIDIRECTIONAL);
1092 	if (dma_mapping_error(dev, ctx->opad_tmp_keys_dma_addr)) {
1093 		dev_err(dev, "Mapping opad digest %zu B at va=%pK for DMA failed\n",
1094 			sizeof(ctx->opad_tmp_keys_buff),
1095 			ctx->opad_tmp_keys_buff);
1096 		goto fail;
1097 	}
1098 	dev_dbg(dev, "Mapped opad_tmp_keys %zu B at va=%pK to dma=%pad\n",
1099 		sizeof(ctx->opad_tmp_keys_buff), ctx->opad_tmp_keys_buff,
1100 		&ctx->opad_tmp_keys_dma_addr);
1101 
1102 	ctx->is_hmac = false;
1103 	return 0;
1104 
1105 fail:
1106 	cc_free_ctx(ctx);
1107 	return -ENOMEM;
1108 }
1109 
cc_get_hash_len(struct crypto_tfm * tfm)1110 static int cc_get_hash_len(struct crypto_tfm *tfm)
1111 {
1112 	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1113 
1114 	if (ctx->hash_mode == DRV_HASH_SM3)
1115 		return CC_SM3_HASH_LEN_SIZE;
1116 	else
1117 		return cc_get_default_hash_len(ctx->drvdata);
1118 }
1119 
cc_cra_init(struct crypto_tfm * tfm)1120 static int cc_cra_init(struct crypto_tfm *tfm)
1121 {
1122 	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1123 	struct hash_alg_common *hash_alg_common =
1124 		container_of(tfm->__crt_alg, struct hash_alg_common, base);
1125 	struct ahash_alg *ahash_alg =
1126 		container_of(hash_alg_common, struct ahash_alg, halg);
1127 	struct cc_hash_alg *cc_alg =
1128 			container_of(ahash_alg, struct cc_hash_alg, ahash_alg);
1129 
1130 	crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
1131 				 sizeof(struct ahash_req_ctx));
1132 
1133 	ctx->hash_mode = cc_alg->hash_mode;
1134 	ctx->hw_mode = cc_alg->hw_mode;
1135 	ctx->inter_digestsize = cc_alg->inter_digestsize;
1136 	ctx->drvdata = cc_alg->drvdata;
1137 	ctx->hash_len = cc_get_hash_len(tfm);
1138 	return cc_alloc_ctx(ctx);
1139 }
1140 
cc_cra_exit(struct crypto_tfm * tfm)1141 static void cc_cra_exit(struct crypto_tfm *tfm)
1142 {
1143 	struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
1144 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1145 
1146 	dev_dbg(dev, "cc_cra_exit");
1147 	cc_free_ctx(ctx);
1148 }
1149 
cc_mac_update(struct ahash_request * req)1150 static int cc_mac_update(struct ahash_request *req)
1151 {
1152 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1153 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1154 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1155 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1156 	unsigned int block_size = crypto_tfm_alg_blocksize(&tfm->base);
1157 	struct cc_crypto_req cc_req = {};
1158 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1159 	int rc;
1160 	u32 idx = 0;
1161 	gfp_t flags = cc_gfp_flags(&req->base);
1162 
1163 	if (req->nbytes == 0) {
1164 		/* no real updates required */
1165 		return 0;
1166 	}
1167 
1168 	state->xcbc_count++;
1169 
1170 	rc = cc_map_hash_request_update(ctx->drvdata, state, req->src,
1171 					req->nbytes, block_size, flags);
1172 	if (rc) {
1173 		if (rc == 1) {
1174 			dev_dbg(dev, " data size not require HW update %x\n",
1175 				req->nbytes);
1176 			/* No hardware updates are required */
1177 			return 0;
1178 		}
1179 		dev_err(dev, "map_ahash_request_update() failed\n");
1180 		return -ENOMEM;
1181 	}
1182 
1183 	if (cc_map_req(dev, state, ctx)) {
1184 		dev_err(dev, "map_ahash_source() failed\n");
1185 		return -EINVAL;
1186 	}
1187 
1188 	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
1189 		cc_setup_xcbc(req, desc, &idx);
1190 	else
1191 		cc_setup_cmac(req, desc, &idx);
1192 
1193 	cc_set_desc(state, ctx, DIN_AES_DOUT, desc, true, &idx);
1194 
1195 	/* store the hash digest result in context */
1196 	hw_desc_init(&desc[idx]);
1197 	set_cipher_mode(&desc[idx], ctx->hw_mode);
1198 	set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
1199 		      ctx->inter_digestsize, NS_BIT, 1);
1200 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
1201 	set_flow_mode(&desc[idx], S_AES_to_DOUT);
1202 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1203 	idx++;
1204 
1205 	/* Setup request structure */
1206 	cc_req.user_cb = cc_update_complete;
1207 	cc_req.user_arg = req;
1208 
1209 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1210 	if (rc != -EINPROGRESS && rc != -EBUSY) {
1211 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1212 		cc_unmap_hash_request(dev, state, req->src, true);
1213 		cc_unmap_req(dev, state, ctx);
1214 	}
1215 	return rc;
1216 }
1217 
cc_mac_final(struct ahash_request * req)1218 static int cc_mac_final(struct ahash_request *req)
1219 {
1220 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1221 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1222 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1223 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1224 	struct cc_crypto_req cc_req = {};
1225 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1226 	int idx = 0;
1227 	int rc = 0;
1228 	u32 key_size, key_len;
1229 	u32 digestsize = crypto_ahash_digestsize(tfm);
1230 	gfp_t flags = cc_gfp_flags(&req->base);
1231 	u32 rem_cnt = *cc_hash_buf_cnt(state);
1232 
1233 	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
1234 		key_size = CC_AES_128_BIT_KEY_SIZE;
1235 		key_len  = CC_AES_128_BIT_KEY_SIZE;
1236 	} else {
1237 		key_size = (ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
1238 			ctx->key_params.keylen;
1239 		key_len =  ctx->key_params.keylen;
1240 	}
1241 
1242 	dev_dbg(dev, "===== final  xcbc reminder (%d) ====\n", rem_cnt);
1243 
1244 	if (cc_map_req(dev, state, ctx)) {
1245 		dev_err(dev, "map_ahash_source() failed\n");
1246 		return -EINVAL;
1247 	}
1248 
1249 	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
1250 				      req->nbytes, 0, flags)) {
1251 		dev_err(dev, "map_ahash_request_final() failed\n");
1252 		cc_unmap_req(dev, state, ctx);
1253 		return -ENOMEM;
1254 	}
1255 
1256 	if (cc_map_result(dev, state, digestsize)) {
1257 		dev_err(dev, "map_ahash_digest() failed\n");
1258 		cc_unmap_hash_request(dev, state, req->src, true);
1259 		cc_unmap_req(dev, state, ctx);
1260 		return -ENOMEM;
1261 	}
1262 
1263 	/* Setup request structure */
1264 	cc_req.user_cb = cc_hash_complete;
1265 	cc_req.user_arg = req;
1266 
1267 	if (state->xcbc_count && rem_cnt == 0) {
1268 		/* Load key for ECB decryption */
1269 		hw_desc_init(&desc[idx]);
1270 		set_cipher_mode(&desc[idx], DRV_CIPHER_ECB);
1271 		set_cipher_config0(&desc[idx], DRV_CRYPTO_DIRECTION_DECRYPT);
1272 		set_din_type(&desc[idx], DMA_DLLI,
1273 			     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K1_OFFSET),
1274 			     key_size, NS_BIT);
1275 		set_key_size_aes(&desc[idx], key_len);
1276 		set_flow_mode(&desc[idx], S_DIN_to_AES);
1277 		set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
1278 		idx++;
1279 
1280 		/* Initiate decryption of block state to previous
1281 		 * block_state-XOR-M[n]
1282 		 */
1283 		hw_desc_init(&desc[idx]);
1284 		set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
1285 			     CC_AES_BLOCK_SIZE, NS_BIT);
1286 		set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
1287 			      CC_AES_BLOCK_SIZE, NS_BIT, 0);
1288 		set_flow_mode(&desc[idx], DIN_AES_DOUT);
1289 		idx++;
1290 
1291 		/* Memory Barrier: wait for axi write to complete */
1292 		hw_desc_init(&desc[idx]);
1293 		set_din_no_dma(&desc[idx], 0, 0xfffff0);
1294 		set_dout_no_dma(&desc[idx], 0, 0, 1);
1295 		idx++;
1296 	}
1297 
1298 	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC)
1299 		cc_setup_xcbc(req, desc, &idx);
1300 	else
1301 		cc_setup_cmac(req, desc, &idx);
1302 
1303 	if (state->xcbc_count == 0) {
1304 		hw_desc_init(&desc[idx]);
1305 		set_cipher_mode(&desc[idx], ctx->hw_mode);
1306 		set_key_size_aes(&desc[idx], key_len);
1307 		set_cmac_size0_mode(&desc[idx]);
1308 		set_flow_mode(&desc[idx], S_DIN_to_AES);
1309 		idx++;
1310 	} else if (rem_cnt > 0) {
1311 		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
1312 	} else {
1313 		hw_desc_init(&desc[idx]);
1314 		set_din_const(&desc[idx], 0x00, CC_AES_BLOCK_SIZE);
1315 		set_flow_mode(&desc[idx], DIN_AES_DOUT);
1316 		idx++;
1317 	}
1318 
1319 	/* Get final MAC result */
1320 	hw_desc_init(&desc[idx]);
1321 	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
1322 		      digestsize, NS_BIT, 1);
1323 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
1324 	set_flow_mode(&desc[idx], S_AES_to_DOUT);
1325 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1326 	set_cipher_mode(&desc[idx], ctx->hw_mode);
1327 	idx++;
1328 
1329 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1330 	if (rc != -EINPROGRESS && rc != -EBUSY) {
1331 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1332 		cc_unmap_hash_request(dev, state, req->src, true);
1333 		cc_unmap_result(dev, state, digestsize, req->result);
1334 		cc_unmap_req(dev, state, ctx);
1335 	}
1336 	return rc;
1337 }
1338 
cc_mac_finup(struct ahash_request * req)1339 static int cc_mac_finup(struct ahash_request *req)
1340 {
1341 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1342 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1343 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1344 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1345 	struct cc_crypto_req cc_req = {};
1346 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1347 	int idx = 0;
1348 	int rc = 0;
1349 	u32 key_len = 0;
1350 	u32 digestsize = crypto_ahash_digestsize(tfm);
1351 	gfp_t flags = cc_gfp_flags(&req->base);
1352 
1353 	dev_dbg(dev, "===== finup xcbc(%d) ====\n", req->nbytes);
1354 	if (state->xcbc_count > 0 && req->nbytes == 0) {
1355 		dev_dbg(dev, "No data to update. Call to fdx_mac_final\n");
1356 		return cc_mac_final(req);
1357 	}
1358 
1359 	if (cc_map_req(dev, state, ctx)) {
1360 		dev_err(dev, "map_ahash_source() failed\n");
1361 		return -EINVAL;
1362 	}
1363 
1364 	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
1365 				      req->nbytes, 1, flags)) {
1366 		dev_err(dev, "map_ahash_request_final() failed\n");
1367 		cc_unmap_req(dev, state, ctx);
1368 		return -ENOMEM;
1369 	}
1370 	if (cc_map_result(dev, state, digestsize)) {
1371 		dev_err(dev, "map_ahash_digest() failed\n");
1372 		cc_unmap_hash_request(dev, state, req->src, true);
1373 		cc_unmap_req(dev, state, ctx);
1374 		return -ENOMEM;
1375 	}
1376 
1377 	/* Setup request structure */
1378 	cc_req.user_cb = cc_hash_complete;
1379 	cc_req.user_arg = req;
1380 
1381 	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
1382 		key_len = CC_AES_128_BIT_KEY_SIZE;
1383 		cc_setup_xcbc(req, desc, &idx);
1384 	} else {
1385 		key_len = ctx->key_params.keylen;
1386 		cc_setup_cmac(req, desc, &idx);
1387 	}
1388 
1389 	if (req->nbytes == 0) {
1390 		hw_desc_init(&desc[idx]);
1391 		set_cipher_mode(&desc[idx], ctx->hw_mode);
1392 		set_key_size_aes(&desc[idx], key_len);
1393 		set_cmac_size0_mode(&desc[idx]);
1394 		set_flow_mode(&desc[idx], S_DIN_to_AES);
1395 		idx++;
1396 	} else {
1397 		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
1398 	}
1399 
1400 	/* Get final MAC result */
1401 	hw_desc_init(&desc[idx]);
1402 	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
1403 		      digestsize, NS_BIT, 1);
1404 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
1405 	set_flow_mode(&desc[idx], S_AES_to_DOUT);
1406 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1407 	set_cipher_mode(&desc[idx], ctx->hw_mode);
1408 	idx++;
1409 
1410 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1411 	if (rc != -EINPROGRESS && rc != -EBUSY) {
1412 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1413 		cc_unmap_hash_request(dev, state, req->src, true);
1414 		cc_unmap_result(dev, state, digestsize, req->result);
1415 		cc_unmap_req(dev, state, ctx);
1416 	}
1417 	return rc;
1418 }
1419 
cc_mac_digest(struct ahash_request * req)1420 static int cc_mac_digest(struct ahash_request *req)
1421 {
1422 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1423 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1424 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
1425 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1426 	u32 digestsize = crypto_ahash_digestsize(tfm);
1427 	struct cc_crypto_req cc_req = {};
1428 	struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
1429 	u32 key_len;
1430 	unsigned int idx = 0;
1431 	int rc;
1432 	gfp_t flags = cc_gfp_flags(&req->base);
1433 
1434 	dev_dbg(dev, "===== -digest mac (%d) ====\n",  req->nbytes);
1435 
1436 	cc_init_req(dev, state, ctx);
1437 
1438 	if (cc_map_req(dev, state, ctx)) {
1439 		dev_err(dev, "map_ahash_source() failed\n");
1440 		return -ENOMEM;
1441 	}
1442 	if (cc_map_result(dev, state, digestsize)) {
1443 		dev_err(dev, "map_ahash_digest() failed\n");
1444 		cc_unmap_req(dev, state, ctx);
1445 		return -ENOMEM;
1446 	}
1447 
1448 	if (cc_map_hash_request_final(ctx->drvdata, state, req->src,
1449 				      req->nbytes, 1, flags)) {
1450 		dev_err(dev, "map_ahash_request_final() failed\n");
1451 		cc_unmap_req(dev, state, ctx);
1452 		return -ENOMEM;
1453 	}
1454 
1455 	/* Setup request structure */
1456 	cc_req.user_cb = cc_digest_complete;
1457 	cc_req.user_arg = req;
1458 
1459 	if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
1460 		key_len = CC_AES_128_BIT_KEY_SIZE;
1461 		cc_setup_xcbc(req, desc, &idx);
1462 	} else {
1463 		key_len = ctx->key_params.keylen;
1464 		cc_setup_cmac(req, desc, &idx);
1465 	}
1466 
1467 	if (req->nbytes == 0) {
1468 		hw_desc_init(&desc[idx]);
1469 		set_cipher_mode(&desc[idx], ctx->hw_mode);
1470 		set_key_size_aes(&desc[idx], key_len);
1471 		set_cmac_size0_mode(&desc[idx]);
1472 		set_flow_mode(&desc[idx], S_DIN_to_AES);
1473 		idx++;
1474 	} else {
1475 		cc_set_desc(state, ctx, DIN_AES_DOUT, desc, false, &idx);
1476 	}
1477 
1478 	/* Get final MAC result */
1479 	hw_desc_init(&desc[idx]);
1480 	set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
1481 		      CC_AES_BLOCK_SIZE, NS_BIT, 1);
1482 	set_queue_last_ind(ctx->drvdata, &desc[idx]);
1483 	set_flow_mode(&desc[idx], S_AES_to_DOUT);
1484 	set_setup_mode(&desc[idx], SETUP_WRITE_STATE0);
1485 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
1486 	set_cipher_mode(&desc[idx], ctx->hw_mode);
1487 	idx++;
1488 
1489 	rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
1490 	if (rc != -EINPROGRESS && rc != -EBUSY) {
1491 		dev_err(dev, "send_request() failed (rc=%d)\n", rc);
1492 		cc_unmap_hash_request(dev, state, req->src, true);
1493 		cc_unmap_result(dev, state, digestsize, req->result);
1494 		cc_unmap_req(dev, state, ctx);
1495 	}
1496 	return rc;
1497 }
1498 
cc_hash_export(struct ahash_request * req,void * out)1499 static int cc_hash_export(struct ahash_request *req, void *out)
1500 {
1501 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1502 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1503 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1504 	u8 *curr_buff = cc_hash_buf(state);
1505 	u32 curr_buff_cnt = *cc_hash_buf_cnt(state);
1506 	const u32 tmp = CC_EXPORT_MAGIC;
1507 
1508 	memcpy(out, &tmp, sizeof(u32));
1509 	out += sizeof(u32);
1510 
1511 	memcpy(out, state->digest_buff, ctx->inter_digestsize);
1512 	out += ctx->inter_digestsize;
1513 
1514 	memcpy(out, state->digest_bytes_len, ctx->hash_len);
1515 	out += ctx->hash_len;
1516 
1517 	memcpy(out, &curr_buff_cnt, sizeof(u32));
1518 	out += sizeof(u32);
1519 
1520 	memcpy(out, curr_buff, curr_buff_cnt);
1521 
1522 	return 0;
1523 }
1524 
cc_hash_import(struct ahash_request * req,const void * in)1525 static int cc_hash_import(struct ahash_request *req, const void *in)
1526 {
1527 	struct crypto_ahash *ahash = crypto_ahash_reqtfm(req);
1528 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(ahash);
1529 	struct device *dev = drvdata_to_dev(ctx->drvdata);
1530 	struct ahash_req_ctx *state = ahash_request_ctx(req);
1531 	u32 tmp;
1532 
1533 	memcpy(&tmp, in, sizeof(u32));
1534 	if (tmp != CC_EXPORT_MAGIC)
1535 		return -EINVAL;
1536 	in += sizeof(u32);
1537 
1538 	cc_init_req(dev, state, ctx);
1539 
1540 	memcpy(state->digest_buff, in, ctx->inter_digestsize);
1541 	in += ctx->inter_digestsize;
1542 
1543 	memcpy(state->digest_bytes_len, in, ctx->hash_len);
1544 	in += ctx->hash_len;
1545 
1546 	/* Sanity check the data as much as possible */
1547 	memcpy(&tmp, in, sizeof(u32));
1548 	if (tmp > CC_MAX_HASH_BLCK_SIZE)
1549 		return -EINVAL;
1550 	in += sizeof(u32);
1551 
1552 	state->buf_cnt[0] = tmp;
1553 	memcpy(state->buffers[0], in, tmp);
1554 
1555 	return 0;
1556 }
1557 
1558 struct cc_hash_template {
1559 	char name[CRYPTO_MAX_ALG_NAME];
1560 	char driver_name[CRYPTO_MAX_ALG_NAME];
1561 	char mac_name[CRYPTO_MAX_ALG_NAME];
1562 	char mac_driver_name[CRYPTO_MAX_ALG_NAME];
1563 	unsigned int blocksize;
1564 	bool is_mac;
1565 	bool synchronize;
1566 	struct ahash_alg template_ahash;
1567 	int hash_mode;
1568 	int hw_mode;
1569 	int inter_digestsize;
1570 	struct cc_drvdata *drvdata;
1571 	u32 min_hw_rev;
1572 	enum cc_std_body std_body;
1573 };
1574 
1575 #define CC_STATE_SIZE(_x) \
1576 	((_x) + HASH_MAX_LEN_SIZE + CC_MAX_HASH_BLCK_SIZE + (2 * sizeof(u32)))
1577 
1578 /* hash descriptors */
1579 static struct cc_hash_template driver_hash[] = {
1580 	//Asynchronize hash template
1581 	{
1582 		.name = "sha1",
1583 		.driver_name = "sha1-ccree",
1584 		.mac_name = "hmac(sha1)",
1585 		.mac_driver_name = "hmac-sha1-ccree",
1586 		.blocksize = SHA1_BLOCK_SIZE,
1587 		.is_mac = true,
1588 		.synchronize = false,
1589 		.template_ahash = {
1590 			.init = cc_hash_init,
1591 			.update = cc_hash_update,
1592 			.final = cc_hash_final,
1593 			.finup = cc_hash_finup,
1594 			.digest = cc_hash_digest,
1595 			.export = cc_hash_export,
1596 			.import = cc_hash_import,
1597 			.setkey = cc_hash_setkey,
1598 			.halg = {
1599 				.digestsize = SHA1_DIGEST_SIZE,
1600 				.statesize = CC_STATE_SIZE(SHA1_DIGEST_SIZE),
1601 			},
1602 		},
1603 		.hash_mode = DRV_HASH_SHA1,
1604 		.hw_mode = DRV_HASH_HW_SHA1,
1605 		.inter_digestsize = SHA1_DIGEST_SIZE,
1606 		.min_hw_rev = CC_HW_REV_630,
1607 		.std_body = CC_STD_NIST,
1608 	},
1609 	{
1610 		.name = "sha256",
1611 		.driver_name = "sha256-ccree",
1612 		.mac_name = "hmac(sha256)",
1613 		.mac_driver_name = "hmac-sha256-ccree",
1614 		.blocksize = SHA256_BLOCK_SIZE,
1615 		.is_mac = true,
1616 		.template_ahash = {
1617 			.init = cc_hash_init,
1618 			.update = cc_hash_update,
1619 			.final = cc_hash_final,
1620 			.finup = cc_hash_finup,
1621 			.digest = cc_hash_digest,
1622 			.export = cc_hash_export,
1623 			.import = cc_hash_import,
1624 			.setkey = cc_hash_setkey,
1625 			.halg = {
1626 				.digestsize = SHA256_DIGEST_SIZE,
1627 				.statesize = CC_STATE_SIZE(SHA256_DIGEST_SIZE)
1628 			},
1629 		},
1630 		.hash_mode = DRV_HASH_SHA256,
1631 		.hw_mode = DRV_HASH_HW_SHA256,
1632 		.inter_digestsize = SHA256_DIGEST_SIZE,
1633 		.min_hw_rev = CC_HW_REV_630,
1634 		.std_body = CC_STD_NIST,
1635 	},
1636 	{
1637 		.name = "sha224",
1638 		.driver_name = "sha224-ccree",
1639 		.mac_name = "hmac(sha224)",
1640 		.mac_driver_name = "hmac-sha224-ccree",
1641 		.blocksize = SHA224_BLOCK_SIZE,
1642 		.is_mac = true,
1643 		.template_ahash = {
1644 			.init = cc_hash_init,
1645 			.update = cc_hash_update,
1646 			.final = cc_hash_final,
1647 			.finup = cc_hash_finup,
1648 			.digest = cc_hash_digest,
1649 			.export = cc_hash_export,
1650 			.import = cc_hash_import,
1651 			.setkey = cc_hash_setkey,
1652 			.halg = {
1653 				.digestsize = SHA224_DIGEST_SIZE,
1654 				.statesize = CC_STATE_SIZE(SHA256_DIGEST_SIZE),
1655 			},
1656 		},
1657 		.hash_mode = DRV_HASH_SHA224,
1658 		.hw_mode = DRV_HASH_HW_SHA256,
1659 		.inter_digestsize = SHA256_DIGEST_SIZE,
1660 		.min_hw_rev = CC_HW_REV_630,
1661 		.std_body = CC_STD_NIST,
1662 	},
1663 	{
1664 		.name = "sha384",
1665 		.driver_name = "sha384-ccree",
1666 		.mac_name = "hmac(sha384)",
1667 		.mac_driver_name = "hmac-sha384-ccree",
1668 		.blocksize = SHA384_BLOCK_SIZE,
1669 		.is_mac = true,
1670 		.template_ahash = {
1671 			.init = cc_hash_init,
1672 			.update = cc_hash_update,
1673 			.final = cc_hash_final,
1674 			.finup = cc_hash_finup,
1675 			.digest = cc_hash_digest,
1676 			.export = cc_hash_export,
1677 			.import = cc_hash_import,
1678 			.setkey = cc_hash_setkey,
1679 			.halg = {
1680 				.digestsize = SHA384_DIGEST_SIZE,
1681 				.statesize = CC_STATE_SIZE(SHA512_DIGEST_SIZE),
1682 			},
1683 		},
1684 		.hash_mode = DRV_HASH_SHA384,
1685 		.hw_mode = DRV_HASH_HW_SHA512,
1686 		.inter_digestsize = SHA512_DIGEST_SIZE,
1687 		.min_hw_rev = CC_HW_REV_712,
1688 		.std_body = CC_STD_NIST,
1689 	},
1690 	{
1691 		.name = "sha512",
1692 		.driver_name = "sha512-ccree",
1693 		.mac_name = "hmac(sha512)",
1694 		.mac_driver_name = "hmac-sha512-ccree",
1695 		.blocksize = SHA512_BLOCK_SIZE,
1696 		.is_mac = true,
1697 		.template_ahash = {
1698 			.init = cc_hash_init,
1699 			.update = cc_hash_update,
1700 			.final = cc_hash_final,
1701 			.finup = cc_hash_finup,
1702 			.digest = cc_hash_digest,
1703 			.export = cc_hash_export,
1704 			.import = cc_hash_import,
1705 			.setkey = cc_hash_setkey,
1706 			.halg = {
1707 				.digestsize = SHA512_DIGEST_SIZE,
1708 				.statesize = CC_STATE_SIZE(SHA512_DIGEST_SIZE),
1709 			},
1710 		},
1711 		.hash_mode = DRV_HASH_SHA512,
1712 		.hw_mode = DRV_HASH_HW_SHA512,
1713 		.inter_digestsize = SHA512_DIGEST_SIZE,
1714 		.min_hw_rev = CC_HW_REV_712,
1715 		.std_body = CC_STD_NIST,
1716 	},
1717 	{
1718 		.name = "md5",
1719 		.driver_name = "md5-ccree",
1720 		.mac_name = "hmac(md5)",
1721 		.mac_driver_name = "hmac-md5-ccree",
1722 		.blocksize = MD5_HMAC_BLOCK_SIZE,
1723 		.is_mac = true,
1724 		.template_ahash = {
1725 			.init = cc_hash_init,
1726 			.update = cc_hash_update,
1727 			.final = cc_hash_final,
1728 			.finup = cc_hash_finup,
1729 			.digest = cc_hash_digest,
1730 			.export = cc_hash_export,
1731 			.import = cc_hash_import,
1732 			.setkey = cc_hash_setkey,
1733 			.halg = {
1734 				.digestsize = MD5_DIGEST_SIZE,
1735 				.statesize = CC_STATE_SIZE(MD5_DIGEST_SIZE),
1736 			},
1737 		},
1738 		.hash_mode = DRV_HASH_MD5,
1739 		.hw_mode = DRV_HASH_HW_MD5,
1740 		.inter_digestsize = MD5_DIGEST_SIZE,
1741 		.min_hw_rev = CC_HW_REV_630,
1742 		.std_body = CC_STD_NIST,
1743 	},
1744 	{
1745 		.name = "sm3",
1746 		.driver_name = "sm3-ccree",
1747 		.blocksize = SM3_BLOCK_SIZE,
1748 		.is_mac = false,
1749 		.template_ahash = {
1750 			.init = cc_hash_init,
1751 			.update = cc_hash_update,
1752 			.final = cc_hash_final,
1753 			.finup = cc_hash_finup,
1754 			.digest = cc_hash_digest,
1755 			.export = cc_hash_export,
1756 			.import = cc_hash_import,
1757 			.setkey = cc_hash_setkey,
1758 			.halg = {
1759 				.digestsize = SM3_DIGEST_SIZE,
1760 				.statesize = CC_STATE_SIZE(SM3_DIGEST_SIZE),
1761 			},
1762 		},
1763 		.hash_mode = DRV_HASH_SM3,
1764 		.hw_mode = DRV_HASH_HW_SM3,
1765 		.inter_digestsize = SM3_DIGEST_SIZE,
1766 		.min_hw_rev = CC_HW_REV_713,
1767 		.std_body = CC_STD_OSCCA,
1768 	},
1769 	{
1770 		.mac_name = "xcbc(aes)",
1771 		.mac_driver_name = "xcbc-aes-ccree",
1772 		.blocksize = AES_BLOCK_SIZE,
1773 		.is_mac = true,
1774 		.template_ahash = {
1775 			.init = cc_hash_init,
1776 			.update = cc_mac_update,
1777 			.final = cc_mac_final,
1778 			.finup = cc_mac_finup,
1779 			.digest = cc_mac_digest,
1780 			.setkey = cc_xcbc_setkey,
1781 			.export = cc_hash_export,
1782 			.import = cc_hash_import,
1783 			.halg = {
1784 				.digestsize = AES_BLOCK_SIZE,
1785 				.statesize = CC_STATE_SIZE(AES_BLOCK_SIZE),
1786 			},
1787 		},
1788 		.hash_mode = DRV_HASH_NULL,
1789 		.hw_mode = DRV_CIPHER_XCBC_MAC,
1790 		.inter_digestsize = AES_BLOCK_SIZE,
1791 		.min_hw_rev = CC_HW_REV_630,
1792 		.std_body = CC_STD_NIST,
1793 	},
1794 	{
1795 		.mac_name = "cmac(aes)",
1796 		.mac_driver_name = "cmac-aes-ccree",
1797 		.blocksize = AES_BLOCK_SIZE,
1798 		.is_mac = true,
1799 		.template_ahash = {
1800 			.init = cc_hash_init,
1801 			.update = cc_mac_update,
1802 			.final = cc_mac_final,
1803 			.finup = cc_mac_finup,
1804 			.digest = cc_mac_digest,
1805 			.setkey = cc_cmac_setkey,
1806 			.export = cc_hash_export,
1807 			.import = cc_hash_import,
1808 			.halg = {
1809 				.digestsize = AES_BLOCK_SIZE,
1810 				.statesize = CC_STATE_SIZE(AES_BLOCK_SIZE),
1811 			},
1812 		},
1813 		.hash_mode = DRV_HASH_NULL,
1814 		.hw_mode = DRV_CIPHER_CMAC,
1815 		.inter_digestsize = AES_BLOCK_SIZE,
1816 		.min_hw_rev = CC_HW_REV_630,
1817 		.std_body = CC_STD_NIST,
1818 	},
1819 };
1820 
cc_alloc_hash_alg(struct cc_hash_template * template,struct device * dev,bool keyed)1821 static struct cc_hash_alg *cc_alloc_hash_alg(struct cc_hash_template *template,
1822 					     struct device *dev, bool keyed)
1823 {
1824 	struct cc_hash_alg *t_crypto_alg;
1825 	struct crypto_alg *alg;
1826 	struct ahash_alg *halg;
1827 
1828 	t_crypto_alg = devm_kzalloc(dev, sizeof(*t_crypto_alg), GFP_KERNEL);
1829 	if (!t_crypto_alg)
1830 		return ERR_PTR(-ENOMEM);
1831 
1832 	t_crypto_alg->ahash_alg = template->template_ahash;
1833 	halg = &t_crypto_alg->ahash_alg;
1834 	alg = &halg->halg.base;
1835 
1836 	if (keyed) {
1837 		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1838 			 template->mac_name);
1839 		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1840 			 template->mac_driver_name);
1841 	} else {
1842 		halg->setkey = NULL;
1843 		snprintf(alg->cra_name, CRYPTO_MAX_ALG_NAME, "%s",
1844 			 template->name);
1845 		snprintf(alg->cra_driver_name, CRYPTO_MAX_ALG_NAME, "%s",
1846 			 template->driver_name);
1847 	}
1848 	alg->cra_module = THIS_MODULE;
1849 	alg->cra_ctxsize = sizeof(struct cc_hash_ctx);
1850 	alg->cra_priority = CC_CRA_PRIO;
1851 	alg->cra_blocksize = template->blocksize;
1852 	alg->cra_alignmask = 0;
1853 	alg->cra_exit = cc_cra_exit;
1854 
1855 	alg->cra_init = cc_cra_init;
1856 	alg->cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_KERN_DRIVER_ONLY;
1857 
1858 	t_crypto_alg->hash_mode = template->hash_mode;
1859 	t_crypto_alg->hw_mode = template->hw_mode;
1860 	t_crypto_alg->inter_digestsize = template->inter_digestsize;
1861 
1862 	return t_crypto_alg;
1863 }
1864 
cc_init_copy_sram(struct cc_drvdata * drvdata,const u32 * data,unsigned int size,u32 * sram_buff_ofs)1865 static int cc_init_copy_sram(struct cc_drvdata *drvdata, const u32 *data,
1866 			     unsigned int size, u32 *sram_buff_ofs)
1867 {
1868 	struct cc_hw_desc larval_seq[CC_DIGEST_SIZE_MAX / sizeof(u32)];
1869 	unsigned int larval_seq_len = 0;
1870 	int rc;
1871 
1872 	cc_set_sram_desc(data, *sram_buff_ofs, size / sizeof(*data),
1873 			 larval_seq, &larval_seq_len);
1874 	rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1875 	if (rc)
1876 		return rc;
1877 
1878 	*sram_buff_ofs += size;
1879 	return 0;
1880 }
1881 
cc_init_hash_sram(struct cc_drvdata * drvdata)1882 int cc_init_hash_sram(struct cc_drvdata *drvdata)
1883 {
1884 	struct cc_hash_handle *hash_handle = drvdata->hash_handle;
1885 	u32 sram_buff_ofs = hash_handle->digest_len_sram_addr;
1886 	bool large_sha_supported = (drvdata->hw_rev >= CC_HW_REV_712);
1887 	bool sm3_supported = (drvdata->hw_rev >= CC_HW_REV_713);
1888 	int rc = 0;
1889 
1890 	/* Copy-to-sram digest-len */
1891 	rc = cc_init_copy_sram(drvdata, cc_digest_len_init,
1892 			       sizeof(cc_digest_len_init), &sram_buff_ofs);
1893 	if (rc)
1894 		goto init_digest_const_err;
1895 
1896 	if (large_sha_supported) {
1897 		/* Copy-to-sram digest-len for sha384/512 */
1898 		rc = cc_init_copy_sram(drvdata, cc_digest_len_sha512_init,
1899 				       sizeof(cc_digest_len_sha512_init),
1900 				       &sram_buff_ofs);
1901 		if (rc)
1902 			goto init_digest_const_err;
1903 	}
1904 
1905 	/* The initial digests offset */
1906 	hash_handle->larval_digest_sram_addr = sram_buff_ofs;
1907 
1908 	/* Copy-to-sram initial SHA* digests */
1909 	rc = cc_init_copy_sram(drvdata, cc_md5_init, sizeof(cc_md5_init),
1910 			       &sram_buff_ofs);
1911 	if (rc)
1912 		goto init_digest_const_err;
1913 
1914 	rc = cc_init_copy_sram(drvdata, cc_sha1_init, sizeof(cc_sha1_init),
1915 			       &sram_buff_ofs);
1916 	if (rc)
1917 		goto init_digest_const_err;
1918 
1919 	rc = cc_init_copy_sram(drvdata, cc_sha224_init, sizeof(cc_sha224_init),
1920 			       &sram_buff_ofs);
1921 	if (rc)
1922 		goto init_digest_const_err;
1923 
1924 	rc = cc_init_copy_sram(drvdata, cc_sha256_init, sizeof(cc_sha256_init),
1925 			       &sram_buff_ofs);
1926 	if (rc)
1927 		goto init_digest_const_err;
1928 
1929 	if (sm3_supported) {
1930 		rc = cc_init_copy_sram(drvdata, cc_sm3_init,
1931 				       sizeof(cc_sm3_init), &sram_buff_ofs);
1932 		if (rc)
1933 			goto init_digest_const_err;
1934 	}
1935 
1936 	if (large_sha_supported) {
1937 		rc = cc_init_copy_sram(drvdata, cc_sha384_init,
1938 				       sizeof(cc_sha384_init), &sram_buff_ofs);
1939 		if (rc)
1940 			goto init_digest_const_err;
1941 
1942 		rc = cc_init_copy_sram(drvdata, cc_sha512_init,
1943 				       sizeof(cc_sha512_init), &sram_buff_ofs);
1944 		if (rc)
1945 			goto init_digest_const_err;
1946 	}
1947 
1948 init_digest_const_err:
1949 	return rc;
1950 }
1951 
cc_hash_alloc(struct cc_drvdata * drvdata)1952 int cc_hash_alloc(struct cc_drvdata *drvdata)
1953 {
1954 	struct cc_hash_handle *hash_handle;
1955 	u32 sram_buff;
1956 	u32 sram_size_to_alloc;
1957 	struct device *dev = drvdata_to_dev(drvdata);
1958 	int rc = 0;
1959 	int alg;
1960 
1961 	hash_handle = devm_kzalloc(dev, sizeof(*hash_handle), GFP_KERNEL);
1962 	if (!hash_handle)
1963 		return -ENOMEM;
1964 
1965 	INIT_LIST_HEAD(&hash_handle->hash_list);
1966 	drvdata->hash_handle = hash_handle;
1967 
1968 	sram_size_to_alloc = sizeof(cc_digest_len_init) +
1969 			sizeof(cc_md5_init) +
1970 			sizeof(cc_sha1_init) +
1971 			sizeof(cc_sha224_init) +
1972 			sizeof(cc_sha256_init);
1973 
1974 	if (drvdata->hw_rev >= CC_HW_REV_713)
1975 		sram_size_to_alloc += sizeof(cc_sm3_init);
1976 
1977 	if (drvdata->hw_rev >= CC_HW_REV_712)
1978 		sram_size_to_alloc += sizeof(cc_digest_len_sha512_init) +
1979 			sizeof(cc_sha384_init) + sizeof(cc_sha512_init);
1980 
1981 	sram_buff = cc_sram_alloc(drvdata, sram_size_to_alloc);
1982 	if (sram_buff == NULL_SRAM_ADDR) {
1983 		rc = -ENOMEM;
1984 		goto fail;
1985 	}
1986 
1987 	/* The initial digest-len offset */
1988 	hash_handle->digest_len_sram_addr = sram_buff;
1989 
1990 	/*must be set before the alg registration as it is being used there*/
1991 	rc = cc_init_hash_sram(drvdata);
1992 	if (rc) {
1993 		dev_err(dev, "Init digest CONST failed (rc=%d)\n", rc);
1994 		goto fail;
1995 	}
1996 
1997 	/* ahash registration */
1998 	for (alg = 0; alg < ARRAY_SIZE(driver_hash); alg++) {
1999 		struct cc_hash_alg *t_alg;
2000 		int hw_mode = driver_hash[alg].hw_mode;
2001 
2002 		/* Check that the HW revision and variants are suitable */
2003 		if ((driver_hash[alg].min_hw_rev > drvdata->hw_rev) ||
2004 		    !(drvdata->std_bodies & driver_hash[alg].std_body))
2005 			continue;
2006 
2007 		if (driver_hash[alg].is_mac) {
2008 			/* register hmac version */
2009 			t_alg = cc_alloc_hash_alg(&driver_hash[alg], dev, true);
2010 			if (IS_ERR(t_alg)) {
2011 				rc = PTR_ERR(t_alg);
2012 				dev_err(dev, "%s alg allocation failed\n",
2013 					driver_hash[alg].driver_name);
2014 				goto fail;
2015 			}
2016 			t_alg->drvdata = drvdata;
2017 
2018 			rc = crypto_register_ahash(&t_alg->ahash_alg);
2019 			if (rc) {
2020 				dev_err(dev, "%s alg registration failed\n",
2021 					driver_hash[alg].driver_name);
2022 				goto fail;
2023 			}
2024 
2025 			list_add_tail(&t_alg->entry, &hash_handle->hash_list);
2026 		}
2027 		if (hw_mode == DRV_CIPHER_XCBC_MAC ||
2028 		    hw_mode == DRV_CIPHER_CMAC)
2029 			continue;
2030 
2031 		/* register hash version */
2032 		t_alg = cc_alloc_hash_alg(&driver_hash[alg], dev, false);
2033 		if (IS_ERR(t_alg)) {
2034 			rc = PTR_ERR(t_alg);
2035 			dev_err(dev, "%s alg allocation failed\n",
2036 				driver_hash[alg].driver_name);
2037 			goto fail;
2038 		}
2039 		t_alg->drvdata = drvdata;
2040 
2041 		rc = crypto_register_ahash(&t_alg->ahash_alg);
2042 		if (rc) {
2043 			dev_err(dev, "%s alg registration failed\n",
2044 				driver_hash[alg].driver_name);
2045 			goto fail;
2046 		}
2047 
2048 		list_add_tail(&t_alg->entry, &hash_handle->hash_list);
2049 	}
2050 
2051 	return 0;
2052 
2053 fail:
2054 	cc_hash_free(drvdata);
2055 	return rc;
2056 }
2057 
cc_hash_free(struct cc_drvdata * drvdata)2058 int cc_hash_free(struct cc_drvdata *drvdata)
2059 {
2060 	struct cc_hash_alg *t_hash_alg, *hash_n;
2061 	struct cc_hash_handle *hash_handle = drvdata->hash_handle;
2062 
2063 	list_for_each_entry_safe(t_hash_alg, hash_n, &hash_handle->hash_list,
2064 				 entry) {
2065 		crypto_unregister_ahash(&t_hash_alg->ahash_alg);
2066 		list_del(&t_hash_alg->entry);
2067 	}
2068 
2069 	return 0;
2070 }
2071 
cc_setup_xcbc(struct ahash_request * areq,struct cc_hw_desc desc[],unsigned int * seq_size)2072 static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
2073 			  unsigned int *seq_size)
2074 {
2075 	unsigned int idx = *seq_size;
2076 	struct ahash_req_ctx *state = ahash_request_ctx(areq);
2077 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2078 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
2079 
2080 	/* Setup XCBC MAC K1 */
2081 	hw_desc_init(&desc[idx]);
2082 	set_din_type(&desc[idx], DMA_DLLI, (ctx->opad_tmp_keys_dma_addr +
2083 					    XCBC_MAC_K1_OFFSET),
2084 		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2085 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
2086 	set_hash_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC, ctx->hash_mode);
2087 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2088 	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2089 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2090 	idx++;
2091 
2092 	/* Setup XCBC MAC K2 */
2093 	hw_desc_init(&desc[idx]);
2094 	set_din_type(&desc[idx], DMA_DLLI,
2095 		     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K2_OFFSET),
2096 		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2097 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE1);
2098 	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2099 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2100 	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2101 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2102 	idx++;
2103 
2104 	/* Setup XCBC MAC K3 */
2105 	hw_desc_init(&desc[idx]);
2106 	set_din_type(&desc[idx], DMA_DLLI,
2107 		     (ctx->opad_tmp_keys_dma_addr + XCBC_MAC_K3_OFFSET),
2108 		     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
2109 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE2);
2110 	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2111 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2112 	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2113 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2114 	idx++;
2115 
2116 	/* Loading MAC state */
2117 	hw_desc_init(&desc[idx]);
2118 	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
2119 		     CC_AES_BLOCK_SIZE, NS_BIT);
2120 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
2121 	set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2122 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2123 	set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
2124 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2125 	idx++;
2126 	*seq_size = idx;
2127 }
2128 
cc_setup_cmac(struct ahash_request * areq,struct cc_hw_desc desc[],unsigned int * seq_size)2129 static void cc_setup_cmac(struct ahash_request *areq, struct cc_hw_desc desc[],
2130 			  unsigned int *seq_size)
2131 {
2132 	unsigned int idx = *seq_size;
2133 	struct ahash_req_ctx *state = ahash_request_ctx(areq);
2134 	struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2135 	struct cc_hash_ctx *ctx = crypto_ahash_ctx(tfm);
2136 
2137 	/* Setup CMAC Key */
2138 	hw_desc_init(&desc[idx]);
2139 	set_din_type(&desc[idx], DMA_DLLI, ctx->opad_tmp_keys_dma_addr,
2140 		     ((ctx->key_params.keylen == 24) ? AES_MAX_KEY_SIZE :
2141 		      ctx->key_params.keylen), NS_BIT);
2142 	set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
2143 	set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
2144 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2145 	set_key_size_aes(&desc[idx], ctx->key_params.keylen);
2146 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2147 	idx++;
2148 
2149 	/* Load MAC state */
2150 	hw_desc_init(&desc[idx]);
2151 	set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
2152 		     CC_AES_BLOCK_SIZE, NS_BIT);
2153 	set_setup_mode(&desc[idx], SETUP_LOAD_STATE0);
2154 	set_cipher_mode(&desc[idx], DRV_CIPHER_CMAC);
2155 	set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
2156 	set_key_size_aes(&desc[idx], ctx->key_params.keylen);
2157 	set_flow_mode(&desc[idx], S_DIN_to_AES);
2158 	idx++;
2159 	*seq_size = idx;
2160 }
2161 
cc_set_desc(struct ahash_req_ctx * areq_ctx,struct cc_hash_ctx * ctx,unsigned int flow_mode,struct cc_hw_desc desc[],bool is_not_last_data,unsigned int * seq_size)2162 static void cc_set_desc(struct ahash_req_ctx *areq_ctx,
2163 			struct cc_hash_ctx *ctx, unsigned int flow_mode,
2164 			struct cc_hw_desc desc[], bool is_not_last_data,
2165 			unsigned int *seq_size)
2166 {
2167 	unsigned int idx = *seq_size;
2168 	struct device *dev = drvdata_to_dev(ctx->drvdata);
2169 
2170 	if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_DLLI) {
2171 		hw_desc_init(&desc[idx]);
2172 		set_din_type(&desc[idx], DMA_DLLI,
2173 			     sg_dma_address(areq_ctx->curr_sg),
2174 			     areq_ctx->curr_sg->length, NS_BIT);
2175 		set_flow_mode(&desc[idx], flow_mode);
2176 		idx++;
2177 	} else {
2178 		if (areq_ctx->data_dma_buf_type == CC_DMA_BUF_NULL) {
2179 			dev_dbg(dev, " NULL mode\n");
2180 			/* nothing to build */
2181 			return;
2182 		}
2183 		/* bypass */
2184 		hw_desc_init(&desc[idx]);
2185 		set_din_type(&desc[idx], DMA_DLLI,
2186 			     areq_ctx->mlli_params.mlli_dma_addr,
2187 			     areq_ctx->mlli_params.mlli_len, NS_BIT);
2188 		set_dout_sram(&desc[idx], ctx->drvdata->mlli_sram_addr,
2189 			      areq_ctx->mlli_params.mlli_len);
2190 		set_flow_mode(&desc[idx], BYPASS);
2191 		idx++;
2192 		/* process */
2193 		hw_desc_init(&desc[idx]);
2194 		set_din_type(&desc[idx], DMA_MLLI,
2195 			     ctx->drvdata->mlli_sram_addr,
2196 			     areq_ctx->mlli_nents, NS_BIT);
2197 		set_flow_mode(&desc[idx], flow_mode);
2198 		idx++;
2199 	}
2200 	if (is_not_last_data)
2201 		set_din_not_last_indication(&desc[(idx - 1)]);
2202 	/* return updated desc sequence size */
2203 	*seq_size = idx;
2204 }
2205 
cc_larval_digest(struct device * dev,u32 mode)2206 static const void *cc_larval_digest(struct device *dev, u32 mode)
2207 {
2208 	switch (mode) {
2209 	case DRV_HASH_MD5:
2210 		return cc_md5_init;
2211 	case DRV_HASH_SHA1:
2212 		return cc_sha1_init;
2213 	case DRV_HASH_SHA224:
2214 		return cc_sha224_init;
2215 	case DRV_HASH_SHA256:
2216 		return cc_sha256_init;
2217 	case DRV_HASH_SHA384:
2218 		return cc_sha384_init;
2219 	case DRV_HASH_SHA512:
2220 		return cc_sha512_init;
2221 	case DRV_HASH_SM3:
2222 		return cc_sm3_init;
2223 	default:
2224 		dev_err(dev, "Invalid hash mode (%d)\n", mode);
2225 		return cc_md5_init;
2226 	}
2227 }
2228 
2229 /**
2230  * cc_larval_digest_addr() - Get the address of the initial digest in SRAM
2231  * according to the given hash mode
2232  *
2233  * @drvdata: Associated device driver context
2234  * @mode: The Hash mode. Supported modes: MD5/SHA1/SHA224/SHA256
2235  *
2236  * Return:
2237  * The address of the initial digest in SRAM
2238  */
cc_larval_digest_addr(void * drvdata,u32 mode)2239 u32 cc_larval_digest_addr(void *drvdata, u32 mode)
2240 {
2241 	struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
2242 	struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
2243 	struct device *dev = drvdata_to_dev(_drvdata);
2244 	bool sm3_supported = (_drvdata->hw_rev >= CC_HW_REV_713);
2245 	u32 addr;
2246 
2247 	switch (mode) {
2248 	case DRV_HASH_NULL:
2249 		break; /*Ignore*/
2250 	case DRV_HASH_MD5:
2251 		return (hash_handle->larval_digest_sram_addr);
2252 	case DRV_HASH_SHA1:
2253 		return (hash_handle->larval_digest_sram_addr +
2254 			sizeof(cc_md5_init));
2255 	case DRV_HASH_SHA224:
2256 		return (hash_handle->larval_digest_sram_addr +
2257 			sizeof(cc_md5_init) +
2258 			sizeof(cc_sha1_init));
2259 	case DRV_HASH_SHA256:
2260 		return (hash_handle->larval_digest_sram_addr +
2261 			sizeof(cc_md5_init) +
2262 			sizeof(cc_sha1_init) +
2263 			sizeof(cc_sha224_init));
2264 	case DRV_HASH_SM3:
2265 		return (hash_handle->larval_digest_sram_addr +
2266 			sizeof(cc_md5_init) +
2267 			sizeof(cc_sha1_init) +
2268 			sizeof(cc_sha224_init) +
2269 			sizeof(cc_sha256_init));
2270 	case DRV_HASH_SHA384:
2271 		addr = (hash_handle->larval_digest_sram_addr +
2272 			sizeof(cc_md5_init) +
2273 			sizeof(cc_sha1_init) +
2274 			sizeof(cc_sha224_init) +
2275 			sizeof(cc_sha256_init));
2276 		if (sm3_supported)
2277 			addr += sizeof(cc_sm3_init);
2278 		return addr;
2279 	case DRV_HASH_SHA512:
2280 		addr = (hash_handle->larval_digest_sram_addr +
2281 			sizeof(cc_md5_init) +
2282 			sizeof(cc_sha1_init) +
2283 			sizeof(cc_sha224_init) +
2284 			sizeof(cc_sha256_init) +
2285 			sizeof(cc_sha384_init));
2286 		if (sm3_supported)
2287 			addr += sizeof(cc_sm3_init);
2288 		return addr;
2289 	default:
2290 		dev_err(dev, "Invalid hash mode (%d)\n", mode);
2291 	}
2292 
2293 	/*This is valid wrong value to avoid kernel crash*/
2294 	return hash_handle->larval_digest_sram_addr;
2295 }
2296 
cc_digest_len_addr(void * drvdata,u32 mode)2297 u32 cc_digest_len_addr(void *drvdata, u32 mode)
2298 {
2299 	struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
2300 	struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
2301 	u32 digest_len_addr = hash_handle->digest_len_sram_addr;
2302 
2303 	switch (mode) {
2304 	case DRV_HASH_SHA1:
2305 	case DRV_HASH_SHA224:
2306 	case DRV_HASH_SHA256:
2307 	case DRV_HASH_MD5:
2308 		return digest_len_addr;
2309 	case DRV_HASH_SHA384:
2310 	case DRV_HASH_SHA512:
2311 		return  digest_len_addr + sizeof(cc_digest_len_init);
2312 	default:
2313 		return digest_len_addr; /*to avoid kernel crash*/
2314 	}
2315 }
2316