1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * Public Key Signature Algorithm
5 * Copyright (c) 2023 Herbert Xu <herbert@gondor.apana.org.au>
8 #include <crypto/internal/sig.h>
9 #include <linux/cryptouser.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/seq_file.h>
13 #include <linux/string.h>
14 #include <net/netlink.h>
18 static void crypto_sig_exit_tfm(struct crypto_tfm
*tfm
)
20 struct crypto_sig
*sig
= __crypto_sig_tfm(tfm
);
21 struct sig_alg
*alg
= crypto_sig_alg(sig
);
26 static int crypto_sig_init_tfm(struct crypto_tfm
*tfm
)
28 struct crypto_sig
*sig
= __crypto_sig_tfm(tfm
);
29 struct sig_alg
*alg
= crypto_sig_alg(sig
);
32 sig
->base
.exit
= crypto_sig_exit_tfm
;
35 return alg
->init(sig
);
40 static void crypto_sig_free_instance(struct crypto_instance
*inst
)
42 struct sig_instance
*sig
= sig_instance(inst
);
47 static void __maybe_unused
crypto_sig_show(struct seq_file
*m
,
48 struct crypto_alg
*alg
)
50 seq_puts(m
, "type : sig\n");
53 static int __maybe_unused
crypto_sig_report(struct sk_buff
*skb
,
54 struct crypto_alg
*alg
)
56 struct crypto_report_sig rsig
= {};
58 strscpy(rsig
.type
, "sig", sizeof(rsig
.type
));
60 return nla_put(skb
, CRYPTOCFGA_REPORT_SIG
, sizeof(rsig
), &rsig
);
63 static const struct crypto_type crypto_sig_type
= {
64 .extsize
= crypto_alg_extsize
,
65 .init_tfm
= crypto_sig_init_tfm
,
66 .free
= crypto_sig_free_instance
,
68 .show
= crypto_sig_show
,
70 #if IS_ENABLED(CONFIG_CRYPTO_USER)
71 .report
= crypto_sig_report
,
73 .maskclear
= ~CRYPTO_ALG_TYPE_MASK
,
74 .maskset
= CRYPTO_ALG_TYPE_MASK
,
75 .type
= CRYPTO_ALG_TYPE_SIG
,
76 .tfmsize
= offsetof(struct crypto_sig
, base
),
77 .algsize
= offsetof(struct sig_alg
, base
),
80 struct crypto_sig
*crypto_alloc_sig(const char *alg_name
, u32 type
, u32 mask
)
82 return crypto_alloc_tfm(alg_name
, &crypto_sig_type
, type
, mask
);
84 EXPORT_SYMBOL_GPL(crypto_alloc_sig
);
86 static int sig_default_sign(struct crypto_sig
*tfm
,
87 const void *src
, unsigned int slen
,
88 void *dst
, unsigned int dlen
)
93 static int sig_default_verify(struct crypto_sig
*tfm
,
94 const void *src
, unsigned int slen
,
95 const void *dst
, unsigned int dlen
)
100 static int sig_default_set_key(struct crypto_sig
*tfm
,
101 const void *key
, unsigned int keylen
)
106 static unsigned int sig_default_size(struct crypto_sig
*tfm
)
108 return DIV_ROUND_UP_POW2(crypto_sig_keysize(tfm
), BITS_PER_BYTE
);
111 static int sig_prepare_alg(struct sig_alg
*alg
)
113 struct crypto_alg
*base
= &alg
->base
;
116 alg
->sign
= sig_default_sign
;
118 alg
->verify
= sig_default_verify
;
119 if (!alg
->set_priv_key
)
120 alg
->set_priv_key
= sig_default_set_key
;
121 if (!alg
->set_pub_key
)
126 alg
->max_size
= sig_default_size
;
127 if (!alg
->digest_size
)
128 alg
->digest_size
= sig_default_size
;
130 base
->cra_type
= &crypto_sig_type
;
131 base
->cra_flags
&= ~CRYPTO_ALG_TYPE_MASK
;
132 base
->cra_flags
|= CRYPTO_ALG_TYPE_SIG
;
137 int crypto_register_sig(struct sig_alg
*alg
)
139 struct crypto_alg
*base
= &alg
->base
;
142 err
= sig_prepare_alg(alg
);
146 return crypto_register_alg(base
);
148 EXPORT_SYMBOL_GPL(crypto_register_sig
);
150 void crypto_unregister_sig(struct sig_alg
*alg
)
152 crypto_unregister_alg(&alg
->base
);
154 EXPORT_SYMBOL_GPL(crypto_unregister_sig
);
156 int sig_register_instance(struct crypto_template
*tmpl
,
157 struct sig_instance
*inst
)
161 if (WARN_ON(!inst
->free
))
164 err
= sig_prepare_alg(&inst
->alg
);
168 return crypto_register_instance(tmpl
, sig_crypto_instance(inst
));
170 EXPORT_SYMBOL_GPL(sig_register_instance
);
172 int crypto_grab_sig(struct crypto_sig_spawn
*spawn
,
173 struct crypto_instance
*inst
,
174 const char *name
, u32 type
, u32 mask
)
176 spawn
->base
.frontend
= &crypto_sig_type
;
177 return crypto_grab_spawn(&spawn
->base
, inst
, name
, type
, mask
);
179 EXPORT_SYMBOL_GPL(crypto_grab_sig
);
181 MODULE_LICENSE("GPL");
182 MODULE_DESCRIPTION("Public Key Signature Algorithms");