blob: df46d47d03219198ea6ca15e709104b584c8973a [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/authenc.h>
12#include <crypto/gcm.h>
13#include <crypto/ghash.h>
14#include <crypto/ctr.h>
15#include <crypto/xts.h>
16#include <crypto/internal/des.h>
17#include <crypto/skcipher.h>
18#include <crypto/internal/skcipher.h>
19#include <crypto/aead.h>
20#include <crypto/internal/aead.h>
21
22#include "crypto-eip/crypto-eip.h"
23#include "crypto-eip/ddk-wrapper.h"
24#include "crypto-eip/lookaside.h"
25#include "crypto-eip/internal.h"
26
27static int mtk_crypto_skcipher_send(struct crypto_async_request *async)
28{
29 struct skcipher_request *req = skcipher_request_cast(async);
30 struct mtk_crypto_cipher_req *mtk_req = skcipher_request_ctx(req);
31 struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
32 int ret = 0;
33
34 ret = crypto_basic_cipher(async, mtk_req, req->src, req->dst, req->cryptlen,
35 0, 0, req->iv, skcipher->ivsize);
36
37 if (ret != 0)
38 async->complete(async, ret);
39
40 return ret;
41}
42
43static int mtk_crypto_skcipher_handle_result(struct mtk_crypto_result *res, int err)
44{
45 struct crypto_async_request *async = res->async;
46 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(async->tfm);
47 struct skcipher_request *req = skcipher_request_cast(async);
48 struct mtk_crypto_cipher_req *mtk_req = skcipher_request_ctx(req);
49 struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
50
51 if (ctx->mode == MTK_CRYPTO_MODE_CBC && mtk_req->direction == MTK_CRYPTO_ENCRYPT)
52 sg_pcopy_to_buffer(req->dst, mtk_req->nr_dst, req->iv, skcipher->ivsize,
53 req->cryptlen - skcipher->ivsize);
54
55 if (req->src == req->dst) {
56 dma_unmap_sg(crypto_dev, req->src, mtk_req->nr_src, DMA_BIDIRECTIONAL);
57 } else {
58 dma_unmap_sg(crypto_dev, req->src, mtk_req->nr_src, DMA_TO_DEVICE);
59 dma_unmap_sg(crypto_dev, req->dst, mtk_req->nr_dst, DMA_FROM_DEVICE);
60 }
61
62 async->complete(async, err);
63
64 crypto_free_sglist(res->eip.pkt_handle);
65 crypto_free_sglist(res->dst);
66 crypto_free_sa(res->eip.sa);
67 crypto_free_token(res->eip.token);
68 kfree(res->eip.token_context);
69
70 return 0;
71}
72
73static int mtk_crypto_aead_send(struct crypto_async_request *async)
74{
75 struct aead_request *req = aead_request_cast(async);
76 struct crypto_aead *tfm = crypto_aead_reqtfm(req);
77 struct mtk_crypto_cipher_req *mtk_req = aead_request_ctx(req);
78 int ret;
79
80 ret = crypto_aead_cipher(async, mtk_req, req->src, req->dst, req->cryptlen,
81 req->assoclen, crypto_aead_authsize(tfm), req->iv,
82 crypto_aead_ivsize(tfm));
83
84 if (ret != 0)
85 async->complete(async, ret);
86
87 return ret;
88}
89
90static int mtk_crypto_aead_handle_result(struct mtk_crypto_result *res, int err)
91{
92 struct crypto_async_request *async = res->async;
93 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(async->tfm);
94 struct aead_request *req = aead_request_cast(async);
95 struct mtk_crypto_cipher_req *mtk_req = aead_request_ctx(req);
96 struct crypto_aead *aead = crypto_aead_reqtfm(req);
97 int pkt_size;
98 uint8_t *temp;
99
100 if (ctx->mode == MTK_CRYPTO_MODE_CCM && mtk_req->direction == MTK_CRYPTO_DECRYPT) {
developerd66221d2024-04-01 19:03:52 +0800101 pkt_size = req->cryptlen + req->assoclen - crypto_aead_authsize(aead);
developer2df22aa2024-03-22 14:36:06 +0800102
103 temp = kmalloc(pkt_size, GFP_KERNEL);
developerd66221d2024-04-01 19:03:52 +0800104 if (!temp) {
105 CRYPTO_ERR("no enough memory for result\n");
106 goto free_dma;
107 }
developer2df22aa2024-03-22 14:36:06 +0800108 memset(temp, 0, pkt_size);
109 sg_copy_to_buffer(req->dst, mtk_req->nr_dst, temp + 8, pkt_size - 8);
110 sg_copy_from_buffer(req->dst, mtk_req->nr_dst, temp, pkt_size);
111 kfree(temp);
112 }
113
developerd66221d2024-04-01 19:03:52 +0800114free_dma:
developer2df22aa2024-03-22 14:36:06 +0800115 if (req->src == req->dst) {
116 dma_unmap_sg(crypto_dev, req->src, mtk_req->nr_src, DMA_BIDIRECTIONAL);
117 } else {
118 dma_unmap_sg(crypto_dev, req->src, mtk_req->nr_src, DMA_TO_DEVICE);
119 dma_unmap_sg(crypto_dev, req->dst, mtk_req->nr_dst, DMA_FROM_DEVICE);
120 }
121
122 crypto_free_sglist(res->eip.pkt_handle);
123 crypto_free_sglist(res->dst);
124 crypto_free_sa(res->eip.sa);
125 crypto_free_token(res->eip.token);
126 kfree(res->eip.token_context);
127
128 async->complete(async, err);
129 return 0;
130}
131
132static int mtk_crypto_skcipher_cra_init(struct crypto_tfm *tfm)
133{
134 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
135 struct mtk_crypto_alg_template *tmpl =
136 container_of(tfm->__crt_alg, struct mtk_crypto_alg_template,
137 alg.skcipher.base);
138
139 crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm),
140 sizeof(struct mtk_crypto_cipher_req));
141 ctx->priv = tmpl->priv;
142
143 ctx->base.send = mtk_crypto_skcipher_send;
144 ctx->base.handle_result = mtk_crypto_skcipher_handle_result;
145 return 0;
146}
147
148static int mtk_crypto_skcipher_aes_cbc_cra_init(struct crypto_tfm *tfm)
149{
150 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
151
152 mtk_crypto_skcipher_cra_init(tfm);
153 ctx->alg = MTK_CRYPTO_AES;
154 ctx->blocksz = AES_BLOCK_SIZE;
155 ctx->mode = MTK_CRYPTO_MODE_CBC;
156 return 0;
157}
158
159static int mtk_crypto_skcipher_aes_ecb_cra_init(struct crypto_tfm *tfm)
160{
161 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
162
163 mtk_crypto_skcipher_cra_init(tfm);
164 ctx->alg = MTK_CRYPTO_AES;
165 ctx->mode = MTK_CRYPTO_MODE_ECB;
166 ctx->blocksz = 0;
167 return 0;
168}
169
170static int mtk_crypto_queue_req(struct crypto_async_request *base,
171 struct mtk_crypto_cipher_req *mtk_req,
172 enum mtk_crypto_cipher_direction dir)
173{
174 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
175 struct mtk_crypto_priv *priv = ctx->priv;
176 int ret;
177
178 mtk_req->direction = dir;
179
180 spin_lock_bh(&priv->mtk_eip_queue.queue_lock);
181 ret = crypto_enqueue_request(&priv->mtk_eip_queue.queue, base);
182 spin_unlock_bh(&priv->mtk_eip_queue.queue_lock);
183
184 queue_work(priv->mtk_eip_queue.workqueue,
185 &priv->mtk_eip_queue.work_data.work);
186
187 return ret;
188}
189
190static int mtk_crypto_decrypt(struct skcipher_request *req)
191{
192 return mtk_crypto_queue_req(&req->base, skcipher_request_ctx(req), MTK_CRYPTO_DECRYPT);
193}
194
195static int mtk_crypto_encrypt(struct skcipher_request *req)
196{
197 return mtk_crypto_queue_req(&req->base, skcipher_request_ctx(req), MTK_CRYPTO_ENCRYPT);
198}
199
200static int mtk_crypto_skcipher_aes_setkey(struct crypto_skcipher *ctfm,
201 const u8 *key, unsigned int len)
202{
203 struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
204 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
205 struct crypto_aes_ctx aes;
206 int ret;
207 int i;
208
209 ret = aes_expandkey(&aes, key, len);
210 if (ret)
211 return ret;
212
213 for (i = 0; i < len / sizeof(u32); i++)
214 ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
215
216 ctx->key_len = len;
217
218 memzero_explicit(&aes, sizeof(aes));
219 return 0;
220}
221
222static void mtk_crypto_skcipher_cra_exit(struct crypto_tfm *tfm)
223{
224 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
225
226 memzero_explicit(ctx->key, sizeof(ctx->key));
227}
228
229
230struct mtk_crypto_alg_template mtk_crypto_cbc_aes = {
231 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
232 .alg.skcipher = {
233 .setkey = mtk_crypto_skcipher_aes_setkey,
234 .encrypt = mtk_crypto_encrypt,
235 .decrypt = mtk_crypto_decrypt,
236 .min_keysize = AES_MIN_KEY_SIZE,
237 .max_keysize = AES_MAX_KEY_SIZE,
238 .ivsize = AES_BLOCK_SIZE,
239 .base = {
240 .cra_name = "cbc(aes)",
241 .cra_driver_name = "crypto-eip-cbc-aes",
242 .cra_priority = MTK_CRYPTO_PRIORITY,
243 .cra_flags = CRYPTO_ALG_ASYNC |
244 CRYPTO_ALG_KERN_DRIVER_ONLY,
245 .cra_blocksize = AES_BLOCK_SIZE,
246 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
247 .cra_init = mtk_crypto_skcipher_aes_cbc_cra_init,
248 .cra_exit = mtk_crypto_skcipher_cra_exit,
249 .cra_module = THIS_MODULE,
250 },
251 },
252};
253
254static int mtk_crypto_skcipher_aes_cfb_cra_init(struct crypto_tfm *tfm)
255{
256 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
257
258 mtk_crypto_skcipher_cra_init(tfm);
259 ctx->alg = MTK_CRYPTO_AES;
260 ctx->blocksz = AES_BLOCK_SIZE;
261 ctx->mode = MTK_CRYPTO_MODE_CFB;
262 return 0;
263}
264
265struct mtk_crypto_alg_template mtk_crypto_cfb_aes = {
266 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
267 .alg.skcipher = {
268 .setkey = mtk_crypto_skcipher_aes_setkey,
269 .encrypt = mtk_crypto_encrypt,
270 .decrypt = mtk_crypto_decrypt,
271 .min_keysize = AES_MIN_KEY_SIZE,
272 .max_keysize = AES_MAX_KEY_SIZE,
273 .ivsize = AES_BLOCK_SIZE,
274 .base = {
275 .cra_name = "cfb(aes)",
276 .cra_driver_name = "crypto-eip-cfb-aes",
277 .cra_priority = MTK_CRYPTO_PRIORITY,
278 .cra_flags = CRYPTO_ALG_ASYNC |
279 CRYPTO_ALG_KERN_DRIVER_ONLY,
280 .cra_blocksize = 1,
281 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
282 .cra_alignmask = 0,
283 .cra_init = mtk_crypto_skcipher_aes_cfb_cra_init,
284 .cra_exit = mtk_crypto_skcipher_cra_exit,
285 .cra_module = THIS_MODULE,
286 },
287 },
288};
289
290static int mtk_crypto_skcipher_aes_ofb_cra_init(struct crypto_tfm *tfm)
291{
292 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
293
294 mtk_crypto_skcipher_cra_init(tfm);
295 ctx->alg = MTK_CRYPTO_AES;
296 ctx->blocksz = AES_BLOCK_SIZE;
297 ctx->mode = MTK_CRYPTO_MODE_OFB;
298 return 0;
299}
300
301struct mtk_crypto_alg_template mtk_crypto_ofb_aes = {
302 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
303 .alg.skcipher = {
304 .setkey = mtk_crypto_skcipher_aes_setkey,
305 .encrypt = mtk_crypto_encrypt,
306 .decrypt = mtk_crypto_decrypt,
307 .min_keysize = AES_MIN_KEY_SIZE,
308 .max_keysize = AES_MAX_KEY_SIZE,
309 .ivsize = AES_BLOCK_SIZE,
310 .base = {
311 .cra_name = "ofb(aes)",
312 .cra_driver_name = "crypto-eip-ofb-aes",
313 .cra_priority = MTK_CRYPTO_PRIORITY,
314 .cra_flags = CRYPTO_ALG_ASYNC |
315 CRYPTO_ALG_KERN_DRIVER_ONLY,
316 .cra_blocksize = 1,
317 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
318 .cra_alignmask = 0,
319 .cra_init = mtk_crypto_skcipher_aes_ofb_cra_init,
320 .cra_exit = mtk_crypto_skcipher_cra_exit,
321 .cra_module = THIS_MODULE,
322 },
323 },
324};
325
326struct mtk_crypto_alg_template mtk_crypto_ecb_aes = {
327 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
328 .alg.skcipher = {
329 .setkey = mtk_crypto_skcipher_aes_setkey,
330 .encrypt = mtk_crypto_encrypt,
331 .decrypt = mtk_crypto_decrypt,
332 .min_keysize = AES_MIN_KEY_SIZE,
333 .max_keysize = AES_MAX_KEY_SIZE,
334 .base = {
335 .cra_name = "ecb(aes)",
336 .cra_driver_name = "crypto-eip-ecb-aes",
337 .cra_priority = MTK_CRYPTO_PRIORITY,
338 .cra_flags = CRYPTO_ALG_ASYNC |
339 CRYPTO_ALG_KERN_DRIVER_ONLY,
340 .cra_blocksize = AES_BLOCK_SIZE,
341 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
342 .cra_init = mtk_crypto_skcipher_aes_ecb_cra_init,
343 .cra_exit = mtk_crypto_skcipher_cra_exit,
344 .cra_module = THIS_MODULE,
345 },
346 },
347};
348
349static int mtk_crypto_skcipher_aesctr_setkey(struct crypto_skcipher *ctfm,
350 const u8 *key, unsigned int len)
351{
352 struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
353 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
354 struct crypto_aes_ctx aes;
355 int ret;
356 int i;
357 unsigned int keylen;
358
359 ctx->nonce = *(u32 *)(key + len - CTR_RFC3686_NONCE_SIZE);
360 keylen = len - CTR_RFC3686_NONCE_SIZE;
361 ret = aes_expandkey(&aes, key, keylen);
362 if (ret)
363 return ret;
364
365 for (i = 0; i < keylen / sizeof(u32); i++)
366 ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
367
368 ctx->key_len = keylen;
369
370 memzero_explicit(&aes, sizeof(aes));
371 return 0;
372}
373
374static int mtk_crypto_skcipher_aes_ctr_cra_init(struct crypto_tfm *tfm)
375{
376 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
377
378 mtk_crypto_skcipher_cra_init(tfm);
379 ctx->alg = MTK_CRYPTO_AES;
380 ctx->blocksz = AES_BLOCK_SIZE;
381 ctx->mode = MTK_CRYPTO_MODE_CTR;
382 return 0;
383}
384
385struct mtk_crypto_alg_template mtk_crypto_ctr_aes = {
386 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
387 .alg.skcipher = {
388 .setkey = mtk_crypto_skcipher_aesctr_setkey,
389 .encrypt = mtk_crypto_encrypt,
390 .decrypt = mtk_crypto_decrypt,
391 .min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
392 .max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
393 .ivsize = CTR_RFC3686_IV_SIZE,
394 .base = {
395 .cra_name = "rfc3686(ctr(aes))",
396 .cra_driver_name = "crypto-eip-ctr-aes",
397 .cra_priority = MTK_CRYPTO_PRIORITY,
398 .cra_flags = CRYPTO_ALG_ASYNC |
399 CRYPTO_ALG_KERN_DRIVER_ONLY,
400 .cra_blocksize = 1,
401 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
402 .cra_alignmask = 0,
403 .cra_init = mtk_crypto_skcipher_aes_ctr_cra_init,
404 .cra_exit = mtk_crypto_skcipher_cra_exit,
405 .cra_module = THIS_MODULE,
406 },
407 },
408};
409
410static int mtk_crypto_des_setkey(struct crypto_skcipher *ctfm, const u8 *key,
411 unsigned int len)
412{
413 struct mtk_crypto_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
414 int ret;
415
416 ret = verify_skcipher_des_key(ctfm, key);
417 if (ret)
418 return ret;
419 memcpy(ctx->key, key, len);
420 ctx->key_len = len;
421
422 return 0;
423}
424
425static int mtk_crypto_skcipher_des_cbc_cra_init(struct crypto_tfm *tfm)
426{
427 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
428
429 mtk_crypto_skcipher_cra_init(tfm);
430 ctx->alg = MTK_CRYPTO_DES;
431 ctx->blocksz = DES_BLOCK_SIZE;
432 ctx->mode = MTK_CRYPTO_MODE_CBC;
433 return 0;
434}
435
436struct mtk_crypto_alg_template mtk_crypto_cbc_des = {
437 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
438 .alg.skcipher = {
439 .setkey = mtk_crypto_des_setkey,
440 .encrypt = mtk_crypto_encrypt,
441 .decrypt = mtk_crypto_decrypt,
442 .min_keysize = DES_KEY_SIZE,
443 .max_keysize = DES_KEY_SIZE,
444 .ivsize = DES_BLOCK_SIZE,
445 .base = {
446 .cra_name = "cbc(des)",
447 .cra_driver_name = "crypto-eip-cbc-des",
448 .cra_priority = MTK_CRYPTO_PRIORITY,
449 .cra_flags = CRYPTO_ALG_ASYNC |
450 CRYPTO_ALG_KERN_DRIVER_ONLY,
451 .cra_blocksize = DES_BLOCK_SIZE,
452 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
453 .cra_alignmask = 0,
454 .cra_init = mtk_crypto_skcipher_des_cbc_cra_init,
455 .cra_exit = mtk_crypto_skcipher_cra_exit,
456 .cra_module = THIS_MODULE,
457 },
458 },
459};
460
461static int mtk_crypto_skcipher_des_ecb_cra_init(struct crypto_tfm *tfm)
462{
463 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
464
465 mtk_crypto_skcipher_cra_init(tfm);
466 ctx->alg = MTK_CRYPTO_DES;
467 ctx->mode = MTK_CRYPTO_MODE_ECB;
468 ctx->blocksz = 0;
469 return 0;
470}
471
472struct mtk_crypto_alg_template mtk_crypto_ecb_des = {
473 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
474 .alg.skcipher = {
475 .setkey = mtk_crypto_des_setkey,
476 .encrypt = mtk_crypto_encrypt,
477 .decrypt = mtk_crypto_decrypt,
478 .min_keysize = DES_KEY_SIZE,
479 .max_keysize = DES_KEY_SIZE,
480 .base = {
481 .cra_name = "ecb(des)",
482 .cra_driver_name = "crypto-eip-ecb-des",
483 .cra_priority = MTK_CRYPTO_PRIORITY,
484 .cra_flags = CRYPTO_ALG_ASYNC |
485 CRYPTO_ALG_KERN_DRIVER_ONLY,
486 .cra_blocksize = DES_BLOCK_SIZE,
487 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
488 .cra_alignmask = 0,
489 .cra_init = mtk_crypto_skcipher_des_ecb_cra_init,
490 .cra_exit = mtk_crypto_skcipher_cra_exit,
491 .cra_module = THIS_MODULE,
492 },
493 },
494};
495
496static int mtk_crypto_des3_ede_setkey(struct crypto_skcipher *ctfm,
497 const u8 *key, unsigned int len)
498{
499 struct mtk_crypto_cipher_ctx *ctx = crypto_skcipher_ctx(ctfm);
500 int err;
501
502 err = verify_skcipher_des3_key(ctfm, key);
503 if (err)
504 return err;
505
506 memcpy(ctx->key, key, len);
507 ctx->key_len = len;
508 return 0;
509}
510
511static int mtk_crypto_skcipher_des3_cbc_cra_init(struct crypto_tfm *tfm)
512{
513 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
514
515 mtk_crypto_skcipher_cra_init(tfm);
516 ctx->alg = MTK_CRYPTO_3DES;
517 ctx->mode = MTK_CRYPTO_MODE_CBC;
518 ctx->blocksz = 0;
519 return 0;
520}
521
522struct mtk_crypto_alg_template mtk_crypto_cbc_des3_ede = {
523 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
524 .alg.skcipher = {
525 .setkey = mtk_crypto_des3_ede_setkey,
526 .encrypt = mtk_crypto_encrypt,
527 .decrypt = mtk_crypto_decrypt,
528 .min_keysize = DES3_EDE_KEY_SIZE,
529 .max_keysize = DES3_EDE_KEY_SIZE,
530 .ivsize = DES3_EDE_BLOCK_SIZE,
531 .base = {
532 .cra_name = "cbc(des3_ede)",
533 .cra_driver_name = "crypto-eip-cbc-des3_ede",
534 .cra_priority = MTK_CRYPTO_PRIORITY,
535 .cra_flags = CRYPTO_ALG_ASYNC |
536 CRYPTO_ALG_KERN_DRIVER_ONLY,
537 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
538 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
539 .cra_alignmask = 0,
540 .cra_init = mtk_crypto_skcipher_des3_cbc_cra_init,
541 .cra_exit = mtk_crypto_skcipher_cra_exit,
542 .cra_module = THIS_MODULE,
543 },
544 },
545};
546
547static int mtk_crypto_skcipher_des3_ecb_cra_init(struct crypto_tfm *tfm)
548{
549 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
550
551 mtk_crypto_skcipher_cra_init(tfm);
552 ctx->alg = MTK_CRYPTO_3DES;
553 ctx->mode = MTK_CRYPTO_MODE_ECB;
554 ctx->blocksz = 0;
555 return 0;
556}
557
558struct mtk_crypto_alg_template mtk_crypto_ecb_des3_ede = {
559 .type = MTK_CRYPTO_ALG_TYPE_SKCIPHER,
560 .alg.skcipher = {
561 .setkey = mtk_crypto_des3_ede_setkey,
562 .encrypt = mtk_crypto_encrypt,
563 .decrypt = mtk_crypto_decrypt,
564 .min_keysize = DES3_EDE_KEY_SIZE,
565 .max_keysize = DES3_EDE_KEY_SIZE,
566 .base = {
567 .cra_name = "ecb(des3_ede)",
568 .cra_driver_name = "crypto-eip-ecb-des3_ede",
569 .cra_priority = MTK_CRYPTO_PRIORITY,
570 .cra_flags = CRYPTO_ALG_ASYNC |
571 CRYPTO_ALG_KERN_DRIVER_ONLY,
572 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
573 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
574 .cra_alignmask = 0,
575 .cra_init = mtk_crypto_skcipher_des3_ecb_cra_init,
576 .cra_exit = mtk_crypto_skcipher_cra_exit,
577 .cra_module = THIS_MODULE,
578 },
579 },
580};
581
582static int mtk_crypto_aead_encrypt(struct aead_request *req)
583{
584 struct mtk_crypto_cipher_req *creq = aead_request_ctx(req);
585
586 return mtk_crypto_queue_req(&req->base, creq, MTK_CRYPTO_ENCRYPT);
587}
588
589static int mtk_crypto_aead_decrypt(struct aead_request *req)
590{
591 struct mtk_crypto_cipher_req *creq = aead_request_ctx(req);
592
593 return mtk_crypto_queue_req(&req->base, creq, MTK_CRYPTO_DECRYPT);
594}
595
596static void mtk_crypto_aead_cra_exit(struct crypto_tfm *tfm)
597{
598 mtk_crypto_skcipher_cra_exit(tfm);
599}
600
601static int mtk_crypto_aead_cra_init(struct crypto_tfm *tfm)
602{
603 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
604 struct mtk_crypto_alg_template *tmpl =
605 container_of(tfm->__crt_alg, struct mtk_crypto_alg_template, alg.aead.base);
606
607 crypto_aead_set_reqsize(__crypto_aead_cast(tfm), sizeof(struct mtk_crypto_cipher_req));
608
609 ctx->priv = tmpl->priv;
610
611 ctx->alg = MTK_CRYPTO_AES;
612 ctx->blocksz = AES_BLOCK_SIZE;
613 ctx->mode = MTK_CRYPTO_MODE_CBC;
614 ctx->aead = true;
615 ctx->base.send = mtk_crypto_aead_send;
616 ctx->base.handle_result = mtk_crypto_aead_handle_result;
617 return 0;
618}
619
620static int mtk_crypto_aead_sha1_cra_init(struct crypto_tfm *tfm)
621{
622 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
623
624 mtk_crypto_aead_cra_init(tfm);
625 ctx->hash_alg = MTK_CRYPTO_ALG_SHA1;
626 ctx->state_sz = SHA1_DIGEST_SIZE;
627 return 0;
628}
629
630static int mtk_crypto_aead_setkey(struct crypto_aead *ctfm, const u8 *key, unsigned int len)
631{
632 struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
633 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
634 struct mtk_crypto_ahash_export_state istate, ostate;
635 struct crypto_authenc_keys keys;
636 struct crypto_aes_ctx aes;
637 int err = -EINVAL, i;
638
developerd66221d2024-04-01 19:03:52 +0800639 memset(&istate, 0, sizeof(struct mtk_crypto_ahash_export_state));
640 memset(&ostate, 0, sizeof(struct mtk_crypto_ahash_export_state));
641
developer2df22aa2024-03-22 14:36:06 +0800642 if (unlikely(crypto_authenc_extractkeys(&keys, key, len)))
643 goto badkey;
644
645 if (ctx->mode == MTK_CRYPTO_MODE_CTR) {
646 if (unlikely(keys.enckeylen < CTR_RFC3686_NONCE_SIZE))
647 goto badkey;
648
649 ctx->nonce = *(u32 *)(keys.enckey + keys.enckeylen - CTR_RFC3686_NONCE_SIZE);
650 keys.enckeylen -= CTR_RFC3686_NONCE_SIZE;
651 }
652
653 switch (ctx->alg) {
654 case MTK_CRYPTO_AES:
655 err = aes_expandkey(&aes, keys.enckey, keys.enckeylen);
656 if (unlikely(err))
657 goto badkey;
658 break;
659 case MTK_CRYPTO_DES:
660 err = verify_aead_des_key(ctfm, keys.enckey, keys.enckeylen);
661 if (unlikely(err))
662 goto badkey;
663 break;
664 case MTK_CRYPTO_3DES:
665 err = verify_aead_des3_key(ctfm, keys.enckey, keys.enckeylen);
666 if (unlikely(err))
667 goto badkey;
668 break;
669 default:
670 CRYPTO_ERR("aead: unsupported cipher algorithm\n");
671 goto badkey;
672 }
673
674 switch (ctx->hash_alg) {
675 case MTK_CRYPTO_ALG_SHA1:
676 err = mtk_crypto_hmac_setkey("crypto-eip-sha1", keys.authkey,
677 keys.authkeylen, &istate, &ostate);
678 if (err)
679 goto badkey;
680 break;
681 case MTK_CRYPTO_ALG_SHA224:
682 if (mtk_crypto_hmac_setkey("crypto-eip-sha224", keys.authkey,
683 keys.authkeylen, &istate, &ostate))
684 goto badkey;
685 break;
686 case MTK_CRYPTO_ALG_SHA256:
687 if (mtk_crypto_hmac_setkey("crypto-eip-sha256", keys.authkey,
688 keys.authkeylen, &istate, &ostate))
689 goto badkey;
690 break;
691 case MTK_CRYPTO_ALG_SHA384:
692 if (mtk_crypto_hmac_setkey("crypto-eip-sha384", keys.authkey,
693 keys.authkeylen, &istate, &ostate))
694 goto badkey;
695 break;
696 case MTK_CRYPTO_ALG_SHA512:
697 if (mtk_crypto_hmac_setkey("crypto-eip-sha512", keys.authkey,
698 keys.authkeylen, &istate, &ostate))
699 goto badkey;
700 break;
701 case MTK_CRYPTO_ALG_MD5:
702 if (mtk_crypto_hmac_setkey("crypto-eip-md5", keys.authkey,
703 keys.authkeylen, &istate, &ostate))
704 goto badkey;
705 break;
706 default:
707 CRYPTO_ERR("aead: unsupported hash algorithm\n");
708 goto badkey;
709 }
710
711 for (i = 0; i < keys.enckeylen / sizeof(u32); i++)
712 ctx->key[i] = cpu_to_le32(((u32 *)keys.enckey)[i]);
713 ctx->key_len = keys.enckeylen;
714
715 memcpy(ctx->ipad, &istate.state, ctx->state_sz);
716 memcpy(ctx->opad, &ostate.state, ctx->state_sz);
717
718 if (istate.sa_pointer)
719 crypto_free_sa(istate.sa_pointer);
720 kfree(istate.token_context);
721 if (ostate.sa_pointer)
722 crypto_free_sa(ostate.sa_pointer);
723 kfree(ostate.token_context);
724
725 memzero_explicit(&keys, sizeof(keys));
726 return 0;
727
728badkey:
729 memzero_explicit(&keys, sizeof(keys));
730 return err;
731}
732
733struct mtk_crypto_alg_template mtk_crypto_hmac_sha1_cbc_aes = {
734 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
735 .alg.aead = {
736 .setkey = mtk_crypto_aead_setkey,
737 .encrypt = mtk_crypto_aead_encrypt,
738 .decrypt = mtk_crypto_aead_decrypt,
739 .ivsize = AES_BLOCK_SIZE,
740 .maxauthsize = SHA1_DIGEST_SIZE,
741 .base = {
742 .cra_name = "authenc(hmac(sha1),cbc(aes))",
743 .cra_driver_name = "crypto-eip-hmac-sha1-cbc-aes",
744 .cra_priority = MTK_CRYPTO_PRIORITY,
745 .cra_flags = CRYPTO_ALG_ASYNC |
746 CRYPTO_ALG_KERN_DRIVER_ONLY,
747 .cra_blocksize = AES_BLOCK_SIZE,
748 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
749 .cra_alignmask = 0,
750 .cra_init = mtk_crypto_aead_sha1_cra_init,
751 .cra_exit = mtk_crypto_aead_cra_exit,
752 .cra_module = THIS_MODULE,
753 },
754 },
755};
756
757static int mtk_crypto_aead_sha224_cra_init(struct crypto_tfm *tfm)
758{
759 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
760
761 mtk_crypto_aead_cra_init(tfm);
762 ctx->hash_alg = MTK_CRYPTO_ALG_SHA224;
763 ctx->state_sz = SHA256_DIGEST_SIZE;
764 return 0;
765}
766
767struct mtk_crypto_alg_template mtk_crypto_hmac_sha224_cbc_aes = {
768 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
769 .alg.aead = {
770 .setkey = mtk_crypto_aead_setkey,
771 .encrypt = mtk_crypto_aead_encrypt,
772 .decrypt = mtk_crypto_aead_decrypt,
773 .ivsize = AES_BLOCK_SIZE,
774 .maxauthsize = SHA224_DIGEST_SIZE,
775 .base = {
776 .cra_name = "authenc(hmac(sha224),cbc(aes))",
777 .cra_driver_name = "crypto-eip-hmac-sha224-cbc-aes",
778 .cra_priority = MTK_CRYPTO_PRIORITY,
779 .cra_flags = CRYPTO_ALG_ASYNC |
780 CRYPTO_ALG_KERN_DRIVER_ONLY,
781 .cra_blocksize = AES_BLOCK_SIZE,
782 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
783 .cra_alignmask = 0,
784 .cra_init = mtk_crypto_aead_sha224_cra_init,
785 .cra_exit = mtk_crypto_aead_cra_exit,
786 .cra_module = THIS_MODULE,
787 },
788 },
789};
790
791static int mtk_crypto_aead_sha256_cra_init(struct crypto_tfm *tfm)
792{
793 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
794
795 mtk_crypto_aead_cra_init(tfm);
796 ctx->hash_alg = MTK_CRYPTO_ALG_SHA256;
797 ctx->state_sz = SHA256_DIGEST_SIZE;
798 return 0;
799}
800
801struct mtk_crypto_alg_template mtk_crypto_hmac_sha256_cbc_aes = {
802 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
803 .alg.aead = {
804 .setkey = mtk_crypto_aead_setkey,
805 .encrypt = mtk_crypto_aead_encrypt,
806 .decrypt = mtk_crypto_aead_decrypt,
807 .ivsize = AES_BLOCK_SIZE,
808 .maxauthsize = SHA256_DIGEST_SIZE,
809 .base = {
810 .cra_name = "authenc(hmac(sha256),cbc(aes))",
811 .cra_driver_name = "crypto-eip-hmac-sha256-cbc-aes",
812 .cra_priority = MTK_CRYPTO_PRIORITY,
813 .cra_flags = CRYPTO_ALG_ASYNC |
814 CRYPTO_ALG_KERN_DRIVER_ONLY,
815 .cra_blocksize = AES_BLOCK_SIZE,
816 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
817 .cra_alignmask = 0,
818 .cra_init = mtk_crypto_aead_sha256_cra_init,
819 .cra_exit = mtk_crypto_aead_cra_exit,
820 .cra_module = THIS_MODULE,
821 },
822 },
823};
824
825static int mtk_crypto_aead_sha384_cra_init(struct crypto_tfm *tfm)
826{
827 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
828
829 mtk_crypto_aead_cra_init(tfm);
830 ctx->hash_alg = MTK_CRYPTO_ALG_SHA384;
831 ctx->state_sz = SHA512_DIGEST_SIZE;
832 return 0;
833}
834
835struct mtk_crypto_alg_template mtk_crypto_hmac_sha384_cbc_aes = {
836 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
837 .alg.aead = {
838 .setkey = mtk_crypto_aead_setkey,
839 .encrypt = mtk_crypto_aead_encrypt,
840 .decrypt = mtk_crypto_aead_decrypt,
841 .ivsize = AES_BLOCK_SIZE,
842 .maxauthsize = SHA384_DIGEST_SIZE,
843 .base = {
844 .cra_name = "authenc(hmac(sha384),cbc(aes))",
845 .cra_driver_name = "crypto-eip-hmac-sha384-cbc-aes",
846 .cra_priority = MTK_CRYPTO_PRIORITY,
847 .cra_flags = CRYPTO_ALG_ASYNC |
848 CRYPTO_ALG_KERN_DRIVER_ONLY,
849 .cra_blocksize = AES_BLOCK_SIZE,
850 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
851 .cra_alignmask = 0,
852 .cra_init = mtk_crypto_aead_sha384_cra_init,
853 .cra_exit = mtk_crypto_aead_cra_exit,
854 .cra_module = THIS_MODULE,
855 },
856 },
857};
858
859static int mtk_crypto_aead_sha512_cra_init(struct crypto_tfm *tfm)
860{
861 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
862
863 mtk_crypto_aead_cra_init(tfm);
864 ctx->hash_alg = MTK_CRYPTO_ALG_SHA512;
865 ctx->state_sz = SHA512_DIGEST_SIZE;
866 return 0;
867}
868
869struct mtk_crypto_alg_template mtk_crypto_hmac_sha512_cbc_aes = {
870 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
871 .alg.aead = {
872 .setkey = mtk_crypto_aead_setkey,
873 .encrypt = mtk_crypto_aead_encrypt,
874 .decrypt = mtk_crypto_aead_decrypt,
875 .ivsize = AES_BLOCK_SIZE,
876 .maxauthsize = SHA512_DIGEST_SIZE,
877 .base = {
878 .cra_name = "authenc(hmac(sha512),cbc(aes))",
879 .cra_driver_name = "crypto-eip-hmac-sha512-cbc-aes",
880 .cra_priority = MTK_CRYPTO_PRIORITY,
881 .cra_flags = CRYPTO_ALG_ASYNC |
882 CRYPTO_ALG_KERN_DRIVER_ONLY,
883 .cra_blocksize = AES_BLOCK_SIZE,
884 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
885 .cra_alignmask = 0,
886 .cra_init = mtk_crypto_aead_sha512_cra_init,
887 .cra_exit = mtk_crypto_aead_cra_exit,
888 .cra_module = THIS_MODULE,
889 },
890 },
891};
892
893static int mtk_crypto_aead_md5_cra_init(struct crypto_tfm *tfm)
894{
895 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
896
897 mtk_crypto_aead_cra_init(tfm);
898 ctx->hash_alg = MTK_CRYPTO_ALG_MD5;
899 ctx->state_sz = MD5_DIGEST_SIZE;
900 return 0;
901}
902
903struct mtk_crypto_alg_template mtk_crypto_hmac_md5_cbc_aes = {
904 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
905 .alg.aead = {
906 .setkey = mtk_crypto_aead_setkey,
907 .encrypt = mtk_crypto_aead_encrypt,
908 .decrypt = mtk_crypto_aead_decrypt,
909 .ivsize = AES_BLOCK_SIZE,
910 .maxauthsize = SHA512_DIGEST_SIZE,
911 .base = {
912 .cra_name = "authenc(hmac(md5),cbc(aes))",
913 .cra_driver_name = "crypto-eip-hmac-md5-cbc-aes",
914 .cra_priority = MTK_CRYPTO_PRIORITY,
915 .cra_flags = CRYPTO_ALG_ASYNC |
916 CRYPTO_ALG_KERN_DRIVER_ONLY,
917 .cra_blocksize = AES_BLOCK_SIZE,
918 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
919 .cra_alignmask = 0,
920 .cra_init = mtk_crypto_aead_md5_cra_init,
921 .cra_exit = mtk_crypto_aead_cra_exit,
922 .cra_module = THIS_MODULE,
923 },
924 },
925};
926
927static int mtk_crypto_aead_sha1_des3_cra_init(struct crypto_tfm *tfm)
928{
929 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
930
931 mtk_crypto_aead_sha1_cra_init(tfm);
932 ctx->alg = MTK_CRYPTO_3DES;
933 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
934 return 0;
935}
936
937struct mtk_crypto_alg_template mtk_crypto_hmac_sha1_cbc_des3_ede = {
938 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
939 .alg.aead = {
940 .setkey = mtk_crypto_aead_setkey,
941 .encrypt = mtk_crypto_aead_encrypt,
942 .decrypt = mtk_crypto_aead_decrypt,
943 .ivsize = DES3_EDE_BLOCK_SIZE,
944 .maxauthsize = SHA1_DIGEST_SIZE,
945 .base = {
946 .cra_name = "authenc(hmac(sha1),cbc(des3_ede))",
947 .cra_driver_name = "crypto-eip-hmac-sha1-cbc-des3_ede",
948 .cra_priority = MTK_CRYPTO_PRIORITY,
949 .cra_flags = CRYPTO_ALG_ASYNC |
950 CRYPTO_ALG_KERN_DRIVER_ONLY,
951 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
952 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
953 .cra_alignmask = 0,
954 .cra_init = mtk_crypto_aead_sha1_des3_cra_init,
955 .cra_exit = mtk_crypto_aead_cra_exit,
956 .cra_module = THIS_MODULE,
957 },
958 },
959};
960
961static int mtk_crypto_aead_sha224_des3_cra_init(struct crypto_tfm *tfm)
962{
963 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
964
965 mtk_crypto_aead_sha224_cra_init(tfm);
966 ctx->alg = MTK_CRYPTO_3DES;
967 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
968 return 0;
969}
970
971struct mtk_crypto_alg_template mtk_crypto_hmac_sha224_cbc_des3_ede = {
972 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
973 .alg.aead = {
974 .setkey = mtk_crypto_aead_setkey,
975 .encrypt = mtk_crypto_aead_encrypt,
976 .decrypt = mtk_crypto_aead_decrypt,
977 .ivsize = DES3_EDE_BLOCK_SIZE,
978 .maxauthsize = SHA224_DIGEST_SIZE,
979 .base = {
980 .cra_name = "authenc(hmac(sha224),cbc(des3_ede))",
981 .cra_driver_name = "crypto-eip-hmac-sha224-cbc-des3_ede",
982 .cra_priority = MTK_CRYPTO_PRIORITY,
983 .cra_flags = CRYPTO_ALG_ASYNC |
984 CRYPTO_ALG_KERN_DRIVER_ONLY,
985 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
986 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
987 .cra_alignmask = 0,
988 .cra_init = mtk_crypto_aead_sha224_des3_cra_init,
989 .cra_exit = mtk_crypto_aead_cra_exit,
990 .cra_module = THIS_MODULE,
991 },
992 },
993};
994
995static int mtk_crypto_aead_sha256_des3_cra_init(struct crypto_tfm *tfm)
996{
997 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
998
999 mtk_crypto_aead_sha256_cra_init(tfm);
1000 ctx->alg = MTK_CRYPTO_3DES;
1001 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1002 return 0;
1003}
1004
1005struct mtk_crypto_alg_template mtk_crypto_hmac_sha256_cbc_des3_ede = {
1006 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1007 .alg.aead = {
1008 .setkey = mtk_crypto_aead_setkey,
1009 .encrypt = mtk_crypto_aead_encrypt,
1010 .decrypt = mtk_crypto_aead_decrypt,
1011 .ivsize = DES3_EDE_BLOCK_SIZE,
1012 .maxauthsize = SHA256_DIGEST_SIZE,
1013 .base = {
1014 .cra_name = "authenc(hmac(sha256),cbc(des3_ede))",
1015 .cra_driver_name = "crypto-eip-hmac-sha256-cbc-des3_ede",
1016 .cra_priority = MTK_CRYPTO_PRIORITY,
1017 .cra_flags = CRYPTO_ALG_ASYNC |
1018 CRYPTO_ALG_KERN_DRIVER_ONLY,
1019 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1020 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1021 .cra_alignmask = 0,
1022 .cra_init = mtk_crypto_aead_sha256_des3_cra_init,
1023 .cra_exit = mtk_crypto_aead_cra_exit,
1024 .cra_module = THIS_MODULE,
1025 },
1026 },
1027};
1028
1029static int mtk_crypto_aead_sha384_des3_cra_init(struct crypto_tfm *tfm)
1030{
1031 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1032
1033 mtk_crypto_aead_sha384_cra_init(tfm);
1034 ctx->alg = MTK_CRYPTO_3DES;
1035 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1036 return 0;
1037}
1038
1039struct mtk_crypto_alg_template mtk_crypto_hmac_sha384_cbc_des3_ede = {
1040 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1041 .alg.aead = {
1042 .setkey = mtk_crypto_aead_setkey,
1043 .encrypt = mtk_crypto_aead_encrypt,
1044 .decrypt = mtk_crypto_aead_decrypt,
1045 .ivsize = DES3_EDE_BLOCK_SIZE,
1046 .maxauthsize = SHA384_DIGEST_SIZE,
1047 .base = {
1048 .cra_name = "authenc(hmac(sha384),cbc(des3_ede))",
1049 .cra_driver_name = "crypto-eip-hmac-sha384-cbc-des3_ede",
1050 .cra_priority = MTK_CRYPTO_PRIORITY,
1051 .cra_flags = CRYPTO_ALG_ASYNC |
1052 CRYPTO_ALG_KERN_DRIVER_ONLY,
1053 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1054 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1055 .cra_alignmask = 0,
1056 .cra_init = mtk_crypto_aead_sha384_des3_cra_init,
1057 .cra_exit = mtk_crypto_aead_cra_exit,
1058 .cra_module = THIS_MODULE,
1059 },
1060 },
1061};
1062
1063static int mtk_crypto_aead_sha512_des3_cra_init(struct crypto_tfm *tfm)
1064{
1065 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1066
1067 mtk_crypto_aead_sha512_cra_init(tfm);
1068 ctx->alg = MTK_CRYPTO_3DES;
1069 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1070 return 0;
1071}
1072
1073struct mtk_crypto_alg_template mtk_crypto_hmac_sha512_cbc_des3_ede = {
1074 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1075 .alg.aead = {
1076 .setkey = mtk_crypto_aead_setkey,
1077 .encrypt = mtk_crypto_aead_encrypt,
1078 .decrypt = mtk_crypto_aead_decrypt,
1079 .ivsize = DES3_EDE_BLOCK_SIZE,
1080 .maxauthsize = SHA512_DIGEST_SIZE,
1081 .base = {
1082 .cra_name = "authenc(hmac(sha512),cbc(des3_ede))",
1083 .cra_driver_name = "crypto-eip-hmac-sha512-cbc-des3_ede",
1084 .cra_priority = MTK_CRYPTO_PRIORITY,
1085 .cra_flags = CRYPTO_ALG_ASYNC |
1086 CRYPTO_ALG_KERN_DRIVER_ONLY,
1087 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1088 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1089 .cra_alignmask = 0,
1090 .cra_init = mtk_crypto_aead_sha512_des3_cra_init,
1091 .cra_exit = mtk_crypto_aead_cra_exit,
1092 .cra_module = THIS_MODULE,
1093 },
1094 },
1095};
1096
1097static int mtk_crypto_aead_md5_des3_cra_init(struct crypto_tfm *tfm)
1098{
1099 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1100
1101 mtk_crypto_aead_md5_cra_init(tfm);
1102 ctx->alg = MTK_CRYPTO_3DES;
1103 ctx->blocksz = DES3_EDE_BLOCK_SIZE;
1104 return 0;
1105}
1106
1107struct mtk_crypto_alg_template mtk_crypto_hmac_md5_cbc_des3_ede = {
1108 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1109 .alg.aead = {
1110 .setkey = mtk_crypto_aead_setkey,
1111 .encrypt = mtk_crypto_aead_encrypt,
1112 .decrypt = mtk_crypto_aead_decrypt,
1113 .ivsize = DES3_EDE_BLOCK_SIZE,
1114 .maxauthsize = MD5_DIGEST_SIZE,
1115 .base = {
1116 .cra_name = "authenc(hmac(md5),cbc(des3_ede))",
1117 .cra_driver_name = "crypto-eip-hmac-md5-cbc-des3_ede",
1118 .cra_priority = MTK_CRYPTO_PRIORITY,
1119 .cra_flags = CRYPTO_ALG_ASYNC |
1120 CRYPTO_ALG_KERN_DRIVER_ONLY,
1121 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
1122 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1123 .cra_alignmask = 0,
1124 .cra_init = mtk_crypto_aead_md5_des3_cra_init,
1125 .cra_exit = mtk_crypto_aead_cra_exit,
1126 .cra_module = THIS_MODULE,
1127 },
1128 },
1129};
1130
1131static int mtk_crypto_aead_sha1_des_cra_init(struct crypto_tfm *tfm)
1132{
1133 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1134
1135 mtk_crypto_aead_sha1_cra_init(tfm);
1136 ctx->alg = MTK_CRYPTO_DES;
1137 ctx->blocksz = DES_BLOCK_SIZE;
1138 return 0;
1139}
1140
1141struct mtk_crypto_alg_template mtk_crypto_hmac_sha1_cbc_des = {
1142 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1143 .alg.aead = {
1144 .setkey = mtk_crypto_aead_setkey,
1145 .encrypt = mtk_crypto_aead_encrypt,
1146 .decrypt = mtk_crypto_aead_decrypt,
1147 .ivsize = DES_BLOCK_SIZE,
1148 .maxauthsize = SHA1_DIGEST_SIZE,
1149 .base = {
1150 .cra_name = "authenc(hmac(sha1),cbc(des))",
1151 .cra_driver_name = "crypto-eip-hmac-sha1-cbc-des",
1152 .cra_priority = MTK_CRYPTO_PRIORITY,
1153 .cra_flags = CRYPTO_ALG_ASYNC |
1154 CRYPTO_ALG_KERN_DRIVER_ONLY,
1155 .cra_blocksize = DES_BLOCK_SIZE,
1156 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1157 .cra_alignmask = 0,
1158 .cra_init = mtk_crypto_aead_sha1_des_cra_init,
1159 .cra_exit = mtk_crypto_aead_cra_exit,
1160 .cra_module = THIS_MODULE,
1161 },
1162 },
1163};
1164
1165static int mtk_crypto_aead_sha224_des_cra_init(struct crypto_tfm *tfm)
1166{
1167 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1168
1169 mtk_crypto_aead_sha224_cra_init(tfm);
1170 ctx->alg = MTK_CRYPTO_DES;
1171 ctx->blocksz = DES_BLOCK_SIZE;
1172 return 0;
1173}
1174
1175struct mtk_crypto_alg_template mtk_crypto_hmac_sha224_cbc_des = {
1176 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1177 .alg.aead = {
1178 .setkey = mtk_crypto_aead_setkey,
1179 .encrypt = mtk_crypto_aead_encrypt,
1180 .decrypt = mtk_crypto_aead_decrypt,
1181 .ivsize = DES_BLOCK_SIZE,
1182 .maxauthsize = SHA224_DIGEST_SIZE,
1183 .base = {
1184 .cra_name = "authenc(hmac(sha224),cbc(des))",
1185 .cra_driver_name = "crypto-eip-hmac-sha224-cbc-des",
1186 .cra_priority = MTK_CRYPTO_PRIORITY,
1187 .cra_flags = CRYPTO_ALG_ASYNC |
1188 CRYPTO_ALG_KERN_DRIVER_ONLY,
1189 .cra_blocksize = DES_BLOCK_SIZE,
1190 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1191 .cra_alignmask = 0,
1192 .cra_init = mtk_crypto_aead_sha224_des_cra_init,
1193 .cra_exit = mtk_crypto_aead_cra_exit,
1194 .cra_module = THIS_MODULE,
1195 },
1196 },
1197};
1198
1199static int mtk_crypto_aead_sha256_des_cra_init(struct crypto_tfm *tfm)
1200{
1201 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1202
1203 mtk_crypto_aead_sha256_cra_init(tfm);
1204 ctx->alg = MTK_CRYPTO_DES;
1205 ctx->blocksz = DES_BLOCK_SIZE;
1206 return 0;
1207}
1208
1209struct mtk_crypto_alg_template mtk_crypto_hmac_sha256_cbc_des = {
1210 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1211 .alg.aead = {
1212 .setkey = mtk_crypto_aead_setkey,
1213 .encrypt = mtk_crypto_aead_encrypt,
1214 .decrypt = mtk_crypto_aead_decrypt,
1215 .ivsize = DES_BLOCK_SIZE,
1216 .maxauthsize = SHA256_DIGEST_SIZE,
1217 .base = {
1218 .cra_name = "authenc(hmac(sha256),cbc(des))",
1219 .cra_driver_name = "crypto-eip-hmac-sha256-cbc-des",
1220 .cra_priority = MTK_CRYPTO_PRIORITY,
1221 .cra_flags = CRYPTO_ALG_ASYNC |
1222 CRYPTO_ALG_KERN_DRIVER_ONLY,
1223 .cra_blocksize = DES_BLOCK_SIZE,
1224 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1225 .cra_alignmask = 0,
1226 .cra_init = mtk_crypto_aead_sha256_des_cra_init,
1227 .cra_exit = mtk_crypto_aead_cra_exit,
1228 .cra_module = THIS_MODULE,
1229 },
1230 },
1231};
1232
1233static int mtk_crypto_aead_sha384_des_cra_init(struct crypto_tfm *tfm)
1234{
1235 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1236
1237 mtk_crypto_aead_sha384_cra_init(tfm);
1238 ctx->alg = MTK_CRYPTO_DES;
1239 ctx->blocksz = DES_BLOCK_SIZE;
1240 return 0;
1241}
1242
1243struct mtk_crypto_alg_template mtk_crypto_hmac_sha384_cbc_des = {
1244 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1245 .alg.aead = {
1246 .setkey = mtk_crypto_aead_setkey,
1247 .encrypt = mtk_crypto_aead_encrypt,
1248 .decrypt = mtk_crypto_aead_decrypt,
1249 .ivsize = DES_BLOCK_SIZE,
1250 .maxauthsize = SHA384_DIGEST_SIZE,
1251 .base = {
1252 .cra_name = "authenc(hmac(sha384),cbc(des))",
1253 .cra_driver_name = "crypto-eip-hmac-sha384-cbc-des",
1254 .cra_priority = MTK_CRYPTO_PRIORITY,
1255 .cra_flags = CRYPTO_ALG_ASYNC |
1256 CRYPTO_ALG_KERN_DRIVER_ONLY,
1257 .cra_blocksize = DES_BLOCK_SIZE,
1258 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1259 .cra_alignmask = 0,
1260 .cra_init = mtk_crypto_aead_sha384_des_cra_init,
1261 .cra_exit = mtk_crypto_aead_cra_exit,
1262 .cra_module = THIS_MODULE,
1263 },
1264 },
1265};
1266
1267static int mtk_crypto_aead_sha512_des_cra_init(struct crypto_tfm *tfm)
1268{
1269 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1270
1271 mtk_crypto_aead_sha512_cra_init(tfm);
1272 ctx->alg = MTK_CRYPTO_DES;
1273 ctx->blocksz = DES_BLOCK_SIZE;
1274 return 0;
1275}
1276
1277struct mtk_crypto_alg_template mtk_crypto_hmac_sha512_cbc_des = {
1278 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1279 .alg.aead = {
1280 .setkey = mtk_crypto_aead_setkey,
1281 .encrypt = mtk_crypto_aead_encrypt,
1282 .decrypt = mtk_crypto_aead_decrypt,
1283 .ivsize = DES_BLOCK_SIZE,
1284 .maxauthsize = SHA512_DIGEST_SIZE,
1285 .base = {
1286 .cra_name = "authenc(hmac(sha512),cbc(des))",
1287 .cra_driver_name = "crypto-eip-hmac-sha512-cbc-des",
1288 .cra_priority = MTK_CRYPTO_PRIORITY,
1289 .cra_flags = CRYPTO_ALG_ASYNC |
1290 CRYPTO_ALG_KERN_DRIVER_ONLY,
1291 .cra_blocksize = DES_BLOCK_SIZE,
1292 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1293 .cra_alignmask = 0,
1294 .cra_init = mtk_crypto_aead_sha512_des_cra_init,
1295 .cra_exit = mtk_crypto_aead_cra_exit,
1296 .cra_module = THIS_MODULE,
1297 },
1298 },
1299};
1300
1301static int mtk_crypto_aead_sha1_ctr_cra_init(struct crypto_tfm *tfm)
1302{
1303 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1304
1305 mtk_crypto_aead_sha1_cra_init(tfm);
1306 ctx->mode = MTK_CRYPTO_MODE_CTR;
1307 return 0;
1308}
1309
1310struct mtk_crypto_alg_template mtk_crypto_hmac_sha1_ctr_aes = {
1311 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1312 .alg.aead = {
1313 .setkey = mtk_crypto_aead_setkey,
1314 .encrypt = mtk_crypto_aead_encrypt,
1315 .decrypt = mtk_crypto_aead_decrypt,
1316 .ivsize = CTR_RFC3686_IV_SIZE,
1317 .maxauthsize = SHA1_DIGEST_SIZE,
1318 .base = {
1319 .cra_name = "authenc(hmac(sha1),rfc3686(ctr(aes)))",
1320 .cra_driver_name = "crypto-eip-hmac-sha1-ctr-aes",
1321 .cra_priority = MTK_CRYPTO_PRIORITY,
1322 .cra_flags = CRYPTO_ALG_ASYNC |
1323 CRYPTO_ALG_KERN_DRIVER_ONLY,
1324 .cra_blocksize = 1,
1325 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1326 .cra_alignmask = 0,
1327 .cra_init = mtk_crypto_aead_sha1_ctr_cra_init,
1328 .cra_exit = mtk_crypto_aead_cra_exit,
1329 .cra_module = THIS_MODULE,
1330 },
1331 },
1332};
1333
1334static int mtk_crypto_aead_sha256_ctr_cra_init(struct crypto_tfm *tfm)
1335{
1336 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1337
1338 mtk_crypto_aead_sha256_cra_init(tfm);
1339 ctx->mode = MTK_CRYPTO_MODE_CTR;
1340 return 0;
1341}
1342
1343struct mtk_crypto_alg_template mtk_crypto_hmac_sha256_ctr_aes = {
1344 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1345 .alg.aead = {
1346 .setkey = mtk_crypto_aead_setkey,
1347 .encrypt = mtk_crypto_aead_encrypt,
1348 .decrypt = mtk_crypto_aead_decrypt,
1349 .ivsize = CTR_RFC3686_IV_SIZE,
1350 .maxauthsize = SHA256_DIGEST_SIZE,
1351 .base = {
1352 .cra_name = "authenc(hmac(sha256),rfc3686(ctr(aes)))",
1353 .cra_driver_name = "crypto-eip-hmac-sha256-ctr-aes",
1354 .cra_priority = MTK_CRYPTO_PRIORITY,
1355 .cra_flags = CRYPTO_ALG_ASYNC |
1356 CRYPTO_ALG_KERN_DRIVER_ONLY,
1357 .cra_blocksize = 1,
1358 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1359 .cra_alignmask = 0,
1360 .cra_init = mtk_crypto_aead_sha256_ctr_cra_init,
1361 .cra_exit = mtk_crypto_aead_cra_exit,
1362 .cra_module = THIS_MODULE,
1363 },
1364 },
1365};
1366
1367static int mtk_crypto_aead_sha224_ctr_cra_init(struct crypto_tfm *tfm)
1368{
1369 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1370
1371 mtk_crypto_aead_sha224_cra_init(tfm);
1372 ctx->mode = MTK_CRYPTO_MODE_CTR;
1373 return 0;
1374}
1375
1376struct mtk_crypto_alg_template mtk_crypto_hmac_sha224_ctr_aes = {
1377 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1378 .alg.aead = {
1379 .setkey = mtk_crypto_aead_setkey,
1380 .encrypt = mtk_crypto_aead_encrypt,
1381 .decrypt = mtk_crypto_aead_decrypt,
1382 .ivsize = CTR_RFC3686_IV_SIZE,
1383 .maxauthsize = SHA224_DIGEST_SIZE,
1384 .base = {
1385 .cra_name = "authenc(hmac(sha224),rfc3686(ctr(aes)))",
1386 .cra_driver_name = "crypto-eip-hmac-sha224-ctr-aes",
1387 .cra_priority = MTK_CRYPTO_PRIORITY,
1388 .cra_flags = CRYPTO_ALG_ASYNC |
1389 CRYPTO_ALG_KERN_DRIVER_ONLY,
1390 .cra_blocksize = 1,
1391 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1392 .cra_alignmask = 0,
1393 .cra_init = mtk_crypto_aead_sha224_ctr_cra_init,
1394 .cra_exit = mtk_crypto_aead_cra_exit,
1395 .cra_module = THIS_MODULE,
1396 },
1397 },
1398};
1399
1400static int mtk_crypto_aead_sha512_ctr_cra_init(struct crypto_tfm *tfm)
1401{
1402 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1403
1404 mtk_crypto_aead_sha512_cra_init(tfm);
1405 ctx->mode = MTK_CRYPTO_MODE_CTR;
1406 return 0;
1407}
1408
1409struct mtk_crypto_alg_template mtk_crypto_hmac_sha512_ctr_aes = {
1410 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1411 .alg.aead = {
1412 .setkey = mtk_crypto_aead_setkey,
1413 .encrypt = mtk_crypto_aead_encrypt,
1414 .decrypt = mtk_crypto_aead_decrypt,
1415 .ivsize = CTR_RFC3686_IV_SIZE,
1416 .maxauthsize = SHA512_DIGEST_SIZE,
1417 .base = {
1418 .cra_name = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
1419 .cra_driver_name = "crypto-eip-hmac-sha512-ctr-aes",
1420 .cra_priority = MTK_CRYPTO_PRIORITY,
1421 .cra_flags = CRYPTO_ALG_ASYNC |
1422 CRYPTO_ALG_KERN_DRIVER_ONLY,
1423 .cra_blocksize = 1,
1424 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1425 .cra_alignmask = 0,
1426 .cra_init = mtk_crypto_aead_sha512_ctr_cra_init,
1427 .cra_exit = mtk_crypto_aead_cra_exit,
1428 .cra_module = THIS_MODULE,
1429 },
1430 },
1431};
1432
1433static int mtk_crypto_aead_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,
1434 unsigned int len)
1435{
1436 struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
1437 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1438 struct crypto_aes_ctx aes;
1439 u32 hashkey[AES_BLOCK_SIZE >> 2];
1440 int ret, i;
1441
1442 ret = aes_expandkey(&aes, key, len);
1443 if (ret) {
1444 memzero_explicit(&aes, sizeof(aes));
1445 return ret;
1446 }
1447
1448 for (i = 0; i < len / sizeof(u32); i++)
1449 ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
1450
1451 ctx->key_len = len;
1452
1453 /* Compute hash key by encrypting zeros with cipher key */
1454 crypto_cipher_clear_flags(ctx->hkaes, CRYPTO_TFM_REQ_MASK);
1455 crypto_cipher_set_flags(ctx->hkaes, crypto_aead_get_flags(ctfm) &
1456 CRYPTO_TFM_REQ_MASK);
1457 ret = crypto_cipher_setkey(ctx->hkaes, key, len);
1458 if (ret)
1459 return ret;
1460
1461 memset(hashkey, 0, AES_BLOCK_SIZE);
1462 crypto_cipher_encrypt_one(ctx->hkaes, (u8 *)hashkey, (u8 *)hashkey);
1463
1464 for (i = 0; i < AES_BLOCK_SIZE / sizeof(u32); i++)
1465 ctx->ipad[i] = cpu_to_be32(hashkey[i]);
1466
1467 memzero_explicit(hashkey, AES_BLOCK_SIZE);
1468 memzero_explicit(&aes, sizeof(aes));
1469 return 0;
1470}
1471
1472static int mtk_crypto_aead_gcm_cra_init(struct crypto_tfm *tfm)
1473{
1474 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1475
1476 mtk_crypto_aead_cra_init(tfm);
1477 ctx->hash_alg = MTK_CRYPTO_ALG_GCM;
1478 ctx->state_sz = GHASH_BLOCK_SIZE;
1479 ctx->mode = MTK_CRYPTO_MODE_GCM;
1480
1481 ctx->hkaes = crypto_alloc_cipher("aes", 0, 0);
1482 return PTR_ERR_OR_ZERO(ctx->hkaes);
1483}
1484
1485static void mtk_crypto_aead_gcm_cra_exit(struct crypto_tfm *tfm)
1486{
1487 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1488
1489 crypto_free_cipher(ctx->hkaes);
1490 mtk_crypto_aead_cra_exit(tfm);
1491}
1492
1493static int mtk_crypto_aead_gcm_setauthsize(struct crypto_aead *tfm,
1494 unsigned int authsize)
1495{
1496 return crypto_gcm_check_authsize(authsize);
1497}
1498
1499struct mtk_crypto_alg_template mtk_crypto_gcm = {
1500 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1501 .alg.aead = {
1502 .setkey = mtk_crypto_aead_gcm_setkey,
1503 .setauthsize = mtk_crypto_aead_gcm_setauthsize,
1504 .encrypt = mtk_crypto_aead_encrypt,
1505 .decrypt = mtk_crypto_aead_decrypt,
1506 .ivsize = GCM_AES_IV_SIZE,
1507 .maxauthsize = GHASH_DIGEST_SIZE,
1508 .base = {
1509 .cra_name = "gcm(aes)",
1510 .cra_driver_name = "crypto-eip-gcm-aes",
1511 .cra_priority = MTK_CRYPTO_PRIORITY,
1512 .cra_flags = CRYPTO_ALG_ASYNC |
1513 CRYPTO_ALG_KERN_DRIVER_ONLY,
1514 .cra_blocksize = 1,
1515 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1516 .cra_alignmask = 0,
1517 .cra_init = mtk_crypto_aead_gcm_cra_init,
1518 .cra_exit = mtk_crypto_aead_gcm_cra_exit,
1519 .cra_module = THIS_MODULE,
1520 },
1521 },
1522};
1523
1524static int mtk_crypto_rfc4106_gcm_setkey(struct crypto_aead *ctfm, const u8 *key,
1525 unsigned int len)
1526{
1527 struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
1528 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1529
1530 /* last 4 bytes of key are the nonce! */
1531 ctx->nonce = *(u32 *)(key + len - CTR_RFC3686_NONCE_SIZE);
1532
1533 len -= CTR_RFC3686_NONCE_SIZE;
1534 return mtk_crypto_aead_gcm_setkey(ctfm, key, len);
1535}
1536
1537static int mtk_crypto_rfc4106_gcm_setauthsize(struct crypto_aead *tfm,
1538 unsigned int authsize)
1539{
1540 return crypto_rfc4106_check_authsize(authsize);
1541}
1542
1543static int mtk_crypto_rfc4106_encrypt(struct aead_request *req)
1544{
1545 return crypto_ipsec_check_assoclen(req->assoclen) ?:
1546 mtk_crypto_aead_encrypt(req);
1547}
1548
1549static int mtk_crypto_rfc4106_decrypt(struct aead_request *req)
1550{
1551 return crypto_ipsec_check_assoclen(req->assoclen) ?:
1552 mtk_crypto_aead_decrypt(req);
1553}
1554
1555static int mtk_crypto_rfc4106_gcm_cra_init(struct crypto_tfm *tfm)
1556{
1557 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1558 int ret;
1559
1560 ret = mtk_crypto_aead_gcm_cra_init(tfm);
1561 ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
1562 return ret;
1563}
1564
1565struct mtk_crypto_alg_template mtk_crypto_rfc4106_gcm = {
1566 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1567 .alg.aead = {
1568 .setkey = mtk_crypto_rfc4106_gcm_setkey,
1569 .setauthsize = mtk_crypto_rfc4106_gcm_setauthsize,
1570 .encrypt = mtk_crypto_rfc4106_encrypt,
1571 .decrypt = mtk_crypto_rfc4106_decrypt,
1572 .ivsize = GCM_RFC4106_IV_SIZE,
1573 .maxauthsize = GHASH_DIGEST_SIZE,
1574 .base = {
1575 .cra_name = "rfc4106(gcm(aes))",
1576 .cra_driver_name = "crypto-eip-rfc4106-gcm-aes",
1577 .cra_priority = MTK_CRYPTO_PRIORITY,
1578 .cra_flags = CRYPTO_ALG_ASYNC |
1579 CRYPTO_ALG_KERN_DRIVER_ONLY,
1580 .cra_blocksize = 1,
1581 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1582 .cra_alignmask = 0,
1583 .cra_init = mtk_crypto_rfc4106_gcm_cra_init,
1584 .cra_exit = mtk_crypto_aead_gcm_cra_exit,
1585 },
1586 },
1587};
1588
1589static int mtk_crypto_rfc4543_gcm_setauthsize(struct crypto_aead *tfm,
1590 unsigned int authsize)
1591{
1592 if (authsize != GHASH_DIGEST_SIZE)
1593 return -EINVAL;
1594
1595 return 0;
1596}
1597
1598static int mtk_crypto_rfc4543_gcm_cra_init(struct crypto_tfm *tfm)
1599{
1600 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1601 int ret;
1602
1603 ret = mtk_crypto_aead_gcm_cra_init(tfm);
1604 ctx->hash_alg = MTK_CRYPTO_ALG_GMAC;
1605 ctx->mode = MTK_CRYPTO_MODE_GMAC;
1606 ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
1607 return ret;
1608}
1609
1610struct mtk_crypto_alg_template mtk_crypto_rfc4543_gcm = {
1611 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1612 .alg.aead = {
1613 .setkey = mtk_crypto_rfc4106_gcm_setkey,
1614 .setauthsize = mtk_crypto_rfc4543_gcm_setauthsize,
1615 .encrypt = mtk_crypto_rfc4106_encrypt,
1616 .decrypt = mtk_crypto_rfc4106_decrypt,
1617 .ivsize = GCM_RFC4543_IV_SIZE,
1618 .maxauthsize = GHASH_DIGEST_SIZE,
1619 .base = {
1620 .cra_name = "rfc4543(gcm(aes))",
1621 .cra_driver_name = "crypto-eip-rfc4543-gcm-aes",
1622 .cra_priority = MTK_CRYPTO_PRIORITY,
1623 .cra_flags = CRYPTO_ALG_ASYNC |
1624 CRYPTO_ALG_KERN_DRIVER_ONLY,
1625 .cra_blocksize = 1,
1626 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1627 .cra_alignmask = 0,
1628 .cra_init = mtk_crypto_rfc4543_gcm_cra_init,
1629 .cra_exit = mtk_crypto_aead_gcm_cra_exit,
1630 },
1631 },
1632};
1633
1634static int mtk_crypto_aead_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
1635 unsigned int len)
1636{
1637 struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
1638 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1639 struct crypto_aes_ctx aes;
1640 int ret, i;
1641
1642 ret = aes_expandkey(&aes, key, len);
1643 if (ret) {
1644 memzero_explicit(&aes, sizeof(aes));
1645 return ret;
1646 }
1647
1648 for (i = 0; i < len / sizeof(u32); i++) {
1649 ctx->key[i] = cpu_to_le32(aes.key_enc[i]);
1650 ctx->ipad[i + 2 * AES_BLOCK_SIZE / sizeof(u32)] =
1651 cpu_to_be32(aes.key_enc[i]);
1652 }
1653
1654 ctx->key_len = len;
1655 ctx->state_sz = 2 * AES_BLOCK_SIZE + len;
1656 ctx->hash_alg = MTK_CRYPTO_ALG_CCM;
1657
1658 memzero_explicit(&aes, sizeof(aes));
1659 return 0;
1660}
1661
1662static int mtk_crypto_rfc4309_ccm_setkey(struct crypto_aead *ctfm, const u8 *key,
1663 unsigned int len)
1664{
1665 struct crypto_tfm *tfm = crypto_aead_tfm(ctfm);
1666 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1667
1668 *(u8 *) &ctx->nonce = 3;
1669 memcpy((u8 *) &ctx->nonce + 1, key + len -
1670 EIP197_AEAD_IPSEC_CCM_NONCE_SIZE,
1671 EIP197_AEAD_IPSEC_CCM_NONCE_SIZE);
1672
1673 len -= EIP197_AEAD_IPSEC_CCM_NONCE_SIZE;
1674 return mtk_crypto_aead_ccm_setkey(ctfm, key, len);
1675}
1676
1677static int mtk_crypto_rfc4309_ccm_setauthsize(struct crypto_aead *tfm,
1678 unsigned int authsize)
1679{
1680 switch (authsize) {
1681 case 8:
1682 case 12:
1683 case 16:
1684 break;
1685 default:
1686 return -EINVAL;
1687 }
1688
1689 return 0;
1690}
1691
1692static int mtk_crypto_rfc4309_ccm_encrypt(struct aead_request *req)
1693{
1694 struct mtk_crypto_cipher_req *creq = aead_request_ctx(req);
1695
1696 if (req->assoclen != 16 && req->assoclen != 20)
1697 return -EINVAL;
1698
1699 return mtk_crypto_queue_req(&req->base, creq, MTK_CRYPTO_ENCRYPT);
1700}
1701
1702static int mtk_crypto_rfc4309_ccm_decrypt(struct aead_request *req)
1703{
1704 struct mtk_crypto_cipher_req *creq = aead_request_ctx(req);
1705
1706 if (req->assoclen != 16 && req->assoclen != 20)
1707 return -EINVAL;
1708
1709 return mtk_crypto_queue_req(&req->base, creq, MTK_CRYPTO_DECRYPT);
1710}
1711
1712static int mtk_crypto_aead_ccm_cra_init(struct crypto_tfm *tfm)
1713{
1714 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1715
1716 mtk_crypto_aead_cra_init(tfm);
1717 ctx->hash_alg = MTK_CRYPTO_ALG_XCBC;
1718 ctx->state_sz = 3 * AES_BLOCK_SIZE;
1719 ctx->mode = MTK_CRYPTO_MODE_CCM;
1720
1721 return 0;
1722}
1723
1724static int mtk_crypto_rfc4309_ccm_cra_init(struct crypto_tfm *tfm)
1725{
1726 struct mtk_crypto_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
1727 int ret;
1728
1729 ret = mtk_crypto_aead_ccm_cra_init(tfm);
1730 ctx->aead = EIP197_AEAD_TYPE_IPSEC_ESP;
1731 return ret;
1732}
1733
1734struct mtk_crypto_alg_template mtk_crypto_rfc4309_ccm = {
1735 .type = MTK_CRYPTO_ALG_TYPE_AEAD,
1736 .alg.aead = {
1737 .setkey = mtk_crypto_rfc4309_ccm_setkey,
1738 .setauthsize = mtk_crypto_rfc4309_ccm_setauthsize,
1739 .encrypt = mtk_crypto_rfc4309_ccm_encrypt,
1740 .decrypt = mtk_crypto_rfc4309_ccm_decrypt,
1741 .ivsize = EIP197_AEAD_IPSEC_IV_SIZE,
1742 .maxauthsize = AES_BLOCK_SIZE,
1743 .base = {
1744 .cra_name = "rfc4309(ccm(aes))",
1745 .cra_driver_name = "crypto-eip-rfc4309-ccm-aes",
1746 .cra_priority = MTK_CRYPTO_PRIORITY,
1747 .cra_flags = CRYPTO_ALG_ASYNC |
1748 CRYPTO_ALG_KERN_DRIVER_ONLY,
1749 .cra_blocksize = 1,
1750 .cra_ctxsize = sizeof(struct mtk_crypto_cipher_ctx),
1751 .cra_alignmask = 0,
1752 .cra_init = mtk_crypto_rfc4309_ccm_cra_init,
1753 .cra_exit = mtk_crypto_aead_cra_exit,
1754 .cra_module = THIS_MODULE,
1755 },
1756 },
1757};
1758