GNU Linux-libre 5.16.19-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 #include <linux/device.h>
12 #include "rk3288_crypto.h"
13
14 #define RK_CRYPTO_DEC                   BIT(0)
15
16 static void rk_crypto_complete(struct crypto_async_request *base, int err)
17 {
18         if (base->complete)
19                 base->complete(base, err);
20 }
21
22 static int rk_handle_req(struct rk_crypto_info *dev,
23                          struct skcipher_request *req)
24 {
25         if (!IS_ALIGNED(req->cryptlen, dev->align_size))
26                 return -EINVAL;
27         else
28                 return dev->enqueue(dev, &req->base);
29 }
30
31 static int rk_aes_setkey(struct crypto_skcipher *cipher,
32                          const u8 *key, unsigned int keylen)
33 {
34         struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
35         struct rk_cipher_ctx *ctx = crypto_tfm_ctx(tfm);
36
37         if (keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_192 &&
38             keylen != AES_KEYSIZE_256)
39                 return -EINVAL;
40         ctx->keylen = keylen;
41         memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, key, keylen);
42         return 0;
43 }
44
45 static int rk_des_setkey(struct crypto_skcipher *cipher,
46                          const u8 *key, unsigned int keylen)
47 {
48         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
49         int err;
50
51         err = verify_skcipher_des_key(cipher, key);
52         if (err)
53                 return err;
54
55         ctx->keylen = keylen;
56         memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
57         return 0;
58 }
59
60 static int rk_tdes_setkey(struct crypto_skcipher *cipher,
61                           const u8 *key, unsigned int keylen)
62 {
63         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
64         int err;
65
66         err = verify_skcipher_des3_key(cipher, key);
67         if (err)
68                 return err;
69
70         ctx->keylen = keylen;
71         memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen);
72         return 0;
73 }
74
75 static int rk_aes_ecb_encrypt(struct skcipher_request *req)
76 {
77         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
78         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
79         struct rk_crypto_info *dev = ctx->dev;
80
81         ctx->mode = RK_CRYPTO_AES_ECB_MODE;
82         return rk_handle_req(dev, req);
83 }
84
85 static int rk_aes_ecb_decrypt(struct skcipher_request *req)
86 {
87         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
88         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
89         struct rk_crypto_info *dev = ctx->dev;
90
91         ctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC;
92         return rk_handle_req(dev, req);
93 }
94
95 static int rk_aes_cbc_encrypt(struct skcipher_request *req)
96 {
97         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
98         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
99         struct rk_crypto_info *dev = ctx->dev;
100
101         ctx->mode = RK_CRYPTO_AES_CBC_MODE;
102         return rk_handle_req(dev, req);
103 }
104
105 static int rk_aes_cbc_decrypt(struct skcipher_request *req)
106 {
107         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
108         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
109         struct rk_crypto_info *dev = ctx->dev;
110
111         ctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC;
112         return rk_handle_req(dev, req);
113 }
114
115 static int rk_des_ecb_encrypt(struct skcipher_request *req)
116 {
117         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
118         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
119         struct rk_crypto_info *dev = ctx->dev;
120
121         ctx->mode = 0;
122         return rk_handle_req(dev, req);
123 }
124
125 static int rk_des_ecb_decrypt(struct skcipher_request *req)
126 {
127         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
128         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
129         struct rk_crypto_info *dev = ctx->dev;
130
131         ctx->mode = RK_CRYPTO_DEC;
132         return rk_handle_req(dev, req);
133 }
134
135 static int rk_des_cbc_encrypt(struct skcipher_request *req)
136 {
137         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
138         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
139         struct rk_crypto_info *dev = ctx->dev;
140
141         ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC;
142         return rk_handle_req(dev, req);
143 }
144
145 static int rk_des_cbc_decrypt(struct skcipher_request *req)
146 {
147         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
148         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
149         struct rk_crypto_info *dev = ctx->dev;
150
151         ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC;
152         return rk_handle_req(dev, req);
153 }
154
155 static int rk_des3_ede_ecb_encrypt(struct skcipher_request *req)
156 {
157         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
158         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
159         struct rk_crypto_info *dev = ctx->dev;
160
161         ctx->mode = RK_CRYPTO_TDES_SELECT;
162         return rk_handle_req(dev, req);
163 }
164
165 static int rk_des3_ede_ecb_decrypt(struct skcipher_request *req)
166 {
167         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
168         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
169         struct rk_crypto_info *dev = ctx->dev;
170
171         ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC;
172         return rk_handle_req(dev, req);
173 }
174
175 static int rk_des3_ede_cbc_encrypt(struct skcipher_request *req)
176 {
177         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
178         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
179         struct rk_crypto_info *dev = ctx->dev;
180
181         ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC;
182         return rk_handle_req(dev, req);
183 }
184
185 static int rk_des3_ede_cbc_decrypt(struct skcipher_request *req)
186 {
187         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
188         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
189         struct rk_crypto_info *dev = ctx->dev;
190
191         ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC |
192                     RK_CRYPTO_DEC;
193         return rk_handle_req(dev, req);
194 }
195
196 static void rk_ablk_hw_init(struct rk_crypto_info *dev)
197 {
198         struct skcipher_request *req =
199                 skcipher_request_cast(dev->async_req);
200         struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req);
201         struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher);
202         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher);
203         u32 ivsize, block, conf_reg = 0;
204
205         block = crypto_tfm_alg_blocksize(tfm);
206         ivsize = crypto_skcipher_ivsize(cipher);
207
208         if (block == DES_BLOCK_SIZE) {
209                 ctx->mode |= RK_CRYPTO_TDES_FIFO_MODE |
210                              RK_CRYPTO_TDES_BYTESWAP_KEY |
211                              RK_CRYPTO_TDES_BYTESWAP_IV;
212                 CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, ctx->mode);
213                 memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize);
214                 conf_reg = RK_CRYPTO_DESSEL;
215         } else {
216                 ctx->mode |= RK_CRYPTO_AES_FIFO_MODE |
217                              RK_CRYPTO_AES_KEY_CHANGE |
218                              RK_CRYPTO_AES_BYTESWAP_KEY |
219                              RK_CRYPTO_AES_BYTESWAP_IV;
220                 if (ctx->keylen == AES_KEYSIZE_192)
221                         ctx->mode |= RK_CRYPTO_AES_192BIT_key;
222                 else if (ctx->keylen == AES_KEYSIZE_256)
223                         ctx->mode |= RK_CRYPTO_AES_256BIT_key;
224                 CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, ctx->mode);
225                 memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize);
226         }
227         conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO |
228                     RK_CRYPTO_BYTESWAP_BRFIFO;
229         CRYPTO_WRITE(dev, RK_CRYPTO_CONF, conf_reg);
230         CRYPTO_WRITE(dev, RK_CRYPTO_INTENA,
231                      RK_CRYPTO_BCDMA_ERR_ENA | RK_CRYPTO_BCDMA_DONE_ENA);
232 }
233
234 static void crypto_dma_start(struct rk_crypto_info *dev)
235 {
236         CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, dev->addr_in);
237         CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, dev->count / 4);
238         CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, dev->addr_out);
239         CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START |
240                      _SBF(RK_CRYPTO_BLOCK_START, 16));
241 }
242
243 static int rk_set_data_start(struct rk_crypto_info *dev)
244 {
245         int err;
246         struct skcipher_request *req =
247                 skcipher_request_cast(dev->async_req);
248         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
249         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
250         u32 ivsize = crypto_skcipher_ivsize(tfm);
251         u8 *src_last_blk = page_address(sg_page(dev->sg_src)) +
252                 dev->sg_src->offset + dev->sg_src->length - ivsize;
253
254         /* Store the iv that need to be updated in chain mode.
255          * And update the IV buffer to contain the next IV for decryption mode.
256          */
257         if (ctx->mode & RK_CRYPTO_DEC) {
258                 memcpy(ctx->iv, src_last_blk, ivsize);
259                 sg_pcopy_to_buffer(dev->first, dev->src_nents, req->iv,
260                                    ivsize, dev->total - ivsize);
261         }
262
263         err = dev->load_data(dev, dev->sg_src, dev->sg_dst);
264         if (!err)
265                 crypto_dma_start(dev);
266         return err;
267 }
268
269 static int rk_ablk_start(struct rk_crypto_info *dev)
270 {
271         struct skcipher_request *req =
272                 skcipher_request_cast(dev->async_req);
273         unsigned long flags;
274         int err = 0;
275
276         dev->left_bytes = req->cryptlen;
277         dev->total = req->cryptlen;
278         dev->sg_src = req->src;
279         dev->first = req->src;
280         dev->src_nents = sg_nents(req->src);
281         dev->sg_dst = req->dst;
282         dev->dst_nents = sg_nents(req->dst);
283         dev->aligned = 1;
284
285         spin_lock_irqsave(&dev->lock, flags);
286         rk_ablk_hw_init(dev);
287         err = rk_set_data_start(dev);
288         spin_unlock_irqrestore(&dev->lock, flags);
289         return err;
290 }
291
292 static void rk_iv_copyback(struct rk_crypto_info *dev)
293 {
294         struct skcipher_request *req =
295                 skcipher_request_cast(dev->async_req);
296         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
297         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
298         u32 ivsize = crypto_skcipher_ivsize(tfm);
299
300         /* Update the IV buffer to contain the next IV for encryption mode. */
301         if (!(ctx->mode & RK_CRYPTO_DEC)) {
302                 if (dev->aligned) {
303                         memcpy(req->iv, sg_virt(dev->sg_dst) +
304                                 dev->sg_dst->length - ivsize, ivsize);
305                 } else {
306                         memcpy(req->iv, dev->addr_vir +
307                                 dev->count - ivsize, ivsize);
308                 }
309         }
310 }
311
312 static void rk_update_iv(struct rk_crypto_info *dev)
313 {
314         struct skcipher_request *req =
315                 skcipher_request_cast(dev->async_req);
316         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
317         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
318         u32 ivsize = crypto_skcipher_ivsize(tfm);
319         u8 *new_iv = NULL;
320
321         if (ctx->mode & RK_CRYPTO_DEC) {
322                 new_iv = ctx->iv;
323         } else {
324                 new_iv = page_address(sg_page(dev->sg_dst)) +
325                          dev->sg_dst->offset + dev->sg_dst->length - ivsize;
326         }
327
328         if (ivsize == DES_BLOCK_SIZE)
329                 memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize);
330         else if (ivsize == AES_BLOCK_SIZE)
331                 memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize);
332 }
333
334 /* return:
335  *      true    some err was occurred
336  *      fault   no err, continue
337  */
338 static int rk_ablk_rx(struct rk_crypto_info *dev)
339 {
340         int err = 0;
341         struct skcipher_request *req =
342                 skcipher_request_cast(dev->async_req);
343
344         dev->unload_data(dev);
345         if (!dev->aligned) {
346                 if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents,
347                                           dev->addr_vir, dev->count,
348                                           dev->total - dev->left_bytes -
349                                           dev->count)) {
350                         err = -EINVAL;
351                         goto out_rx;
352                 }
353         }
354         if (dev->left_bytes) {
355                 rk_update_iv(dev);
356                 if (dev->aligned) {
357                         if (sg_is_last(dev->sg_src)) {
358                                 dev_err(dev->dev, "[%s:%d] Lack of data\n",
359                                         __func__, __LINE__);
360                                 err = -ENOMEM;
361                                 goto out_rx;
362                         }
363                         dev->sg_src = sg_next(dev->sg_src);
364                         dev->sg_dst = sg_next(dev->sg_dst);
365                 }
366                 err = rk_set_data_start(dev);
367         } else {
368                 rk_iv_copyback(dev);
369                 /* here show the calculation is over without any err */
370                 dev->complete(dev->async_req, 0);
371                 tasklet_schedule(&dev->queue_task);
372         }
373 out_rx:
374         return err;
375 }
376
377 static int rk_ablk_init_tfm(struct crypto_skcipher *tfm)
378 {
379         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
380         struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
381         struct rk_crypto_tmp *algt;
382
383         algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher);
384
385         ctx->dev = algt->dev;
386         ctx->dev->align_size = crypto_tfm_alg_alignmask(crypto_skcipher_tfm(tfm)) + 1;
387         ctx->dev->start = rk_ablk_start;
388         ctx->dev->update = rk_ablk_rx;
389         ctx->dev->complete = rk_crypto_complete;
390         ctx->dev->addr_vir = (char *)__get_free_page(GFP_KERNEL);
391
392         return ctx->dev->addr_vir ? ctx->dev->enable_clk(ctx->dev) : -ENOMEM;
393 }
394
395 static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm)
396 {
397         struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
398
399         free_page((unsigned long)ctx->dev->addr_vir);
400         ctx->dev->disable_clk(ctx->dev);
401 }
402
403 struct rk_crypto_tmp rk_ecb_aes_alg = {
404         .type = ALG_TYPE_CIPHER,
405         .alg.skcipher = {
406                 .base.cra_name          = "ecb(aes)",
407                 .base.cra_driver_name   = "ecb-aes-rk",
408                 .base.cra_priority      = 300,
409                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
410                 .base.cra_blocksize     = AES_BLOCK_SIZE,
411                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
412                 .base.cra_alignmask     = 0x0f,
413                 .base.cra_module        = THIS_MODULE,
414
415                 .init                   = rk_ablk_init_tfm,
416                 .exit                   = rk_ablk_exit_tfm,
417                 .min_keysize            = AES_MIN_KEY_SIZE,
418                 .max_keysize            = AES_MAX_KEY_SIZE,
419                 .setkey                 = rk_aes_setkey,
420                 .encrypt                = rk_aes_ecb_encrypt,
421                 .decrypt                = rk_aes_ecb_decrypt,
422         }
423 };
424
425 struct rk_crypto_tmp rk_cbc_aes_alg = {
426         .type = ALG_TYPE_CIPHER,
427         .alg.skcipher = {
428                 .base.cra_name          = "cbc(aes)",
429                 .base.cra_driver_name   = "cbc-aes-rk",
430                 .base.cra_priority      = 300,
431                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
432                 .base.cra_blocksize     = AES_BLOCK_SIZE,
433                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
434                 .base.cra_alignmask     = 0x0f,
435                 .base.cra_module        = THIS_MODULE,
436
437                 .init                   = rk_ablk_init_tfm,
438                 .exit                   = rk_ablk_exit_tfm,
439                 .min_keysize            = AES_MIN_KEY_SIZE,
440                 .max_keysize            = AES_MAX_KEY_SIZE,
441                 .ivsize                 = AES_BLOCK_SIZE,
442                 .setkey                 = rk_aes_setkey,
443                 .encrypt                = rk_aes_cbc_encrypt,
444                 .decrypt                = rk_aes_cbc_decrypt,
445         }
446 };
447
448 struct rk_crypto_tmp rk_ecb_des_alg = {
449         .type = ALG_TYPE_CIPHER,
450         .alg.skcipher = {
451                 .base.cra_name          = "ecb(des)",
452                 .base.cra_driver_name   = "ecb-des-rk",
453                 .base.cra_priority      = 300,
454                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
455                 .base.cra_blocksize     = DES_BLOCK_SIZE,
456                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
457                 .base.cra_alignmask     = 0x07,
458                 .base.cra_module        = THIS_MODULE,
459
460                 .init                   = rk_ablk_init_tfm,
461                 .exit                   = rk_ablk_exit_tfm,
462                 .min_keysize            = DES_KEY_SIZE,
463                 .max_keysize            = DES_KEY_SIZE,
464                 .setkey                 = rk_des_setkey,
465                 .encrypt                = rk_des_ecb_encrypt,
466                 .decrypt                = rk_des_ecb_decrypt,
467         }
468 };
469
470 struct rk_crypto_tmp rk_cbc_des_alg = {
471         .type = ALG_TYPE_CIPHER,
472         .alg.skcipher = {
473                 .base.cra_name          = "cbc(des)",
474                 .base.cra_driver_name   = "cbc-des-rk",
475                 .base.cra_priority      = 300,
476                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
477                 .base.cra_blocksize     = DES_BLOCK_SIZE,
478                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
479                 .base.cra_alignmask     = 0x07,
480                 .base.cra_module        = THIS_MODULE,
481
482                 .init                   = rk_ablk_init_tfm,
483                 .exit                   = rk_ablk_exit_tfm,
484                 .min_keysize            = DES_KEY_SIZE,
485                 .max_keysize            = DES_KEY_SIZE,
486                 .ivsize                 = DES_BLOCK_SIZE,
487                 .setkey                 = rk_des_setkey,
488                 .encrypt                = rk_des_cbc_encrypt,
489                 .decrypt                = rk_des_cbc_decrypt,
490         }
491 };
492
493 struct rk_crypto_tmp rk_ecb_des3_ede_alg = {
494         .type = ALG_TYPE_CIPHER,
495         .alg.skcipher = {
496                 .base.cra_name          = "ecb(des3_ede)",
497                 .base.cra_driver_name   = "ecb-des3-ede-rk",
498                 .base.cra_priority      = 300,
499                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
500                 .base.cra_blocksize     = DES_BLOCK_SIZE,
501                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
502                 .base.cra_alignmask     = 0x07,
503                 .base.cra_module        = THIS_MODULE,
504
505                 .init                   = rk_ablk_init_tfm,
506                 .exit                   = rk_ablk_exit_tfm,
507                 .min_keysize            = DES3_EDE_KEY_SIZE,
508                 .max_keysize            = DES3_EDE_KEY_SIZE,
509                 .setkey                 = rk_tdes_setkey,
510                 .encrypt                = rk_des3_ede_ecb_encrypt,
511                 .decrypt                = rk_des3_ede_ecb_decrypt,
512         }
513 };
514
515 struct rk_crypto_tmp rk_cbc_des3_ede_alg = {
516         .type = ALG_TYPE_CIPHER,
517         .alg.skcipher = {
518                 .base.cra_name          = "cbc(des3_ede)",
519                 .base.cra_driver_name   = "cbc-des3-ede-rk",
520                 .base.cra_priority      = 300,
521                 .base.cra_flags         = CRYPTO_ALG_ASYNC,
522                 .base.cra_blocksize     = DES_BLOCK_SIZE,
523                 .base.cra_ctxsize       = sizeof(struct rk_cipher_ctx),
524                 .base.cra_alignmask     = 0x07,
525                 .base.cra_module        = THIS_MODULE,
526
527                 .init                   = rk_ablk_init_tfm,
528                 .exit                   = rk_ablk_exit_tfm,
529                 .min_keysize            = DES3_EDE_KEY_SIZE,
530                 .max_keysize            = DES3_EDE_KEY_SIZE,
531                 .ivsize                 = DES_BLOCK_SIZE,
532                 .setkey                 = rk_tdes_setkey,
533                 .encrypt                = rk_des3_ede_cbc_encrypt,
534                 .decrypt                = rk_des3_ede_cbc_decrypt,
535         }
536 };