hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/drivers/crypto/ccree/cc_hash.c
....@@ -1,11 +1,12 @@
11 // SPDX-License-Identifier: GPL-2.0
2
-/* Copyright (C) 2012-2018 ARM Limited or its affiliates. */
2
+/* Copyright (C) 2012-2019 ARM Limited (or its affiliates). */
33
44 #include <linux/kernel.h>
55 #include <linux/module.h>
66 #include <crypto/algapi.h>
77 #include <crypto/hash.h>
88 #include <crypto/md5.h>
9
+#include <crypto/sm3.h>
910 #include <crypto/internal/hash.h>
1011
1112 #include "cc_driver.h"
....@@ -16,33 +17,44 @@
1617
1718 #define CC_MAX_HASH_SEQ_LEN 12
1819 #define CC_MAX_OPAD_KEYS_SIZE CC_MAX_HASH_BLCK_SIZE
20
+#define CC_SM3_HASH_LEN_SIZE 8
1921
2022 struct cc_hash_handle {
21
- cc_sram_addr_t digest_len_sram_addr; /* const value in SRAM*/
22
- cc_sram_addr_t larval_digest_sram_addr; /* const value in SRAM */
23
+ u32 digest_len_sram_addr; /* const value in SRAM*/
24
+ u32 larval_digest_sram_addr; /* const value in SRAM */
2325 struct list_head hash_list;
2426 };
2527
26
-static const u32 digest_len_init[] = {
28
+static const u32 cc_digest_len_init[] = {
2729 0x00000040, 0x00000000, 0x00000000, 0x00000000 };
28
-static const u32 md5_init[] = {
30
+static const u32 cc_md5_init[] = {
2931 SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
30
-static const u32 sha1_init[] = {
32
+static const u32 cc_sha1_init[] = {
3133 SHA1_H4, SHA1_H3, SHA1_H2, SHA1_H1, SHA1_H0 };
32
-static const u32 sha224_init[] = {
34
+static const u32 cc_sha224_init[] = {
3335 SHA224_H7, SHA224_H6, SHA224_H5, SHA224_H4,
3436 SHA224_H3, SHA224_H2, SHA224_H1, SHA224_H0 };
35
-static const u32 sha256_init[] = {
37
+static const u32 cc_sha256_init[] = {
3638 SHA256_H7, SHA256_H6, SHA256_H5, SHA256_H4,
3739 SHA256_H3, SHA256_H2, SHA256_H1, SHA256_H0 };
38
-static const u32 digest_len_sha512_init[] = {
40
+static const u32 cc_digest_len_sha512_init[] = {
3941 0x00000080, 0x00000000, 0x00000000, 0x00000000 };
40
-static u64 sha384_init[] = {
41
- SHA384_H7, SHA384_H6, SHA384_H5, SHA384_H4,
42
- SHA384_H3, SHA384_H2, SHA384_H1, SHA384_H0 };
43
-static u64 sha512_init[] = {
44
- SHA512_H7, SHA512_H6, SHA512_H5, SHA512_H4,
45
- SHA512_H3, SHA512_H2, SHA512_H1, SHA512_H0 };
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 };
4658
4759 static void cc_setup_xcbc(struct ahash_request *areq, struct cc_hw_desc desc[],
4860 unsigned int *seq_size);
....@@ -83,6 +95,7 @@
8395 int hash_mode;
8496 int hw_mode;
8597 int inter_digestsize;
98
+ unsigned int hash_len;
8699 struct completion setkey_comp;
87100 bool is_hmac;
88101 };
....@@ -138,11 +151,12 @@
138151 if (ctx->hash_mode == DRV_HASH_SHA512 ||
139152 ctx->hash_mode == DRV_HASH_SHA384)
140153 memcpy(state->digest_bytes_len,
141
- digest_len_sha512_init,
142
- ctx->drvdata->hash_len_sz);
154
+ cc_digest_len_sha512_init,
155
+ ctx->hash_len);
143156 else
144
- memcpy(state->digest_bytes_len, digest_len_init,
145
- ctx->drvdata->hash_len_sz);
157
+ memcpy(state->digest_bytes_len,
158
+ cc_digest_len_init,
159
+ ctx->hash_len);
146160 }
147161
148162 if (ctx->hash_mode != DRV_HASH_NULL) {
....@@ -275,9 +289,13 @@
275289
276290 dev_dbg(dev, "req=%pK\n", req);
277291
278
- cc_unmap_hash_request(dev, state, req->src, false);
279
- cc_unmap_req(dev, state, ctx);
280
- req->base.complete(&req->base, err);
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);
281299 }
282300
283301 static void cc_digest_complete(struct device *dev, void *cc_req, int err)
....@@ -290,10 +308,14 @@
290308
291309 dev_dbg(dev, "req=%pK\n", req);
292310
293
- cc_unmap_hash_request(dev, state, req->src, false);
294
- cc_unmap_result(dev, state, digestsize, req->result);
295
- cc_unmap_req(dev, state, ctx);
296
- req->base.complete(&req->base, err);
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);
297319 }
298320
299321 static void cc_hash_complete(struct device *dev, void *cc_req, int err)
....@@ -306,10 +328,14 @@
306328
307329 dev_dbg(dev, "req=%pK\n", req);
308330
309
- cc_unmap_hash_request(dev, state, req->src, false);
310
- cc_unmap_result(dev, state, digestsize, req->result);
311
- cc_unmap_req(dev, state, ctx);
312
- req->base.complete(&req->base, err);
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);
313339 }
314340
315341 static int cc_fin_result(struct cc_hw_desc *desc, struct ahash_request *req,
....@@ -322,8 +348,7 @@
322348
323349 /* Get final MAC result */
324350 hw_desc_init(&desc[idx]);
325
- set_cipher_mode(&desc[idx], ctx->hw_mode);
326
- /* TODO */
351
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
327352 set_dout_dlli(&desc[idx], state->digest_result_dma_addr, digestsize,
328353 NS_BIT, 1);
329354 set_queue_last_ind(ctx->drvdata, &desc[idx]);
....@@ -368,7 +393,7 @@
368393 set_cipher_mode(&desc[idx], ctx->hw_mode);
369394 set_din_sram(&desc[idx],
370395 cc_digest_len_addr(ctx->drvdata, ctx->hash_mode),
371
- ctx->drvdata->hash_len_sz);
396
+ ctx->hash_len);
372397 set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
373398 set_flow_mode(&desc[idx], S_DIN_to_HASH);
374399 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
....@@ -403,8 +428,7 @@
403428 bool is_hmac = ctx->is_hmac;
404429 struct cc_crypto_req cc_req = {};
405430 struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
406
- cc_sram_addr_t larval_digest_addr =
407
- cc_larval_digest_addr(ctx->drvdata, ctx->hash_mode);
431
+ u32 larval_digest_addr;
408432 int idx = 0;
409433 int rc = 0;
410434 gfp_t flags = cc_gfp_flags(&req->base);
....@@ -441,11 +465,13 @@
441465 * digest
442466 */
443467 hw_desc_init(&desc[idx]);
444
- set_cipher_mode(&desc[idx], ctx->hw_mode);
468
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
445469 if (is_hmac) {
446470 set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
447471 ctx->inter_digestsize, NS_BIT);
448472 } else {
473
+ larval_digest_addr = cc_larval_digest_addr(ctx->drvdata,
474
+ ctx->hash_mode);
449475 set_din_sram(&desc[idx], larval_digest_addr,
450476 ctx->inter_digestsize);
451477 }
....@@ -455,14 +481,14 @@
455481
456482 /* Load the hash current length */
457483 hw_desc_init(&desc[idx]);
458
- set_cipher_mode(&desc[idx], ctx->hw_mode);
484
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
459485
460486 if (is_hmac) {
461487 set_din_type(&desc[idx], DMA_DLLI,
462488 state->digest_bytes_len_dma_addr,
463
- ctx->drvdata->hash_len_sz, NS_BIT);
489
+ ctx->hash_len, NS_BIT);
464490 } else {
465
- set_din_const(&desc[idx], 0, ctx->drvdata->hash_len_sz);
491
+ set_din_const(&desc[idx], 0, ctx->hash_len);
466492 if (nbytes)
467493 set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
468494 else
....@@ -479,7 +505,7 @@
479505 hw_desc_init(&desc[idx]);
480506 set_cipher_mode(&desc[idx], ctx->hw_mode);
481507 set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
482
- ctx->drvdata->hash_len_sz, NS_BIT, 0);
508
+ ctx->hash_len, NS_BIT, 0);
483509 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
484510 set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
485511 set_cipher_do(&desc[idx], DO_PAD);
....@@ -505,7 +531,7 @@
505531 {
506532 /* Restore hash digest */
507533 hw_desc_init(&desc[idx]);
508
- set_cipher_mode(&desc[idx], ctx->hw_mode);
534
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
509535 set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
510536 ctx->inter_digestsize, NS_BIT);
511537 set_flow_mode(&desc[idx], S_DIN_to_HASH);
....@@ -514,10 +540,10 @@
514540
515541 /* Restore hash current length */
516542 hw_desc_init(&desc[idx]);
517
- set_cipher_mode(&desc[idx], ctx->hw_mode);
543
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
518544 set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
519545 set_din_type(&desc[idx], DMA_DLLI, state->digest_bytes_len_dma_addr,
520
- ctx->drvdata->hash_len_sz, NS_BIT);
546
+ ctx->hash_len, NS_BIT);
521547 set_flow_mode(&desc[idx], S_DIN_to_HASH);
522548 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
523549 idx++;
....@@ -577,7 +603,7 @@
577603
578604 /* store the hash digest result in context */
579605 hw_desc_init(&desc[idx]);
580
- set_cipher_mode(&desc[idx], ctx->hw_mode);
606
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
581607 set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
582608 ctx->inter_digestsize, NS_BIT, 0);
583609 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
....@@ -586,9 +612,9 @@
586612
587613 /* store current hash length in context */
588614 hw_desc_init(&desc[idx]);
589
- set_cipher_mode(&desc[idx], ctx->hw_mode);
615
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
590616 set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
591
- ctx->drvdata->hash_len_sz, NS_BIT, 1);
617
+ ctx->hash_len, NS_BIT, 1);
592618 set_queue_last_ind(ctx->drvdata, &desc[idx]);
593619 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
594620 set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
....@@ -650,9 +676,9 @@
650676 /* Pad the hash */
651677 hw_desc_init(&desc[idx]);
652678 set_cipher_do(&desc[idx], DO_PAD);
653
- set_cipher_mode(&desc[idx], ctx->hw_mode);
679
+ set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
654680 set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
655
- ctx->drvdata->hash_len_sz, NS_BIT, 0);
681
+ ctx->hash_len, NS_BIT, 0);
656682 set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
657683 set_flow_mode(&desc[idx], S_HASH_to_DOUT);
658684 idx++;
....@@ -707,7 +733,7 @@
707733 int digestsize = 0;
708734 int i, idx = 0, rc = 0;
709735 struct cc_hw_desc desc[CC_MAX_HASH_SEQ_LEN];
710
- cc_sram_addr_t larval_addr;
736
+ u32 larval_addr;
711737 struct device *dev;
712738
713739 ctx = crypto_ahash_ctx(ahash);
....@@ -733,12 +759,12 @@
733759 return -ENOMEM;
734760
735761 ctx->key_params.key_dma_addr =
736
- dma_map_single(dev, (void *)ctx->key_params.key, keylen,
762
+ dma_map_single(dev, ctx->key_params.key, keylen,
737763 DMA_TO_DEVICE);
738764 if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
739765 dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
740766 ctx->key_params.key, keylen);
741
- kzfree(ctx->key_params.key);
767
+ kfree_sensitive(ctx->key_params.key);
742768 return -ENOMEM;
743769 }
744770 dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
....@@ -757,7 +783,7 @@
757783 /* Load the hash current length*/
758784 hw_desc_init(&desc[idx]);
759785 set_cipher_mode(&desc[idx], ctx->hw_mode);
760
- set_din_const(&desc[idx], 0, ctx->drvdata->hash_len_sz);
786
+ set_din_const(&desc[idx], 0, ctx->hash_len);
761787 set_cipher_config1(&desc[idx], HASH_PADDING_ENABLED);
762788 set_flow_mode(&desc[idx], S_DIN_to_HASH);
763789 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
....@@ -839,7 +865,7 @@
839865 /* Load the hash current length*/
840866 hw_desc_init(&desc[idx]);
841867 set_cipher_mode(&desc[idx], ctx->hw_mode);
842
- set_din_const(&desc[idx], 0, ctx->drvdata->hash_len_sz);
868
+ set_din_const(&desc[idx], 0, ctx->hash_len);
843869 set_flow_mode(&desc[idx], S_DIN_to_HASH);
844870 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
845871 idx++;
....@@ -880,9 +906,6 @@
880906 rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
881907
882908 out:
883
- if (rc)
884
- crypto_ahash_set_flags(ahash, CRYPTO_TFM_RES_BAD_KEY_LEN);
885
-
886909 if (ctx->key_params.key_dma_addr) {
887910 dma_unmap_single(dev, ctx->key_params.key_dma_addr,
888911 ctx->key_params.keylen, DMA_TO_DEVICE);
....@@ -890,7 +913,7 @@
890913 &ctx->key_params.key_dma_addr, ctx->key_params.keylen);
891914 }
892915
893
- kzfree(ctx->key_params.key);
916
+ kfree_sensitive(ctx->key_params.key);
894917
895918 return rc;
896919 }
....@@ -927,7 +950,7 @@
927950 if (dma_mapping_error(dev, ctx->key_params.key_dma_addr)) {
928951 dev_err(dev, "Mapping key va=0x%p len=%u for DMA failed\n",
929952 key, keylen);
930
- kzfree(ctx->key_params.key);
953
+ kfree_sensitive(ctx->key_params.key);
931954 return -ENOMEM;
932955 }
933956 dev_dbg(dev, "mapping key-buffer: key_dma_addr=%pad keylen=%u\n",
....@@ -971,15 +994,12 @@
971994
972995 rc = cc_send_sync_request(ctx->drvdata, &cc_req, desc, idx);
973996
974
- if (rc)
975
- crypto_ahash_set_flags(ahash, CRYPTO_TFM_RES_BAD_KEY_LEN);
976
-
977997 dma_unmap_single(dev, ctx->key_params.key_dma_addr,
978998 ctx->key_params.keylen, DMA_TO_DEVICE);
979999 dev_dbg(dev, "Unmapped key-buffer: key_dma_addr=%pad keylen=%u\n",
9801000 &ctx->key_params.key_dma_addr, ctx->key_params.keylen);
9811001
982
- kzfree(ctx->key_params.key);
1002
+ kfree_sensitive(ctx->key_params.key);
9831003
9841004 return rc;
9851005 }
....@@ -1054,8 +1074,8 @@
10541074 ctx->key_params.keylen = 0;
10551075
10561076 ctx->digest_buff_dma_addr =
1057
- dma_map_single(dev, (void *)ctx->digest_buff,
1058
- sizeof(ctx->digest_buff), DMA_BIDIRECTIONAL);
1077
+ dma_map_single(dev, ctx->digest_buff, sizeof(ctx->digest_buff),
1078
+ DMA_BIDIRECTIONAL);
10591079 if (dma_mapping_error(dev, ctx->digest_buff_dma_addr)) {
10601080 dev_err(dev, "Mapping digest len %zu B at va=%pK for DMA failed\n",
10611081 sizeof(ctx->digest_buff), ctx->digest_buff);
....@@ -1066,7 +1086,7 @@
10661086 &ctx->digest_buff_dma_addr);
10671087
10681088 ctx->opad_tmp_keys_dma_addr =
1069
- dma_map_single(dev, (void *)ctx->opad_tmp_keys_buff,
1089
+ dma_map_single(dev, ctx->opad_tmp_keys_buff,
10701090 sizeof(ctx->opad_tmp_keys_buff),
10711091 DMA_BIDIRECTIONAL);
10721092 if (dma_mapping_error(dev, ctx->opad_tmp_keys_dma_addr)) {
....@@ -1087,6 +1107,16 @@
10871107 return -ENOMEM;
10881108 }
10891109
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
+
10901120 static int cc_cra_init(struct crypto_tfm *tfm)
10911121 {
10921122 struct cc_hash_ctx *ctx = crypto_tfm_ctx(tfm);
....@@ -1104,7 +1134,7 @@
11041134 ctx->hw_mode = cc_alg->hw_mode;
11051135 ctx->inter_digestsize = cc_alg->inter_digestsize;
11061136 ctx->drvdata = cc_alg->drvdata;
1107
-
1137
+ ctx->hash_len = cc_get_hash_len(tfm);
11081138 return cc_alloc_ctx(ctx);
11091139 }
11101140
....@@ -1173,8 +1203,8 @@
11731203 idx++;
11741204
11751205 /* Setup request structure */
1176
- cc_req.user_cb = (void *)cc_update_complete;
1177
- cc_req.user_arg = (void *)req;
1206
+ cc_req.user_cb = cc_update_complete;
1207
+ cc_req.user_arg = req;
11781208
11791209 rc = cc_send_request(ctx->drvdata, &cc_req, desc, idx, &req->base);
11801210 if (rc != -EINPROGRESS && rc != -EBUSY) {
....@@ -1231,8 +1261,8 @@
12311261 }
12321262
12331263 /* Setup request structure */
1234
- cc_req.user_cb = (void *)cc_hash_complete;
1235
- cc_req.user_arg = (void *)req;
1264
+ cc_req.user_cb = cc_hash_complete;
1265
+ cc_req.user_arg = req;
12361266
12371267 if (state->xcbc_count && rem_cnt == 0) {
12381268 /* Load key for ECB decryption */
....@@ -1288,7 +1318,6 @@
12881318
12891319 /* Get final MAC result */
12901320 hw_desc_init(&desc[idx]);
1291
- /* TODO */
12921321 set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
12931322 digestsize, NS_BIT, 1);
12941323 set_queue_last_ind(ctx->drvdata, &desc[idx]);
....@@ -1346,8 +1375,8 @@
13461375 }
13471376
13481377 /* Setup request structure */
1349
- cc_req.user_cb = (void *)cc_hash_complete;
1350
- cc_req.user_arg = (void *)req;
1378
+ cc_req.user_cb = cc_hash_complete;
1379
+ cc_req.user_arg = req;
13511380
13521381 if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
13531382 key_len = CC_AES_128_BIT_KEY_SIZE;
....@@ -1370,7 +1399,6 @@
13701399
13711400 /* Get final MAC result */
13721401 hw_desc_init(&desc[idx]);
1373
- /* TODO */
13741402 set_dout_dlli(&desc[idx], state->digest_result_dma_addr,
13751403 digestsize, NS_BIT, 1);
13761404 set_queue_last_ind(ctx->drvdata, &desc[idx]);
....@@ -1425,8 +1453,8 @@
14251453 }
14261454
14271455 /* Setup request structure */
1428
- cc_req.user_cb = (void *)cc_digest_complete;
1429
- cc_req.user_arg = (void *)req;
1456
+ cc_req.user_cb = cc_digest_complete;
1457
+ cc_req.user_arg = req;
14301458
14311459 if (ctx->hw_mode == DRV_CIPHER_XCBC_MAC) {
14321460 key_len = CC_AES_128_BIT_KEY_SIZE;
....@@ -1483,8 +1511,8 @@
14831511 memcpy(out, state->digest_buff, ctx->inter_digestsize);
14841512 out += ctx->inter_digestsize;
14851513
1486
- memcpy(out, state->digest_bytes_len, ctx->drvdata->hash_len_sz);
1487
- out += ctx->drvdata->hash_len_sz;
1514
+ memcpy(out, state->digest_bytes_len, ctx->hash_len);
1515
+ out += ctx->hash_len;
14881516
14891517 memcpy(out, &curr_buff_cnt, sizeof(u32));
14901518 out += sizeof(u32);
....@@ -1512,8 +1540,8 @@
15121540 memcpy(state->digest_buff, in, ctx->inter_digestsize);
15131541 in += ctx->inter_digestsize;
15141542
1515
- memcpy(state->digest_bytes_len, in, ctx->drvdata->hash_len_sz);
1516
- in += ctx->drvdata->hash_len_sz;
1543
+ memcpy(state->digest_bytes_len, in, ctx->hash_len);
1544
+ in += ctx->hash_len;
15171545
15181546 /* Sanity check the data as much as possible */
15191547 memcpy(&tmp, in, sizeof(u32));
....@@ -1533,6 +1561,7 @@
15331561 char mac_name[CRYPTO_MAX_ALG_NAME];
15341562 char mac_driver_name[CRYPTO_MAX_ALG_NAME];
15351563 unsigned int blocksize;
1564
+ bool is_mac;
15361565 bool synchronize;
15371566 struct ahash_alg template_ahash;
15381567 int hash_mode;
....@@ -1540,6 +1569,7 @@
15401569 int inter_digestsize;
15411570 struct cc_drvdata *drvdata;
15421571 u32 min_hw_rev;
1572
+ enum cc_std_body std_body;
15431573 };
15441574
15451575 #define CC_STATE_SIZE(_x) \
....@@ -1554,6 +1584,7 @@
15541584 .mac_name = "hmac(sha1)",
15551585 .mac_driver_name = "hmac-sha1-ccree",
15561586 .blocksize = SHA1_BLOCK_SIZE,
1587
+ .is_mac = true,
15571588 .synchronize = false,
15581589 .template_ahash = {
15591590 .init = cc_hash_init,
....@@ -1573,6 +1604,7 @@
15731604 .hw_mode = DRV_HASH_HW_SHA1,
15741605 .inter_digestsize = SHA1_DIGEST_SIZE,
15751606 .min_hw_rev = CC_HW_REV_630,
1607
+ .std_body = CC_STD_NIST,
15761608 },
15771609 {
15781610 .name = "sha256",
....@@ -1580,6 +1612,7 @@
15801612 .mac_name = "hmac(sha256)",
15811613 .mac_driver_name = "hmac-sha256-ccree",
15821614 .blocksize = SHA256_BLOCK_SIZE,
1615
+ .is_mac = true,
15831616 .template_ahash = {
15841617 .init = cc_hash_init,
15851618 .update = cc_hash_update,
....@@ -1598,6 +1631,7 @@
15981631 .hw_mode = DRV_HASH_HW_SHA256,
15991632 .inter_digestsize = SHA256_DIGEST_SIZE,
16001633 .min_hw_rev = CC_HW_REV_630,
1634
+ .std_body = CC_STD_NIST,
16011635 },
16021636 {
16031637 .name = "sha224",
....@@ -1605,6 +1639,7 @@
16051639 .mac_name = "hmac(sha224)",
16061640 .mac_driver_name = "hmac-sha224-ccree",
16071641 .blocksize = SHA224_BLOCK_SIZE,
1642
+ .is_mac = true,
16081643 .template_ahash = {
16091644 .init = cc_hash_init,
16101645 .update = cc_hash_update,
....@@ -1623,6 +1658,7 @@
16231658 .hw_mode = DRV_HASH_HW_SHA256,
16241659 .inter_digestsize = SHA256_DIGEST_SIZE,
16251660 .min_hw_rev = CC_HW_REV_630,
1661
+ .std_body = CC_STD_NIST,
16261662 },
16271663 {
16281664 .name = "sha384",
....@@ -1630,6 +1666,7 @@
16301666 .mac_name = "hmac(sha384)",
16311667 .mac_driver_name = "hmac-sha384-ccree",
16321668 .blocksize = SHA384_BLOCK_SIZE,
1669
+ .is_mac = true,
16331670 .template_ahash = {
16341671 .init = cc_hash_init,
16351672 .update = cc_hash_update,
....@@ -1648,6 +1685,7 @@
16481685 .hw_mode = DRV_HASH_HW_SHA512,
16491686 .inter_digestsize = SHA512_DIGEST_SIZE,
16501687 .min_hw_rev = CC_HW_REV_712,
1688
+ .std_body = CC_STD_NIST,
16511689 },
16521690 {
16531691 .name = "sha512",
....@@ -1655,6 +1693,7 @@
16551693 .mac_name = "hmac(sha512)",
16561694 .mac_driver_name = "hmac-sha512-ccree",
16571695 .blocksize = SHA512_BLOCK_SIZE,
1696
+ .is_mac = true,
16581697 .template_ahash = {
16591698 .init = cc_hash_init,
16601699 .update = cc_hash_update,
....@@ -1673,6 +1712,7 @@
16731712 .hw_mode = DRV_HASH_HW_SHA512,
16741713 .inter_digestsize = SHA512_DIGEST_SIZE,
16751714 .min_hw_rev = CC_HW_REV_712,
1715
+ .std_body = CC_STD_NIST,
16761716 },
16771717 {
16781718 .name = "md5",
....@@ -1680,6 +1720,7 @@
16801720 .mac_name = "hmac(md5)",
16811721 .mac_driver_name = "hmac-md5-ccree",
16821722 .blocksize = MD5_HMAC_BLOCK_SIZE,
1723
+ .is_mac = true,
16831724 .template_ahash = {
16841725 .init = cc_hash_init,
16851726 .update = cc_hash_update,
....@@ -1698,11 +1739,38 @@
16981739 .hw_mode = DRV_HASH_HW_MD5,
16991740 .inter_digestsize = MD5_DIGEST_SIZE,
17001741 .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,
17011768 },
17021769 {
17031770 .mac_name = "xcbc(aes)",
17041771 .mac_driver_name = "xcbc-aes-ccree",
17051772 .blocksize = AES_BLOCK_SIZE,
1773
+ .is_mac = true,
17061774 .template_ahash = {
17071775 .init = cc_hash_init,
17081776 .update = cc_mac_update,
....@@ -1721,11 +1789,13 @@
17211789 .hw_mode = DRV_CIPHER_XCBC_MAC,
17221790 .inter_digestsize = AES_BLOCK_SIZE,
17231791 .min_hw_rev = CC_HW_REV_630,
1792
+ .std_body = CC_STD_NIST,
17241793 },
17251794 {
17261795 .mac_name = "cmac(aes)",
17271796 .mac_driver_name = "cmac-aes-ccree",
17281797 .blocksize = AES_BLOCK_SIZE,
1798
+ .is_mac = true,
17291799 .template_ahash = {
17301800 .init = cc_hash_init,
17311801 .update = cc_mac_update,
....@@ -1744,6 +1814,7 @@
17441814 .hw_mode = DRV_CIPHER_CMAC,
17451815 .inter_digestsize = AES_BLOCK_SIZE,
17461816 .min_hw_rev = CC_HW_REV_630,
1817
+ .std_body = CC_STD_NIST,
17471818 },
17481819 };
17491820
....@@ -1754,7 +1825,7 @@
17541825 struct crypto_alg *alg;
17551826 struct ahash_alg *halg;
17561827
1757
- t_crypto_alg = kzalloc(sizeof(*t_crypto_alg), GFP_KERNEL);
1828
+ t_crypto_alg = devm_kzalloc(dev, sizeof(*t_crypto_alg), GFP_KERNEL);
17581829 if (!t_crypto_alg)
17591830 return ERR_PTR(-ENOMEM);
17601831
....@@ -1791,92 +1862,85 @@
17911862 return t_crypto_alg;
17921863 }
17931864
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
+
17941882 int cc_init_hash_sram(struct cc_drvdata *drvdata)
17951883 {
17961884 struct cc_hash_handle *hash_handle = drvdata->hash_handle;
1797
- cc_sram_addr_t sram_buff_ofs = hash_handle->digest_len_sram_addr;
1798
- unsigned int larval_seq_len = 0;
1799
- struct cc_hw_desc larval_seq[CC_DIGEST_SIZE_MAX / sizeof(u32)];
1885
+ u32 sram_buff_ofs = hash_handle->digest_len_sram_addr;
18001886 bool large_sha_supported = (drvdata->hw_rev >= CC_HW_REV_712);
1887
+ bool sm3_supported = (drvdata->hw_rev >= CC_HW_REV_713);
18011888 int rc = 0;
18021889
18031890 /* Copy-to-sram digest-len */
1804
- cc_set_sram_desc(digest_len_init, sram_buff_ofs,
1805
- ARRAY_SIZE(digest_len_init), larval_seq,
1806
- &larval_seq_len);
1807
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1891
+ rc = cc_init_copy_sram(drvdata, cc_digest_len_init,
1892
+ sizeof(cc_digest_len_init), &sram_buff_ofs);
18081893 if (rc)
18091894 goto init_digest_const_err;
18101895
1811
- sram_buff_ofs += sizeof(digest_len_init);
1812
- larval_seq_len = 0;
1813
-
18141896 if (large_sha_supported) {
18151897 /* Copy-to-sram digest-len for sha384/512 */
1816
- cc_set_sram_desc(digest_len_sha512_init, sram_buff_ofs,
1817
- ARRAY_SIZE(digest_len_sha512_init),
1818
- larval_seq, &larval_seq_len);
1819
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1898
+ rc = cc_init_copy_sram(drvdata, cc_digest_len_sha512_init,
1899
+ sizeof(cc_digest_len_sha512_init),
1900
+ &sram_buff_ofs);
18201901 if (rc)
18211902 goto init_digest_const_err;
1822
-
1823
- sram_buff_ofs += sizeof(digest_len_sha512_init);
1824
- larval_seq_len = 0;
18251903 }
18261904
18271905 /* The initial digests offset */
18281906 hash_handle->larval_digest_sram_addr = sram_buff_ofs;
18291907
18301908 /* Copy-to-sram initial SHA* digests */
1831
- cc_set_sram_desc(md5_init, sram_buff_ofs, ARRAY_SIZE(md5_init),
1832
- larval_seq, &larval_seq_len);
1833
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1909
+ rc = cc_init_copy_sram(drvdata, cc_md5_init, sizeof(cc_md5_init),
1910
+ &sram_buff_ofs);
18341911 if (rc)
18351912 goto init_digest_const_err;
1836
- sram_buff_ofs += sizeof(md5_init);
1837
- larval_seq_len = 0;
18381913
1839
- cc_set_sram_desc(sha1_init, sram_buff_ofs,
1840
- ARRAY_SIZE(sha1_init), larval_seq,
1841
- &larval_seq_len);
1842
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1914
+ rc = cc_init_copy_sram(drvdata, cc_sha1_init, sizeof(cc_sha1_init),
1915
+ &sram_buff_ofs);
18431916 if (rc)
18441917 goto init_digest_const_err;
1845
- sram_buff_ofs += sizeof(sha1_init);
1846
- larval_seq_len = 0;
18471918
1848
- cc_set_sram_desc(sha224_init, sram_buff_ofs,
1849
- ARRAY_SIZE(sha224_init), larval_seq,
1850
- &larval_seq_len);
1851
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1919
+ rc = cc_init_copy_sram(drvdata, cc_sha224_init, sizeof(cc_sha224_init),
1920
+ &sram_buff_ofs);
18521921 if (rc)
18531922 goto init_digest_const_err;
1854
- sram_buff_ofs += sizeof(sha224_init);
1855
- larval_seq_len = 0;
18561923
1857
- cc_set_sram_desc(sha256_init, sram_buff_ofs,
1858
- ARRAY_SIZE(sha256_init), larval_seq,
1859
- &larval_seq_len);
1860
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1924
+ rc = cc_init_copy_sram(drvdata, cc_sha256_init, sizeof(cc_sha256_init),
1925
+ &sram_buff_ofs);
18611926 if (rc)
18621927 goto init_digest_const_err;
1863
- sram_buff_ofs += sizeof(sha256_init);
1864
- larval_seq_len = 0;
18651928
1866
- if (large_sha_supported) {
1867
- cc_set_sram_desc((u32 *)sha384_init, sram_buff_ofs,
1868
- (ARRAY_SIZE(sha384_init) * 2), larval_seq,
1869
- &larval_seq_len);
1870
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
1929
+ if (sm3_supported) {
1930
+ rc = cc_init_copy_sram(drvdata, cc_sm3_init,
1931
+ sizeof(cc_sm3_init), &sram_buff_ofs);
18711932 if (rc)
18721933 goto init_digest_const_err;
1873
- sram_buff_ofs += sizeof(sha384_init);
1874
- larval_seq_len = 0;
1934
+ }
18751935
1876
- cc_set_sram_desc((u32 *)sha512_init, sram_buff_ofs,
1877
- (ARRAY_SIZE(sha512_init) * 2), larval_seq,
1878
- &larval_seq_len);
1879
- rc = send_request_init(drvdata, larval_seq, larval_seq_len);
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);
18801944 if (rc)
18811945 goto init_digest_const_err;
18821946 }
....@@ -1885,57 +1949,37 @@
18851949 return rc;
18861950 }
18871951
1888
-static void __init cc_swap_dwords(u32 *buf, unsigned long size)
1889
-{
1890
- int i;
1891
- u32 tmp;
1892
-
1893
- for (i = 0; i < size; i += 2) {
1894
- tmp = buf[i];
1895
- buf[i] = buf[i + 1];
1896
- buf[i + 1] = tmp;
1897
- }
1898
-}
1899
-
1900
-/*
1901
- * Due to the way the HW works we need to swap every
1902
- * double word in the SHA384 and SHA512 larval hashes
1903
- */
1904
-void __init cc_hash_global_init(void)
1905
-{
1906
- cc_swap_dwords((u32 *)&sha384_init, (ARRAY_SIZE(sha384_init) * 2));
1907
- cc_swap_dwords((u32 *)&sha512_init, (ARRAY_SIZE(sha512_init) * 2));
1908
-}
1909
-
19101952 int cc_hash_alloc(struct cc_drvdata *drvdata)
19111953 {
19121954 struct cc_hash_handle *hash_handle;
1913
- cc_sram_addr_t sram_buff;
1955
+ u32 sram_buff;
19141956 u32 sram_size_to_alloc;
19151957 struct device *dev = drvdata_to_dev(drvdata);
19161958 int rc = 0;
19171959 int alg;
19181960
1919
- hash_handle = kzalloc(sizeof(*hash_handle), GFP_KERNEL);
1961
+ hash_handle = devm_kzalloc(dev, sizeof(*hash_handle), GFP_KERNEL);
19201962 if (!hash_handle)
19211963 return -ENOMEM;
19221964
19231965 INIT_LIST_HEAD(&hash_handle->hash_list);
19241966 drvdata->hash_handle = hash_handle;
19251967
1926
- sram_size_to_alloc = sizeof(digest_len_init) +
1927
- sizeof(md5_init) +
1928
- sizeof(sha1_init) +
1929
- sizeof(sha224_init) +
1930
- sizeof(sha256_init);
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);
19311976
19321977 if (drvdata->hw_rev >= CC_HW_REV_712)
1933
- sram_size_to_alloc += sizeof(digest_len_sha512_init) +
1934
- sizeof(sha384_init) + sizeof(sha512_init);
1978
+ sram_size_to_alloc += sizeof(cc_digest_len_sha512_init) +
1979
+ sizeof(cc_sha384_init) + sizeof(cc_sha512_init);
19351980
19361981 sram_buff = cc_sram_alloc(drvdata, sram_size_to_alloc);
19371982 if (sram_buff == NULL_SRAM_ADDR) {
1938
- dev_err(dev, "SRAM pool exhausted\n");
19391983 rc = -ENOMEM;
19401984 goto fail;
19411985 }
....@@ -1955,30 +1999,31 @@
19551999 struct cc_hash_alg *t_alg;
19562000 int hw_mode = driver_hash[alg].hw_mode;
19572001
1958
- /* We either support both HASH and MAC or none */
1959
- if (driver_hash[alg].min_hw_rev > drvdata->hw_rev)
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))
19602005 continue;
19612006
1962
- /* register hmac version */
1963
- t_alg = cc_alloc_hash_alg(&driver_hash[alg], dev, true);
1964
- if (IS_ERR(t_alg)) {
1965
- rc = PTR_ERR(t_alg);
1966
- dev_err(dev, "%s alg allocation failed\n",
1967
- driver_hash[alg].driver_name);
1968
- goto fail;
1969
- }
1970
- t_alg->drvdata = drvdata;
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;
19712017
1972
- rc = crypto_register_ahash(&t_alg->ahash_alg);
1973
- if (rc) {
1974
- dev_err(dev, "%s alg registration failed\n",
1975
- driver_hash[alg].driver_name);
1976
- kfree(t_alg);
1977
- goto fail;
1978
- } else {
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
+
19792025 list_add_tail(&t_alg->entry, &hash_handle->hash_list);
19802026 }
1981
-
19822027 if (hw_mode == DRV_CIPHER_XCBC_MAC ||
19832028 hw_mode == DRV_CIPHER_CMAC)
19842029 continue;
....@@ -1997,18 +2042,16 @@
19972042 if (rc) {
19982043 dev_err(dev, "%s alg registration failed\n",
19992044 driver_hash[alg].driver_name);
2000
- kfree(t_alg);
20012045 goto fail;
2002
- } else {
2003
- list_add_tail(&t_alg->entry, &hash_handle->hash_list);
20042046 }
2047
+
2048
+ list_add_tail(&t_alg->entry, &hash_handle->hash_list);
20052049 }
20062050
20072051 return 0;
20082052
20092053 fail:
2010
- kfree(drvdata->hash_handle);
2011
- drvdata->hash_handle = NULL;
2054
+ cc_hash_free(drvdata);
20122055 return rc;
20132056 }
20142057
....@@ -2017,17 +2060,12 @@
20172060 struct cc_hash_alg *t_hash_alg, *hash_n;
20182061 struct cc_hash_handle *hash_handle = drvdata->hash_handle;
20192062
2020
- if (hash_handle) {
2021
- list_for_each_entry_safe(t_hash_alg, hash_n,
2022
- &hash_handle->hash_list, entry) {
2023
- crypto_unregister_ahash(&t_hash_alg->ahash_alg);
2024
- list_del(&t_hash_alg->entry);
2025
- kfree(t_hash_alg);
2026
- }
2027
-
2028
- kfree(hash_handle);
2029
- drvdata->hash_handle = NULL;
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);
20302067 }
2068
+
20312069 return 0;
20322070 }
20332071
....@@ -2045,7 +2083,7 @@
20452083 XCBC_MAC_K1_OFFSET),
20462084 CC_AES_128_BIT_KEY_SIZE, NS_BIT);
20472085 set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
2048
- set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
2086
+ set_hash_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC, ctx->hash_mode);
20492087 set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
20502088 set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
20512089 set_flow_mode(&desc[idx], S_DIN_to_AES);
....@@ -2169,37 +2207,42 @@
21692207 {
21702208 switch (mode) {
21712209 case DRV_HASH_MD5:
2172
- return md5_init;
2210
+ return cc_md5_init;
21732211 case DRV_HASH_SHA1:
2174
- return sha1_init;
2212
+ return cc_sha1_init;
21752213 case DRV_HASH_SHA224:
2176
- return sha224_init;
2214
+ return cc_sha224_init;
21772215 case DRV_HASH_SHA256:
2178
- return sha256_init;
2216
+ return cc_sha256_init;
21792217 case DRV_HASH_SHA384:
2180
- return sha384_init;
2218
+ return cc_sha384_init;
21812219 case DRV_HASH_SHA512:
2182
- return sha512_init;
2220
+ return cc_sha512_init;
2221
+ case DRV_HASH_SM3:
2222
+ return cc_sm3_init;
21832223 default:
21842224 dev_err(dev, "Invalid hash mode (%d)\n", mode);
2185
- return md5_init;
2225
+ return cc_md5_init;
21862226 }
21872227 }
21882228
2189
-/*!
2190
- * Gets the address of the initial digest in SRAM
2229
+/**
2230
+ * cc_larval_digest_addr() - Get the address of the initial digest in SRAM
21912231 * according to the given hash mode
21922232 *
2193
- * \param drvdata
2194
- * \param mode The Hash mode. Supported modes: MD5/SHA1/SHA224/SHA256
2233
+ * @drvdata: Associated device driver context
2234
+ * @mode: The Hash mode. Supported modes: MD5/SHA1/SHA224/SHA256
21952235 *
2196
- * \return u32 The address of the initial digest in SRAM
2236
+ * Return:
2237
+ * The address of the initial digest in SRAM
21972238 */
2198
-cc_sram_addr_t cc_larval_digest_addr(void *drvdata, u32 mode)
2239
+u32 cc_larval_digest_addr(void *drvdata, u32 mode)
21992240 {
22002241 struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
22012242 struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
22022243 struct device *dev = drvdata_to_dev(_drvdata);
2244
+ bool sm3_supported = (_drvdata->hw_rev >= CC_HW_REV_713);
2245
+ u32 addr;
22032246
22042247 switch (mode) {
22052248 case DRV_HASH_NULL:
....@@ -2208,29 +2251,41 @@
22082251 return (hash_handle->larval_digest_sram_addr);
22092252 case DRV_HASH_SHA1:
22102253 return (hash_handle->larval_digest_sram_addr +
2211
- sizeof(md5_init));
2254
+ sizeof(cc_md5_init));
22122255 case DRV_HASH_SHA224:
22132256 return (hash_handle->larval_digest_sram_addr +
2214
- sizeof(md5_init) +
2215
- sizeof(sha1_init));
2257
+ sizeof(cc_md5_init) +
2258
+ sizeof(cc_sha1_init));
22162259 case DRV_HASH_SHA256:
22172260 return (hash_handle->larval_digest_sram_addr +
2218
- sizeof(md5_init) +
2219
- sizeof(sha1_init) +
2220
- sizeof(sha224_init));
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));
22212270 case DRV_HASH_SHA384:
2222
- return (hash_handle->larval_digest_sram_addr +
2223
- sizeof(md5_init) +
2224
- sizeof(sha1_init) +
2225
- sizeof(sha224_init) +
2226
- sizeof(sha256_init));
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;
22272279 case DRV_HASH_SHA512:
2228
- return (hash_handle->larval_digest_sram_addr +
2229
- sizeof(md5_init) +
2230
- sizeof(sha1_init) +
2231
- sizeof(sha224_init) +
2232
- sizeof(sha256_init) +
2233
- sizeof(sha384_init));
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;
22342289 default:
22352290 dev_err(dev, "Invalid hash mode (%d)\n", mode);
22362291 }
....@@ -2239,12 +2294,11 @@
22392294 return hash_handle->larval_digest_sram_addr;
22402295 }
22412296
2242
-cc_sram_addr_t
2243
-cc_digest_len_addr(void *drvdata, u32 mode)
2297
+u32 cc_digest_len_addr(void *drvdata, u32 mode)
22442298 {
22452299 struct cc_drvdata *_drvdata = (struct cc_drvdata *)drvdata;
22462300 struct cc_hash_handle *hash_handle = _drvdata->hash_handle;
2247
- cc_sram_addr_t digest_len_addr = hash_handle->digest_len_sram_addr;
2301
+ u32 digest_len_addr = hash_handle->digest_len_sram_addr;
22482302
22492303 switch (mode) {
22502304 case DRV_HASH_SHA1:
....@@ -2252,11 +2306,9 @@
22522306 case DRV_HASH_SHA256:
22532307 case DRV_HASH_MD5:
22542308 return digest_len_addr;
2255
-#if (CC_DEV_SHA_MAX > 256)
22562309 case DRV_HASH_SHA384:
22572310 case DRV_HASH_SHA512:
2258
- return digest_len_addr + sizeof(digest_len_init);
2259
-#endif
2311
+ return digest_len_addr + sizeof(cc_digest_len_init);
22602312 default:
22612313 return digest_len_addr; /*to avoid kernel crash*/
22622314 }