1 // SPDX-License-Identifier: GPL-2.0-only
3 * pcrypt - Parallel crypto wrapper.
5 * Copyright (C) 2009 secunet Security Networks AG
6 * Copyright (C) 2009 Steffen Klassert <steffen.klassert@secunet.com>
9 #include <crypto/algapi.h>
10 #include <crypto/internal/aead.h>
11 #include <linux/atomic.h>
12 #include <linux/err.h>
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/notifier.h>
17 #include <linux/kobject.h>
18 #include <linux/cpu.h>
19 #include <crypto/pcrypt.h>
21 static struct padata_instance
*pencrypt
;
22 static struct padata_instance
*pdecrypt
;
23 static struct kset
*pcrypt_kset
;
25 struct pcrypt_instance_ctx
{
26 struct crypto_aead_spawn spawn
;
27 struct padata_shell
*psenc
;
28 struct padata_shell
*psdec
;
32 struct pcrypt_aead_ctx
{
33 struct crypto_aead
*child
;
37 static inline struct pcrypt_instance_ctx
*pcrypt_tfm_ictx(
38 struct crypto_aead
*tfm
)
40 return aead_instance_ctx(aead_alg_instance(tfm
));
43 static int pcrypt_aead_setkey(struct crypto_aead
*parent
,
44 const u8
*key
, unsigned int keylen
)
46 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(parent
);
48 return crypto_aead_setkey(ctx
->child
, key
, keylen
);
51 static int pcrypt_aead_setauthsize(struct crypto_aead
*parent
,
52 unsigned int authsize
)
54 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(parent
);
56 return crypto_aead_setauthsize(ctx
->child
, authsize
);
59 static void pcrypt_aead_serial(struct padata_priv
*padata
)
61 struct pcrypt_request
*preq
= pcrypt_padata_request(padata
);
62 struct aead_request
*req
= pcrypt_request_ctx(preq
);
64 aead_request_complete(req
->base
.data
, padata
->info
);
67 static void pcrypt_aead_done(struct crypto_async_request
*areq
, int err
)
69 struct aead_request
*req
= areq
->data
;
70 struct pcrypt_request
*preq
= aead_request_ctx(req
);
71 struct padata_priv
*padata
= pcrypt_request_padata(preq
);
74 req
->base
.flags
&= ~CRYPTO_TFM_REQ_MAY_SLEEP
;
76 padata_do_serial(padata
);
79 static void pcrypt_aead_enc(struct padata_priv
*padata
)
81 struct pcrypt_request
*preq
= pcrypt_padata_request(padata
);
82 struct aead_request
*req
= pcrypt_request_ctx(preq
);
84 padata
->info
= crypto_aead_encrypt(req
);
86 if (padata
->info
== -EINPROGRESS
)
89 padata_do_serial(padata
);
92 static int pcrypt_aead_encrypt(struct aead_request
*req
)
95 struct pcrypt_request
*preq
= aead_request_ctx(req
);
96 struct aead_request
*creq
= pcrypt_request_ctx(preq
);
97 struct padata_priv
*padata
= pcrypt_request_padata(preq
);
98 struct crypto_aead
*aead
= crypto_aead_reqtfm(req
);
99 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(aead
);
100 u32 flags
= aead_request_flags(req
);
101 struct pcrypt_instance_ctx
*ictx
;
103 ictx
= pcrypt_tfm_ictx(aead
);
105 memset(padata
, 0, sizeof(struct padata_priv
));
107 padata
->parallel
= pcrypt_aead_enc
;
108 padata
->serial
= pcrypt_aead_serial
;
110 aead_request_set_tfm(creq
, ctx
->child
);
111 aead_request_set_callback(creq
, flags
& ~CRYPTO_TFM_REQ_MAY_SLEEP
,
112 pcrypt_aead_done
, req
);
113 aead_request_set_crypt(creq
, req
->src
, req
->dst
,
114 req
->cryptlen
, req
->iv
);
115 aead_request_set_ad(creq
, req
->assoclen
);
117 err
= padata_do_parallel(ictx
->psenc
, padata
, &ctx
->cb_cpu
);
124 static void pcrypt_aead_dec(struct padata_priv
*padata
)
126 struct pcrypt_request
*preq
= pcrypt_padata_request(padata
);
127 struct aead_request
*req
= pcrypt_request_ctx(preq
);
129 padata
->info
= crypto_aead_decrypt(req
);
131 if (padata
->info
== -EINPROGRESS
)
134 padata_do_serial(padata
);
137 static int pcrypt_aead_decrypt(struct aead_request
*req
)
140 struct pcrypt_request
*preq
= aead_request_ctx(req
);
141 struct aead_request
*creq
= pcrypt_request_ctx(preq
);
142 struct padata_priv
*padata
= pcrypt_request_padata(preq
);
143 struct crypto_aead
*aead
= crypto_aead_reqtfm(req
);
144 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(aead
);
145 u32 flags
= aead_request_flags(req
);
146 struct pcrypt_instance_ctx
*ictx
;
148 ictx
= pcrypt_tfm_ictx(aead
);
150 memset(padata
, 0, sizeof(struct padata_priv
));
152 padata
->parallel
= pcrypt_aead_dec
;
153 padata
->serial
= pcrypt_aead_serial
;
155 aead_request_set_tfm(creq
, ctx
->child
);
156 aead_request_set_callback(creq
, flags
& ~CRYPTO_TFM_REQ_MAY_SLEEP
,
157 pcrypt_aead_done
, req
);
158 aead_request_set_crypt(creq
, req
->src
, req
->dst
,
159 req
->cryptlen
, req
->iv
);
160 aead_request_set_ad(creq
, req
->assoclen
);
162 err
= padata_do_parallel(ictx
->psdec
, padata
, &ctx
->cb_cpu
);
169 static int pcrypt_aead_init_tfm(struct crypto_aead
*tfm
)
172 struct aead_instance
*inst
= aead_alg_instance(tfm
);
173 struct pcrypt_instance_ctx
*ictx
= aead_instance_ctx(inst
);
174 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(tfm
);
175 struct crypto_aead
*cipher
;
177 cpu_index
= (unsigned int)atomic_inc_return(&ictx
->tfm_count
) %
178 cpumask_weight(cpu_online_mask
);
180 ctx
->cb_cpu
= cpumask_first(cpu_online_mask
);
181 for (cpu
= 0; cpu
< cpu_index
; cpu
++)
182 ctx
->cb_cpu
= cpumask_next(ctx
->cb_cpu
, cpu_online_mask
);
184 cipher
= crypto_spawn_aead(&ictx
->spawn
);
187 return PTR_ERR(cipher
);
190 crypto_aead_set_reqsize(tfm
, sizeof(struct pcrypt_request
) +
191 sizeof(struct aead_request
) +
192 crypto_aead_reqsize(cipher
));
197 static void pcrypt_aead_exit_tfm(struct crypto_aead
*tfm
)
199 struct pcrypt_aead_ctx
*ctx
= crypto_aead_ctx(tfm
);
201 crypto_free_aead(ctx
->child
);
204 static void pcrypt_free(struct aead_instance
*inst
)
206 struct pcrypt_instance_ctx
*ctx
= aead_instance_ctx(inst
);
208 crypto_drop_aead(&ctx
->spawn
);
209 padata_free_shell(ctx
->psdec
);
210 padata_free_shell(ctx
->psenc
);
214 static int pcrypt_init_instance(struct crypto_instance
*inst
,
215 struct crypto_alg
*alg
)
217 if (snprintf(inst
->alg
.cra_driver_name
, CRYPTO_MAX_ALG_NAME
,
218 "pcrypt(%s)", alg
->cra_driver_name
) >= CRYPTO_MAX_ALG_NAME
)
219 return -ENAMETOOLONG
;
221 memcpy(inst
->alg
.cra_name
, alg
->cra_name
, CRYPTO_MAX_ALG_NAME
);
223 inst
->alg
.cra_priority
= alg
->cra_priority
+ 100;
224 inst
->alg
.cra_blocksize
= alg
->cra_blocksize
;
225 inst
->alg
.cra_alignmask
= alg
->cra_alignmask
;
230 static int pcrypt_create_aead(struct crypto_template
*tmpl
, struct rtattr
**tb
,
233 struct pcrypt_instance_ctx
*ctx
;
234 struct crypto_attr_type
*algt
;
235 struct aead_instance
*inst
;
236 struct aead_alg
*alg
;
240 algt
= crypto_get_attr_type(tb
);
242 return PTR_ERR(algt
);
244 name
= crypto_attr_alg_name(tb
[1]);
246 return PTR_ERR(name
);
248 inst
= kzalloc(sizeof(*inst
) + sizeof(*ctx
), GFP_KERNEL
);
254 ctx
= aead_instance_ctx(inst
);
255 ctx
->psenc
= padata_alloc_shell(pencrypt
);
259 ctx
->psdec
= padata_alloc_shell(pdecrypt
);
263 crypto_set_aead_spawn(&ctx
->spawn
, aead_crypto_instance(inst
));
265 err
= crypto_grab_aead(&ctx
->spawn
, name
, 0, 0);
269 alg
= crypto_spawn_aead_alg(&ctx
->spawn
);
270 err
= pcrypt_init_instance(aead_crypto_instance(inst
), &alg
->base
);
274 inst
->alg
.base
.cra_flags
= CRYPTO_ALG_ASYNC
;
276 inst
->alg
.ivsize
= crypto_aead_alg_ivsize(alg
);
277 inst
->alg
.maxauthsize
= crypto_aead_alg_maxauthsize(alg
);
279 inst
->alg
.base
.cra_ctxsize
= sizeof(struct pcrypt_aead_ctx
);
281 inst
->alg
.init
= pcrypt_aead_init_tfm
;
282 inst
->alg
.exit
= pcrypt_aead_exit_tfm
;
284 inst
->alg
.setkey
= pcrypt_aead_setkey
;
285 inst
->alg
.setauthsize
= pcrypt_aead_setauthsize
;
286 inst
->alg
.encrypt
= pcrypt_aead_encrypt
;
287 inst
->alg
.decrypt
= pcrypt_aead_decrypt
;
289 inst
->free
= pcrypt_free
;
291 err
= aead_register_instance(tmpl
, inst
);
299 crypto_drop_aead(&ctx
->spawn
);
301 padata_free_shell(ctx
->psdec
);
303 padata_free_shell(ctx
->psenc
);
309 static int pcrypt_create(struct crypto_template
*tmpl
, struct rtattr
**tb
)
311 struct crypto_attr_type
*algt
;
313 algt
= crypto_get_attr_type(tb
);
315 return PTR_ERR(algt
);
317 switch (algt
->type
& algt
->mask
& CRYPTO_ALG_TYPE_MASK
) {
318 case CRYPTO_ALG_TYPE_AEAD
:
319 return pcrypt_create_aead(tmpl
, tb
, algt
->type
, algt
->mask
);
325 static int pcrypt_sysfs_add(struct padata_instance
*pinst
, const char *name
)
329 pinst
->kobj
.kset
= pcrypt_kset
;
330 ret
= kobject_add(&pinst
->kobj
, NULL
, "%s", name
);
332 kobject_uevent(&pinst
->kobj
, KOBJ_ADD
);
337 static int pcrypt_init_padata(struct padata_instance
**pinst
, const char *name
)
341 *pinst
= padata_alloc_possible(name
);
345 ret
= pcrypt_sysfs_add(*pinst
, name
);
352 static void pcrypt_fini_padata(struct padata_instance
*pinst
)
358 static struct crypto_template pcrypt_tmpl
= {
360 .create
= pcrypt_create
,
361 .module
= THIS_MODULE
,
364 static int __init
pcrypt_init(void)
368 pcrypt_kset
= kset_create_and_add("pcrypt", NULL
, kernel_kobj
);
372 err
= pcrypt_init_padata(&pencrypt
, "pencrypt");
376 err
= pcrypt_init_padata(&pdecrypt
, "pdecrypt");
378 goto err_deinit_pencrypt
;
380 padata_start(pencrypt
);
381 padata_start(pdecrypt
);
383 return crypto_register_template(&pcrypt_tmpl
);
386 pcrypt_fini_padata(pencrypt
);
388 kset_unregister(pcrypt_kset
);
393 static void __exit
pcrypt_exit(void)
395 crypto_unregister_template(&pcrypt_tmpl
);
397 pcrypt_fini_padata(pencrypt
);
398 pcrypt_fini_padata(pdecrypt
);
400 kset_unregister(pcrypt_kset
);
403 subsys_initcall(pcrypt_init
);
404 module_exit(pcrypt_exit
);
406 MODULE_LICENSE("GPL");
407 MODULE_AUTHOR("Steffen Klassert <steffen.klassert@secunet.com>");
408 MODULE_DESCRIPTION("Parallel crypto wrapper");
409 MODULE_ALIAS_CRYPTO("pcrypt");