2 * Cipher algorithms supported by the CESA: DES, 3DES and AES.
4 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
5 * Author: Arnaud Ebalard <arno@natisbad.org>
7 * This work is based on an initial version written by
8 * Sebastian Andrzej Siewior < sebastian at breakpoint dot cc >
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published
12 * by the Free Software Foundation.
15 #include <crypto/aes.h>
16 #include <crypto/des.h>
20 struct mv_cesa_des_ctx
{
21 struct mv_cesa_ctx base
;
25 struct mv_cesa_des3_ctx
{
26 struct mv_cesa_ctx base
;
27 u8 key
[DES3_EDE_KEY_SIZE
];
30 struct mv_cesa_aes_ctx
{
31 struct mv_cesa_ctx base
;
32 struct crypto_aes_ctx aes
;
35 struct mv_cesa_skcipher_dma_iter
{
36 struct mv_cesa_dma_iter base
;
37 struct mv_cesa_sg_dma_iter src
;
38 struct mv_cesa_sg_dma_iter dst
;
42 mv_cesa_skcipher_req_iter_init(struct mv_cesa_skcipher_dma_iter
*iter
,
43 struct skcipher_request
*req
)
45 mv_cesa_req_dma_iter_init(&iter
->base
, req
->cryptlen
);
46 mv_cesa_sg_dma_iter_init(&iter
->src
, req
->src
, DMA_TO_DEVICE
);
47 mv_cesa_sg_dma_iter_init(&iter
->dst
, req
->dst
, DMA_FROM_DEVICE
);
51 mv_cesa_skcipher_req_iter_next_op(struct mv_cesa_skcipher_dma_iter
*iter
)
53 iter
->src
.op_offset
= 0;
54 iter
->dst
.op_offset
= 0;
56 return mv_cesa_req_dma_iter_next_op(&iter
->base
);
60 mv_cesa_skcipher_dma_cleanup(struct skcipher_request
*req
)
62 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
64 if (req
->dst
!= req
->src
) {
65 dma_unmap_sg(cesa_dev
->dev
, req
->dst
, creq
->dst_nents
,
67 dma_unmap_sg(cesa_dev
->dev
, req
->src
, creq
->src_nents
,
70 dma_unmap_sg(cesa_dev
->dev
, req
->src
, creq
->src_nents
,
73 mv_cesa_dma_cleanup(&creq
->base
);
76 static inline void mv_cesa_skcipher_cleanup(struct skcipher_request
*req
)
78 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
80 if (mv_cesa_req_get_type(&creq
->base
) == CESA_DMA_REQ
)
81 mv_cesa_skcipher_dma_cleanup(req
);
84 static void mv_cesa_skcipher_std_step(struct skcipher_request
*req
)
86 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
87 struct mv_cesa_skcipher_std_req
*sreq
= &creq
->std
;
88 struct mv_cesa_engine
*engine
= creq
->base
.engine
;
89 size_t len
= min_t(size_t, req
->cryptlen
- sreq
->offset
,
90 CESA_SA_SRAM_PAYLOAD_SIZE
);
92 mv_cesa_adjust_op(engine
, &sreq
->op
);
93 memcpy_toio(engine
->sram
, &sreq
->op
, sizeof(sreq
->op
));
95 len
= sg_pcopy_to_buffer(req
->src
, creq
->src_nents
,
96 engine
->sram
+ CESA_SA_DATA_SRAM_OFFSET
,
100 mv_cesa_set_crypt_op_len(&sreq
->op
, len
);
102 /* FIXME: only update enc_len field */
103 if (!sreq
->skip_ctx
) {
104 memcpy_toio(engine
->sram
, &sreq
->op
, sizeof(sreq
->op
));
105 sreq
->skip_ctx
= true;
107 memcpy_toio(engine
->sram
, &sreq
->op
, sizeof(sreq
->op
.desc
));
110 mv_cesa_set_int_mask(engine
, CESA_SA_INT_ACCEL0_DONE
);
111 writel_relaxed(CESA_SA_CFG_PARA_DIS
, engine
->regs
+ CESA_SA_CFG
);
112 BUG_ON(readl(engine
->regs
+ CESA_SA_CMD
) &
113 CESA_SA_CMD_EN_CESA_SA_ACCL0
);
114 writel(CESA_SA_CMD_EN_CESA_SA_ACCL0
, engine
->regs
+ CESA_SA_CMD
);
117 static int mv_cesa_skcipher_std_process(struct skcipher_request
*req
,
120 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
121 struct mv_cesa_skcipher_std_req
*sreq
= &creq
->std
;
122 struct mv_cesa_engine
*engine
= creq
->base
.engine
;
125 len
= sg_pcopy_from_buffer(req
->dst
, creq
->dst_nents
,
126 engine
->sram
+ CESA_SA_DATA_SRAM_OFFSET
,
127 sreq
->size
, sreq
->offset
);
130 if (sreq
->offset
< req
->cryptlen
)
136 static int mv_cesa_skcipher_process(struct crypto_async_request
*req
,
139 struct skcipher_request
*skreq
= skcipher_request_cast(req
);
140 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(skreq
);
141 struct mv_cesa_req
*basereq
= &creq
->base
;
143 if (mv_cesa_req_get_type(basereq
) == CESA_STD_REQ
)
144 return mv_cesa_skcipher_std_process(skreq
, status
);
146 return mv_cesa_dma_process(basereq
, status
);
149 static void mv_cesa_skcipher_step(struct crypto_async_request
*req
)
151 struct skcipher_request
*skreq
= skcipher_request_cast(req
);
152 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(skreq
);
154 if (mv_cesa_req_get_type(&creq
->base
) == CESA_DMA_REQ
)
155 mv_cesa_dma_step(&creq
->base
);
157 mv_cesa_skcipher_std_step(skreq
);
161 mv_cesa_skcipher_dma_prepare(struct skcipher_request
*req
)
163 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
164 struct mv_cesa_req
*basereq
= &creq
->base
;
166 mv_cesa_dma_prepare(basereq
, basereq
->engine
);
170 mv_cesa_skcipher_std_prepare(struct skcipher_request
*req
)
172 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
173 struct mv_cesa_skcipher_std_req
*sreq
= &creq
->std
;
179 static inline void mv_cesa_skcipher_prepare(struct crypto_async_request
*req
,
180 struct mv_cesa_engine
*engine
)
182 struct skcipher_request
*skreq
= skcipher_request_cast(req
);
183 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(skreq
);
184 creq
->base
.engine
= engine
;
186 if (mv_cesa_req_get_type(&creq
->base
) == CESA_DMA_REQ
)
187 mv_cesa_skcipher_dma_prepare(skreq
);
189 mv_cesa_skcipher_std_prepare(skreq
);
193 mv_cesa_skcipher_req_cleanup(struct crypto_async_request
*req
)
195 struct skcipher_request
*skreq
= skcipher_request_cast(req
);
197 mv_cesa_skcipher_cleanup(skreq
);
201 mv_cesa_skcipher_complete(struct crypto_async_request
*req
)
203 struct skcipher_request
*skreq
= skcipher_request_cast(req
);
204 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(skreq
);
205 struct mv_cesa_engine
*engine
= creq
->base
.engine
;
208 atomic_sub(skreq
->cryptlen
, &engine
->load
);
209 ivsize
= crypto_skcipher_ivsize(crypto_skcipher_reqtfm(skreq
));
211 if (mv_cesa_req_get_type(&creq
->base
) == CESA_DMA_REQ
) {
212 struct mv_cesa_req
*basereq
;
214 basereq
= &creq
->base
;
215 memcpy(skreq
->iv
, basereq
->chain
.last
->op
->ctx
.blkcipher
.iv
,
218 memcpy_fromio(skreq
->iv
,
219 engine
->sram
+ CESA_SA_CRYPT_IV_SRAM_OFFSET
,
224 static const struct mv_cesa_req_ops mv_cesa_skcipher_req_ops
= {
225 .step
= mv_cesa_skcipher_step
,
226 .process
= mv_cesa_skcipher_process
,
227 .cleanup
= mv_cesa_skcipher_req_cleanup
,
228 .complete
= mv_cesa_skcipher_complete
,
231 static void mv_cesa_skcipher_cra_exit(struct crypto_tfm
*tfm
)
233 void *ctx
= crypto_tfm_ctx(tfm
);
235 memzero_explicit(ctx
, tfm
->__crt_alg
->cra_ctxsize
);
238 static int mv_cesa_skcipher_cra_init(struct crypto_tfm
*tfm
)
240 struct mv_cesa_ctx
*ctx
= crypto_tfm_ctx(tfm
);
242 ctx
->ops
= &mv_cesa_skcipher_req_ops
;
244 crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm
),
245 sizeof(struct mv_cesa_skcipher_req
));
250 static int mv_cesa_aes_setkey(struct crypto_skcipher
*cipher
, const u8
*key
,
253 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
254 struct mv_cesa_aes_ctx
*ctx
= crypto_tfm_ctx(tfm
);
260 ret
= crypto_aes_expand_key(&ctx
->aes
, key
, len
);
262 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
266 remaining
= (ctx
->aes
.key_length
- 16) / 4;
267 offset
= ctx
->aes
.key_length
+ 24 - remaining
;
268 for (i
= 0; i
< remaining
; i
++)
269 ctx
->aes
.key_dec
[4 + i
] =
270 cpu_to_le32(ctx
->aes
.key_enc
[offset
+ i
]);
275 static int mv_cesa_des_setkey(struct crypto_skcipher
*cipher
, const u8
*key
,
278 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
279 struct mv_cesa_des_ctx
*ctx
= crypto_tfm_ctx(tfm
);
280 u32 tmp
[DES_EXPKEY_WORDS
];
283 if (len
!= DES_KEY_SIZE
) {
284 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
288 ret
= des_ekey(tmp
, key
);
289 if (!ret
&& (tfm
->crt_flags
& CRYPTO_TFM_REQ_WEAK_KEY
)) {
290 tfm
->crt_flags
|= CRYPTO_TFM_RES_WEAK_KEY
;
294 memcpy(ctx
->key
, key
, DES_KEY_SIZE
);
299 static int mv_cesa_des3_ede_setkey(struct crypto_skcipher
*cipher
,
300 const u8
*key
, unsigned int len
)
302 struct crypto_tfm
*tfm
= crypto_skcipher_tfm(cipher
);
303 struct mv_cesa_des_ctx
*ctx
= crypto_tfm_ctx(tfm
);
305 if (len
!= DES3_EDE_KEY_SIZE
) {
306 crypto_skcipher_set_flags(cipher
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
310 memcpy(ctx
->key
, key
, DES3_EDE_KEY_SIZE
);
315 static int mv_cesa_skcipher_dma_req_init(struct skcipher_request
*req
,
316 const struct mv_cesa_op_ctx
*op_templ
)
318 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
319 gfp_t flags
= (req
->base
.flags
& CRYPTO_TFM_REQ_MAY_SLEEP
) ?
320 GFP_KERNEL
: GFP_ATOMIC
;
321 struct mv_cesa_req
*basereq
= &creq
->base
;
322 struct mv_cesa_skcipher_dma_iter iter
;
323 bool skip_ctx
= false;
327 basereq
->chain
.first
= NULL
;
328 basereq
->chain
.last
= NULL
;
330 if (req
->src
!= req
->dst
) {
331 ret
= dma_map_sg(cesa_dev
->dev
, req
->src
, creq
->src_nents
,
336 ret
= dma_map_sg(cesa_dev
->dev
, req
->dst
, creq
->dst_nents
,
343 ret
= dma_map_sg(cesa_dev
->dev
, req
->src
, creq
->src_nents
,
349 mv_cesa_tdma_desc_iter_init(&basereq
->chain
);
350 mv_cesa_skcipher_req_iter_init(&iter
, req
);
353 struct mv_cesa_op_ctx
*op
;
355 op
= mv_cesa_dma_add_op(&basereq
->chain
, op_templ
, skip_ctx
, flags
);
362 mv_cesa_set_crypt_op_len(op
, iter
.base
.op_len
);
364 /* Add input transfers */
365 ret
= mv_cesa_dma_add_op_transfers(&basereq
->chain
, &iter
.base
,
370 /* Add dummy desc to launch the crypto operation */
371 ret
= mv_cesa_dma_add_dummy_launch(&basereq
->chain
, flags
);
375 /* Add output transfers */
376 ret
= mv_cesa_dma_add_op_transfers(&basereq
->chain
, &iter
.base
,
381 } while (mv_cesa_skcipher_req_iter_next_op(&iter
));
383 /* Add output data for IV */
384 ivsize
= crypto_skcipher_ivsize(crypto_skcipher_reqtfm(req
));
385 ret
= mv_cesa_dma_add_result_op(&basereq
->chain
, CESA_SA_CFG_SRAM_OFFSET
,
386 CESA_SA_DATA_SRAM_OFFSET
,
387 CESA_TDMA_SRC_IN_SRAM
, flags
);
392 basereq
->chain
.last
->flags
|= CESA_TDMA_END_OF_REQ
;
397 mv_cesa_dma_cleanup(basereq
);
398 if (req
->dst
!= req
->src
)
399 dma_unmap_sg(cesa_dev
->dev
, req
->dst
, creq
->dst_nents
,
403 dma_unmap_sg(cesa_dev
->dev
, req
->src
, creq
->src_nents
,
404 req
->dst
!= req
->src
? DMA_TO_DEVICE
: DMA_BIDIRECTIONAL
);
410 mv_cesa_skcipher_std_req_init(struct skcipher_request
*req
,
411 const struct mv_cesa_op_ctx
*op_templ
)
413 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
414 struct mv_cesa_skcipher_std_req
*sreq
= &creq
->std
;
415 struct mv_cesa_req
*basereq
= &creq
->base
;
417 sreq
->op
= *op_templ
;
418 sreq
->skip_ctx
= false;
419 basereq
->chain
.first
= NULL
;
420 basereq
->chain
.last
= NULL
;
425 static int mv_cesa_skcipher_req_init(struct skcipher_request
*req
,
426 struct mv_cesa_op_ctx
*tmpl
)
428 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
429 struct crypto_skcipher
*tfm
= crypto_skcipher_reqtfm(req
);
430 unsigned int blksize
= crypto_skcipher_blocksize(tfm
);
433 if (!IS_ALIGNED(req
->cryptlen
, blksize
))
436 creq
->src_nents
= sg_nents_for_len(req
->src
, req
->cryptlen
);
437 if (creq
->src_nents
< 0) {
438 dev_err(cesa_dev
->dev
, "Invalid number of src SG");
439 return creq
->src_nents
;
441 creq
->dst_nents
= sg_nents_for_len(req
->dst
, req
->cryptlen
);
442 if (creq
->dst_nents
< 0) {
443 dev_err(cesa_dev
->dev
, "Invalid number of dst SG");
444 return creq
->dst_nents
;
447 mv_cesa_update_op_cfg(tmpl
, CESA_SA_DESC_CFG_OP_CRYPT_ONLY
,
448 CESA_SA_DESC_CFG_OP_MSK
);
450 if (cesa_dev
->caps
->has_tdma
)
451 ret
= mv_cesa_skcipher_dma_req_init(req
, tmpl
);
453 ret
= mv_cesa_skcipher_std_req_init(req
, tmpl
);
458 static int mv_cesa_skcipher_queue_req(struct skcipher_request
*req
,
459 struct mv_cesa_op_ctx
*tmpl
)
462 struct mv_cesa_skcipher_req
*creq
= skcipher_request_ctx(req
);
463 struct mv_cesa_engine
*engine
;
465 ret
= mv_cesa_skcipher_req_init(req
, tmpl
);
469 engine
= mv_cesa_select_engine(req
->cryptlen
);
470 mv_cesa_skcipher_prepare(&req
->base
, engine
);
472 ret
= mv_cesa_queue_req(&req
->base
, &creq
->base
);
474 if (mv_cesa_req_needs_cleanup(&req
->base
, ret
))
475 mv_cesa_skcipher_cleanup(req
);
480 static int mv_cesa_des_op(struct skcipher_request
*req
,
481 struct mv_cesa_op_ctx
*tmpl
)
483 struct mv_cesa_des_ctx
*ctx
= crypto_tfm_ctx(req
->base
.tfm
);
485 mv_cesa_update_op_cfg(tmpl
, CESA_SA_DESC_CFG_CRYPTM_DES
,
486 CESA_SA_DESC_CFG_CRYPTM_MSK
);
488 memcpy(tmpl
->ctx
.blkcipher
.key
, ctx
->key
, DES_KEY_SIZE
);
490 return mv_cesa_skcipher_queue_req(req
, tmpl
);
493 static int mv_cesa_ecb_des_encrypt(struct skcipher_request
*req
)
495 struct mv_cesa_op_ctx tmpl
;
497 mv_cesa_set_op_cfg(&tmpl
,
498 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
499 CESA_SA_DESC_CFG_DIR_ENC
);
501 return mv_cesa_des_op(req
, &tmpl
);
504 static int mv_cesa_ecb_des_decrypt(struct skcipher_request
*req
)
506 struct mv_cesa_op_ctx tmpl
;
508 mv_cesa_set_op_cfg(&tmpl
,
509 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
510 CESA_SA_DESC_CFG_DIR_DEC
);
512 return mv_cesa_des_op(req
, &tmpl
);
515 struct skcipher_alg mv_cesa_ecb_des_alg
= {
516 .setkey
= mv_cesa_des_setkey
,
517 .encrypt
= mv_cesa_ecb_des_encrypt
,
518 .decrypt
= mv_cesa_ecb_des_decrypt
,
519 .min_keysize
= DES_KEY_SIZE
,
520 .max_keysize
= DES_KEY_SIZE
,
522 .cra_name
= "ecb(des)",
523 .cra_driver_name
= "mv-ecb-des",
525 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
526 .cra_blocksize
= DES_BLOCK_SIZE
,
527 .cra_ctxsize
= sizeof(struct mv_cesa_des_ctx
),
529 .cra_module
= THIS_MODULE
,
530 .cra_init
= mv_cesa_skcipher_cra_init
,
531 .cra_exit
= mv_cesa_skcipher_cra_exit
,
535 static int mv_cesa_cbc_des_op(struct skcipher_request
*req
,
536 struct mv_cesa_op_ctx
*tmpl
)
538 mv_cesa_update_op_cfg(tmpl
, CESA_SA_DESC_CFG_CRYPTCM_CBC
,
539 CESA_SA_DESC_CFG_CRYPTCM_MSK
);
541 memcpy(tmpl
->ctx
.blkcipher
.iv
, req
->iv
, DES_BLOCK_SIZE
);
543 return mv_cesa_des_op(req
, tmpl
);
546 static int mv_cesa_cbc_des_encrypt(struct skcipher_request
*req
)
548 struct mv_cesa_op_ctx tmpl
;
550 mv_cesa_set_op_cfg(&tmpl
, CESA_SA_DESC_CFG_DIR_ENC
);
552 return mv_cesa_cbc_des_op(req
, &tmpl
);
555 static int mv_cesa_cbc_des_decrypt(struct skcipher_request
*req
)
557 struct mv_cesa_op_ctx tmpl
;
559 mv_cesa_set_op_cfg(&tmpl
, CESA_SA_DESC_CFG_DIR_DEC
);
561 return mv_cesa_cbc_des_op(req
, &tmpl
);
564 struct skcipher_alg mv_cesa_cbc_des_alg
= {
565 .setkey
= mv_cesa_des_setkey
,
566 .encrypt
= mv_cesa_cbc_des_encrypt
,
567 .decrypt
= mv_cesa_cbc_des_decrypt
,
568 .min_keysize
= DES_KEY_SIZE
,
569 .max_keysize
= DES_KEY_SIZE
,
570 .ivsize
= DES_BLOCK_SIZE
,
572 .cra_name
= "cbc(des)",
573 .cra_driver_name
= "mv-cbc-des",
575 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
576 .cra_blocksize
= DES_BLOCK_SIZE
,
577 .cra_ctxsize
= sizeof(struct mv_cesa_des_ctx
),
579 .cra_module
= THIS_MODULE
,
580 .cra_init
= mv_cesa_skcipher_cra_init
,
581 .cra_exit
= mv_cesa_skcipher_cra_exit
,
585 static int mv_cesa_des3_op(struct skcipher_request
*req
,
586 struct mv_cesa_op_ctx
*tmpl
)
588 struct mv_cesa_des3_ctx
*ctx
= crypto_tfm_ctx(req
->base
.tfm
);
590 mv_cesa_update_op_cfg(tmpl
, CESA_SA_DESC_CFG_CRYPTM_3DES
,
591 CESA_SA_DESC_CFG_CRYPTM_MSK
);
593 memcpy(tmpl
->ctx
.blkcipher
.key
, ctx
->key
, DES3_EDE_KEY_SIZE
);
595 return mv_cesa_skcipher_queue_req(req
, tmpl
);
598 static int mv_cesa_ecb_des3_ede_encrypt(struct skcipher_request
*req
)
600 struct mv_cesa_op_ctx tmpl
;
602 mv_cesa_set_op_cfg(&tmpl
,
603 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
604 CESA_SA_DESC_CFG_3DES_EDE
|
605 CESA_SA_DESC_CFG_DIR_ENC
);
607 return mv_cesa_des3_op(req
, &tmpl
);
610 static int mv_cesa_ecb_des3_ede_decrypt(struct skcipher_request
*req
)
612 struct mv_cesa_op_ctx tmpl
;
614 mv_cesa_set_op_cfg(&tmpl
,
615 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
616 CESA_SA_DESC_CFG_3DES_EDE
|
617 CESA_SA_DESC_CFG_DIR_DEC
);
619 return mv_cesa_des3_op(req
, &tmpl
);
622 struct skcipher_alg mv_cesa_ecb_des3_ede_alg
= {
623 .setkey
= mv_cesa_des3_ede_setkey
,
624 .encrypt
= mv_cesa_ecb_des3_ede_encrypt
,
625 .decrypt
= mv_cesa_ecb_des3_ede_decrypt
,
626 .min_keysize
= DES3_EDE_KEY_SIZE
,
627 .max_keysize
= DES3_EDE_KEY_SIZE
,
628 .ivsize
= DES3_EDE_BLOCK_SIZE
,
630 .cra_name
= "ecb(des3_ede)",
631 .cra_driver_name
= "mv-ecb-des3-ede",
633 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
634 .cra_blocksize
= DES3_EDE_BLOCK_SIZE
,
635 .cra_ctxsize
= sizeof(struct mv_cesa_des3_ctx
),
637 .cra_module
= THIS_MODULE
,
638 .cra_init
= mv_cesa_skcipher_cra_init
,
639 .cra_exit
= mv_cesa_skcipher_cra_exit
,
643 static int mv_cesa_cbc_des3_op(struct skcipher_request
*req
,
644 struct mv_cesa_op_ctx
*tmpl
)
646 memcpy(tmpl
->ctx
.blkcipher
.iv
, req
->iv
, DES3_EDE_BLOCK_SIZE
);
648 return mv_cesa_des3_op(req
, tmpl
);
651 static int mv_cesa_cbc_des3_ede_encrypt(struct skcipher_request
*req
)
653 struct mv_cesa_op_ctx tmpl
;
655 mv_cesa_set_op_cfg(&tmpl
,
656 CESA_SA_DESC_CFG_CRYPTCM_CBC
|
657 CESA_SA_DESC_CFG_3DES_EDE
|
658 CESA_SA_DESC_CFG_DIR_ENC
);
660 return mv_cesa_cbc_des3_op(req
, &tmpl
);
663 static int mv_cesa_cbc_des3_ede_decrypt(struct skcipher_request
*req
)
665 struct mv_cesa_op_ctx tmpl
;
667 mv_cesa_set_op_cfg(&tmpl
,
668 CESA_SA_DESC_CFG_CRYPTCM_CBC
|
669 CESA_SA_DESC_CFG_3DES_EDE
|
670 CESA_SA_DESC_CFG_DIR_DEC
);
672 return mv_cesa_cbc_des3_op(req
, &tmpl
);
675 struct skcipher_alg mv_cesa_cbc_des3_ede_alg
= {
676 .setkey
= mv_cesa_des3_ede_setkey
,
677 .encrypt
= mv_cesa_cbc_des3_ede_encrypt
,
678 .decrypt
= mv_cesa_cbc_des3_ede_decrypt
,
679 .min_keysize
= DES3_EDE_KEY_SIZE
,
680 .max_keysize
= DES3_EDE_KEY_SIZE
,
681 .ivsize
= DES3_EDE_BLOCK_SIZE
,
683 .cra_name
= "cbc(des3_ede)",
684 .cra_driver_name
= "mv-cbc-des3-ede",
686 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
687 .cra_blocksize
= DES3_EDE_BLOCK_SIZE
,
688 .cra_ctxsize
= sizeof(struct mv_cesa_des3_ctx
),
690 .cra_module
= THIS_MODULE
,
691 .cra_init
= mv_cesa_skcipher_cra_init
,
692 .cra_exit
= mv_cesa_skcipher_cra_exit
,
696 static int mv_cesa_aes_op(struct skcipher_request
*req
,
697 struct mv_cesa_op_ctx
*tmpl
)
699 struct mv_cesa_aes_ctx
*ctx
= crypto_tfm_ctx(req
->base
.tfm
);
704 cfg
= CESA_SA_DESC_CFG_CRYPTM_AES
;
706 if (mv_cesa_get_op_cfg(tmpl
) & CESA_SA_DESC_CFG_DIR_DEC
)
707 key
= ctx
->aes
.key_dec
;
709 key
= ctx
->aes
.key_enc
;
711 for (i
= 0; i
< ctx
->aes
.key_length
/ sizeof(u32
); i
++)
712 tmpl
->ctx
.blkcipher
.key
[i
] = cpu_to_le32(key
[i
]);
714 if (ctx
->aes
.key_length
== 24)
715 cfg
|= CESA_SA_DESC_CFG_AES_LEN_192
;
716 else if (ctx
->aes
.key_length
== 32)
717 cfg
|= CESA_SA_DESC_CFG_AES_LEN_256
;
719 mv_cesa_update_op_cfg(tmpl
, cfg
,
720 CESA_SA_DESC_CFG_CRYPTM_MSK
|
721 CESA_SA_DESC_CFG_AES_LEN_MSK
);
723 return mv_cesa_skcipher_queue_req(req
, tmpl
);
726 static int mv_cesa_ecb_aes_encrypt(struct skcipher_request
*req
)
728 struct mv_cesa_op_ctx tmpl
;
730 mv_cesa_set_op_cfg(&tmpl
,
731 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
732 CESA_SA_DESC_CFG_DIR_ENC
);
734 return mv_cesa_aes_op(req
, &tmpl
);
737 static int mv_cesa_ecb_aes_decrypt(struct skcipher_request
*req
)
739 struct mv_cesa_op_ctx tmpl
;
741 mv_cesa_set_op_cfg(&tmpl
,
742 CESA_SA_DESC_CFG_CRYPTCM_ECB
|
743 CESA_SA_DESC_CFG_DIR_DEC
);
745 return mv_cesa_aes_op(req
, &tmpl
);
748 struct skcipher_alg mv_cesa_ecb_aes_alg
= {
749 .setkey
= mv_cesa_aes_setkey
,
750 .encrypt
= mv_cesa_ecb_aes_encrypt
,
751 .decrypt
= mv_cesa_ecb_aes_decrypt
,
752 .min_keysize
= AES_MIN_KEY_SIZE
,
753 .max_keysize
= AES_MAX_KEY_SIZE
,
755 .cra_name
= "ecb(aes)",
756 .cra_driver_name
= "mv-ecb-aes",
758 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
759 .cra_blocksize
= AES_BLOCK_SIZE
,
760 .cra_ctxsize
= sizeof(struct mv_cesa_aes_ctx
),
762 .cra_module
= THIS_MODULE
,
763 .cra_init
= mv_cesa_skcipher_cra_init
,
764 .cra_exit
= mv_cesa_skcipher_cra_exit
,
768 static int mv_cesa_cbc_aes_op(struct skcipher_request
*req
,
769 struct mv_cesa_op_ctx
*tmpl
)
771 mv_cesa_update_op_cfg(tmpl
, CESA_SA_DESC_CFG_CRYPTCM_CBC
,
772 CESA_SA_DESC_CFG_CRYPTCM_MSK
);
773 memcpy(tmpl
->ctx
.blkcipher
.iv
, req
->iv
, AES_BLOCK_SIZE
);
775 return mv_cesa_aes_op(req
, tmpl
);
778 static int mv_cesa_cbc_aes_encrypt(struct skcipher_request
*req
)
780 struct mv_cesa_op_ctx tmpl
;
782 mv_cesa_set_op_cfg(&tmpl
, CESA_SA_DESC_CFG_DIR_ENC
);
784 return mv_cesa_cbc_aes_op(req
, &tmpl
);
787 static int mv_cesa_cbc_aes_decrypt(struct skcipher_request
*req
)
789 struct mv_cesa_op_ctx tmpl
;
791 mv_cesa_set_op_cfg(&tmpl
, CESA_SA_DESC_CFG_DIR_DEC
);
793 return mv_cesa_cbc_aes_op(req
, &tmpl
);
796 struct skcipher_alg mv_cesa_cbc_aes_alg
= {
797 .setkey
= mv_cesa_aes_setkey
,
798 .encrypt
= mv_cesa_cbc_aes_encrypt
,
799 .decrypt
= mv_cesa_cbc_aes_decrypt
,
800 .min_keysize
= AES_MIN_KEY_SIZE
,
801 .max_keysize
= AES_MAX_KEY_SIZE
,
802 .ivsize
= AES_BLOCK_SIZE
,
804 .cra_name
= "cbc(aes)",
805 .cra_driver_name
= "mv-cbc-aes",
807 .cra_flags
= CRYPTO_ALG_KERN_DRIVER_ONLY
| CRYPTO_ALG_ASYNC
,
808 .cra_blocksize
= AES_BLOCK_SIZE
,
809 .cra_ctxsize
= sizeof(struct mv_cesa_aes_ctx
),
811 .cra_module
= THIS_MODULE
,
812 .cra_init
= mv_cesa_skcipher_cra_init
,
813 .cra_exit
= mv_cesa_skcipher_cra_exit
,