Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/crypto/ccree/cc_hash.c
26282 views
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
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
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=%p to dma=%pad\n",
129
digestsize, state->digest_result_buff,
130
&state->digest_result_dma_addr);
131
132
return 0;
133
}
134
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
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=%p 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=%p 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=%p 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=%p 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=%p 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=%p 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
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
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 (%p) 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
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_dma(req);
287
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
288
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(tfm);
289
290
dev_dbg(dev, "req=%p\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
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_dma(req);
305
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
306
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(tfm);
307
u32 digestsize = crypto_ahash_digestsize(tfm);
308
309
dev_dbg(dev, "req=%p\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
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_dma(req);
325
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
326
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(tfm);
327
u32 digestsize = crypto_ahash_digestsize(tfm);
328
329
dev_dbg(dev, "req=%p\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
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_dma(req);
345
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
346
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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_dma(req);
368
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
369
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
418
static int cc_hash_digest(struct ahash_request *req)
419
{
420
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
421
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
422
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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
556
static int cc_hash_update(struct ahash_request *req)
557
{
558
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
559
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
560
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
632
static int cc_do_finup(struct ahash_request *req, bool update)
633
{
634
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
635
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
636
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
701
static int cc_hash_finup(struct ahash_request *req)
702
{
703
return cc_do_finup(req, true);
704
}
705
706
707
static int cc_hash_final(struct ahash_request *req)
708
{
709
return cc_do_finup(req, false);
710
}
711
712
static int cc_hash_init(struct ahash_request *req)
713
{
714
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
715
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
716
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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_dma(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
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_dma(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
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_dma(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
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
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=%p 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=%p 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=%p 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=%p 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
1110
static int cc_get_hash_len(struct crypto_tfm *tfm)
1111
{
1112
struct cc_hash_ctx *ctx = crypto_tfm_ctx_dma(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
1120
static int cc_cra_init(struct crypto_tfm *tfm)
1121
{
1122
struct cc_hash_ctx *ctx = crypto_tfm_ctx_dma(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_dma(__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
1141
static void cc_cra_exit(struct crypto_tfm *tfm)
1142
{
1143
struct cc_hash_ctx *ctx = crypto_tfm_ctx_dma(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
1150
static int cc_mac_update(struct ahash_request *req)
1151
{
1152
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
1153
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1154
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
1218
static int cc_mac_final(struct ahash_request *req)
1219
{
1220
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
1221
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1222
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
1339
static int cc_mac_finup(struct ahash_request *req)
1340
{
1341
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
1342
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1343
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
1420
static int cc_mac_digest(struct ahash_request *req)
1421
{
1422
struct ahash_req_ctx *state = ahash_request_ctx_dma(req);
1423
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
1424
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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_dma(ahash);
1503
struct ahash_req_ctx *state = ahash_request_ctx_dma(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
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_dma(ahash);
1529
struct device *dev = drvdata_to_dev(ctx->drvdata);
1530
struct ahash_req_ctx *state = ahash_request_ctx_dma(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
//Asynchronous 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
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) + crypto_dma_padding();
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
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
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
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
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
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_dma(areq);
2077
struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2078
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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_dma(areq);
2134
struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq);
2135
struct cc_hash_ctx *ctx = crypto_ahash_ctx_dma(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
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
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
*/
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
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
2317