xref: /linux/drivers/crypto/rockchip/rk3288_crypto_skcipher.c (revision a619fe35ab41fded440d3762d4fbad84ff86a4d4)
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 
rk_cipher_need_fallback(struct skcipher_request * req)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 
rk_cipher_fallback(struct skcipher_request * areq)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 
rk_cipher_handle_req(struct skcipher_request * req)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 
rk_aes_setkey(struct crypto_skcipher * cipher,const u8 * key,unsigned int keylen)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 
rk_des_setkey(struct crypto_skcipher * cipher,const u8 * key,unsigned int keylen)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 
rk_tdes_setkey(struct crypto_skcipher * cipher,const u8 * key,unsigned int keylen)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 
rk_aes_ecb_encrypt(struct skcipher_request * req)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 
rk_aes_ecb_decrypt(struct skcipher_request * req)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 
rk_aes_cbc_encrypt(struct skcipher_request * req)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 
rk_aes_cbc_decrypt(struct skcipher_request * req)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 
rk_des_ecb_encrypt(struct skcipher_request * req)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 
rk_des_ecb_decrypt(struct skcipher_request * req)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 
rk_des_cbc_encrypt(struct skcipher_request * req)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 
rk_des_cbc_decrypt(struct skcipher_request * req)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 
rk_des3_ede_ecb_encrypt(struct skcipher_request * req)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 
rk_des3_ede_ecb_decrypt(struct skcipher_request * req)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 
rk_des3_ede_cbc_encrypt(struct skcipher_request * req)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 
rk_des3_ede_cbc_decrypt(struct skcipher_request * req)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 
rk_cipher_hw_init(struct rk_crypto_info * dev,struct skcipher_request * req)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 
crypto_dma_start(struct rk_crypto_info * dev,struct scatterlist * sgs,struct scatterlist * sgd,unsigned int todo)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 
rk_cipher_run(struct crypto_engine * engine,void * async_req)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 	if (areq->iv && ivsize > 0) {
325 		if (rctx->mode & RK_CRYPTO_DEC) {
326 			offset = areq->cryptlen - ivsize;
327 			scatterwalk_map_and_copy(rctx->backup_iv, areq->src,
328 						 offset, ivsize, 0);
329 		}
330 	}
331 
332 	sgs = areq->src;
333 	sgd = areq->dst;
334 
335 	while (sgs && sgd && len) {
336 		if (!sgs->length) {
337 			sgs = sg_next(sgs);
338 			sgd = sg_next(sgd);
339 			continue;
340 		}
341 		if (rctx->mode & RK_CRYPTO_DEC) {
342 			/* we backup last block of source to be used as IV at next step */
343 			offset = sgs->length - ivsize;
344 			scatterwalk_map_and_copy(biv, sgs, offset, ivsize, 0);
345 		}
346 		if (sgs == sgd) {
347 			err = dma_map_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
348 			if (err <= 0) {
349 				err = -EINVAL;
350 				goto theend_iv;
351 			}
352 		} else {
353 			err = dma_map_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
354 			if (err <= 0) {
355 				err = -EINVAL;
356 				goto theend_iv;
357 			}
358 			err = dma_map_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
359 			if (err <= 0) {
360 				err = -EINVAL;
361 				goto theend_sgs;
362 			}
363 		}
364 		err = 0;
365 		rk_cipher_hw_init(rkc, areq);
366 		if (ivsize) {
367 			if (ivsize == DES_BLOCK_SIZE)
368 				memcpy_toio(rkc->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize);
369 			else
370 				memcpy_toio(rkc->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize);
371 		}
372 		reinit_completion(&rkc->complete);
373 		rkc->status = 0;
374 
375 		todo = min(sg_dma_len(sgs), len);
376 		len -= todo;
377 		crypto_dma_start(rkc, sgs, sgd, todo / 4);
378 		wait_for_completion_interruptible_timeout(&rkc->complete,
379 							  msecs_to_jiffies(2000));
380 		if (!rkc->status) {
381 			dev_err(rkc->dev, "DMA timeout\n");
382 			err = -EFAULT;
383 			goto theend;
384 		}
385 		if (sgs == sgd) {
386 			dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
387 		} else {
388 			dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
389 			dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
390 		}
391 		if (rctx->mode & RK_CRYPTO_DEC) {
392 			memcpy(iv, biv, ivsize);
393 			ivtouse = iv;
394 		} else {
395 			offset = sgd->length - ivsize;
396 			scatterwalk_map_and_copy(iv, sgd, offset, ivsize, 0);
397 			ivtouse = iv;
398 		}
399 		sgs = sg_next(sgs);
400 		sgd = sg_next(sgd);
401 	}
402 
403 	if (areq->iv && ivsize > 0) {
404 		offset = areq->cryptlen - ivsize;
405 		if (rctx->mode & RK_CRYPTO_DEC) {
406 			memcpy(areq->iv, rctx->backup_iv, ivsize);
407 			memzero_explicit(rctx->backup_iv, ivsize);
408 		} else {
409 			scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
410 						 ivsize, 0);
411 		}
412 	}
413 
414 theend:
415 	pm_runtime_put_autosuspend(rkc->dev);
416 
417 	local_bh_disable();
418 	crypto_finalize_skcipher_request(engine, areq, err);
419 	local_bh_enable();
420 	return 0;
421 
422 theend_sgs:
423 	if (sgs == sgd) {
424 		dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL);
425 	} else {
426 		dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE);
427 		dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE);
428 	}
429 theend_iv:
430 	return err;
431 }
432 
rk_cipher_tfm_init(struct crypto_skcipher * tfm)433 static int rk_cipher_tfm_init(struct crypto_skcipher *tfm)
434 {
435 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
436 	const char *name = crypto_tfm_alg_name(&tfm->base);
437 	struct skcipher_alg *alg = crypto_skcipher_alg(tfm);
438 	struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher.base);
439 
440 	ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK);
441 	if (IS_ERR(ctx->fallback_tfm)) {
442 		dev_err(algt->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n",
443 			name, PTR_ERR(ctx->fallback_tfm));
444 		return PTR_ERR(ctx->fallback_tfm);
445 	}
446 
447 	crypto_skcipher_set_reqsize(tfm, sizeof(struct rk_cipher_rctx) +
448 				    crypto_skcipher_reqsize(ctx->fallback_tfm));
449 
450 	return 0;
451 }
452 
rk_cipher_tfm_exit(struct crypto_skcipher * tfm)453 static void rk_cipher_tfm_exit(struct crypto_skcipher *tfm)
454 {
455 	struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
456 
457 	memzero_explicit(ctx->key, ctx->keylen);
458 	crypto_free_skcipher(ctx->fallback_tfm);
459 }
460 
461 struct rk_crypto_tmp rk_ecb_aes_alg = {
462 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
463 	.alg.skcipher.base = {
464 		.base.cra_name		= "ecb(aes)",
465 		.base.cra_driver_name	= "ecb-aes-rk",
466 		.base.cra_priority	= 300,
467 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
468 		.base.cra_blocksize	= AES_BLOCK_SIZE,
469 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
470 		.base.cra_alignmask	= 0x0f,
471 		.base.cra_module	= THIS_MODULE,
472 
473 		.init			= rk_cipher_tfm_init,
474 		.exit			= rk_cipher_tfm_exit,
475 		.min_keysize		= AES_MIN_KEY_SIZE,
476 		.max_keysize		= AES_MAX_KEY_SIZE,
477 		.setkey			= rk_aes_setkey,
478 		.encrypt		= rk_aes_ecb_encrypt,
479 		.decrypt		= rk_aes_ecb_decrypt,
480 	},
481 	.alg.skcipher.op = {
482 		.do_one_request = rk_cipher_run,
483 	},
484 };
485 
486 struct rk_crypto_tmp rk_cbc_aes_alg = {
487 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
488 	.alg.skcipher.base = {
489 		.base.cra_name		= "cbc(aes)",
490 		.base.cra_driver_name	= "cbc-aes-rk",
491 		.base.cra_priority	= 300,
492 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
493 		.base.cra_blocksize	= AES_BLOCK_SIZE,
494 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
495 		.base.cra_alignmask	= 0x0f,
496 		.base.cra_module	= THIS_MODULE,
497 
498 		.init			= rk_cipher_tfm_init,
499 		.exit			= rk_cipher_tfm_exit,
500 		.min_keysize		= AES_MIN_KEY_SIZE,
501 		.max_keysize		= AES_MAX_KEY_SIZE,
502 		.ivsize			= AES_BLOCK_SIZE,
503 		.setkey			= rk_aes_setkey,
504 		.encrypt		= rk_aes_cbc_encrypt,
505 		.decrypt		= rk_aes_cbc_decrypt,
506 	},
507 	.alg.skcipher.op = {
508 		.do_one_request = rk_cipher_run,
509 	},
510 };
511 
512 struct rk_crypto_tmp rk_ecb_des_alg = {
513 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
514 	.alg.skcipher.base = {
515 		.base.cra_name		= "ecb(des)",
516 		.base.cra_driver_name	= "ecb-des-rk",
517 		.base.cra_priority	= 300,
518 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
519 		.base.cra_blocksize	= DES_BLOCK_SIZE,
520 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
521 		.base.cra_alignmask	= 0x07,
522 		.base.cra_module	= THIS_MODULE,
523 
524 		.init			= rk_cipher_tfm_init,
525 		.exit			= rk_cipher_tfm_exit,
526 		.min_keysize		= DES_KEY_SIZE,
527 		.max_keysize		= DES_KEY_SIZE,
528 		.setkey			= rk_des_setkey,
529 		.encrypt		= rk_des_ecb_encrypt,
530 		.decrypt		= rk_des_ecb_decrypt,
531 	},
532 	.alg.skcipher.op = {
533 		.do_one_request = rk_cipher_run,
534 	},
535 };
536 
537 struct rk_crypto_tmp rk_cbc_des_alg = {
538 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
539 	.alg.skcipher.base = {
540 		.base.cra_name		= "cbc(des)",
541 		.base.cra_driver_name	= "cbc-des-rk",
542 		.base.cra_priority	= 300,
543 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
544 		.base.cra_blocksize	= DES_BLOCK_SIZE,
545 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
546 		.base.cra_alignmask	= 0x07,
547 		.base.cra_module	= THIS_MODULE,
548 
549 		.init			= rk_cipher_tfm_init,
550 		.exit			= rk_cipher_tfm_exit,
551 		.min_keysize		= DES_KEY_SIZE,
552 		.max_keysize		= DES_KEY_SIZE,
553 		.ivsize			= DES_BLOCK_SIZE,
554 		.setkey			= rk_des_setkey,
555 		.encrypt		= rk_des_cbc_encrypt,
556 		.decrypt		= rk_des_cbc_decrypt,
557 	},
558 	.alg.skcipher.op = {
559 		.do_one_request = rk_cipher_run,
560 	},
561 };
562 
563 struct rk_crypto_tmp rk_ecb_des3_ede_alg = {
564 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
565 	.alg.skcipher.base = {
566 		.base.cra_name		= "ecb(des3_ede)",
567 		.base.cra_driver_name	= "ecb-des3-ede-rk",
568 		.base.cra_priority	= 300,
569 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
570 		.base.cra_blocksize	= DES_BLOCK_SIZE,
571 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
572 		.base.cra_alignmask	= 0x07,
573 		.base.cra_module	= THIS_MODULE,
574 
575 		.init			= rk_cipher_tfm_init,
576 		.exit			= rk_cipher_tfm_exit,
577 		.min_keysize		= DES3_EDE_KEY_SIZE,
578 		.max_keysize		= DES3_EDE_KEY_SIZE,
579 		.setkey			= rk_tdes_setkey,
580 		.encrypt		= rk_des3_ede_ecb_encrypt,
581 		.decrypt		= rk_des3_ede_ecb_decrypt,
582 	},
583 	.alg.skcipher.op = {
584 		.do_one_request = rk_cipher_run,
585 	},
586 };
587 
588 struct rk_crypto_tmp rk_cbc_des3_ede_alg = {
589 	.type = CRYPTO_ALG_TYPE_SKCIPHER,
590 	.alg.skcipher.base = {
591 		.base.cra_name		= "cbc(des3_ede)",
592 		.base.cra_driver_name	= "cbc-des3-ede-rk",
593 		.base.cra_priority	= 300,
594 		.base.cra_flags		= CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK,
595 		.base.cra_blocksize	= DES_BLOCK_SIZE,
596 		.base.cra_ctxsize	= sizeof(struct rk_cipher_ctx),
597 		.base.cra_alignmask	= 0x07,
598 		.base.cra_module	= THIS_MODULE,
599 
600 		.init			= rk_cipher_tfm_init,
601 		.exit			= rk_cipher_tfm_exit,
602 		.min_keysize		= DES3_EDE_KEY_SIZE,
603 		.max_keysize		= DES3_EDE_KEY_SIZE,
604 		.ivsize			= DES_BLOCK_SIZE,
605 		.setkey			= rk_tdes_setkey,
606 		.encrypt		= rk_des3_ede_cbc_encrypt,
607 		.decrypt		= rk_des3_ede_cbc_decrypt,
608 	},
609 	.alg.skcipher.op = {
610 		.do_one_request = rk_cipher_run,
611 	},
612 };
613