cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rk3288_crypto_skcipher.c (15395B)


      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
     16static void rk_crypto_complete(struct crypto_async_request *base, int err)
     17{
     18	if (base->complete)
     19		base->complete(base, err);
     20}
     21
     22static 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
     31static 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
     45static 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
     60static 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
     75static 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
     85static 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
     95static 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
    105static 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
    115static 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
    125static 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
    135static 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
    145static 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
    155static 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
    165static 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
    175static 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
    185static 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
    196static 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
    234static 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
    243static 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
    269static 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
    292static 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
    312static 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 */
    338static 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	}
    373out_rx:
    374	return err;
    375}
    376
    377static 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
    395static 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
    403struct 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
    425struct 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
    448struct 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
    470struct 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
    493struct 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
    515struct 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};