xref: /linux/drivers/crypto/inside-secure/eip93/eip93-cipher.c (revision bbfd5594756011167b8f8de9a00e0c946afda1e6)
1*9739f5f9SChristian Marangi // SPDX-License-Identifier: GPL-2.0
2*9739f5f9SChristian Marangi /*
3*9739f5f9SChristian Marangi  * Copyright (C) 2019 - 2021
4*9739f5f9SChristian Marangi  *
5*9739f5f9SChristian Marangi  * Richard van Schagen <vschagen@icloud.com>
6*9739f5f9SChristian Marangi  * Christian Marangi <ansuelsmth@gmail.com
7*9739f5f9SChristian Marangi  */
8*9739f5f9SChristian Marangi 
9*9739f5f9SChristian Marangi #include <crypto/aes.h>
10*9739f5f9SChristian Marangi #include <crypto/ctr.h>
11*9739f5f9SChristian Marangi #include <crypto/internal/des.h>
12*9739f5f9SChristian Marangi #include <linux/dma-mapping.h>
13*9739f5f9SChristian Marangi 
14*9739f5f9SChristian Marangi #include "eip93-aes.h"
15*9739f5f9SChristian Marangi #include "eip93-cipher.h"
16*9739f5f9SChristian Marangi #include "eip93-common.h"
17*9739f5f9SChristian Marangi #include "eip93-des.h"
18*9739f5f9SChristian Marangi #include "eip93-regs.h"
19*9739f5f9SChristian Marangi 
20*9739f5f9SChristian Marangi void eip93_skcipher_handle_result(struct crypto_async_request *async, int err)
21*9739f5f9SChristian Marangi {
22*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(async->tfm);
23*9739f5f9SChristian Marangi 	struct eip93_device *eip93 = ctx->eip93;
24*9739f5f9SChristian Marangi 	struct skcipher_request *req = skcipher_request_cast(async);
25*9739f5f9SChristian Marangi 	struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
26*9739f5f9SChristian Marangi 
27*9739f5f9SChristian Marangi 	eip93_unmap_dma(eip93, rctx, req->src, req->dst);
28*9739f5f9SChristian Marangi 	eip93_handle_result(eip93, rctx, req->iv);
29*9739f5f9SChristian Marangi 
30*9739f5f9SChristian Marangi 	skcipher_request_complete(req, err);
31*9739f5f9SChristian Marangi }
32*9739f5f9SChristian Marangi 
33*9739f5f9SChristian Marangi static int eip93_skcipher_send_req(struct crypto_async_request *async)
34*9739f5f9SChristian Marangi {
35*9739f5f9SChristian Marangi 	struct skcipher_request *req = skcipher_request_cast(async);
36*9739f5f9SChristian Marangi 	struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
37*9739f5f9SChristian Marangi 	int err;
38*9739f5f9SChristian Marangi 
39*9739f5f9SChristian Marangi 	err = check_valid_request(rctx);
40*9739f5f9SChristian Marangi 
41*9739f5f9SChristian Marangi 	if (err) {
42*9739f5f9SChristian Marangi 		skcipher_request_complete(req, err);
43*9739f5f9SChristian Marangi 		return err;
44*9739f5f9SChristian Marangi 	}
45*9739f5f9SChristian Marangi 
46*9739f5f9SChristian Marangi 	return eip93_send_req(async, req->iv, rctx);
47*9739f5f9SChristian Marangi }
48*9739f5f9SChristian Marangi 
49*9739f5f9SChristian Marangi /* Crypto skcipher API functions */
50*9739f5f9SChristian Marangi static int eip93_skcipher_cra_init(struct crypto_tfm *tfm)
51*9739f5f9SChristian Marangi {
52*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
53*9739f5f9SChristian Marangi 	struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,
54*9739f5f9SChristian Marangi 				struct eip93_alg_template, alg.skcipher.base);
55*9739f5f9SChristian Marangi 
56*9739f5f9SChristian Marangi 	crypto_skcipher_set_reqsize(__crypto_skcipher_cast(tfm),
57*9739f5f9SChristian Marangi 				    sizeof(struct eip93_cipher_reqctx));
58*9739f5f9SChristian Marangi 
59*9739f5f9SChristian Marangi 	memset(ctx, 0, sizeof(*ctx));
60*9739f5f9SChristian Marangi 
61*9739f5f9SChristian Marangi 	ctx->eip93 = tmpl->eip93;
62*9739f5f9SChristian Marangi 	ctx->type = tmpl->type;
63*9739f5f9SChristian Marangi 
64*9739f5f9SChristian Marangi 	ctx->sa_record = kzalloc(sizeof(*ctx->sa_record), GFP_KERNEL);
65*9739f5f9SChristian Marangi 	if (!ctx->sa_record)
66*9739f5f9SChristian Marangi 		return -ENOMEM;
67*9739f5f9SChristian Marangi 
68*9739f5f9SChristian Marangi 	return 0;
69*9739f5f9SChristian Marangi }
70*9739f5f9SChristian Marangi 
71*9739f5f9SChristian Marangi static void eip93_skcipher_cra_exit(struct crypto_tfm *tfm)
72*9739f5f9SChristian Marangi {
73*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
74*9739f5f9SChristian Marangi 
75*9739f5f9SChristian Marangi 	dma_unmap_single(ctx->eip93->dev, ctx->sa_record_base,
76*9739f5f9SChristian Marangi 			 sizeof(*ctx->sa_record), DMA_TO_DEVICE);
77*9739f5f9SChristian Marangi 	kfree(ctx->sa_record);
78*9739f5f9SChristian Marangi }
79*9739f5f9SChristian Marangi 
80*9739f5f9SChristian Marangi static int eip93_skcipher_setkey(struct crypto_skcipher *ctfm, const u8 *key,
81*9739f5f9SChristian Marangi 				 unsigned int len)
82*9739f5f9SChristian Marangi {
83*9739f5f9SChristian Marangi 	struct crypto_tfm *tfm = crypto_skcipher_tfm(ctfm);
84*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
85*9739f5f9SChristian Marangi 	struct eip93_alg_template *tmpl = container_of(tfm->__crt_alg,
86*9739f5f9SChristian Marangi 						     struct eip93_alg_template,
87*9739f5f9SChristian Marangi 						     alg.skcipher.base);
88*9739f5f9SChristian Marangi 	struct sa_record *sa_record = ctx->sa_record;
89*9739f5f9SChristian Marangi 	unsigned int keylen = len;
90*9739f5f9SChristian Marangi 	u32 flags = tmpl->flags;
91*9739f5f9SChristian Marangi 	u32 nonce = 0;
92*9739f5f9SChristian Marangi 	int ret;
93*9739f5f9SChristian Marangi 
94*9739f5f9SChristian Marangi 	if (!key || !keylen)
95*9739f5f9SChristian Marangi 		return -EINVAL;
96*9739f5f9SChristian Marangi 
97*9739f5f9SChristian Marangi 	if (IS_RFC3686(flags)) {
98*9739f5f9SChristian Marangi 		if (len < CTR_RFC3686_NONCE_SIZE)
99*9739f5f9SChristian Marangi 			return -EINVAL;
100*9739f5f9SChristian Marangi 
101*9739f5f9SChristian Marangi 		keylen = len - CTR_RFC3686_NONCE_SIZE;
102*9739f5f9SChristian Marangi 		memcpy(&nonce, key + keylen, CTR_RFC3686_NONCE_SIZE);
103*9739f5f9SChristian Marangi 	}
104*9739f5f9SChristian Marangi 
105*9739f5f9SChristian Marangi 	if (flags & EIP93_ALG_DES) {
106*9739f5f9SChristian Marangi 		ctx->blksize = DES_BLOCK_SIZE;
107*9739f5f9SChristian Marangi 		ret = verify_skcipher_des_key(ctfm, key);
108*9739f5f9SChristian Marangi 		if (ret)
109*9739f5f9SChristian Marangi 			return ret;
110*9739f5f9SChristian Marangi 	}
111*9739f5f9SChristian Marangi 	if (flags & EIP93_ALG_3DES) {
112*9739f5f9SChristian Marangi 		ctx->blksize = DES3_EDE_BLOCK_SIZE;
113*9739f5f9SChristian Marangi 		ret = verify_skcipher_des3_key(ctfm, key);
114*9739f5f9SChristian Marangi 		if (ret)
115*9739f5f9SChristian Marangi 			return ret;
116*9739f5f9SChristian Marangi 	}
117*9739f5f9SChristian Marangi 
118*9739f5f9SChristian Marangi 	if (flags & EIP93_ALG_AES) {
119*9739f5f9SChristian Marangi 		struct crypto_aes_ctx aes;
120*9739f5f9SChristian Marangi 
121*9739f5f9SChristian Marangi 		ctx->blksize = AES_BLOCK_SIZE;
122*9739f5f9SChristian Marangi 		ret = aes_expandkey(&aes, key, keylen);
123*9739f5f9SChristian Marangi 		if (ret)
124*9739f5f9SChristian Marangi 			return ret;
125*9739f5f9SChristian Marangi 	}
126*9739f5f9SChristian Marangi 
127*9739f5f9SChristian Marangi 	eip93_set_sa_record(sa_record, keylen, flags);
128*9739f5f9SChristian Marangi 
129*9739f5f9SChristian Marangi 	memcpy(sa_record->sa_key, key, keylen);
130*9739f5f9SChristian Marangi 	ctx->sa_nonce = nonce;
131*9739f5f9SChristian Marangi 	sa_record->sa_nonce = nonce;
132*9739f5f9SChristian Marangi 
133*9739f5f9SChristian Marangi 	return 0;
134*9739f5f9SChristian Marangi }
135*9739f5f9SChristian Marangi 
136*9739f5f9SChristian Marangi static int eip93_skcipher_crypt(struct skcipher_request *req)
137*9739f5f9SChristian Marangi {
138*9739f5f9SChristian Marangi 	struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
139*9739f5f9SChristian Marangi 	struct crypto_async_request *async = &req->base;
140*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
141*9739f5f9SChristian Marangi 	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
142*9739f5f9SChristian Marangi 	int ret;
143*9739f5f9SChristian Marangi 
144*9739f5f9SChristian Marangi 	if (!req->cryptlen)
145*9739f5f9SChristian Marangi 		return 0;
146*9739f5f9SChristian Marangi 
147*9739f5f9SChristian Marangi 	/*
148*9739f5f9SChristian Marangi 	 * ECB and CBC algorithms require message lengths to be
149*9739f5f9SChristian Marangi 	 * multiples of block size.
150*9739f5f9SChristian Marangi 	 */
151*9739f5f9SChristian Marangi 	if (IS_ECB(rctx->flags) || IS_CBC(rctx->flags))
152*9739f5f9SChristian Marangi 		if (!IS_ALIGNED(req->cryptlen,
153*9739f5f9SChristian Marangi 				crypto_skcipher_blocksize(skcipher)))
154*9739f5f9SChristian Marangi 			return -EINVAL;
155*9739f5f9SChristian Marangi 
156*9739f5f9SChristian Marangi 	ctx->sa_record_base = dma_map_single(ctx->eip93->dev, ctx->sa_record,
157*9739f5f9SChristian Marangi 					     sizeof(*ctx->sa_record), DMA_TO_DEVICE);
158*9739f5f9SChristian Marangi 	ret = dma_mapping_error(ctx->eip93->dev, ctx->sa_record_base);
159*9739f5f9SChristian Marangi 	if (ret)
160*9739f5f9SChristian Marangi 		return ret;
161*9739f5f9SChristian Marangi 
162*9739f5f9SChristian Marangi 	rctx->assoclen = 0;
163*9739f5f9SChristian Marangi 	rctx->textsize = req->cryptlen;
164*9739f5f9SChristian Marangi 	rctx->authsize = 0;
165*9739f5f9SChristian Marangi 	rctx->sg_src = req->src;
166*9739f5f9SChristian Marangi 	rctx->sg_dst = req->dst;
167*9739f5f9SChristian Marangi 	rctx->ivsize = crypto_skcipher_ivsize(skcipher);
168*9739f5f9SChristian Marangi 	rctx->blksize = ctx->blksize;
169*9739f5f9SChristian Marangi 	rctx->desc_flags = EIP93_DESC_SKCIPHER;
170*9739f5f9SChristian Marangi 	rctx->sa_record_base = ctx->sa_record_base;
171*9739f5f9SChristian Marangi 
172*9739f5f9SChristian Marangi 	return eip93_skcipher_send_req(async);
173*9739f5f9SChristian Marangi }
174*9739f5f9SChristian Marangi 
175*9739f5f9SChristian Marangi static int eip93_skcipher_encrypt(struct skcipher_request *req)
176*9739f5f9SChristian Marangi {
177*9739f5f9SChristian Marangi 	struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
178*9739f5f9SChristian Marangi 	struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
179*9739f5f9SChristian Marangi 				struct eip93_alg_template, alg.skcipher.base);
180*9739f5f9SChristian Marangi 
181*9739f5f9SChristian Marangi 	rctx->flags = tmpl->flags;
182*9739f5f9SChristian Marangi 	rctx->flags |= EIP93_ENCRYPT;
183*9739f5f9SChristian Marangi 
184*9739f5f9SChristian Marangi 	return eip93_skcipher_crypt(req);
185*9739f5f9SChristian Marangi }
186*9739f5f9SChristian Marangi 
187*9739f5f9SChristian Marangi static int eip93_skcipher_decrypt(struct skcipher_request *req)
188*9739f5f9SChristian Marangi {
189*9739f5f9SChristian Marangi 	struct eip93_crypto_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
190*9739f5f9SChristian Marangi 	struct eip93_cipher_reqctx *rctx = skcipher_request_ctx(req);
191*9739f5f9SChristian Marangi 	struct eip93_alg_template *tmpl = container_of(req->base.tfm->__crt_alg,
192*9739f5f9SChristian Marangi 				struct eip93_alg_template, alg.skcipher.base);
193*9739f5f9SChristian Marangi 
194*9739f5f9SChristian Marangi 	ctx->sa_record->sa_cmd0_word |= EIP93_SA_CMD_DIRECTION_IN;
195*9739f5f9SChristian Marangi 
196*9739f5f9SChristian Marangi 	rctx->flags = tmpl->flags;
197*9739f5f9SChristian Marangi 	rctx->flags |= EIP93_DECRYPT;
198*9739f5f9SChristian Marangi 
199*9739f5f9SChristian Marangi 	return eip93_skcipher_crypt(req);
200*9739f5f9SChristian Marangi }
201*9739f5f9SChristian Marangi 
202*9739f5f9SChristian Marangi /* Available algorithms in this module */
203*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_aes = {
204*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
205*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_ECB | EIP93_ALG_AES,
206*9739f5f9SChristian Marangi 	.alg.skcipher = {
207*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
208*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
209*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
210*9739f5f9SChristian Marangi 		.min_keysize = AES_MIN_KEY_SIZE,
211*9739f5f9SChristian Marangi 		.max_keysize = AES_MAX_KEY_SIZE,
212*9739f5f9SChristian Marangi 		.ivsize	= 0,
213*9739f5f9SChristian Marangi 		.base = {
214*9739f5f9SChristian Marangi 			.cra_name = "ecb(aes)",
215*9739f5f9SChristian Marangi 			.cra_driver_name = "ecb(aes-eip93)",
216*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
217*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
218*9739f5f9SChristian Marangi 					CRYPTO_ALG_NEED_FALLBACK |
219*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
220*9739f5f9SChristian Marangi 			.cra_blocksize = AES_BLOCK_SIZE,
221*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
222*9739f5f9SChristian Marangi 			.cra_alignmask = 0xf,
223*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
224*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
225*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
226*9739f5f9SChristian Marangi 		},
227*9739f5f9SChristian Marangi 	},
228*9739f5f9SChristian Marangi };
229*9739f5f9SChristian Marangi 
230*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_aes = {
231*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
232*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_CBC | EIP93_ALG_AES,
233*9739f5f9SChristian Marangi 	.alg.skcipher = {
234*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
235*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
236*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
237*9739f5f9SChristian Marangi 		.min_keysize = AES_MIN_KEY_SIZE,
238*9739f5f9SChristian Marangi 		.max_keysize = AES_MAX_KEY_SIZE,
239*9739f5f9SChristian Marangi 		.ivsize	= AES_BLOCK_SIZE,
240*9739f5f9SChristian Marangi 		.base = {
241*9739f5f9SChristian Marangi 			.cra_name = "cbc(aes)",
242*9739f5f9SChristian Marangi 			.cra_driver_name = "cbc(aes-eip93)",
243*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
244*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
245*9739f5f9SChristian Marangi 					CRYPTO_ALG_NEED_FALLBACK |
246*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
247*9739f5f9SChristian Marangi 			.cra_blocksize = AES_BLOCK_SIZE,
248*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
249*9739f5f9SChristian Marangi 			.cra_alignmask = 0xf,
250*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
251*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
252*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
253*9739f5f9SChristian Marangi 		},
254*9739f5f9SChristian Marangi 	},
255*9739f5f9SChristian Marangi };
256*9739f5f9SChristian Marangi 
257*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ctr_aes = {
258*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
259*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_CTR | EIP93_ALG_AES,
260*9739f5f9SChristian Marangi 	.alg.skcipher = {
261*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
262*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
263*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
264*9739f5f9SChristian Marangi 		.min_keysize = AES_MIN_KEY_SIZE,
265*9739f5f9SChristian Marangi 		.max_keysize = AES_MAX_KEY_SIZE,
266*9739f5f9SChristian Marangi 		.ivsize	= AES_BLOCK_SIZE,
267*9739f5f9SChristian Marangi 		.base = {
268*9739f5f9SChristian Marangi 			.cra_name = "ctr(aes)",
269*9739f5f9SChristian Marangi 			.cra_driver_name = "ctr(aes-eip93)",
270*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
271*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
272*9739f5f9SChristian Marangi 				     CRYPTO_ALG_NEED_FALLBACK |
273*9739f5f9SChristian Marangi 				     CRYPTO_ALG_KERN_DRIVER_ONLY,
274*9739f5f9SChristian Marangi 			.cra_blocksize = 1,
275*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
276*9739f5f9SChristian Marangi 			.cra_alignmask = 0xf,
277*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
278*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
279*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
280*9739f5f9SChristian Marangi 		},
281*9739f5f9SChristian Marangi 	},
282*9739f5f9SChristian Marangi };
283*9739f5f9SChristian Marangi 
284*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_rfc3686_aes = {
285*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
286*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_CTR | EIP93_MODE_RFC3686 | EIP93_ALG_AES,
287*9739f5f9SChristian Marangi 	.alg.skcipher = {
288*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
289*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
290*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
291*9739f5f9SChristian Marangi 		.min_keysize = AES_MIN_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
292*9739f5f9SChristian Marangi 		.max_keysize = AES_MAX_KEY_SIZE + CTR_RFC3686_NONCE_SIZE,
293*9739f5f9SChristian Marangi 		.ivsize	= CTR_RFC3686_IV_SIZE,
294*9739f5f9SChristian Marangi 		.base = {
295*9739f5f9SChristian Marangi 			.cra_name = "rfc3686(ctr(aes))",
296*9739f5f9SChristian Marangi 			.cra_driver_name = "rfc3686(ctr(aes-eip93))",
297*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
298*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
299*9739f5f9SChristian Marangi 					CRYPTO_ALG_NEED_FALLBACK |
300*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
301*9739f5f9SChristian Marangi 			.cra_blocksize = 1,
302*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
303*9739f5f9SChristian Marangi 			.cra_alignmask = 0xf,
304*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
305*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
306*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
307*9739f5f9SChristian Marangi 		},
308*9739f5f9SChristian Marangi 	},
309*9739f5f9SChristian Marangi };
310*9739f5f9SChristian Marangi 
311*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_des = {
312*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
313*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_ECB | EIP93_ALG_DES,
314*9739f5f9SChristian Marangi 	.alg.skcipher = {
315*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
316*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
317*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
318*9739f5f9SChristian Marangi 		.min_keysize = DES_KEY_SIZE,
319*9739f5f9SChristian Marangi 		.max_keysize = DES_KEY_SIZE,
320*9739f5f9SChristian Marangi 		.ivsize	= 0,
321*9739f5f9SChristian Marangi 		.base = {
322*9739f5f9SChristian Marangi 			.cra_name = "ecb(des)",
323*9739f5f9SChristian Marangi 			.cra_driver_name = "ebc(des-eip93)",
324*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
325*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
326*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
327*9739f5f9SChristian Marangi 			.cra_blocksize = DES_BLOCK_SIZE,
328*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
329*9739f5f9SChristian Marangi 			.cra_alignmask = 0,
330*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
331*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
332*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
333*9739f5f9SChristian Marangi 		},
334*9739f5f9SChristian Marangi 	},
335*9739f5f9SChristian Marangi };
336*9739f5f9SChristian Marangi 
337*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_des = {
338*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
339*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_CBC | EIP93_ALG_DES,
340*9739f5f9SChristian Marangi 	.alg.skcipher = {
341*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
342*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
343*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
344*9739f5f9SChristian Marangi 		.min_keysize = DES_KEY_SIZE,
345*9739f5f9SChristian Marangi 		.max_keysize = DES_KEY_SIZE,
346*9739f5f9SChristian Marangi 		.ivsize	= DES_BLOCK_SIZE,
347*9739f5f9SChristian Marangi 		.base = {
348*9739f5f9SChristian Marangi 			.cra_name = "cbc(des)",
349*9739f5f9SChristian Marangi 			.cra_driver_name = "cbc(des-eip93)",
350*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
351*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
352*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
353*9739f5f9SChristian Marangi 			.cra_blocksize = DES_BLOCK_SIZE,
354*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
355*9739f5f9SChristian Marangi 			.cra_alignmask = 0,
356*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
357*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
358*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
359*9739f5f9SChristian Marangi 		},
360*9739f5f9SChristian Marangi 	},
361*9739f5f9SChristian Marangi };
362*9739f5f9SChristian Marangi 
363*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_ecb_des3_ede = {
364*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
365*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_ECB | EIP93_ALG_3DES,
366*9739f5f9SChristian Marangi 	.alg.skcipher = {
367*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
368*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
369*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
370*9739f5f9SChristian Marangi 		.min_keysize = DES3_EDE_KEY_SIZE,
371*9739f5f9SChristian Marangi 		.max_keysize = DES3_EDE_KEY_SIZE,
372*9739f5f9SChristian Marangi 		.ivsize	= 0,
373*9739f5f9SChristian Marangi 		.base = {
374*9739f5f9SChristian Marangi 			.cra_name = "ecb(des3_ede)",
375*9739f5f9SChristian Marangi 			.cra_driver_name = "ecb(des3_ede-eip93)",
376*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
377*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
378*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
379*9739f5f9SChristian Marangi 			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
380*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
381*9739f5f9SChristian Marangi 			.cra_alignmask = 0,
382*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
383*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
384*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
385*9739f5f9SChristian Marangi 		},
386*9739f5f9SChristian Marangi 	},
387*9739f5f9SChristian Marangi };
388*9739f5f9SChristian Marangi 
389*9739f5f9SChristian Marangi struct eip93_alg_template eip93_alg_cbc_des3_ede = {
390*9739f5f9SChristian Marangi 	.type = EIP93_ALG_TYPE_SKCIPHER,
391*9739f5f9SChristian Marangi 	.flags = EIP93_MODE_CBC | EIP93_ALG_3DES,
392*9739f5f9SChristian Marangi 	.alg.skcipher = {
393*9739f5f9SChristian Marangi 		.setkey = eip93_skcipher_setkey,
394*9739f5f9SChristian Marangi 		.encrypt = eip93_skcipher_encrypt,
395*9739f5f9SChristian Marangi 		.decrypt = eip93_skcipher_decrypt,
396*9739f5f9SChristian Marangi 		.min_keysize = DES3_EDE_KEY_SIZE,
397*9739f5f9SChristian Marangi 		.max_keysize = DES3_EDE_KEY_SIZE,
398*9739f5f9SChristian Marangi 		.ivsize	= DES3_EDE_BLOCK_SIZE,
399*9739f5f9SChristian Marangi 		.base = {
400*9739f5f9SChristian Marangi 			.cra_name = "cbc(des3_ede)",
401*9739f5f9SChristian Marangi 			.cra_driver_name = "cbc(des3_ede-eip93)",
402*9739f5f9SChristian Marangi 			.cra_priority = EIP93_CRA_PRIORITY,
403*9739f5f9SChristian Marangi 			.cra_flags = CRYPTO_ALG_ASYNC |
404*9739f5f9SChristian Marangi 					CRYPTO_ALG_KERN_DRIVER_ONLY,
405*9739f5f9SChristian Marangi 			.cra_blocksize = DES3_EDE_BLOCK_SIZE,
406*9739f5f9SChristian Marangi 			.cra_ctxsize = sizeof(struct eip93_crypto_ctx),
407*9739f5f9SChristian Marangi 			.cra_alignmask = 0,
408*9739f5f9SChristian Marangi 			.cra_init = eip93_skcipher_cra_init,
409*9739f5f9SChristian Marangi 			.cra_exit = eip93_skcipher_cra_exit,
410*9739f5f9SChristian Marangi 			.cra_module = THIS_MODULE,
411*9739f5f9SChristian Marangi 		},
412*9739f5f9SChristian Marangi 	},
413*9739f5f9SChristian Marangi };
414