blob: 8e0ed2771c13650ba03c9741bf8d90cf00c01c8c [file] [log] [blame]
developer2df22aa2024-03-22 14:36:06 +08001// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2023 MediaTek Inc.
4 *
5 * Author: Chris.Chou <chris.chou@mediatek.com>
6 * Ren-Ting Wang <ren-ting.wang@mediatek.com>
7 */
8
9#include <linux/bitops.h>
10#include <crypto/aes.h>
11#include <crypto/hmac.h>
12#include <crypto/skcipher.h>
13#include <crypto/internal/skcipher.h>
14#include <crypto/internal/hash.h>
15
16#include "crypto-eip/crypto-eip.h"
17#include "crypto-eip/ddk-wrapper.h"
18#include "crypto-eip/lookaside.h"
19#include "crypto-eip/internal.h"
20
21static inline u64 mtk_crypto_queued_len(struct mtk_crypto_ahash_req *req)
22{
23 return req->len - req->processed;
24}
25
26static int mtk_crypto_ahash_enqueue(struct ahash_request *areq)
27{
28 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
29 struct mtk_crypto_priv *priv = ctx->priv;
30 int ret;
31
32 spin_lock_bh(&priv->mtk_eip_queue.queue_lock);
33 ret = crypto_enqueue_request(&priv->mtk_eip_queue.queue, &areq->base);
34 spin_unlock_bh(&priv->mtk_eip_queue.queue_lock);
35
36 queue_work(priv->mtk_eip_queue.workqueue,
37 &priv->mtk_eip_queue.work_data.work);
38
39 return ret;
40}
41
42static int mtk_crypto_ahash_send(struct crypto_async_request *async)
43{
44 struct ahash_request *areq = ahash_request_cast(async);
45 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
46 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
47 int cache_len;
48 int extra = 0;
49 int areq_shift;
50 u64 queued;
51 u64 len;
developerd66221d2024-04-01 19:03:52 +080052 bool ret = 0;
developer2df22aa2024-03-22 14:36:06 +080053 uint8_t *cur_req;
54 int i;
55
56 if (req->hmac_zlen)
57 goto zero_length_hmac;
58 areq_shift = 0;
59 queued = mtk_crypto_queued_len(req);
60 if (queued <= HASH_CACHE_SIZE)
61 cache_len = queued;
62 else
63 cache_len = queued - areq->nbytes;
64
65 if (!req->finish && !req->last_req) {
66 /* If this is not the last request and the queued data does not
67 * fit into full cache blocks, cache it for the next send call.
68 */
69 extra = queued & (HASH_CACHE_SIZE - 1);
70
71 if (!extra)
72 extra = HASH_CACHE_SIZE;
73
74 sg_pcopy_to_buffer(areq->src, sg_nents(areq->src),
75 req->cache_next, extra, areq->nbytes - extra);
76
77 queued -= extra;
78
79 if (!queued)
80 return 0;
81
82 extra = 0;
83 }
84
85 len = queued;
86 cur_req = kmalloc(sizeof(uint8_t) * len + AES_BLOCK_SIZE, GFP_KERNEL);
87 if (!cur_req) {
88 CRYPTO_ERR("alloc buffer for ahash request failed\n");
89 goto exit;
90 }
91 /* Send request to EIP197 */
92 if (cache_len) {
93 memcpy(cur_req, req->cache, cache_len);
94 queued -= cache_len;
95 }
96 if (queued)
97 sg_copy_to_buffer(areq->src, sg_nents(areq->src), cur_req + cache_len, queued);
98
99 if (unlikely(req->xcbcmac)) {
developerd66221d2024-04-01 19:03:52 +0800100 int pad_size = 0;
developer2df22aa2024-03-22 14:36:06 +0800101 int offset;
102 int new;
103
104 if (req->finish) {
105 new = len % AES_BLOCK_SIZE;
106 pad_size = AES_BLOCK_SIZE - new;
107 offset = (len - new) / sizeof(u32);
108
109 if (pad_size != AES_BLOCK_SIZE) {
110 memset(cur_req + len, 0, pad_size);
111 cur_req[len] = 0x80;
112 for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++) {
113 ((__be32 *) cur_req)[offset + i] ^=
114 cpu_to_be32(le32_to_cpu(
115 ctx->ipad[i + 4]));
116 }
117 } else {
118 for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++)
119 ((__be32 *) cur_req)[offset - 4 + i] ^=
120 cpu_to_be32(le32_to_cpu(
121 ctx->ipad[i]));
122 pad_size = 0;
123 }
124 }
125
126 ret = crypto_ahash_aes_cbc(async, req, cur_req, len + pad_size);
127 kfree(cur_req);
128 if (ret) {
129 if (req->sa_pointer)
130 crypto_free_sa(req->sa_pointer);
131 kfree(req->token_context);
132 CRYPTO_ERR("Fail on ahash_aes_cbc process\n");
133 goto exit;
134 }
135 req->not_first = true;
136 req->processed += len - extra;
137
138 return 0;
139 }
140
141 if (req->not_first)
142 ret = crypto_ahash_token_req(async, req, cur_req, len, req->finish);
143 else
144 ret = crypto_first_ahash_req(async, req, cur_req, len, req->finish);
145
146 kfree(cur_req);
147
148 if (ret) {
149 if (req->sa_pointer)
150 crypto_free_sa(req->sa_pointer);
developer2df22aa2024-03-22 14:36:06 +0800151 CRYPTO_ERR("Fail on ahash_req process\n");
152 goto exit;
153 }
154 req->not_first = true;
155 req->processed += len - extra;
156
157 return 0;
158
159zero_length_hmac:
160 if (req->sa_pointer)
161 crypto_free_sa(req->sa_pointer);
162 kfree(req->token_context);
163
164 /* complete the final hash with opad for hmac*/
165 if (req->hmac) {
166 req->sa_pointer = ctx->opad_sa;
167 req->token_context = ctx->opad_token;
168 ret = crypto_ahash_token_req(async, req, (uint8_t *) req->state,
169 req->digest_sz, true);
170 }
171
172 return 0;
173exit:
174 async->complete(async, ret);
175
176 return 0;
177}
178
179static int mtk_crypto_ahash_handle_result(struct mtk_crypto_result *res, int err)
180{
181 struct crypto_async_request *async = res->async;
182 struct ahash_request *areq = ahash_request_cast(async);
183 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
184 struct crypto_ahash *ahash = crypto_ahash_reqtfm(areq);
185 int cache_len;
186
187 if (req->xcbcmac) {
188 memcpy(req->state, res->dst + res->size - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
189 crypto_free_sa(res->eip.sa);
190 kfree(res->eip.token_context);
191 } else
192 memcpy(req->state, res->dst, req->digest_sz);
193
194 crypto_free_token(res->eip.token);
195 crypto_free_pkt(res->eip.pkt_handle);
196
197 if (req->finish) {
198 if (req->hmac && !req->hmac_zlen) {
199 req->hmac_zlen = true;
200 mtk_crypto_ahash_enqueue(areq);
201 return 0;
202 }
203 if (req->sa_pointer)
204 crypto_free_sa(req->sa_pointer);
205
206 kfree(req->token_context);
207
208 memcpy(areq->result, req->state, crypto_ahash_digestsize(ahash));
209 }
210
211 cache_len = mtk_crypto_queued_len(req);
212 if (cache_len)
213 memcpy(req->cache, req->cache_next, cache_len);
214 async->complete(async, 0);
215
216 return 0;
217}
218
219static int mtk_crypto_ahash_cache(struct ahash_request *areq)
220{
221 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
222 u64 cache_len;
223
224 cache_len = mtk_crypto_queued_len(req);
225
226 if (cache_len + areq->nbytes <= HASH_CACHE_SIZE) {
227 sg_pcopy_to_buffer(areq->src, sg_nents(areq->src),
228 req->cache + cache_len,
229 areq->nbytes, 0);
230 return 0;
231 }
232
233 return -E2BIG;
234}
235
236static int mtk_crypto_ahash_update(struct ahash_request *areq)
237{
238 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
239 int ret;
240
241 if (!areq->nbytes)
242 return 0;
243
244 ret = mtk_crypto_ahash_cache(areq);
245
246 req->len += areq->nbytes;
247
248 if ((ret && !req->finish) || req->last_req)
249 return mtk_crypto_ahash_enqueue(areq);
250
251 return 0;
252}
253
254static int mtk_crypto_ahash_final(struct ahash_request *areq)
255{
256 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
257 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
258
259 req->finish = true;
260
261 if (unlikely(!req->len && !areq->nbytes && !req->hmac)) {
262 if (ctx->alg == MTK_CRYPTO_ALG_SHA1)
263 memcpy(areq->result, sha1_zero_message_hash,
264 SHA1_DIGEST_SIZE);
265 else if (ctx->alg == MTK_CRYPTO_ALG_SHA224)
266 memcpy(areq->result, sha224_zero_message_hash,
267 SHA224_DIGEST_SIZE);
268 else if (ctx->alg == MTK_CRYPTO_ALG_SHA256)
269 memcpy(areq->result, sha256_zero_message_hash,
270 SHA256_DIGEST_SIZE);
271 else if (ctx->alg == MTK_CRYPTO_ALG_SHA384)
272 memcpy(areq->result, sha384_zero_message_hash,
273 SHA384_DIGEST_SIZE);
274 else if (ctx->alg == MTK_CRYPTO_ALG_SHA512)
275 memcpy(areq->result, sha512_zero_message_hash,
276 SHA512_DIGEST_SIZE);
277 else if (ctx->alg == MTK_CRYPTO_ALG_MD5)
278 memcpy(areq->result, md5_zero_message_hash,
279 MD5_DIGEST_SIZE);
280
281 return 0;
282 } else if (unlikely(req->digest == MTK_CRYPTO_DIGEST_XCM &&
283 ctx->alg == MTK_CRYPTO_ALG_MD5 && req->len == sizeof(u32) &&
284 !areq->nbytes)) {
285 memcpy(areq->result, ctx->ipad, sizeof(u32));
286 return 0;
287 } else if (unlikely(ctx->cbcmac && req->len == AES_BLOCK_SIZE &&
288 !areq->nbytes)) {
289 memset(areq->result, 0, AES_BLOCK_SIZE);
290 return 0;
291 } else if (unlikely(req->xcbcmac && req->len == AES_BLOCK_SIZE &&
292 !areq->nbytes)) {
293 int i;
294
295 for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++)
296 ((__be32 *) areq->result)[i] =
297 cpu_to_be32(le32_to_cpu(ctx->ipad[i + 4]));
298 areq->result[0] ^= 0x80;
299 crypto_cipher_encrypt_one(ctx->kaes, areq->result, areq->result);
300 return 0;
301 } else if (unlikely(req->hmac && (req->len == req->block_sz) &&
302 !areq->nbytes)) {
303 memcpy(req->state, ctx->zero_hmac, req->state_sz);
304 req->hmac_zlen = true;
305 } else if (req->hmac) {
306 req->digest = MTK_CRYPTO_DIGEST_HMAC;
307 }
308
309 return mtk_crypto_ahash_enqueue(areq);
310}
311
312static int mtk_crypto_ahash_finup(struct ahash_request *areq)
313{
314 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
315
316 req->finish = true;
317
318 mtk_crypto_ahash_update(areq);
319 return mtk_crypto_ahash_final(areq);
320}
321
322static int mtk_crypto_ahash_export(struct ahash_request *areq, void *out)
323{
324 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
325 struct mtk_crypto_ahash_export_state *export = out;
326
327 export->len = req->len;
328 export->processed = req->processed;
329
330 export->digest = req->digest;
331 export->sa_pointer = req->sa_pointer;
332 export->token_context = req->token_context;
333
334 memcpy(export->state, req->state, req->state_sz);
335 memcpy(export->cache, req->cache, HASH_CACHE_SIZE);
336
337 return 0;
338}
339
340static int mtk_crypto_ahash_import(struct ahash_request *areq, const void *in)
341{
342 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
343 const struct mtk_crypto_ahash_export_state *export = in;
344 int ret;
345
346 ret = crypto_ahash_init(areq);
347 if (ret)
348 return ret;
349
350 req->len = export->len;
351 req->processed = export->processed;
352
353 req->digest = export->digest;
354 req->sa_pointer = export->sa_pointer;
355 req->token_context = export->token_context;
356 if (req->sa_pointer)
357 req->not_first = true;
358
359 memcpy(req->cache, export->cache, HASH_CACHE_SIZE);
360 memcpy(req->state, export->state, req->state_sz);
361
362 return 0;
363}
364
365static int mtk_crypto_ahash_cra_init(struct crypto_tfm *tfm)
366{
367 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
368 struct mtk_crypto_alg_template *tmpl =
369 container_of(__crypto_ahash_alg(tfm->__crt_alg),
370 struct mtk_crypto_alg_template, alg.ahash);
371
372 ctx->priv = tmpl->priv;
373 ctx->base.send = mtk_crypto_ahash_send;
374 ctx->base.handle_result = mtk_crypto_ahash_handle_result;
375 crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm),
376 sizeof(struct mtk_crypto_ahash_req));
377
378 return 0;
379}
380
381static int mtk_crypto_sha1_init(struct ahash_request *areq)
382{
383 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
384 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
385
386 memset(req, 0, sizeof(*req));
387
388 ctx->alg = MTK_CRYPTO_ALG_SHA1;
389 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
390 req->state_sz = SHA1_DIGEST_SIZE;
391 req->digest_sz = SHA1_DIGEST_SIZE;
392 req->block_sz = SHA1_BLOCK_SIZE;
393
394 return 0;
395}
396
397static int mtk_crypto_sha1_digest(struct ahash_request *areq)
398{
399 int ret = mtk_crypto_sha1_init(areq);
400
401 if (ret)
402 return ret;
403
404 return mtk_crypto_ahash_finup(areq);
405}
406
407static void mtk_crypto_ahash_cra_exit(struct crypto_tfm *tfm)
408{
409}
410
411struct mtk_crypto_alg_template mtk_crypto_sha1 = {
412 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
413 .alg.ahash = {
414 .init = mtk_crypto_sha1_init,
415 .update = mtk_crypto_ahash_update,
416 .final = mtk_crypto_ahash_final,
417 .finup = mtk_crypto_ahash_finup,
418 .digest = mtk_crypto_sha1_digest,
419 .export = mtk_crypto_ahash_export,
420 .import = mtk_crypto_ahash_import,
421 .halg = {
422 .digestsize = SHA1_DIGEST_SIZE,
423 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
424 .base = {
425 .cra_name = "sha1",
426 .cra_driver_name = "crypto-eip-sha1",
427 .cra_priority = MTK_CRYPTO_PRIORITY,
428 .cra_flags = CRYPTO_ALG_ASYNC |
429 CRYPTO_ALG_KERN_DRIVER_ONLY,
430 .cra_blocksize = SHA1_BLOCK_SIZE,
431 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
432 .cra_init = mtk_crypto_ahash_cra_init,
433 .cra_exit = mtk_crypto_ahash_cra_exit,
434 .cra_module = THIS_MODULE,
435 },
436 },
437 },
438};
439
440static int mtk_crypto_hmac_sha1_init(struct ahash_request *areq)
441{
442 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
443 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
444
445 memset(req, 0, sizeof(*req));
446
447 memcpy(req->state, ctx->ipad, SHA1_DIGEST_SIZE);
448 req->sa_pointer = ctx->ipad_sa;
449 req->token_context = ctx->ipad_token;
450 req->not_first = true;
451 req->len = SHA1_BLOCK_SIZE;
452 req->processed = SHA1_BLOCK_SIZE;
453
454 ctx->alg = MTK_CRYPTO_ALG_SHA1;
455 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
456 req->state_sz = SHA1_DIGEST_SIZE;
457 req->digest_sz = SHA1_DIGEST_SIZE;
458 req->block_sz = SHA1_BLOCK_SIZE;
459 req->hmac = true;
460
461 return 0;
462}
463
464static int mtk_crypto_hmac_sha1_digest(struct ahash_request *areq)
465{
466 int ret = mtk_crypto_hmac_sha1_init(areq);
467
468 if (ret)
469 return ret;
470
471 return mtk_crypto_ahash_finup(areq);
472}
473
474struct mtk_crypto_ahash_result {
475 struct completion completion;
476 int error;
477};
478
479static void mtk_crypto_ahash_complete(struct crypto_async_request *req, int error)
480{
481 struct mtk_crypto_ahash_result *result = req->data;
482
483 if (error == -EINPROGRESS)
484 return;
485
486 result->error = error;
487 complete(&result->completion);
488}
489
490static int mtk_crypto_hmac_init_pad(struct ahash_request *areq, unsigned int blocksize,
491 const u8 *key, unsigned int keylen,
492 u8 *ipad, u8 *opad)
493{
494 struct mtk_crypto_ahash_result result;
495 struct scatterlist sg;
496 int ret, i;
497 u8 *keydup;
498
499 if (keylen <= blocksize) {
500 memcpy(ipad, key, keylen);
501 } else {
502 keydup = kmemdup(key, keylen, GFP_KERNEL);
503 if (!keydup)
504 return -ENOMEM;
505
506 ahash_request_set_callback(areq, CRYPTO_TFM_REQ_MAY_BACKLOG,
507 mtk_crypto_ahash_complete, &result);
508 sg_init_one(&sg, keydup, keylen);
509 ahash_request_set_crypt(areq, &sg, ipad, keylen);
510 init_completion(&result.completion);
511
512 ret = crypto_ahash_digest(areq);
513 if (ret == -EINPROGRESS || ret == -EBUSY) {
514 wait_for_completion_interruptible(&result.completion);
515 ret = result.error;
516 }
517
518 memzero_explicit(keydup, keylen);
519 kfree(keydup);
520
521 if (ret)
522 return ret;
523
524 keylen = crypto_ahash_digestsize(crypto_ahash_reqtfm(areq));
525 }
526
527 memset(ipad + keylen, 0, blocksize - keylen);
528 memcpy(opad, ipad, blocksize);
529
530 for (i = 0; i < blocksize; i++) {
531 ipad[i] ^= HMAC_IPAD_VALUE;
532 opad[i] ^= HMAC_OPAD_VALUE;
533 }
534
535 return 0;
536}
537
538static int mtk_crypto_hmac_init_iv(struct ahash_request *areq, unsigned int blocksize,
539 u8 *pad, void *state, bool zero)
540{
541 struct mtk_crypto_ahash_result result;
542 struct mtk_crypto_ahash_req *req;
543 struct scatterlist sg;
544 int ret;
545
546 ahash_request_set_callback(areq, CRYPTO_TFM_REQ_MAY_BACKLOG,
547 mtk_crypto_ahash_complete, &result);
548 sg_init_one(&sg, pad, blocksize);
549 ahash_request_set_crypt(areq, &sg, pad, blocksize);
550 init_completion(&result.completion);
551
552 ret = crypto_ahash_init(areq);
553 if (ret)
554 return ret;
555
556 req = ahash_request_ctx(areq);
557 req->last_req = !zero;
558
559 if (zero)
560 ret = crypto_ahash_finup(areq);
561 else
562 ret = crypto_ahash_update(areq);
563 if (ret && ret != -EINPROGRESS && ret != -EBUSY)
564 return ret;
565
566 wait_for_completion_interruptible(&result.completion);
567 if (result.error)
568 return result.error;
569
570 return crypto_ahash_export(areq, state);
571}
572
573int mtk_crypto_zero_hmac_setkey(const char *alg, const u8 *key, unsigned int keylen,
574 void *istate)
575{
576 struct ahash_request *areq;
577 struct crypto_ahash *tfm;
578 unsigned int blocksize;
579 u8 *ipad, *opad;
580 int ret;
581
582 tfm = crypto_alloc_ahash(alg, 0, 0);
583 if (IS_ERR(tfm))
584 return PTR_ERR(tfm);
585
586 areq = ahash_request_alloc(tfm, GFP_KERNEL);
587 if (!areq) {
588 ret = -ENOMEM;
589 goto free_ahash;
590 }
591
592 crypto_ahash_clear_flags(tfm, ~0);
593 blocksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
594
595 ipad = kcalloc(2, blocksize, GFP_KERNEL);
596 if (!ipad) {
597 ret = -ENOMEM;
598 goto free_request;
599 }
600
601 opad = ipad + blocksize;
602
603 ret = mtk_crypto_hmac_init_pad(areq, blocksize, key, keylen, ipad, opad);
604 if (ret)
605 goto free_ipad;
606
607 ret = mtk_crypto_hmac_init_iv(areq, blocksize, ipad, istate, true);
608 if (ret)
609 goto free_ipad;
610
611free_ipad:
612 kfree(ipad);
613free_request:
developerd66221d2024-04-01 19:03:52 +0800614 kfree(areq);
developer2df22aa2024-03-22 14:36:06 +0800615free_ahash:
616 crypto_free_ahash(tfm);
617
618 return ret;
619}
620
621int mtk_crypto_hmac_setkey(const char *alg, const u8 *key, unsigned int keylen,
622 void *istate, void *ostate)
623{
624 struct ahash_request *areq;
625 struct crypto_ahash *tfm;
626 unsigned int blocksize;
627 u8 *ipad, *opad;
628 int ret;
629
630 tfm = crypto_alloc_ahash(alg, 0, 0);
631 if (IS_ERR(tfm))
632 return PTR_ERR(tfm);
633
634 areq = ahash_request_alloc(tfm, GFP_KERNEL);
635 if (!areq) {
636 ret = -ENOMEM;
637 goto free_ahash;
638 }
639
640 crypto_ahash_clear_flags(tfm, ~0);
641 blocksize = crypto_tfm_alg_blocksize(crypto_ahash_tfm(tfm));
642
643 ipad = kcalloc(2, blocksize, GFP_KERNEL);
644 if (!ipad) {
645 ret = -ENOMEM;
646 goto free_request;
647 }
648
649 opad = ipad + blocksize;
650
651 ret = mtk_crypto_hmac_init_pad(areq, blocksize, key, keylen, ipad, opad);
652 if (ret)
653 goto free_ipad;
654
655 ret = mtk_crypto_hmac_init_iv(areq, blocksize, ipad, istate, false);
656 if (ret)
657 goto free_ipad;
658
659 ret = mtk_crypto_hmac_init_iv(areq, blocksize, opad, ostate, false);
660
661free_ipad:
662 kfree(ipad);
663free_request:
developerd66221d2024-04-01 19:03:52 +0800664 kfree(areq);
developer2df22aa2024-03-22 14:36:06 +0800665free_ahash:
666 crypto_free_ahash(tfm);
667
668 return ret;
669}
670
671static int mtk_crypto_hmac_alg_setkey(struct crypto_ahash *tfm, const u8 *key,
672 unsigned int keylen, const char *alg,
673 unsigned int state_sz)
674{
675 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
676 struct mtk_crypto_ahash_export_state istate, ostate, zeroi;
677 int ret;
678
developerd66221d2024-04-01 19:03:52 +0800679 memset(&zeroi, 0, sizeof(struct mtk_crypto_ahash_export_state));
680 memset(&istate, 0, sizeof(struct mtk_crypto_ahash_export_state));
681 memset(&ostate, 0, sizeof(struct mtk_crypto_ahash_export_state));
developer2df22aa2024-03-22 14:36:06 +0800682 ret = mtk_crypto_hmac_setkey(alg, key, keylen, &istate, &ostate);
683 if (ret)
684 return ret;
685
686 ret = mtk_crypto_zero_hmac_setkey(alg, key, keylen, &zeroi);
687 if (ret)
688 return ret;
689
690 memcpy(ctx->zero_hmac, &zeroi.state, state_sz);
691 memcpy(ctx->ipad, &istate.state, state_sz);
692 memcpy(ctx->opad, &ostate.state, state_sz);
693 ctx->ipad_sa = istate.sa_pointer;
694 ctx->ipad_token = istate.token_context;
695 ctx->opad_sa = ostate.sa_pointer;
696 ctx->opad_token = ostate.token_context;
697
698 return 0;
699}
700
701static int mtk_crypto_hmac_sha1_setkey(struct crypto_ahash *tfm, const u8 *key,
702 unsigned int keylen)
703{
704 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-sha1",
705 SHA1_DIGEST_SIZE);
706}
707
708struct mtk_crypto_alg_template mtk_crypto_hmac_sha1 = {
709 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
710 .alg.ahash = {
711 .init = mtk_crypto_hmac_sha1_init,
712 .update = mtk_crypto_ahash_update,
713 .final = mtk_crypto_ahash_final,
714 .finup = mtk_crypto_ahash_finup,
715 .digest = mtk_crypto_hmac_sha1_digest,
716 .setkey = mtk_crypto_hmac_sha1_setkey,
717 .export = mtk_crypto_ahash_export,
718 .import = mtk_crypto_ahash_import,
719 .halg = {
720 .digestsize = SHA1_DIGEST_SIZE,
721 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
722 .base = {
723 .cra_name = "hmac(sha1)",
724 .cra_driver_name = "crypto-eip-hmac-sha1",
725 .cra_priority = MTK_CRYPTO_PRIORITY,
726 .cra_flags = CRYPTO_ALG_ASYNC |
727 CRYPTO_ALG_KERN_DRIVER_ONLY,
728 .cra_blocksize = SHA1_BLOCK_SIZE,
729 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
730 .cra_init = mtk_crypto_ahash_cra_init,
731 .cra_exit = mtk_crypto_ahash_cra_exit,
732 .cra_module = THIS_MODULE,
733 },
734 },
735 },
736};
737
738static int mtk_crypto_sha256_init(struct ahash_request *areq)
739{
740 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
741 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
742
743 memset(req, 0, sizeof(*req));
744
745 ctx->alg = MTK_CRYPTO_ALG_SHA256;
746 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
747 req->state_sz = SHA256_DIGEST_SIZE;
748 req->digest_sz = SHA256_DIGEST_SIZE;
749 req->block_sz = SHA256_BLOCK_SIZE;
750
751 return 0;
752}
753
754static int mtk_crypto_sha256_digest(struct ahash_request *areq)
755{
756 int ret = mtk_crypto_sha256_init(areq);
757
758 if (ret)
759 return ret;
760
761 return mtk_crypto_ahash_finup(areq);
762}
763
764struct mtk_crypto_alg_template mtk_crypto_sha256 = {
765 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
766 .alg.ahash = {
767 .init = mtk_crypto_sha256_init,
768 .update = mtk_crypto_ahash_update,
769 .final = mtk_crypto_ahash_final,
770 .finup = mtk_crypto_ahash_finup,
771 .digest = mtk_crypto_sha256_digest,
772 .export = mtk_crypto_ahash_export,
773 .import = mtk_crypto_ahash_import,
774 .halg = {
775 .digestsize = SHA256_DIGEST_SIZE,
776 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
777 .base = {
778 .cra_name = "sha256",
779 .cra_driver_name = "crypto-eip-sha256",
780 .cra_priority = MTK_CRYPTO_PRIORITY,
781 .cra_flags = CRYPTO_ALG_ASYNC |
782 CRYPTO_ALG_KERN_DRIVER_ONLY,
783 .cra_blocksize = SHA256_BLOCK_SIZE,
784 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
785 .cra_init = mtk_crypto_ahash_cra_init,
786 .cra_exit = mtk_crypto_ahash_cra_exit,
787 .cra_module = THIS_MODULE,
788 },
789 },
790 },
791};
792
793static int mtk_crypto_sha224_init(struct ahash_request *areq)
794{
795 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
796 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
797
798 memset(req, 0, sizeof(*req));
799
800 ctx->alg = MTK_CRYPTO_ALG_SHA224;
801 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
802 req->state_sz = SHA256_DIGEST_SIZE;
803 req->digest_sz = SHA256_DIGEST_SIZE;
804 req->block_sz = SHA256_BLOCK_SIZE;
805
806 return 0;
807}
808
809static int mtk_crypto_sha224_digest(struct ahash_request *areq)
810{
811 int ret = mtk_crypto_sha224_init(areq);
812
813 if (ret)
814 return ret;
815
816 return mtk_crypto_ahash_finup(areq);
817}
818
819struct mtk_crypto_alg_template mtk_crypto_sha224 = {
820 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
821 .alg.ahash = {
822 .init = mtk_crypto_sha224_init,
823 .update = mtk_crypto_ahash_update,
824 .final = mtk_crypto_ahash_final,
825 .finup = mtk_crypto_ahash_finup,
826 .digest = mtk_crypto_sha224_digest,
827 .export = mtk_crypto_ahash_export,
828 .import = mtk_crypto_ahash_import,
829 .halg = {
830 .digestsize = SHA224_DIGEST_SIZE,
831 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
832 .base = {
833 .cra_name = "sha224",
834 .cra_driver_name = "crypto-eip-sha224",
835 .cra_priority = MTK_CRYPTO_PRIORITY,
836 .cra_flags = CRYPTO_ALG_ASYNC |
837 CRYPTO_ALG_KERN_DRIVER_ONLY,
838 .cra_blocksize = SHA224_BLOCK_SIZE,
839 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
840 .cra_init = mtk_crypto_ahash_cra_init,
841 .cra_exit = mtk_crypto_ahash_cra_exit,
842 .cra_module = THIS_MODULE,
843 },
844 },
845 },
846};
847
848static int mtk_crypto_hmac_sha224_setkey(struct crypto_ahash *tfm, const u8 *key,
849 unsigned int keylen)
850{
851 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-sha224",
852 SHA256_DIGEST_SIZE);
853}
854
855static int mtk_crypto_hmac_sha224_init(struct ahash_request *areq)
856{
857 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
858 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
859
860 memset(req, 0, sizeof(*req));
861
862 memcpy(req->state, ctx->ipad, SHA224_DIGEST_SIZE);
863
864 req->sa_pointer = ctx->ipad_sa;
865 req->token_context = ctx->ipad_token;
866 req->not_first = true;
867 req->len = SHA224_BLOCK_SIZE;
868 req->processed = SHA224_BLOCK_SIZE;
869
870 ctx->alg = MTK_CRYPTO_ALG_SHA224;
871 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
872 req->state_sz = SHA224_DIGEST_SIZE;
873 req->digest_sz = SHA224_DIGEST_SIZE;
874 req->block_sz = SHA224_BLOCK_SIZE;
875 req->hmac = true;
876
877 return 0;
878}
879
880static int mtk_crypto_hmac_sha224_digest(struct ahash_request *areq)
881{
882 int ret = mtk_crypto_hmac_sha224_init(areq);
883
884 if (ret)
885 return ret;
886 return mtk_crypto_ahash_finup(areq);
887}
888
889struct mtk_crypto_alg_template mtk_crypto_hmac_sha224 = {
890 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
891 .alg.ahash = {
892 .init = mtk_crypto_hmac_sha224_init,
893 .update = mtk_crypto_ahash_update,
894 .final = mtk_crypto_ahash_final,
895 .finup = mtk_crypto_ahash_finup,
896 .digest = mtk_crypto_hmac_sha224_digest,
897 .setkey = mtk_crypto_hmac_sha224_setkey,
898 .export = mtk_crypto_ahash_export,
899 .import = mtk_crypto_ahash_import,
900 .halg = {
901 .digestsize = SHA224_DIGEST_SIZE,
902 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
903 .base = {
904 .cra_name = "hmac(sha224)",
905 .cra_driver_name = "crypto-eip-hmac-sha224",
906 .cra_priority = MTK_CRYPTO_PRIORITY,
907 .cra_flags = CRYPTO_ALG_ASYNC |
908 CRYPTO_ALG_KERN_DRIVER_ONLY,
909 .cra_blocksize = SHA224_BLOCK_SIZE,
910 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
911 .cra_init = mtk_crypto_ahash_cra_init,
912 .cra_exit = mtk_crypto_ahash_cra_exit,
913 .cra_module = THIS_MODULE,
914 },
915 },
916 },
917};
918
919static int mtk_crypto_hmac_sha256_setkey(struct crypto_ahash *tfm, const u8 *key,
920 unsigned int keylen)
921{
922 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-sha256",
923 SHA256_DIGEST_SIZE);
924}
925
926static int mtk_crypto_hmac_sha256_init(struct ahash_request *areq)
927{
928 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
929 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
930
931 memset(req, 0, sizeof(*req));
932
933 memcpy(req->state, ctx->ipad, SHA256_DIGEST_SIZE);
934 req->sa_pointer = ctx->ipad_sa;
935 req->token_context = ctx->ipad_token;
936 req->not_first = true;
937 req->len = SHA256_BLOCK_SIZE;
938 req->processed = SHA256_BLOCK_SIZE;
939
940 ctx->alg = MTK_CRYPTO_ALG_SHA256;
941 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
942 req->state_sz = SHA256_DIGEST_SIZE;
943 req->digest_sz = SHA256_DIGEST_SIZE;
944 req->block_sz = SHA256_BLOCK_SIZE;
945 req->hmac = true;
946
947 return 0;
948}
949
950static int mtk_crypto_hmac_sha256_digest(struct ahash_request *areq)
951{
952 int ret = mtk_crypto_hmac_sha256_init(areq);
953
954 if (ret)
955 return ret;
956 return mtk_crypto_ahash_finup(areq);
957}
958
959struct mtk_crypto_alg_template mtk_crypto_hmac_sha256 = {
960 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
961 .alg.ahash = {
962 .init = mtk_crypto_hmac_sha256_init,
963 .update = mtk_crypto_ahash_update,
964 .final = mtk_crypto_ahash_final,
965 .finup = mtk_crypto_ahash_finup,
966 .digest = mtk_crypto_hmac_sha256_digest,
967 .setkey = mtk_crypto_hmac_sha256_setkey,
968 .export = mtk_crypto_ahash_export,
969 .import = mtk_crypto_ahash_import,
970 .halg = {
971 .digestsize = SHA256_DIGEST_SIZE,
972 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
973 .base = {
974 .cra_name = "hmac(sha256)",
975 .cra_driver_name = "crypto-eip-hmac-sha256",
976 .cra_priority = MTK_CRYPTO_PRIORITY,
977 .cra_flags = CRYPTO_ALG_ASYNC |
978 CRYPTO_ALG_KERN_DRIVER_ONLY,
979 .cra_blocksize = SHA256_BLOCK_SIZE,
980 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
981 .cra_init = mtk_crypto_ahash_cra_init,
982 .cra_exit = mtk_crypto_ahash_cra_exit,
983 .cra_module = THIS_MODULE,
984 },
985 },
986 },
987};
988
989static int mtk_crypto_sha512_init(struct ahash_request *areq)
990{
991 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
992 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
993
994 memset(req, 0, sizeof(*req));
995
996 ctx->alg = MTK_CRYPTO_ALG_SHA512;
997 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
998 req->state_sz = SHA512_DIGEST_SIZE;
999 req->digest_sz = SHA512_DIGEST_SIZE;
1000 req->block_sz = SHA512_BLOCK_SIZE;
1001
1002 return 0;
1003}
1004
1005static int mtk_crypto_sha512_digest(struct ahash_request *areq)
1006{
1007 int ret = mtk_crypto_sha512_init(areq);
1008
1009 if (ret)
1010 return ret;
1011 return mtk_crypto_ahash_finup(areq);
1012}
1013
1014struct mtk_crypto_alg_template mtk_crypto_sha512 = {
1015 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1016 .alg.ahash = {
1017 .init = mtk_crypto_sha512_init,
1018 .update = mtk_crypto_ahash_update,
1019 .final = mtk_crypto_ahash_final,
1020 .finup = mtk_crypto_ahash_finup,
1021 .digest = mtk_crypto_sha512_digest,
1022 .export = mtk_crypto_ahash_export,
1023 .import = mtk_crypto_ahash_import,
1024 .halg = {
1025 .digestsize = SHA512_DIGEST_SIZE,
1026 .statesize = sizeof(struct mtk_crypto_ahash_ctx),
1027 .base = {
1028 .cra_name = "sha512",
1029 .cra_driver_name = "crypto-eip-sha512",
1030 .cra_priority = MTK_CRYPTO_PRIORITY,
1031 .cra_flags = CRYPTO_ALG_ASYNC |
1032 CRYPTO_ALG_KERN_DRIVER_ONLY,
1033 .cra_blocksize = SHA512_BLOCK_SIZE,
1034 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1035 .cra_init = mtk_crypto_ahash_cra_init,
1036 .cra_exit = mtk_crypto_ahash_cra_exit,
1037 .cra_module = THIS_MODULE,
1038 },
1039 },
1040 },
1041};
1042
1043static int mtk_crypto_sha384_init(struct ahash_request *areq)
1044{
1045 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1046 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1047
1048 memset(req, 0, sizeof(*req));
1049
1050 ctx->alg = MTK_CRYPTO_ALG_SHA384;
1051 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
1052 req->state_sz = SHA512_DIGEST_SIZE;
1053 req->digest_sz = SHA512_DIGEST_SIZE;
1054 req->block_sz = SHA384_BLOCK_SIZE;
1055
1056 return 0;
1057}
1058
1059static int mtk_crypto_sha384_digest(struct ahash_request *areq)
1060{
1061 int ret = mtk_crypto_sha384_init(areq);
1062
1063 if (ret)
1064 return ret;
1065
1066 return mtk_crypto_ahash_finup(areq);
1067}
1068
1069struct mtk_crypto_alg_template mtk_crypto_sha384 = {
1070 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1071 .alg.ahash = {
1072 .init = mtk_crypto_sha384_init,
1073 .update = mtk_crypto_ahash_update,
1074 .final = mtk_crypto_ahash_final,
1075 .finup = mtk_crypto_ahash_finup,
1076 .digest = mtk_crypto_sha384_digest,
1077 .export = mtk_crypto_ahash_export,
1078 .import = mtk_crypto_ahash_import,
1079 .halg = {
1080 .digestsize = SHA384_DIGEST_SIZE,
1081 .statesize = sizeof(struct mtk_crypto_ahash_ctx),
1082 .base = {
1083 .cra_name = "sha384",
1084 .cra_driver_name = "crypto-eip-sha384",
1085 .cra_priority = MTK_CRYPTO_PRIORITY,
1086 .cra_flags = CRYPTO_ALG_ASYNC |
1087 CRYPTO_ALG_KERN_DRIVER_ONLY,
1088 .cra_blocksize = SHA384_BLOCK_SIZE,
1089 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1090 .cra_init = mtk_crypto_ahash_cra_init,
1091 .cra_exit = mtk_crypto_ahash_cra_exit,
1092 .cra_module = THIS_MODULE,
1093 },
1094 },
1095 },
1096};
1097
1098static int mtk_crypto_hmac_sha512_setkey(struct crypto_ahash *tfm, const u8 *key,
1099 unsigned int keylen)
1100{
1101 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-sha512",
1102 SHA512_DIGEST_SIZE);
1103}
1104
1105static int mtk_crypto_hmac_sha512_init(struct ahash_request *areq)
1106{
1107 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1108 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1109
1110 memset(req, 0, sizeof(*req));
1111
1112 memcpy(req->state, ctx->ipad, SHA512_DIGEST_SIZE);
1113 req->sa_pointer = ctx->ipad_sa;
1114 req->token_context = ctx->ipad_token;
1115 req->not_first = true;
1116 req->len = SHA512_BLOCK_SIZE;
1117 req->processed = SHA512_BLOCK_SIZE;
1118
1119 ctx->alg = MTK_CRYPTO_ALG_SHA512;
1120 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
1121 req->state_sz = SHA512_DIGEST_SIZE;
1122 req->digest_sz = SHA512_DIGEST_SIZE;
1123 req->block_sz = SHA512_BLOCK_SIZE;
1124 req->hmac = true;
1125
1126 return 0;
1127}
1128
1129static int mtk_crypto_hmac_sha512_digest(struct ahash_request *areq)
1130{
1131 int ret = mtk_crypto_hmac_sha512_init(areq);
1132
1133 if (ret)
1134 return ret;
1135
1136 return mtk_crypto_ahash_finup(areq);
1137}
1138
1139struct mtk_crypto_alg_template mtk_crypto_hmac_sha512 = {
1140 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1141 .alg.ahash = {
1142 .init = mtk_crypto_hmac_sha512_init,
1143 .update = mtk_crypto_ahash_update,
1144 .final = mtk_crypto_ahash_final,
1145 .finup = mtk_crypto_ahash_finup,
1146 .digest = mtk_crypto_hmac_sha512_digest,
1147 .setkey = mtk_crypto_hmac_sha512_setkey,
1148 .export = mtk_crypto_ahash_export,
1149 .import = mtk_crypto_ahash_import,
1150 .halg = {
1151 .digestsize = SHA512_DIGEST_SIZE,
1152 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1153 .base = {
1154 .cra_name = "hmac(sha512)",
1155 .cra_driver_name = "crypto-eip-hmac-sha512",
1156 .cra_priority = MTK_CRYPTO_PRIORITY,
1157 .cra_flags = CRYPTO_ALG_ASYNC |
1158 CRYPTO_ALG_KERN_DRIVER_ONLY,
1159 .cra_blocksize = SHA512_BLOCK_SIZE,
1160 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1161 .cra_init = mtk_crypto_ahash_cra_init,
1162 .cra_exit = mtk_crypto_ahash_cra_exit,
1163 .cra_module = THIS_MODULE,
1164 },
1165 },
1166 },
1167};
1168
1169static int mtk_crypto_hmac_sha384_setkey(struct crypto_ahash *tfm, const u8 *key,
1170 unsigned int keylen)
1171{
1172 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-sha384",
1173 SHA512_DIGEST_SIZE);
1174}
1175
1176static int mtk_crypto_hmac_sha384_init(struct ahash_request *areq)
1177{
1178 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1179 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1180
1181 memset(req, 0, sizeof(*req));
1182
1183 memcpy(req->state, ctx->ipad, SHA384_DIGEST_SIZE);
1184 req->sa_pointer = ctx->ipad_sa;
1185 req->token_context = ctx->ipad_token;
1186 req->not_first = true;
1187 req->len = SHA384_BLOCK_SIZE;
1188 req->processed = SHA384_BLOCK_SIZE;
1189
1190 ctx->alg = MTK_CRYPTO_ALG_SHA384;
1191 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
1192 req->state_sz = SHA384_DIGEST_SIZE;
1193 req->digest_sz = SHA384_DIGEST_SIZE;
1194 req->block_sz = SHA384_BLOCK_SIZE;
1195 req->hmac = true;
1196
1197 return 0;
1198}
1199
1200static int mtk_crypto_hmac_sha384_digest(struct ahash_request *areq)
1201{
1202 int ret = mtk_crypto_hmac_sha384_init(areq);
1203
1204 if (ret)
1205 return ret;
1206
1207 return mtk_crypto_ahash_finup(areq);
1208}
1209
1210struct mtk_crypto_alg_template mtk_crypto_hmac_sha384 = {
1211 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1212 .alg.ahash = {
1213 .init = mtk_crypto_hmac_sha384_init,
1214 .update = mtk_crypto_ahash_update,
1215 .final = mtk_crypto_ahash_final,
1216 .finup = mtk_crypto_ahash_finup,
1217 .digest = mtk_crypto_hmac_sha384_digest,
1218 .setkey = mtk_crypto_hmac_sha384_setkey,
1219 .export = mtk_crypto_ahash_export,
1220 .import = mtk_crypto_ahash_import,
1221 .halg = {
1222 .digestsize = SHA384_DIGEST_SIZE,
1223 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1224 .base = {
1225 .cra_name = "hmac(sha384)",
1226 .cra_driver_name = "crypto-eip-hmac-sha384",
1227 .cra_priority = MTK_CRYPTO_PRIORITY,
1228 .cra_flags = CRYPTO_ALG_ASYNC |
1229 CRYPTO_ALG_KERN_DRIVER_ONLY,
1230 .cra_blocksize = SHA384_BLOCK_SIZE,
1231 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1232 .cra_init = mtk_crypto_ahash_cra_init,
1233 .cra_exit = mtk_crypto_ahash_cra_exit,
1234 .cra_module = THIS_MODULE,
1235 },
1236 },
1237 },
1238};
1239
1240static int mtk_crypto_md5_init(struct ahash_request *areq)
1241{
1242 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1243 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1244
1245 memset(req, 0, sizeof(*req));
1246
1247 ctx->alg = MTK_CRYPTO_ALG_MD5;
1248 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
1249 req->state_sz = MD5_DIGEST_SIZE;
1250 req->digest_sz = MD5_DIGEST_SIZE;
1251 req->block_sz = MD5_HMAC_BLOCK_SIZE;
1252
1253 return 0;
1254}
1255
1256static int mtk_crypto_md5_digest(struct ahash_request *areq)
1257{
1258 int ret = mtk_crypto_md5_init(areq);
1259
1260 if (ret)
1261 return ret;
1262
1263 return mtk_crypto_ahash_finup(areq);
1264}
1265
1266struct mtk_crypto_alg_template mtk_crypto_md5 = {
1267 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1268 .alg.ahash = {
1269 .init = mtk_crypto_md5_init,
1270 .update = mtk_crypto_ahash_update,
1271 .final = mtk_crypto_ahash_final,
1272 .finup = mtk_crypto_ahash_finup,
1273 .digest = mtk_crypto_md5_digest,
1274 .export = mtk_crypto_ahash_export,
1275 .import = mtk_crypto_ahash_import,
1276 .halg = {
1277 .digestsize = MD5_DIGEST_SIZE,
1278 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1279 .base = {
1280 .cra_name = "md5",
1281 .cra_driver_name = "crypto-eip-md5",
1282 .cra_priority = MTK_CRYPTO_PRIORITY,
1283 .cra_flags = CRYPTO_ALG_ASYNC |
1284 CRYPTO_ALG_KERN_DRIVER_ONLY,
1285 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
1286 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1287 .cra_init = mtk_crypto_ahash_cra_init,
1288 .cra_exit = mtk_crypto_ahash_cra_exit,
1289 .cra_module = THIS_MODULE,
1290 },
1291 },
1292 },
1293};
1294
1295static int mtk_crypto_hmac_md5_init(struct ahash_request *areq)
1296{
1297 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1298 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1299
1300 memset(req, 0, sizeof(*req));
1301
1302 memcpy(req->state, ctx->ipad, MD5_DIGEST_SIZE);
1303 req->sa_pointer = ctx->ipad_sa;
1304 req->token_context = ctx->ipad_token;
1305 req->not_first = true;
1306 req->len = MD5_HMAC_BLOCK_SIZE;
1307 req->processed = MD5_HMAC_BLOCK_SIZE;
1308
1309 ctx->alg = MTK_CRYPTO_ALG_MD5;
1310 req->digest = MTK_CRYPTO_DIGEST_PRECOMPUTED;
1311 req->state_sz = MD5_DIGEST_SIZE;
1312 req->digest_sz = MD5_DIGEST_SIZE;
1313 req->block_sz = MD5_HMAC_BLOCK_SIZE;
1314 req->hmac = true;
1315
1316 return 0;
1317}
1318
1319static int mtk_crypto_hmac_md5_setkey(struct crypto_ahash *tfm, const u8 *key,
1320 unsigned int keylen)
1321{
1322 return mtk_crypto_hmac_alg_setkey(tfm, key, keylen, "crypto-eip-md5",
1323 MD5_DIGEST_SIZE);
1324}
1325
1326static int mtk_crypto_hmac_md5_digest(struct ahash_request *areq)
1327{
1328 int ret = mtk_crypto_hmac_md5_init(areq);
1329
1330 if (ret)
1331 return ret;
1332
1333 return mtk_crypto_ahash_finup(areq);
1334}
1335
1336struct mtk_crypto_alg_template mtk_crypto_hmac_md5 = {
1337 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1338 .alg.ahash = {
1339 .init = mtk_crypto_hmac_md5_init,
1340 .update = mtk_crypto_ahash_update,
1341 .final = mtk_crypto_ahash_final,
1342 .finup = mtk_crypto_ahash_finup,
1343 .digest = mtk_crypto_hmac_md5_digest,
1344 .setkey = mtk_crypto_hmac_md5_setkey,
1345 .export = mtk_crypto_ahash_export,
1346 .import = mtk_crypto_ahash_import,
1347 .halg = {
1348 .digestsize = MD5_DIGEST_SIZE,
1349 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1350 .base = {
1351 .cra_name = "hmac(md5)",
1352 .cra_driver_name = "crypto-eip-hmac-md5",
1353 .cra_priority = MTK_CRYPTO_PRIORITY,
1354 .cra_flags = CRYPTO_ALG_ASYNC |
1355 CRYPTO_ALG_KERN_DRIVER_ONLY,
1356 .cra_blocksize = MD5_HMAC_BLOCK_SIZE,
1357 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1358 .cra_init = mtk_crypto_ahash_cra_init,
1359 .cra_exit = mtk_crypto_ahash_cra_exit,
1360 .cra_module = THIS_MODULE,
1361 },
1362 },
1363 },
1364};
1365
1366static int mtk_crypto_cbcmac_init(struct ahash_request *areq)
1367{
1368 struct mtk_crypto_ahash_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(areq));
1369 struct mtk_crypto_ahash_req *req = ahash_request_ctx(areq);
1370
1371 memset(req, 0, sizeof(*req));
1372 memset(req->state, 0, sizeof(u32) * (SHA512_DIGEST_SIZE / sizeof(u32)));
1373
1374 req->len = AES_BLOCK_SIZE;
1375 req->processed = AES_BLOCK_SIZE;
1376
1377 req->digest = MTK_CRYPTO_DIGEST_XCM;
1378 req->state_sz = ctx->key_sz;
1379 req->digest_sz = AES_BLOCK_SIZE;
1380 req->block_sz = AES_BLOCK_SIZE;
1381 req->xcbcmac = true;
1382
1383 return 0;
1384}
1385
1386static int mtk_crypto_cbcmac_digest(struct ahash_request *areq)
1387{
1388 return mtk_crypto_cbcmac_init(areq) ?: mtk_crypto_ahash_finup(areq);
1389}
1390
1391static int mtk_crypto_xcbcmac_setkey(struct crypto_ahash *tfm, const u8 *key,
1392 unsigned int len)
1393{
1394 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
1395 struct crypto_aes_ctx aes;
1396 u32 key_tmp[3 * AES_BLOCK_SIZE / sizeof(u32)];
1397 int ret, i;
1398
1399 ret = aes_expandkey(&aes, key, len);
1400 if (ret)
1401 return ret;
1402
1403 crypto_cipher_clear_flags(ctx->kaes, CRYPTO_TFM_REQ_MASK);
1404 crypto_cipher_set_flags(ctx->kaes, crypto_ahash_get_flags(tfm) & CRYPTO_TFM_REQ_MASK);
1405
1406 ret = crypto_cipher_setkey(ctx->kaes, key, len);
1407 if (ret)
1408 return ret;
1409
1410 crypto_cipher_encrypt_one(ctx->kaes, (u8 *)key_tmp + 2 * AES_BLOCK_SIZE,
1411 "\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1");
1412 crypto_cipher_encrypt_one(ctx->kaes, (u8 *)key_tmp,
1413 "\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2\x2");
1414 crypto_cipher_encrypt_one(ctx->kaes, (u8 *)key_tmp + AES_BLOCK_SIZE,
1415 "\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3");
1416
1417 for (i = 0; i < 3 * AES_BLOCK_SIZE / sizeof(u32); i++)
1418 ctx->ipad[i] =
1419 (__force u32)cpu_to_be32(key_tmp[i]);
1420
1421 crypto_cipher_clear_flags(ctx->kaes, CRYPTO_TFM_REQ_MASK);
1422 crypto_cipher_set_flags(ctx->kaes, crypto_ahash_get_flags(tfm) &
1423 CRYPTO_TFM_REQ_MASK);
1424 ret = crypto_cipher_setkey(ctx->kaes, (u8 *)key_tmp + 2 * AES_BLOCK_SIZE,
1425 AES_MIN_KEY_SIZE);
1426
1427 if (ret)
1428 return ret;
1429
1430 ctx->alg = MTK_CRYPTO_ALG_XCBC;
1431 ctx->key_sz = AES_MIN_KEY_SIZE + 2 * AES_BLOCK_SIZE;
1432 ctx->cbcmac = false;
1433
1434 memzero_explicit(&aes, sizeof(aes));
1435 return 0;
1436}
1437
1438static int mtk_crypto_xcbcmac_cra_init(struct crypto_tfm *tfm)
1439{
1440 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
1441
1442 mtk_crypto_ahash_cra_init(tfm);
1443 ctx->kaes = crypto_alloc_cipher("aes", 0, 0);
1444 return PTR_ERR_OR_ZERO(ctx->kaes);
1445}
1446
1447static void mtk_crypto_xcbcmac_cra_exit(struct crypto_tfm *tfm)
1448{
1449 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(tfm);
1450
1451 crypto_free_cipher(ctx->kaes);
1452 mtk_crypto_ahash_cra_exit(tfm);
1453}
1454
1455struct mtk_crypto_alg_template mtk_crypto_xcbcmac = {
1456 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1457 .alg.ahash = {
1458 .init = mtk_crypto_cbcmac_init,
1459 .update = mtk_crypto_ahash_update,
1460 .final = mtk_crypto_ahash_final,
1461 .finup = mtk_crypto_ahash_finup,
1462 .digest = mtk_crypto_cbcmac_digest,
1463 .setkey = mtk_crypto_xcbcmac_setkey,
1464 .export = mtk_crypto_ahash_export,
1465 .import = mtk_crypto_ahash_import,
1466 .halg = {
1467 .digestsize = AES_BLOCK_SIZE,
1468 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1469 .base = {
1470 .cra_name = "xcbc(aes)",
1471 .cra_driver_name = "crypto-eip-xcbc-aes",
1472 .cra_priority = MTK_CRYPTO_PRIORITY,
1473 .cra_flags = CRYPTO_ALG_ASYNC |
1474 CRYPTO_ALG_KERN_DRIVER_ONLY,
1475 .cra_blocksize = AES_BLOCK_SIZE,
1476 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1477 .cra_init = mtk_crypto_xcbcmac_cra_init,
1478 .cra_exit = mtk_crypto_xcbcmac_cra_exit,
1479 .cra_module = THIS_MODULE,
1480 },
1481 },
1482 },
1483};
1484
1485static int mtk_crypto_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
1486 unsigned int len)
1487{
1488 struct mtk_crypto_ahash_ctx *ctx = crypto_tfm_ctx(crypto_ahash_tfm(tfm));
1489 struct crypto_aes_ctx aes;
1490 __be64 consts[4];
1491 u64 _const[2];
1492 u8 msb_mask, gfmask;
1493 int ret, i;
1494
1495 ret = aes_expandkey(&aes, key, len);
1496 if (ret)
1497 return ret;
1498
1499 crypto_cipher_clear_flags(ctx->kaes, CRYPTO_TFM_REQ_MASK);
1500 crypto_cipher_set_flags(ctx->kaes, crypto_ahash_get_flags(tfm) &
1501 CRYPTO_TFM_REQ_MASK);
1502 ret = crypto_cipher_setkey(ctx->kaes, key, len);
1503 if (ret)
1504 return ret;
1505
1506 /* code below borrowed from crypto/cmac.c */
1507 /* encrypt the zero block */
1508 memset(consts, 0, AES_BLOCK_SIZE);
1509 crypto_cipher_encrypt_one(ctx->kaes, (u8 *) consts, (u8 *) consts);
1510
1511 gfmask = 0x87;
1512 _const[0] = be64_to_cpu(consts[1]);
1513 _const[1] = be64_to_cpu(consts[0]);
1514
1515 /* gf(2^128) multiply zero-ciphertext with u and u^2 */
1516 for (i = 0; i < 4; i += 2) {
1517 msb_mask = ((s64)_const[1] >> 63) & gfmask;
1518 _const[1] = (_const[1] << 1) | (_const[0] >> 63);
1519 _const[0] = (_const[0] << 1) ^ msb_mask;
1520
1521 consts[i + 0] = cpu_to_be64(_const[1]);
1522 consts[i + 1] = cpu_to_be64(_const[0]);
1523 }
1524 /* end of code borrowed from crypto/cmac.c */
1525
1526 for (i = 0; i < 2 * AES_BLOCK_SIZE / sizeof(u32); i++)
1527 ctx->ipad[i] = (__force __le32)cpu_to_be32(((u32 *) consts)[i]);
1528 memcpy((uint8_t *) ctx->ipad + 2 * AES_BLOCK_SIZE, key, len);
1529
1530 if (len == AES_KEYSIZE_192) {
1531 ctx->alg = MTK_CRYPTO_ALG_CMAC_192;
1532 ctx->key_sz = 24 + 2 * AES_BLOCK_SIZE;
1533 } else if (len == AES_KEYSIZE_256) {
1534 ctx->alg = MTK_CRYPTO_ALG_CMAC_256;
1535 ctx->key_sz = AES_MAX_KEY_SIZE + 2 * AES_BLOCK_SIZE;
1536 } else {
1537 ctx->alg = MTK_CRYPTO_ALG_CMAC_128;
1538 ctx->key_sz = AES_MIN_KEY_SIZE + 2 * AES_BLOCK_SIZE;
1539 }
1540 ctx->cbcmac = false;
1541
1542 memzero_explicit(&aes, sizeof(aes));
1543 return 0;
1544}
1545
1546struct mtk_crypto_alg_template mtk_crypto_cmac = {
1547 .type = MTK_CRYPTO_ALG_TYPE_AHASH,
1548 .alg.ahash = {
1549 .init = mtk_crypto_cbcmac_init,
1550 .update = mtk_crypto_ahash_update,
1551 .final = mtk_crypto_ahash_final,
1552 .finup = mtk_crypto_ahash_finup,
1553 .digest = mtk_crypto_cbcmac_digest,
1554 .setkey = mtk_crypto_cmac_setkey,
1555 .export = mtk_crypto_ahash_export,
1556 .import = mtk_crypto_ahash_import,
1557 .halg = {
1558 .digestsize = AES_BLOCK_SIZE,
1559 .statesize = sizeof(struct mtk_crypto_ahash_export_state),
1560 .base = {
1561 .cra_name = "cmac(aes)",
1562 .cra_driver_name = "crypto-eip-cmac-aes",
1563 .cra_priority = MTK_CRYPTO_PRIORITY,
1564 .cra_flags = CRYPTO_ALG_ASYNC |
1565 CRYPTO_ALG_KERN_DRIVER_ONLY,
1566 .cra_blocksize = AES_BLOCK_SIZE,
1567 .cra_ctxsize = sizeof(struct mtk_crypto_ahash_ctx),
1568 .cra_init = mtk_crypto_xcbcmac_cra_init,
1569 .cra_exit = mtk_crypto_xcbcmac_cra_exit,
1570 .cra_module = THIS_MODULE,
1571 },
1572 },
1573 },
1574};
1575