1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Public Key Encryption
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2015, Intel Corporation
6*4882a593Smuzhiyun * Authors: Tadeusz Struk <tadeusz.struk@intel.com>
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #include <linux/errno.h>
9*4882a593Smuzhiyun #include <linux/kernel.h>
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/seq_file.h>
12*4882a593Smuzhiyun #include <linux/slab.h>
13*4882a593Smuzhiyun #include <linux/string.h>
14*4882a593Smuzhiyun #include <linux/crypto.h>
15*4882a593Smuzhiyun #include <linux/compiler.h>
16*4882a593Smuzhiyun #include <crypto/algapi.h>
17*4882a593Smuzhiyun #include <linux/cryptouser.h>
18*4882a593Smuzhiyun #include <net/netlink.h>
19*4882a593Smuzhiyun #include <crypto/akcipher.h>
20*4882a593Smuzhiyun #include <crypto/internal/akcipher.h>
21*4882a593Smuzhiyun #include "internal.h"
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #ifdef CONFIG_NET
crypto_akcipher_report(struct sk_buff * skb,struct crypto_alg * alg)24*4882a593Smuzhiyun static int crypto_akcipher_report(struct sk_buff *skb, struct crypto_alg *alg)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun struct crypto_report_akcipher rakcipher;
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun memset(&rakcipher, 0, sizeof(rakcipher));
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun strscpy(rakcipher.type, "akcipher", sizeof(rakcipher.type));
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun return nla_put(skb, CRYPTOCFGA_REPORT_AKCIPHER,
33*4882a593Smuzhiyun sizeof(rakcipher), &rakcipher);
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun #else
crypto_akcipher_report(struct sk_buff * skb,struct crypto_alg * alg)36*4882a593Smuzhiyun static int crypto_akcipher_report(struct sk_buff *skb, struct crypto_alg *alg)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun return -ENOSYS;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun #endif
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun static void crypto_akcipher_show(struct seq_file *m, struct crypto_alg *alg)
43*4882a593Smuzhiyun __maybe_unused;
44*4882a593Smuzhiyun
crypto_akcipher_show(struct seq_file * m,struct crypto_alg * alg)45*4882a593Smuzhiyun static void crypto_akcipher_show(struct seq_file *m, struct crypto_alg *alg)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun seq_puts(m, "type : akcipher\n");
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
crypto_akcipher_exit_tfm(struct crypto_tfm * tfm)50*4882a593Smuzhiyun static void crypto_akcipher_exit_tfm(struct crypto_tfm *tfm)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun struct crypto_akcipher *akcipher = __crypto_akcipher_tfm(tfm);
53*4882a593Smuzhiyun struct akcipher_alg *alg = crypto_akcipher_alg(akcipher);
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun alg->exit(akcipher);
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
crypto_akcipher_init_tfm(struct crypto_tfm * tfm)58*4882a593Smuzhiyun static int crypto_akcipher_init_tfm(struct crypto_tfm *tfm)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun struct crypto_akcipher *akcipher = __crypto_akcipher_tfm(tfm);
61*4882a593Smuzhiyun struct akcipher_alg *alg = crypto_akcipher_alg(akcipher);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun if (alg->exit)
64*4882a593Smuzhiyun akcipher->base.exit = crypto_akcipher_exit_tfm;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun if (alg->init)
67*4882a593Smuzhiyun return alg->init(akcipher);
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun return 0;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
crypto_akcipher_free_instance(struct crypto_instance * inst)72*4882a593Smuzhiyun static void crypto_akcipher_free_instance(struct crypto_instance *inst)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun struct akcipher_instance *akcipher = akcipher_instance(inst);
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun akcipher->free(akcipher);
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun static const struct crypto_type crypto_akcipher_type = {
80*4882a593Smuzhiyun .extsize = crypto_alg_extsize,
81*4882a593Smuzhiyun .init_tfm = crypto_akcipher_init_tfm,
82*4882a593Smuzhiyun .free = crypto_akcipher_free_instance,
83*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
84*4882a593Smuzhiyun .show = crypto_akcipher_show,
85*4882a593Smuzhiyun #endif
86*4882a593Smuzhiyun .report = crypto_akcipher_report,
87*4882a593Smuzhiyun .maskclear = ~CRYPTO_ALG_TYPE_MASK,
88*4882a593Smuzhiyun .maskset = CRYPTO_ALG_TYPE_MASK,
89*4882a593Smuzhiyun .type = CRYPTO_ALG_TYPE_AKCIPHER,
90*4882a593Smuzhiyun .tfmsize = offsetof(struct crypto_akcipher, base),
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun
crypto_grab_akcipher(struct crypto_akcipher_spawn * spawn,struct crypto_instance * inst,const char * name,u32 type,u32 mask)93*4882a593Smuzhiyun int crypto_grab_akcipher(struct crypto_akcipher_spawn *spawn,
94*4882a593Smuzhiyun struct crypto_instance *inst,
95*4882a593Smuzhiyun const char *name, u32 type, u32 mask)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun spawn->base.frontend = &crypto_akcipher_type;
98*4882a593Smuzhiyun return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_grab_akcipher);
101*4882a593Smuzhiyun
crypto_alloc_akcipher(const char * alg_name,u32 type,u32 mask)102*4882a593Smuzhiyun struct crypto_akcipher *crypto_alloc_akcipher(const char *alg_name, u32 type,
103*4882a593Smuzhiyun u32 mask)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun return crypto_alloc_tfm(alg_name, &crypto_akcipher_type, type, mask);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_alloc_akcipher);
108*4882a593Smuzhiyun
akcipher_prepare_alg(struct akcipher_alg * alg)109*4882a593Smuzhiyun static void akcipher_prepare_alg(struct akcipher_alg *alg)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun struct crypto_alg *base = &alg->base;
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun base->cra_type = &crypto_akcipher_type;
114*4882a593Smuzhiyun base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
115*4882a593Smuzhiyun base->cra_flags |= CRYPTO_ALG_TYPE_AKCIPHER;
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun
akcipher_default_op(struct akcipher_request * req)118*4882a593Smuzhiyun static int akcipher_default_op(struct akcipher_request *req)
119*4882a593Smuzhiyun {
120*4882a593Smuzhiyun return -ENOSYS;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
akcipher_default_set_key(struct crypto_akcipher * tfm,const void * key,unsigned int keylen)123*4882a593Smuzhiyun static int akcipher_default_set_key(struct crypto_akcipher *tfm,
124*4882a593Smuzhiyun const void *key, unsigned int keylen)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun return -ENOSYS;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun
crypto_register_akcipher(struct akcipher_alg * alg)129*4882a593Smuzhiyun int crypto_register_akcipher(struct akcipher_alg *alg)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun struct crypto_alg *base = &alg->base;
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun if (!alg->sign)
134*4882a593Smuzhiyun alg->sign = akcipher_default_op;
135*4882a593Smuzhiyun if (!alg->verify)
136*4882a593Smuzhiyun alg->verify = akcipher_default_op;
137*4882a593Smuzhiyun if (!alg->encrypt)
138*4882a593Smuzhiyun alg->encrypt = akcipher_default_op;
139*4882a593Smuzhiyun if (!alg->decrypt)
140*4882a593Smuzhiyun alg->decrypt = akcipher_default_op;
141*4882a593Smuzhiyun if (!alg->set_priv_key)
142*4882a593Smuzhiyun alg->set_priv_key = akcipher_default_set_key;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun akcipher_prepare_alg(alg);
145*4882a593Smuzhiyun return crypto_register_alg(base);
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_register_akcipher);
148*4882a593Smuzhiyun
crypto_unregister_akcipher(struct akcipher_alg * alg)149*4882a593Smuzhiyun void crypto_unregister_akcipher(struct akcipher_alg *alg)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun crypto_unregister_alg(&alg->base);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_unregister_akcipher);
154*4882a593Smuzhiyun
akcipher_register_instance(struct crypto_template * tmpl,struct akcipher_instance * inst)155*4882a593Smuzhiyun int akcipher_register_instance(struct crypto_template *tmpl,
156*4882a593Smuzhiyun struct akcipher_instance *inst)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun if (WARN_ON(!inst->free))
159*4882a593Smuzhiyun return -EINVAL;
160*4882a593Smuzhiyun akcipher_prepare_alg(&inst->alg);
161*4882a593Smuzhiyun return crypto_register_instance(tmpl, akcipher_crypto_instance(inst));
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(akcipher_register_instance);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun MODULE_LICENSE("GPL");
166*4882a593Smuzhiyun MODULE_DESCRIPTION("Generic public key cipher type");
167