xref: /openbsd-src/lib/libcrypto/rsa/rsa_meth.c (revision 1da360153a2aac4b87b158742c54c8dbb9d58f24)
1*1da36015Sbeck /*	$OpenBSD: rsa_meth.c,v 1.7 2023/07/08 12:26:45 beck Exp $	*/
27a0262ffStb /*
37a0262ffStb  * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
47a0262ffStb  *
57a0262ffStb  * Permission to use, copy, modify, and distribute this software for any
67a0262ffStb  * purpose with or without fee is hereby granted, provided that the above
77a0262ffStb  * copyright notice and this permission notice appear in all copies.
87a0262ffStb  *
97a0262ffStb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107a0262ffStb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117a0262ffStb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127a0262ffStb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137a0262ffStb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147a0262ffStb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157a0262ffStb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167a0262ffStb  */
177a0262ffStb 
187a0262ffStb #include <stdlib.h>
197a0262ffStb #include <string.h>
207a0262ffStb 
217a0262ffStb #include <openssl/err.h>
227a0262ffStb #include <openssl/rsa.h>
237a0262ffStb 
24c9675a23Stb #include "rsa_local.h"
2505cb8c9eStb 
267a0262ffStb RSA_METHOD *
RSA_meth_new(const char * name,int flags)277a0262ffStb RSA_meth_new(const char *name, int flags)
287a0262ffStb {
297a0262ffStb 	RSA_METHOD *meth;
307a0262ffStb 
317a0262ffStb 	if ((meth = calloc(1, sizeof(*meth))) == NULL)
327a0262ffStb 		return NULL;
337a0262ffStb 	if ((meth->name = strdup(name)) == NULL) {
347a0262ffStb 		free(meth);
357a0262ffStb 		return NULL;
367a0262ffStb 	}
377a0262ffStb 	meth->flags = flags;
387a0262ffStb 
397a0262ffStb 	return meth;
407a0262ffStb }
41*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_new);
427a0262ffStb 
437a0262ffStb void
RSA_meth_free(RSA_METHOD * meth)447a0262ffStb RSA_meth_free(RSA_METHOD *meth)
457a0262ffStb {
46d77d95a1Stb 	if (meth == NULL)
47d77d95a1Stb 		return;
48d77d95a1Stb 
49d77d95a1Stb 	free(meth->name);
507a0262ffStb 	free(meth);
517a0262ffStb }
52*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_free);
537a0262ffStb 
547a0262ffStb RSA_METHOD *
RSA_meth_dup(const RSA_METHOD * meth)557a0262ffStb RSA_meth_dup(const RSA_METHOD *meth)
567a0262ffStb {
577a0262ffStb 	RSA_METHOD *copy;
587a0262ffStb 
597a0262ffStb 	if ((copy = calloc(1, sizeof(*copy))) == NULL)
607a0262ffStb 		return NULL;
617a0262ffStb 	memcpy(copy, meth, sizeof(*copy));
627a0262ffStb 	if ((copy->name = strdup(meth->name)) == NULL) {
637a0262ffStb 		free(copy);
647a0262ffStb 		return NULL;
657a0262ffStb 	}
667a0262ffStb 
677a0262ffStb 	return copy;
687a0262ffStb }
69*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_dup);
707a0262ffStb 
717a0262ffStb int
RSA_meth_set1_name(RSA_METHOD * meth,const char * name)72bd028407Sdjm RSA_meth_set1_name(RSA_METHOD *meth, const char *name)
73bd028407Sdjm {
74d77d95a1Stb 	char *new_name;
75bd028407Sdjm 
76d77d95a1Stb 	if ((new_name = strdup(name)) == NULL)
77bd028407Sdjm 		return 0;
78d77d95a1Stb 	free(meth->name);
79d77d95a1Stb 	meth->name = new_name;
80bd028407Sdjm 	return 1;
81bd028407Sdjm }
82*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set1_name);
83bd028407Sdjm 
84bd028407Sdjm int
RSA_meth_get_finish(const RSA_METHOD * meth)85bd028407Sdjm (*RSA_meth_get_finish(const RSA_METHOD *meth))(RSA *rsa)
86bd028407Sdjm {
87bd028407Sdjm 	return meth->finish;
88bd028407Sdjm }
89*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_finish);
90bd028407Sdjm 
91bd028407Sdjm int
RSA_meth_set_priv_enc(RSA_METHOD * meth,int (* priv_enc)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))927a0262ffStb RSA_meth_set_priv_enc(RSA_METHOD *meth, int (*priv_enc)(int flen,
937a0262ffStb     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
947a0262ffStb {
957a0262ffStb 	meth->rsa_priv_enc = priv_enc;
967a0262ffStb 	return 1;
977a0262ffStb }
98*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_priv_enc);
997a0262ffStb 
1007a0262ffStb int
RSA_meth_set_priv_dec(RSA_METHOD * meth,int (* priv_dec)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))1017a0262ffStb RSA_meth_set_priv_dec(RSA_METHOD *meth, int (*priv_dec)(int flen,
1027a0262ffStb     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
1037a0262ffStb {
1047a0262ffStb 	meth->rsa_priv_dec = priv_dec;
1057a0262ffStb 	return 1;
1067a0262ffStb }
107*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_priv_dec);
1087a0262ffStb 
1097a0262ffStb int
RSA_meth_set_finish(RSA_METHOD * meth,int (* finish)(RSA * rsa))1107a0262ffStb RSA_meth_set_finish(RSA_METHOD *meth, int (*finish)(RSA *rsa))
1117a0262ffStb {
1127a0262ffStb 	meth->finish = finish;
1137a0262ffStb 	return 1;
1147a0262ffStb }
115*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_finish);
116bd3f6f9aSgilles 
117bd3f6f9aSgilles int
RSA_meth_set_pub_enc(RSA_METHOD * meth,int (* pub_enc)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))118bd3f6f9aSgilles RSA_meth_set_pub_enc(RSA_METHOD *meth, int (*pub_enc)(int flen,
119bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
120bd3f6f9aSgilles {
121bd3f6f9aSgilles 	meth->rsa_pub_enc = pub_enc;
122bd3f6f9aSgilles 	return 1;
123bd3f6f9aSgilles }
124*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_pub_enc);
125bd3f6f9aSgilles 
126bd3f6f9aSgilles int
RSA_meth_set_pub_dec(RSA_METHOD * meth,int (* pub_dec)(int flen,const unsigned char * from,unsigned char * to,RSA * rsa,int padding))127bd3f6f9aSgilles RSA_meth_set_pub_dec(RSA_METHOD *meth, int (*pub_dec)(int flen,
128bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding))
129bd3f6f9aSgilles {
130bd3f6f9aSgilles 	meth->rsa_pub_dec = pub_dec;
131bd3f6f9aSgilles 	return 1;
132bd3f6f9aSgilles }
133*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_pub_dec);
134bd3f6f9aSgilles 
135bd3f6f9aSgilles int
RSA_meth_set_mod_exp(RSA_METHOD * meth,int (* mod_exp)(BIGNUM * r0,const BIGNUM * i,RSA * rsa,BN_CTX * ctx))136bd3f6f9aSgilles RSA_meth_set_mod_exp(RSA_METHOD *meth, int (*mod_exp)(BIGNUM *r0,
137bd3f6f9aSgilles     const BIGNUM *i, RSA *rsa, BN_CTX *ctx))
138bd3f6f9aSgilles {
139bd3f6f9aSgilles 	meth->rsa_mod_exp = mod_exp;
140bd3f6f9aSgilles 	return 1;
141bd3f6f9aSgilles }
142*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_mod_exp);
143bd3f6f9aSgilles 
144bd3f6f9aSgilles int
RSA_meth_set_bn_mod_exp(RSA_METHOD * meth,int (* bn_mod_exp)(BIGNUM * r,const BIGNUM * a,const BIGNUM * p,const BIGNUM * m,BN_CTX * ctx,BN_MONT_CTX * m_ctx))145bd3f6f9aSgilles RSA_meth_set_bn_mod_exp(RSA_METHOD *meth, int (*bn_mod_exp)(BIGNUM *r,
146bd3f6f9aSgilles     const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,
147bd3f6f9aSgilles 	BN_MONT_CTX *m_ctx))
148bd3f6f9aSgilles {
149bd3f6f9aSgilles 	meth->bn_mod_exp = bn_mod_exp;
150bd3f6f9aSgilles 	return 1;
151bd3f6f9aSgilles }
152*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_bn_mod_exp);
153bd3f6f9aSgilles 
154bd3f6f9aSgilles int
RSA_meth_set_init(RSA_METHOD * meth,int (* init)(RSA * rsa))155bd3f6f9aSgilles RSA_meth_set_init(RSA_METHOD *meth, int (*init)(RSA *rsa))
156bd3f6f9aSgilles {
157bd3f6f9aSgilles 	meth->init = init;
158bd3f6f9aSgilles 	return 1;
159bd3f6f9aSgilles }
160*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_init);
161bd3f6f9aSgilles 
162bd3f6f9aSgilles int
RSA_meth_set_keygen(RSA_METHOD * meth,int (* keygen)(RSA * rsa,int bits,BIGNUM * e,BN_GENCB * cb))163bd3f6f9aSgilles RSA_meth_set_keygen(RSA_METHOD *meth, int (*keygen)(RSA *rsa, int bits,
164bd3f6f9aSgilles     BIGNUM *e, BN_GENCB *cb))
165bd3f6f9aSgilles {
166bd3f6f9aSgilles 	meth->rsa_keygen = keygen;
167bd3f6f9aSgilles 	return 1;
168bd3f6f9aSgilles }
169*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_keygen);
170bd3f6f9aSgilles 
171bd3f6f9aSgilles int
RSA_meth_set_flags(RSA_METHOD * meth,int flags)172bd3f6f9aSgilles RSA_meth_set_flags(RSA_METHOD *meth, int flags)
173bd3f6f9aSgilles {
174bd3f6f9aSgilles 	meth->flags = flags;
175bd3f6f9aSgilles 	return 1;
176bd3f6f9aSgilles }
177*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_flags);
178bd3f6f9aSgilles 
179bd3f6f9aSgilles int
RSA_meth_set0_app_data(RSA_METHOD * meth,void * app_data)180bd3f6f9aSgilles RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data)
181bd3f6f9aSgilles {
182bd3f6f9aSgilles 	meth->app_data = app_data;
183bd3f6f9aSgilles 	return 1;
184bd3f6f9aSgilles }
185*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set0_app_data);
186bd3f6f9aSgilles 
187bd3f6f9aSgilles const char *
RSA_meth_get0_name(const RSA_METHOD * meth)188bd3f6f9aSgilles RSA_meth_get0_name(const RSA_METHOD *meth)
189bd3f6f9aSgilles {
190bd3f6f9aSgilles 	return meth->name;
191bd3f6f9aSgilles }
192*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get0_name);
193bd3f6f9aSgilles 
194bd3f6f9aSgilles int
RSA_meth_get_pub_enc(const RSA_METHOD * meth)195bd3f6f9aSgilles (*RSA_meth_get_pub_enc(const RSA_METHOD *meth))(int flen,
196bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
197bd3f6f9aSgilles {
198bd3f6f9aSgilles 	return meth->rsa_pub_enc;
199bd3f6f9aSgilles }
200*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_pub_enc);
201bd3f6f9aSgilles 
202bd3f6f9aSgilles int
RSA_meth_get_pub_dec(const RSA_METHOD * meth)203bd3f6f9aSgilles (*RSA_meth_get_pub_dec(const RSA_METHOD *meth))(int flen,
204bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
205bd3f6f9aSgilles {
206bd3f6f9aSgilles 	return meth->rsa_pub_dec;
207bd3f6f9aSgilles }
208*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_pub_dec);
209bd3f6f9aSgilles 
210bd3f6f9aSgilles int
RSA_meth_get_priv_enc(const RSA_METHOD * meth)211bd3f6f9aSgilles (*RSA_meth_get_priv_enc(const RSA_METHOD *meth))(int flen,
212bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
213bd3f6f9aSgilles {
214bd3f6f9aSgilles 	return meth->rsa_priv_enc;
215bd3f6f9aSgilles }
216*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_priv_enc);
217bd3f6f9aSgilles 
218bd3f6f9aSgilles int
RSA_meth_get_priv_dec(const RSA_METHOD * meth)219bd3f6f9aSgilles (*RSA_meth_get_priv_dec(const RSA_METHOD *meth))(int flen,
220bd3f6f9aSgilles     const unsigned char *from, unsigned char *to, RSA *rsa, int padding)
221bd3f6f9aSgilles {
222bd3f6f9aSgilles 	return meth->rsa_priv_dec;
223bd3f6f9aSgilles }
224*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_priv_dec);
225bd3f6f9aSgilles 
226bd3f6f9aSgilles int
RSA_meth_get_mod_exp(const RSA_METHOD * meth)227bd3f6f9aSgilles (*RSA_meth_get_mod_exp(const RSA_METHOD *meth))(BIGNUM *r0, const BIGNUM *i,
228bd3f6f9aSgilles     RSA *rsa, BN_CTX *ctx)
229bd3f6f9aSgilles {
230bd3f6f9aSgilles 	return meth->rsa_mod_exp;
231bd3f6f9aSgilles }
232*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_mod_exp);
233bd3f6f9aSgilles 
234bd3f6f9aSgilles int
RSA_meth_get_bn_mod_exp(const RSA_METHOD * meth)235bd3f6f9aSgilles (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth))(BIGNUM *r,
236bd3f6f9aSgilles     const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,
237bd3f6f9aSgilles     BN_MONT_CTX *m_ctx)
238bd3f6f9aSgilles {
239bd3f6f9aSgilles 	return meth->bn_mod_exp;
240bd3f6f9aSgilles }
241*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_bn_mod_exp);
242bd3f6f9aSgilles 
243bd3f6f9aSgilles int
RSA_meth_get_init(const RSA_METHOD * meth)244bd3f6f9aSgilles (*RSA_meth_get_init(const RSA_METHOD *meth))(RSA *rsa)
245bd3f6f9aSgilles {
246bd3f6f9aSgilles 	return meth->init;
247bd3f6f9aSgilles }
248*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_init);
249bd3f6f9aSgilles 
250bd3f6f9aSgilles int
RSA_meth_get_keygen(const RSA_METHOD * meth)251bd3f6f9aSgilles (*RSA_meth_get_keygen(const RSA_METHOD *meth))(RSA *rsa, int bits, BIGNUM *e,
252bd3f6f9aSgilles     BN_GENCB *cb)
253bd3f6f9aSgilles {
254bd3f6f9aSgilles 	return meth->rsa_keygen;
255bd3f6f9aSgilles }
256*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_keygen);
257bd3f6f9aSgilles 
258bd3f6f9aSgilles int
RSA_meth_get_flags(const RSA_METHOD * meth)259bd3f6f9aSgilles RSA_meth_get_flags(const RSA_METHOD *meth)
260bd3f6f9aSgilles {
261bd3f6f9aSgilles 	return meth->flags;
262bd3f6f9aSgilles }
263*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_flags);
264bd3f6f9aSgilles 
265bd3f6f9aSgilles void *
RSA_meth_get0_app_data(const RSA_METHOD * meth)266bd3f6f9aSgilles RSA_meth_get0_app_data(const RSA_METHOD *meth)
267bd3f6f9aSgilles {
268bd3f6f9aSgilles 	return meth->app_data;
269bd3f6f9aSgilles }
270*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get0_app_data);
271bd3f6f9aSgilles 
272bd3f6f9aSgilles int
RSA_meth_get_sign(const RSA_METHOD * meth)273bd3f6f9aSgilles (*RSA_meth_get_sign(const RSA_METHOD *meth))(int type,
274bd3f6f9aSgilles     const unsigned char *m, unsigned int m_length,
275bd3f6f9aSgilles     unsigned char *sigret, unsigned int *siglen,
276bd3f6f9aSgilles     const RSA *rsa)
277bd3f6f9aSgilles {
278bd3f6f9aSgilles 	return meth->rsa_sign;
279bd3f6f9aSgilles }
280*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_sign);
281bd3f6f9aSgilles 
282bd3f6f9aSgilles int
RSA_meth_set_sign(RSA_METHOD * meth,int (* sign)(int type,const unsigned char * m,unsigned int m_length,unsigned char * sigret,unsigned int * siglen,const RSA * rsa))283bd3f6f9aSgilles RSA_meth_set_sign(RSA_METHOD *meth, int (*sign)(int type,
284bd3f6f9aSgilles     const unsigned char *m, unsigned int m_length, unsigned char *sigret,
285bd3f6f9aSgilles     unsigned int *siglen, const RSA *rsa))
286bd3f6f9aSgilles {
287bd3f6f9aSgilles 	meth->rsa_sign = sign;
288bd3f6f9aSgilles 	return 1;
289bd3f6f9aSgilles }
290*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_sign);
291bd3f6f9aSgilles 
292bd3f6f9aSgilles int
RSA_meth_get_verify(const RSA_METHOD * meth)293bd3f6f9aSgilles (*RSA_meth_get_verify(const RSA_METHOD *meth))(int dtype,
294bd3f6f9aSgilles     const unsigned char *m, unsigned int m_length, const unsigned char *sigbuf,
295bd3f6f9aSgilles     unsigned int siglen, const RSA *rsa)
296bd3f6f9aSgilles {
297bd3f6f9aSgilles 	return meth->rsa_verify;
298bd3f6f9aSgilles }
299*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_get_verify);
300bd3f6f9aSgilles 
301bd3f6f9aSgilles int
RSA_meth_set_verify(RSA_METHOD * meth,int (* verify)(int dtype,const unsigned char * m,unsigned int m_length,const unsigned char * sigbuf,unsigned int siglen,const RSA * rsa))302bd3f6f9aSgilles RSA_meth_set_verify(RSA_METHOD *meth, int (*verify)(int dtype,
303bd3f6f9aSgilles     const unsigned char *m, unsigned int m_length, const unsigned char *sigbuf,
304bd3f6f9aSgilles     unsigned int siglen, const RSA *rsa))
305bd3f6f9aSgilles {
306bd3f6f9aSgilles 	meth->rsa_verify = verify;
307bd3f6f9aSgilles 	return 1;
308bd3f6f9aSgilles }
309*1da36015Sbeck LCRYPTO_ALIAS(RSA_meth_set_verify);
310