xref: /OK3568_Linux_fs/kernel/crypto/kpp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Key-agreement Protocol Primitives (KPP)
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2016, Intel Corporation
6*4882a593Smuzhiyun  * Authors: Salvatore Benedetto <salvatore.benedetto@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 <crypto/algapi.h>
16*4882a593Smuzhiyun #include <linux/cryptouser.h>
17*4882a593Smuzhiyun #include <linux/compiler.h>
18*4882a593Smuzhiyun #include <net/netlink.h>
19*4882a593Smuzhiyun #include <crypto/kpp.h>
20*4882a593Smuzhiyun #include <crypto/internal/kpp.h>
21*4882a593Smuzhiyun #include "internal.h"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #ifdef CONFIG_NET
crypto_kpp_report(struct sk_buff * skb,struct crypto_alg * alg)24*4882a593Smuzhiyun static int crypto_kpp_report(struct sk_buff *skb, struct crypto_alg *alg)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	struct crypto_report_kpp rkpp;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	memset(&rkpp, 0, sizeof(rkpp));
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	strscpy(rkpp.type, "kpp", sizeof(rkpp.type));
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	return nla_put(skb, CRYPTOCFGA_REPORT_KPP, sizeof(rkpp), &rkpp);
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun #else
crypto_kpp_report(struct sk_buff * skb,struct crypto_alg * alg)35*4882a593Smuzhiyun static int crypto_kpp_report(struct sk_buff *skb, struct crypto_alg *alg)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun 	return -ENOSYS;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun static void crypto_kpp_show(struct seq_file *m, struct crypto_alg *alg)
42*4882a593Smuzhiyun 	__maybe_unused;
43*4882a593Smuzhiyun 
crypto_kpp_show(struct seq_file * m,struct crypto_alg * alg)44*4882a593Smuzhiyun static void crypto_kpp_show(struct seq_file *m, struct crypto_alg *alg)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	seq_puts(m, "type         : kpp\n");
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
crypto_kpp_exit_tfm(struct crypto_tfm * tfm)49*4882a593Smuzhiyun static void crypto_kpp_exit_tfm(struct crypto_tfm *tfm)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	struct crypto_kpp *kpp = __crypto_kpp_tfm(tfm);
52*4882a593Smuzhiyun 	struct kpp_alg *alg = crypto_kpp_alg(kpp);
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	alg->exit(kpp);
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
crypto_kpp_init_tfm(struct crypto_tfm * tfm)57*4882a593Smuzhiyun static int crypto_kpp_init_tfm(struct crypto_tfm *tfm)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	struct crypto_kpp *kpp = __crypto_kpp_tfm(tfm);
60*4882a593Smuzhiyun 	struct kpp_alg *alg = crypto_kpp_alg(kpp);
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	if (alg->exit)
63*4882a593Smuzhiyun 		kpp->base.exit = crypto_kpp_exit_tfm;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	if (alg->init)
66*4882a593Smuzhiyun 		return alg->init(kpp);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	return 0;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun static const struct crypto_type crypto_kpp_type = {
72*4882a593Smuzhiyun 	.extsize = crypto_alg_extsize,
73*4882a593Smuzhiyun 	.init_tfm = crypto_kpp_init_tfm,
74*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
75*4882a593Smuzhiyun 	.show = crypto_kpp_show,
76*4882a593Smuzhiyun #endif
77*4882a593Smuzhiyun 	.report = crypto_kpp_report,
78*4882a593Smuzhiyun 	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
79*4882a593Smuzhiyun 	.maskset = CRYPTO_ALG_TYPE_MASK,
80*4882a593Smuzhiyun 	.type = CRYPTO_ALG_TYPE_KPP,
81*4882a593Smuzhiyun 	.tfmsize = offsetof(struct crypto_kpp, base),
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
crypto_alloc_kpp(const char * alg_name,u32 type,u32 mask)84*4882a593Smuzhiyun struct crypto_kpp *crypto_alloc_kpp(const char *alg_name, u32 type, u32 mask)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	return crypto_alloc_tfm(alg_name, &crypto_kpp_type, type, mask);
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_alloc_kpp);
89*4882a593Smuzhiyun 
kpp_prepare_alg(struct kpp_alg * alg)90*4882a593Smuzhiyun static void kpp_prepare_alg(struct kpp_alg *alg)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun 	struct crypto_alg *base = &alg->base;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	base->cra_type = &crypto_kpp_type;
95*4882a593Smuzhiyun 	base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
96*4882a593Smuzhiyun 	base->cra_flags |= CRYPTO_ALG_TYPE_KPP;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
crypto_register_kpp(struct kpp_alg * alg)99*4882a593Smuzhiyun int crypto_register_kpp(struct kpp_alg *alg)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	struct crypto_alg *base = &alg->base;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	kpp_prepare_alg(alg);
104*4882a593Smuzhiyun 	return crypto_register_alg(base);
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_register_kpp);
107*4882a593Smuzhiyun 
crypto_unregister_kpp(struct kpp_alg * alg)108*4882a593Smuzhiyun void crypto_unregister_kpp(struct kpp_alg *alg)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	crypto_unregister_alg(&alg->base);
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(crypto_unregister_kpp);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun MODULE_LICENSE("GPL");
115*4882a593Smuzhiyun MODULE_DESCRIPTION("Key-agreement Protocol Primitives");
116