1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * pcrypt - Parallel crypto wrapper.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2009 secunet Security Networks AG
6*4882a593Smuzhiyun * Copyright (C) 2009 Steffen Klassert <steffen.klassert@secunet.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <crypto/algapi.h>
10*4882a593Smuzhiyun #include <crypto/internal/aead.h>
11*4882a593Smuzhiyun #include <linux/atomic.h>
12*4882a593Smuzhiyun #include <linux/err.h>
13*4882a593Smuzhiyun #include <linux/init.h>
14*4882a593Smuzhiyun #include <linux/module.h>
15*4882a593Smuzhiyun #include <linux/slab.h>
16*4882a593Smuzhiyun #include <linux/kobject.h>
17*4882a593Smuzhiyun #include <linux/cpu.h>
18*4882a593Smuzhiyun #include <crypto/pcrypt.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun static struct padata_instance *pencrypt;
21*4882a593Smuzhiyun static struct padata_instance *pdecrypt;
22*4882a593Smuzhiyun static struct kset *pcrypt_kset;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun struct pcrypt_instance_ctx {
25*4882a593Smuzhiyun struct crypto_aead_spawn spawn;
26*4882a593Smuzhiyun struct padata_shell *psenc;
27*4882a593Smuzhiyun struct padata_shell *psdec;
28*4882a593Smuzhiyun atomic_t tfm_count;
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun struct pcrypt_aead_ctx {
32*4882a593Smuzhiyun struct crypto_aead *child;
33*4882a593Smuzhiyun unsigned int cb_cpu;
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun
pcrypt_tfm_ictx(struct crypto_aead * tfm)36*4882a593Smuzhiyun static inline struct pcrypt_instance_ctx *pcrypt_tfm_ictx(
37*4882a593Smuzhiyun struct crypto_aead *tfm)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun return aead_instance_ctx(aead_alg_instance(tfm));
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun
pcrypt_aead_setkey(struct crypto_aead * parent,const u8 * key,unsigned int keylen)42*4882a593Smuzhiyun static int pcrypt_aead_setkey(struct crypto_aead *parent,
43*4882a593Smuzhiyun const u8 *key, unsigned int keylen)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(parent);
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun return crypto_aead_setkey(ctx->child, key, keylen);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
pcrypt_aead_setauthsize(struct crypto_aead * parent,unsigned int authsize)50*4882a593Smuzhiyun static int pcrypt_aead_setauthsize(struct crypto_aead *parent,
51*4882a593Smuzhiyun unsigned int authsize)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(parent);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun return crypto_aead_setauthsize(ctx->child, authsize);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
pcrypt_aead_serial(struct padata_priv * padata)58*4882a593Smuzhiyun static void pcrypt_aead_serial(struct padata_priv *padata)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun struct pcrypt_request *preq = pcrypt_padata_request(padata);
61*4882a593Smuzhiyun struct aead_request *req = pcrypt_request_ctx(preq);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun aead_request_complete(req->base.data, padata->info);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
pcrypt_aead_done(struct crypto_async_request * areq,int err)66*4882a593Smuzhiyun static void pcrypt_aead_done(struct crypto_async_request *areq, int err)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun struct aead_request *req = areq->data;
69*4882a593Smuzhiyun struct pcrypt_request *preq = aead_request_ctx(req);
70*4882a593Smuzhiyun struct padata_priv *padata = pcrypt_request_padata(preq);
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun padata->info = err;
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun padata_do_serial(padata);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
pcrypt_aead_enc(struct padata_priv * padata)77*4882a593Smuzhiyun static void pcrypt_aead_enc(struct padata_priv *padata)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun struct pcrypt_request *preq = pcrypt_padata_request(padata);
80*4882a593Smuzhiyun struct aead_request *req = pcrypt_request_ctx(preq);
81*4882a593Smuzhiyun int ret;
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun ret = crypto_aead_encrypt(req);
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun if (ret == -EINPROGRESS)
86*4882a593Smuzhiyun return;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun padata->info = ret;
89*4882a593Smuzhiyun padata_do_serial(padata);
90*4882a593Smuzhiyun }
91*4882a593Smuzhiyun
pcrypt_aead_encrypt(struct aead_request * req)92*4882a593Smuzhiyun static int pcrypt_aead_encrypt(struct aead_request *req)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun int err;
95*4882a593Smuzhiyun struct pcrypt_request *preq = aead_request_ctx(req);
96*4882a593Smuzhiyun struct aead_request *creq = pcrypt_request_ctx(preq);
97*4882a593Smuzhiyun struct padata_priv *padata = pcrypt_request_padata(preq);
98*4882a593Smuzhiyun struct crypto_aead *aead = crypto_aead_reqtfm(req);
99*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead);
100*4882a593Smuzhiyun u32 flags = aead_request_flags(req);
101*4882a593Smuzhiyun struct pcrypt_instance_ctx *ictx;
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun ictx = pcrypt_tfm_ictx(aead);
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun memset(padata, 0, sizeof(struct padata_priv));
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun padata->parallel = pcrypt_aead_enc;
108*4882a593Smuzhiyun padata->serial = pcrypt_aead_serial;
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun aead_request_set_tfm(creq, ctx->child);
111*4882a593Smuzhiyun aead_request_set_callback(creq, flags & ~CRYPTO_TFM_REQ_MAY_SLEEP,
112*4882a593Smuzhiyun pcrypt_aead_done, req);
113*4882a593Smuzhiyun aead_request_set_crypt(creq, req->src, req->dst,
114*4882a593Smuzhiyun req->cryptlen, req->iv);
115*4882a593Smuzhiyun aead_request_set_ad(creq, req->assoclen);
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun err = padata_do_parallel(ictx->psenc, padata, &ctx->cb_cpu);
118*4882a593Smuzhiyun if (!err)
119*4882a593Smuzhiyun return -EINPROGRESS;
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun return err;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
pcrypt_aead_dec(struct padata_priv * padata)124*4882a593Smuzhiyun static void pcrypt_aead_dec(struct padata_priv *padata)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun struct pcrypt_request *preq = pcrypt_padata_request(padata);
127*4882a593Smuzhiyun struct aead_request *req = pcrypt_request_ctx(preq);
128*4882a593Smuzhiyun int ret;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun ret = crypto_aead_decrypt(req);
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun if (ret == -EINPROGRESS)
133*4882a593Smuzhiyun return;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun padata->info = ret;
136*4882a593Smuzhiyun padata_do_serial(padata);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
pcrypt_aead_decrypt(struct aead_request * req)139*4882a593Smuzhiyun static int pcrypt_aead_decrypt(struct aead_request *req)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun int err;
142*4882a593Smuzhiyun struct pcrypt_request *preq = aead_request_ctx(req);
143*4882a593Smuzhiyun struct aead_request *creq = pcrypt_request_ctx(preq);
144*4882a593Smuzhiyun struct padata_priv *padata = pcrypt_request_padata(preq);
145*4882a593Smuzhiyun struct crypto_aead *aead = crypto_aead_reqtfm(req);
146*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(aead);
147*4882a593Smuzhiyun u32 flags = aead_request_flags(req);
148*4882a593Smuzhiyun struct pcrypt_instance_ctx *ictx;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun ictx = pcrypt_tfm_ictx(aead);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun memset(padata, 0, sizeof(struct padata_priv));
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun padata->parallel = pcrypt_aead_dec;
155*4882a593Smuzhiyun padata->serial = pcrypt_aead_serial;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun aead_request_set_tfm(creq, ctx->child);
158*4882a593Smuzhiyun aead_request_set_callback(creq, flags & ~CRYPTO_TFM_REQ_MAY_SLEEP,
159*4882a593Smuzhiyun pcrypt_aead_done, req);
160*4882a593Smuzhiyun aead_request_set_crypt(creq, req->src, req->dst,
161*4882a593Smuzhiyun req->cryptlen, req->iv);
162*4882a593Smuzhiyun aead_request_set_ad(creq, req->assoclen);
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun err = padata_do_parallel(ictx->psdec, padata, &ctx->cb_cpu);
165*4882a593Smuzhiyun if (!err)
166*4882a593Smuzhiyun return -EINPROGRESS;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun return err;
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
pcrypt_aead_init_tfm(struct crypto_aead * tfm)171*4882a593Smuzhiyun static int pcrypt_aead_init_tfm(struct crypto_aead *tfm)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun int cpu, cpu_index;
174*4882a593Smuzhiyun struct aead_instance *inst = aead_alg_instance(tfm);
175*4882a593Smuzhiyun struct pcrypt_instance_ctx *ictx = aead_instance_ctx(inst);
176*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(tfm);
177*4882a593Smuzhiyun struct crypto_aead *cipher;
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun cpu_index = (unsigned int)atomic_inc_return(&ictx->tfm_count) %
180*4882a593Smuzhiyun cpumask_weight(cpu_online_mask);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun ctx->cb_cpu = cpumask_first(cpu_online_mask);
183*4882a593Smuzhiyun for (cpu = 0; cpu < cpu_index; cpu++)
184*4882a593Smuzhiyun ctx->cb_cpu = cpumask_next(ctx->cb_cpu, cpu_online_mask);
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun cipher = crypto_spawn_aead(&ictx->spawn);
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun if (IS_ERR(cipher))
189*4882a593Smuzhiyun return PTR_ERR(cipher);
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun ctx->child = cipher;
192*4882a593Smuzhiyun crypto_aead_set_reqsize(tfm, sizeof(struct pcrypt_request) +
193*4882a593Smuzhiyun sizeof(struct aead_request) +
194*4882a593Smuzhiyun crypto_aead_reqsize(cipher));
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun return 0;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
pcrypt_aead_exit_tfm(struct crypto_aead * tfm)199*4882a593Smuzhiyun static void pcrypt_aead_exit_tfm(struct crypto_aead *tfm)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun struct pcrypt_aead_ctx *ctx = crypto_aead_ctx(tfm);
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun crypto_free_aead(ctx->child);
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
pcrypt_free(struct aead_instance * inst)206*4882a593Smuzhiyun static void pcrypt_free(struct aead_instance *inst)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun struct pcrypt_instance_ctx *ctx = aead_instance_ctx(inst);
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun crypto_drop_aead(&ctx->spawn);
211*4882a593Smuzhiyun padata_free_shell(ctx->psdec);
212*4882a593Smuzhiyun padata_free_shell(ctx->psenc);
213*4882a593Smuzhiyun kfree(inst);
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
pcrypt_init_instance(struct crypto_instance * inst,struct crypto_alg * alg)216*4882a593Smuzhiyun static int pcrypt_init_instance(struct crypto_instance *inst,
217*4882a593Smuzhiyun struct crypto_alg *alg)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun if (snprintf(inst->alg.cra_driver_name, CRYPTO_MAX_ALG_NAME,
220*4882a593Smuzhiyun "pcrypt(%s)", alg->cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
221*4882a593Smuzhiyun return -ENAMETOOLONG;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun memcpy(inst->alg.cra_name, alg->cra_name, CRYPTO_MAX_ALG_NAME);
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun inst->alg.cra_priority = alg->cra_priority + 100;
226*4882a593Smuzhiyun inst->alg.cra_blocksize = alg->cra_blocksize;
227*4882a593Smuzhiyun inst->alg.cra_alignmask = alg->cra_alignmask;
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun return 0;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
pcrypt_create_aead(struct crypto_template * tmpl,struct rtattr ** tb,struct crypto_attr_type * algt)232*4882a593Smuzhiyun static int pcrypt_create_aead(struct crypto_template *tmpl, struct rtattr **tb,
233*4882a593Smuzhiyun struct crypto_attr_type *algt)
234*4882a593Smuzhiyun {
235*4882a593Smuzhiyun struct pcrypt_instance_ctx *ctx;
236*4882a593Smuzhiyun struct aead_instance *inst;
237*4882a593Smuzhiyun struct aead_alg *alg;
238*4882a593Smuzhiyun u32 mask = crypto_algt_inherited_mask(algt);
239*4882a593Smuzhiyun int err;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
242*4882a593Smuzhiyun if (!inst)
243*4882a593Smuzhiyun return -ENOMEM;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun err = -ENOMEM;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun ctx = aead_instance_ctx(inst);
248*4882a593Smuzhiyun ctx->psenc = padata_alloc_shell(pencrypt);
249*4882a593Smuzhiyun if (!ctx->psenc)
250*4882a593Smuzhiyun goto err_free_inst;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun ctx->psdec = padata_alloc_shell(pdecrypt);
253*4882a593Smuzhiyun if (!ctx->psdec)
254*4882a593Smuzhiyun goto err_free_inst;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun err = crypto_grab_aead(&ctx->spawn, aead_crypto_instance(inst),
257*4882a593Smuzhiyun crypto_attr_alg_name(tb[1]), 0, mask);
258*4882a593Smuzhiyun if (err)
259*4882a593Smuzhiyun goto err_free_inst;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun alg = crypto_spawn_aead_alg(&ctx->spawn);
262*4882a593Smuzhiyun err = pcrypt_init_instance(aead_crypto_instance(inst), &alg->base);
263*4882a593Smuzhiyun if (err)
264*4882a593Smuzhiyun goto err_free_inst;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun inst->alg.base.cra_flags |= CRYPTO_ALG_ASYNC;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun inst->alg.ivsize = crypto_aead_alg_ivsize(alg);
269*4882a593Smuzhiyun inst->alg.maxauthsize = crypto_aead_alg_maxauthsize(alg);
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun inst->alg.base.cra_ctxsize = sizeof(struct pcrypt_aead_ctx);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun inst->alg.init = pcrypt_aead_init_tfm;
274*4882a593Smuzhiyun inst->alg.exit = pcrypt_aead_exit_tfm;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun inst->alg.setkey = pcrypt_aead_setkey;
277*4882a593Smuzhiyun inst->alg.setauthsize = pcrypt_aead_setauthsize;
278*4882a593Smuzhiyun inst->alg.encrypt = pcrypt_aead_encrypt;
279*4882a593Smuzhiyun inst->alg.decrypt = pcrypt_aead_decrypt;
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun inst->free = pcrypt_free;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun err = aead_register_instance(tmpl, inst);
284*4882a593Smuzhiyun if (err) {
285*4882a593Smuzhiyun err_free_inst:
286*4882a593Smuzhiyun pcrypt_free(inst);
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun return err;
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
pcrypt_create(struct crypto_template * tmpl,struct rtattr ** tb)291*4882a593Smuzhiyun static int pcrypt_create(struct crypto_template *tmpl, struct rtattr **tb)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun struct crypto_attr_type *algt;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun algt = crypto_get_attr_type(tb);
296*4882a593Smuzhiyun if (IS_ERR(algt))
297*4882a593Smuzhiyun return PTR_ERR(algt);
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun switch (algt->type & algt->mask & CRYPTO_ALG_TYPE_MASK) {
300*4882a593Smuzhiyun case CRYPTO_ALG_TYPE_AEAD:
301*4882a593Smuzhiyun return pcrypt_create_aead(tmpl, tb, algt);
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun return -EINVAL;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
pcrypt_sysfs_add(struct padata_instance * pinst,const char * name)307*4882a593Smuzhiyun static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun int ret;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun pinst->kobj.kset = pcrypt_kset;
312*4882a593Smuzhiyun ret = kobject_add(&pinst->kobj, NULL, "%s", name);
313*4882a593Smuzhiyun if (!ret)
314*4882a593Smuzhiyun kobject_uevent(&pinst->kobj, KOBJ_ADD);
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun return ret;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun
pcrypt_init_padata(struct padata_instance ** pinst,const char * name)319*4882a593Smuzhiyun static int pcrypt_init_padata(struct padata_instance **pinst, const char *name)
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun int ret = -ENOMEM;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun *pinst = padata_alloc(name);
324*4882a593Smuzhiyun if (!*pinst)
325*4882a593Smuzhiyun return ret;
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun ret = pcrypt_sysfs_add(*pinst, name);
328*4882a593Smuzhiyun if (ret)
329*4882a593Smuzhiyun padata_free(*pinst);
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun return ret;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun static struct crypto_template pcrypt_tmpl = {
335*4882a593Smuzhiyun .name = "pcrypt",
336*4882a593Smuzhiyun .create = pcrypt_create,
337*4882a593Smuzhiyun .module = THIS_MODULE,
338*4882a593Smuzhiyun };
339*4882a593Smuzhiyun
pcrypt_init(void)340*4882a593Smuzhiyun static int __init pcrypt_init(void)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun int err = -ENOMEM;
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun pcrypt_kset = kset_create_and_add("pcrypt", NULL, kernel_kobj);
345*4882a593Smuzhiyun if (!pcrypt_kset)
346*4882a593Smuzhiyun goto err;
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun err = pcrypt_init_padata(&pencrypt, "pencrypt");
349*4882a593Smuzhiyun if (err)
350*4882a593Smuzhiyun goto err_unreg_kset;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun err = pcrypt_init_padata(&pdecrypt, "pdecrypt");
353*4882a593Smuzhiyun if (err)
354*4882a593Smuzhiyun goto err_deinit_pencrypt;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun return crypto_register_template(&pcrypt_tmpl);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun err_deinit_pencrypt:
359*4882a593Smuzhiyun padata_free(pencrypt);
360*4882a593Smuzhiyun err_unreg_kset:
361*4882a593Smuzhiyun kset_unregister(pcrypt_kset);
362*4882a593Smuzhiyun err:
363*4882a593Smuzhiyun return err;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
pcrypt_exit(void)366*4882a593Smuzhiyun static void __exit pcrypt_exit(void)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun crypto_unregister_template(&pcrypt_tmpl);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun padata_free(pencrypt);
371*4882a593Smuzhiyun padata_free(pdecrypt);
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun kset_unregister(pcrypt_kset);
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun subsys_initcall(pcrypt_init);
377*4882a593Smuzhiyun module_exit(pcrypt_exit);
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun MODULE_LICENSE("GPL");
380*4882a593Smuzhiyun MODULE_AUTHOR("Steffen Klassert <steffen.klassert@secunet.com>");
381*4882a593Smuzhiyun MODULE_DESCRIPTION("Parallel crypto wrapper");
382*4882a593Smuzhiyun MODULE_ALIAS_CRYPTO("pcrypt");
383