GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / crypto / rockchip / rk3288_crypto_skcipher.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Crypto acceleration support for Rockchip RK3288
4  *
5  * Copyright (c) 2015, Fuzhou Rockchip Electronics Co., Ltd
6  *
7  * Author: Zain Wang <zain.wang@rock-chips.com>
8  *
9  * Some ideas are from marvell-cesa.c and s5p-sss.c driver.
10  */
11
12 #include <crypto/engine.h>
13 #include <crypto/internal/skcipher.h>
14 #include <crypto/scatterwalk.h>
15 #include <linux/device.h>
16 #include <linux/err.h>
17 #include <linux/kernel.h>
18 #include <linux/string.h>
19 #include "rk3288_crypto.h"
20
21 #define RK_CRYPTO_DEC                   BIT(0)
22
23 static int rk_cipher_need_fallback(struct skcipher_request *req)
24 {
25         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
26         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
27         struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher.base);
28         struct scatterlist *sgs, *sgd;
29         unsigned int stodo, dtodo, len;
30         unsigned int bs = crypto_skcipher_blocksize(tfm);
31
32         if (!req->cryptlen)
33                 return true;
34
35         len = req->cryptlen;
36         sgs = req->src;
37         sgd = req->dst;
38         while (sgs && sgd) {
39                 if (!IS_ALIGNED(sgs->offset, sizeof(u32))) {
40                         algt->stat_fb_align++;
41                         return true;
42                 }
43                 if (!IS_ALIGNED(sgd->offset, sizeof(u32))) {
44                         algt->stat_fb_align++;
45                         return true;
46                 }
47                 stodo = min(len, sgs->length);
48                 if (stodo % bs) {
49                         algt->stat_fb_len++;
50                         return true;
51                 }
52                 dtodo = min(len, sgd->length);
53                 if (dtodo % bs) {
54                         algt->stat_fb_len++;
55                         return true;
56                 }
57                 if (stodo != dtodo) {
58                         algt->stat_fb_sgdiff++;
59                         return true;
60                 }
61                 len -= stodo;
62                 sgs = sg_next(sgs);
63                 sgd = sg_next(sgd);
64         }
65         return false;
66 }
67
68 static int rk_cipher_fallback(struct skcipher_request *areq)
69 {
70         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
71         struct rk_cipher_ctx *op = crypto_skcipher_ctx(tfm);
72         struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
73         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
74         struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher.base);
75         int err;
76
77         algt->stat_fb++;
78
79         skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm);
80         skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags,
81                                       areq->base.complete, areq->base.data);
82         skcipher_request_set_crypt(&rctx->fallback_req, areq->src, areq->dst,
83                                    areq->cryptlen, areq->iv);
84         if (rctx->mode & RK_CRYPTO_DEC)
85                 err = crypto_skcipher_decrypt(&rctx->fallback_req);
86         else
87                 err = crypto_skcipher_encrypt(&rctx->fallback_req);
88         return err;
89 }
90
91 static int rk_cipher_handle_req(struct skcipher_request *req)
92 {
93         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
94         struct rk_crypto_info *rkc;
95         struct crypto_engine *engine;
96
97         if (rk_cipher_need_fallback(req))
98                 return rk_cipher_fallback(req);
99
100         rkc = get_rk_crypto();
101
102         engine = rkc->engine;
103         rctx->dev = rkc;
104
105         return crypto_transfer_skcipher_request_to_engine(engine, req);
106 }
107
108 static int rk_aes_setkey(struct crypto_skcipher *cipher,
109                          const u8 *key, unsigned int keylen)
110 {
111         struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
112         struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
113
114         if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
115             keylen != AES_KEYSIZE_256)
116                 return -EINVAL;
117         ctx->keylen = keylen;
118         memcpy(ctx->key, key, keylen);
119
120         return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
121 }
122
123 static int rk_des_setkey(struct crypto_skcipher *cipher,
124                          const u8 *key, unsigned int keylen)
125 {
126         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
127         int err;
128
129         err = verify_skcipher_des_key(cipher, key);
130         if (err)
131                 return err;
132
133         ctx->keylen = keylen;
134         memcpy(ctx->key, key, keylen);
135
136         return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
137 }
138
139 static int rk_tdes_setkey(struct crypto_skcipher *cipher,
140                           const u8 *key, unsigned int keylen)
141 {
142         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
143         int err;
144
145         err = verify_skcipher_des3_key(cipher, key);
146         if (err)
147                 return err;
148
149         ctx->keylen = keylen;
150         memcpy(ctx->key, key, keylen);
151
152         return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen);
153 }
154
155 static int rk_aes_ecb_encrypt(struct skcipher_request *req)
156 {
157         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
158
159         rctx->mode = RK_CRYPTO_AES_ECB_MODE;
160         return rk_cipher_handle_req(req);
161 }
162
163 static int rk_aes_ecb_decrypt(struct skcipher_request *req)
164 {
165         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
166
167         rctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
168         return rk_cipher_handle_req(req);
169 }
170
171 static int rk_aes_cbc_encrypt(struct skcipher_request *req)
172 {
173         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
174
175         rctx->mode = RK_CRYPTO_AES_CBC_MODE;
176         return rk_cipher_handle_req(req);
177 }
178
179 static int rk_aes_cbc_decrypt(struct skcipher_request *req)
180 {
181         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
182
183         rctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
184         return rk_cipher_handle_req(req);
185 }
186
187 static int rk_des_ecb_encrypt(struct skcipher_request *req)
188 {
189         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
190
191         rctx->mode = 0;
192         return rk_cipher_handle_req(req);
193 }
194
195 static int rk_des_ecb_decrypt(struct skcipher_request *req)
196 {
197         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
198
199         rctx->mode = RK_CRYPTO_DEC;
200         return rk_cipher_handle_req(req);
201 }
202
203 static int rk_des_cbc_encrypt(struct skcipher_request *req)
204 {
205         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
206
207         rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC;
208         return rk_cipher_handle_req(req);
209 }
210
211 static int rk_des_cbc_decrypt(struct skcipher_request *req)
212 {
213         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
214
215         rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC;
216         return rk_cipher_handle_req(req);
217 }
218
219 static int rk_des3_ede_ecb_encrypt(struct skcipher_request *req)
220 {
221         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
222
223         rctx->mode = RK_CRYPTO_TDES_SELECT;
224         return rk_cipher_handle_req(req);
225 }
226
227 static int rk_des3_ede_ecb_decrypt(struct skcipher_request *req)
228 {
229         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
230
231         rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC;
232         return rk_cipher_handle_req(req);
233 }
234
235 static int rk_des3_ede_cbc_encrypt(struct skcipher_request *req)
236 {
237         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
238
239         rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC;
240         return rk_cipher_handle_req(req);
241 }
242
243 static int rk_des3_ede_cbc_decrypt(struct skcipher_request *req)
244 {
245         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
246
247         rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC |
248                     RK_CRYPTO_DEC;
249         return rk_cipher_handle_req(req);
250 }
251
252 static void rk_cipher_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req)
253 {
254         struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
255         struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
256         struct rk_cipher_rctx *rctx = skcipher_request_ctx(req);
257         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
258         u32 block, conf_reg = 0;
259
260         block = crypto_tfm_alg_blocksize(tfm);
261
262         if (block == DES_BLOCK_SIZE) {
263                 rctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
264                              RK_CRYPTO_TDES_BYTESWAP_KEY |
265                              RK_CRYPTO_TDES_BYTESWAP_IV;
266                 CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode);
267                 memcpy_toio(dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen);
268                 conf_reg = RK_CRYPTO_DESSEL;
269         } else {
270                 rctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
271                              RK_CRYPTO_AES_KEY_CHANGE |
272                              RK_CRYPTO_AES_BYTESWAP_KEY |
273                              RK_CRYPTO_AES_BYTESWAP_IV;
274                 if (ctx->keylen == AES_KEYSIZE_192)
275                         rctx->mode |= RK_CRYPTO_AES_192BIT_key;
276                 else if (ctx->keylen == AES_KEYSIZE_256)
277                         rctx->mode |= RK_CRYPTO_AES_256BIT_key;
278                 CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode);
279                 memcpy_toio(dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen);
280         }
281         conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
282                     RK_CRYPTO_BYTESWAP_BRFIFO;
283         CRYPTO_WRITE(dev, RK_CRYPTO_CONF, conf_reg);
284         CRYPTO_WRITE(dev, RK_CRYPTO_INTENA,
285                      RK_CRYPTO_BCDMA_ERR_ENA | RK_CRYPTO_BCDMA_DONE_ENA);
286 }
287
288 static void crypto_dma_start(struct rk_crypto_info *dev,
289                              struct scatterlist *sgs,
290                              struct scatterlist *sgd, unsigned int todo)
291 {
292         CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, sg_dma_address(sgs));
293         CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, todo);
294         CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, sg_dma_address(sgd));
295         CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
296                      _SBF(RK_CRYPTO_BLOCK_START, 16));
297 }
298
299 static int rk_cipher_run(struct crypto_engine *engine, void *async_req)
300 {
301         struct skcipher_request *areq = container_of(async_req, struct skcipher_request, base);
302         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq);
303         struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq);
304         struct scatterlist *sgs, *sgd;
305         int err = 0;
306         int ivsize = crypto_skcipher_ivsize(tfm);
307         int offset;
308         u8 iv[AES_BLOCK_SIZE];
309         u8 biv[AES_BLOCK_SIZE];
310         u8 *ivtouse = areq->iv;
311         unsigned int len = areq->cryptlen;
312         unsigned int todo;
313         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
314         struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher.base);
315         struct rk_crypto_info *rkc = rctx->dev;
316
317         err = pm_runtime_resume_and_get(rkc->dev);
318         if (err)
319                 return err;
320
321         algt->stat_req++;
322         rkc->nreq++;
323
324         ivsize = crypto_skcipher_ivsize(tfm);
325         if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
326                 if (rctx->mode & RK_CRYPTO_DEC) {
327                         offset = areq->cryptlen - ivsize;
328                         scatterwalk_map_and_copy(rctx->backup_iv, areq->src,
329                                                  offset, ivsize, 0);
330                 }
331         }
332
333         sgs = areq->src;
334         sgd = areq->dst;
335
336         while (sgs && sgd && len) {
337                 if (!sgs->length) {
338                         sgs = sg_next(sgs);
339                         sgd = sg_next(sgd);
340                         continue;
341                 }
342                 if (rctx->mode & RK_CRYPTO_DEC) {
343                         /* we backup last block of source to be used as IV at next step */
344                         offset = sgs->length - ivsize;
345                         scatterwalk_map_and_copy(biv, sgs, offset, ivsize, 0);
346                 }
347                 if (sgs == sgd) {
348                         err = dma_map_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
349                         if (err <= 0) {
350                                 err = -EINVAL;
351                                 goto theend_iv;
352                         }
353                 } else {
354                         err = dma_map_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
355                         if (err <= 0) {
356                                 err = -EINVAL;
357                                 goto theend_iv;
358                         }
359                         err = dma_map_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
360                         if (err <= 0) {
361                                 err = -EINVAL;
362                                 goto theend_sgs;
363                         }
364                 }
365                 err = 0;
366                 rk_cipher_hw_init(rkc, areq);
367                 if (ivsize) {
368                         if (ivsize == DES_BLOCK_SIZE)
369                                 memcpy_toio(rkc->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
370                         else
371                                 memcpy_toio(rkc->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize);
372                 }
373                 reinit_completion(&rkc->complete);
374                 rkc->status = 0;
375
376                 todo = min(sg_dma_len(sgs), len);
377                 len -= todo;
378                 crypto_dma_start(rkc, sgs, sgd, todo / 4);
379                 wait_for_completion_interruptible_timeout(&rkc->complete,
380                                                           msecs_to_jiffies(2000));
381                 if (!rkc->status) {
382                         dev_err(rkc->dev, "DMA timeout\n");
383                         err = -EFAULT;
384                         goto theend;
385                 }
386                 if (sgs == sgd) {
387                         dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
388                 } else {
389                         dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
390                         dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
391                 }
392                 if (rctx->mode & RK_CRYPTO_DEC) {
393                         memcpy(iv, biv, ivsize);
394                         ivtouse = iv;
395                 } else {
396                         offset = sgd->length - ivsize;
397                         scatterwalk_map_and_copy(iv, sgd, offset, ivsize, 0);
398                         ivtouse = iv;
399                 }
400                 sgs = sg_next(sgs);
401                 sgd = sg_next(sgd);
402         }
403
404         if (areq->iv && ivsize > 0) {
405                 offset = areq->cryptlen - ivsize;
406                 if (rctx->mode & RK_CRYPTO_DEC) {
407                         memcpy(areq->iv, rctx->backup_iv, ivsize);
408                         memzero_explicit(rctx->backup_iv, ivsize);
409                 } else {
410                         scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
411                                                  ivsize, 0);
412                 }
413         }
414
415 theend:
416         pm_runtime_put_autosuspend(rkc->dev);
417
418         local_bh_disable();
419         crypto_finalize_skcipher_request(engine, areq, err);
420         local_bh_enable();
421         return 0;
422
423 theend_sgs:
424         if (sgs == sgd) {
425                 dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
426         } else {
427                 dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
428                 dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
429         }
430 theend_iv:
431         return err;
432 }
433
434 static int rk_cipher_tfm_init(struct crypto_skcipher *tfm)
435 {
436         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
437         const char *name = crypto_tfm_alg_name(&tfm->base);
438         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
439         struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher.base);
440
441         ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
442         if (IS_ERR(ctx->fallback_tfm)) {
443                 dev_err(algt->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
444                         name, PTR_ERR(ctx->fallback_tfm));
445                 return PTR_ERR(ctx->fallback_tfm);
446         }
447
448         tfm->reqsize = sizeof(struct rk_cipher_rctx) +
449                 crypto_skcipher_reqsize(ctx->fallback_tfm);
450
451         return 0;
452 }
453
454 static void rk_cipher_tfm_exit(struct crypto_skcipher *tfm)
455 {
456         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
457
458         memzero_explicit(ctx->key, ctx->keylen);
459         crypto_free_skcipher(ctx->fallback_tfm);
460 }
461
462 struct rk_crypto_tmp rk_ecb_aes_alg = {
463         .type = CRYPTO_ALG_TYPE_SKCIPHER,
464         .alg.skcipher.base = {
465                 .base.cra_name          = "ecb(aes)",
466                 .base.cra_driver_name   = "ecb-aes-rk",
467                 .base.cra_priority      = 300,
468                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
469                 .base.cra_blocksize     = AES_BLOCK_SIZE,
470                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
471                 .base.cra_alignmask     = 0x0f,
472                 .base.cra_module        = THIS_MODULE,
473
474                 .init                   = rk_cipher_tfm_init,
475                 .exit                   = rk_cipher_tfm_exit,
476                 .min_keysize            = AES_MIN_KEY_SIZE,
477                 .max_keysize            = AES_MAX_KEY_SIZE,
478                 .setkey                 = rk_aes_setkey,
479                 .encrypt                = rk_aes_ecb_encrypt,
480                 .decrypt                = rk_aes_ecb_decrypt,
481         },
482         .alg.skcipher.op = {
483                 .do_one_request = rk_cipher_run,
484         },
485 };
486
487 struct rk_crypto_tmp rk_cbc_aes_alg = {
488         .type = CRYPTO_ALG_TYPE_SKCIPHER,
489         .alg.skcipher.base = {
490                 .base.cra_name          = "cbc(aes)",
491                 .base.cra_driver_name   = "cbc-aes-rk",
492                 .base.cra_priority      = 300,
493                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
494                 .base.cra_blocksize     = AES_BLOCK_SIZE,
495                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
496                 .base.cra_alignmask     = 0x0f,
497                 .base.cra_module        = THIS_MODULE,
498
499                 .init                   = rk_cipher_tfm_init,
500                 .exit                   = rk_cipher_tfm_exit,
501                 .min_keysize            = AES_MIN_KEY_SIZE,
502                 .max_keysize            = AES_MAX_KEY_SIZE,
503                 .ivsize                 = AES_BLOCK_SIZE,
504                 .setkey                 = rk_aes_setkey,
505                 .encrypt                = rk_aes_cbc_encrypt,
506                 .decrypt                = rk_aes_cbc_decrypt,
507         },
508         .alg.skcipher.op = {
509                 .do_one_request = rk_cipher_run,
510         },
511 };
512
513 struct rk_crypto_tmp rk_ecb_des_alg = {
514         .type = CRYPTO_ALG_TYPE_SKCIPHER,
515         .alg.skcipher.base = {
516                 .base.cra_name          = "ecb(des)",
517                 .base.cra_driver_name   = "ecb-des-rk",
518                 .base.cra_priority      = 300,
519                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
520                 .base.cra_blocksize     = DES_BLOCK_SIZE,
521                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
522                 .base.cra_alignmask     = 0x07,
523                 .base.cra_module        = THIS_MODULE,
524
525                 .init                   = rk_cipher_tfm_init,
526                 .exit                   = rk_cipher_tfm_exit,
527                 .min_keysize            = DES_KEY_SIZE,
528                 .max_keysize            = DES_KEY_SIZE,
529                 .setkey                 = rk_des_setkey,
530                 .encrypt                = rk_des_ecb_encrypt,
531                 .decrypt                = rk_des_ecb_decrypt,
532         },
533         .alg.skcipher.op = {
534                 .do_one_request = rk_cipher_run,
535         },
536 };
537
538 struct rk_crypto_tmp rk_cbc_des_alg = {
539         .type = CRYPTO_ALG_TYPE_SKCIPHER,
540         .alg.skcipher.base = {
541                 .base.cra_name          = "cbc(des)",
542                 .base.cra_driver_name   = "cbc-des-rk",
543                 .base.cra_priority      = 300,
544                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
545                 .base.cra_blocksize     = DES_BLOCK_SIZE,
546                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
547                 .base.cra_alignmask     = 0x07,
548                 .base.cra_module        = THIS_MODULE,
549
550                 .init                   = rk_cipher_tfm_init,
551                 .exit                   = rk_cipher_tfm_exit,
552                 .min_keysize            = DES_KEY_SIZE,
553                 .max_keysize            = DES_KEY_SIZE,
554                 .ivsize                 = DES_BLOCK_SIZE,
555                 .setkey                 = rk_des_setkey,
556                 .encrypt                = rk_des_cbc_encrypt,
557                 .decrypt                = rk_des_cbc_decrypt,
558         },
559         .alg.skcipher.op = {
560                 .do_one_request = rk_cipher_run,
561         },
562 };
563
564 struct rk_crypto_tmp rk_ecb_des3_ede_alg = {
565         .type = CRYPTO_ALG_TYPE_SKCIPHER,
566         .alg.skcipher.base = {
567                 .base.cra_name          = "ecb(des3_ede)",
568                 .base.cra_driver_name   = "ecb-des3-ede-rk",
569                 .base.cra_priority      = 300,
570                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
571                 .base.cra_blocksize     = DES_BLOCK_SIZE,
572                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
573                 .base.cra_alignmask     = 0x07,
574                 .base.cra_module        = THIS_MODULE,
575
576                 .init                   = rk_cipher_tfm_init,
577                 .exit                   = rk_cipher_tfm_exit,
578                 .min_keysize            = DES3_EDE_KEY_SIZE,
579                 .max_keysize            = DES3_EDE_KEY_SIZE,
580                 .setkey                 = rk_tdes_setkey,
581                 .encrypt                = rk_des3_ede_ecb_encrypt,
582                 .decrypt                = rk_des3_ede_ecb_decrypt,
583         },
584         .alg.skcipher.op = {
585                 .do_one_request = rk_cipher_run,
586         },
587 };
588
589 struct rk_crypto_tmp rk_cbc_des3_ede_alg = {
590         .type = CRYPTO_ALG_TYPE_SKCIPHER,
591         .alg.skcipher.base = {
592                 .base.cra_name          = "cbc(des3_ede)",
593                 .base.cra_driver_name   = "cbc-des3-ede-rk",
594                 .base.cra_priority      = 300,
595                 .base.cra_flags         = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
596                 .base.cra_blocksize     = DES_BLOCK_SIZE,
597                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
598                 .base.cra_alignmask     = 0x07,
599                 .base.cra_module        = THIS_MODULE,
600
601                 .init                   = rk_cipher_tfm_init,
602                 .exit                   = rk_cipher_tfm_exit,
603                 .min_keysize            = DES3_EDE_KEY_SIZE,
604                 .max_keysize            = DES3_EDE_KEY_SIZE,
605                 .ivsize                 = DES_BLOCK_SIZE,
606                 .setkey                 = rk_tdes_setkey,
607                 .encrypt                = rk_des3_ede_cbc_encrypt,
608                 .decrypt                = rk_des3_ede_cbc_decrypt,
609         },
610         .alg.skcipher.op = {
611                 .do_one_request = rk_cipher_run,
612         },
613 };