Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/crypto/rockchip/rk3288_crypto_skcipher.c
26289 views
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 <[email protected]>
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
crypto_skcipher_set_reqsize(tfm, 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
};
614
615