xref: /openbsd-src/lib/libcrypto/dsa/dsa_meth.c (revision 81dbdade91b3e62ec2fd29e5611b1a0ab5fde727)
1*81dbdadeSbeck /*	$OpenBSD: dsa_meth.c,v 1.7 2023/07/08 14:28:15 beck Exp $	*/
2980ae8f2Stb /*
3980ae8f2Stb  * Copyright (c) 2018 Theo Buehler <tb@openbsd.org>
4980ae8f2Stb  *
5980ae8f2Stb  * Permission to use, copy, modify, and distribute this software for any
6980ae8f2Stb  * purpose with or without fee is hereby granted, provided that the above
7980ae8f2Stb  * copyright notice and this permission notice appear in all copies.
8980ae8f2Stb  *
9980ae8f2Stb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10980ae8f2Stb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11980ae8f2Stb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12980ae8f2Stb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13980ae8f2Stb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14980ae8f2Stb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15980ae8f2Stb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16980ae8f2Stb  */
17980ae8f2Stb 
18980ae8f2Stb #include <stdlib.h>
19980ae8f2Stb #include <string.h>
20980ae8f2Stb 
21980ae8f2Stb #include <openssl/dsa.h>
22980ae8f2Stb #include <openssl/err.h>
23980ae8f2Stb 
24c9675a23Stb #include "dsa_local.h"
25f69303b6Stb 
26980ae8f2Stb DSA_METHOD *
DSA_meth_new(const char * name,int flags)27980ae8f2Stb DSA_meth_new(const char *name, int flags)
28980ae8f2Stb {
29980ae8f2Stb 	DSA_METHOD *meth;
30980ae8f2Stb 
31980ae8f2Stb 	if ((meth = calloc(1, sizeof(*meth))) == NULL)
32980ae8f2Stb 		return NULL;
33980ae8f2Stb 	if ((meth->name = strdup(name)) == NULL) {
34980ae8f2Stb 		free(meth);
35980ae8f2Stb 		return NULL;
36980ae8f2Stb 	}
37980ae8f2Stb 	meth->flags = flags;
38980ae8f2Stb 
39980ae8f2Stb 	return meth;
40980ae8f2Stb }
41*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_new);
42980ae8f2Stb 
43980ae8f2Stb void
DSA_meth_free(DSA_METHOD * meth)44980ae8f2Stb DSA_meth_free(DSA_METHOD *meth)
45980ae8f2Stb {
468fc6b311Stb 	if (meth == NULL)
472a533b50Sbcook 		return;
488fc6b311Stb 
498fc6b311Stb 	free(meth->name);
50980ae8f2Stb 	free(meth);
51980ae8f2Stb }
52*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_free);
53980ae8f2Stb 
54980ae8f2Stb DSA_METHOD *
DSA_meth_dup(const DSA_METHOD * meth)55980ae8f2Stb DSA_meth_dup(const DSA_METHOD *meth)
56980ae8f2Stb {
57980ae8f2Stb 	DSA_METHOD *copy;
58980ae8f2Stb 
59980ae8f2Stb 	if ((copy = calloc(1, sizeof(*copy))) == NULL)
60980ae8f2Stb 		return NULL;
61980ae8f2Stb 	memcpy(copy, meth, sizeof(*copy));
62980ae8f2Stb 	if ((copy->name = strdup(meth->name)) == NULL) {
63980ae8f2Stb 		free(copy);
64980ae8f2Stb 		return NULL;
65980ae8f2Stb 	}
66980ae8f2Stb 
67980ae8f2Stb 	return copy;
68980ae8f2Stb }
69*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_dup);
70980ae8f2Stb 
718fc6b311Stb const char *
DSA_meth_get0_name(const DSA_METHOD * meth)728fc6b311Stb DSA_meth_get0_name(const DSA_METHOD *meth)
738fc6b311Stb {
748fc6b311Stb 	return meth->name;
758fc6b311Stb }
76*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_get0_name);
778fc6b311Stb 
788fc6b311Stb int
DSA_meth_set1_name(DSA_METHOD * meth,const char * name)798fc6b311Stb DSA_meth_set1_name(DSA_METHOD *meth, const char *name)
808fc6b311Stb {
818fc6b311Stb 	char *new_name;
828fc6b311Stb 
838fc6b311Stb 	if ((new_name = strdup(name)) == NULL) {
848fc6b311Stb 		DSAerror(ERR_R_MALLOC_FAILURE);
858fc6b311Stb 		return 0;
868fc6b311Stb 	}
878fc6b311Stb 
888fc6b311Stb 	free(meth->name);
898fc6b311Stb 	meth->name = new_name;
908fc6b311Stb 
918fc6b311Stb 	return 1;
928fc6b311Stb }
93*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_set1_name);
948fc6b311Stb 
95980ae8f2Stb int
DSA_meth_set_sign(DSA_METHOD * meth,DSA_SIG * (* sign)(const unsigned char *,int,DSA *))96980ae8f2Stb DSA_meth_set_sign(DSA_METHOD *meth,
97980ae8f2Stb     DSA_SIG *(*sign)(const unsigned char *, int, DSA *))
98980ae8f2Stb {
99980ae8f2Stb 	meth->dsa_do_sign = sign;
100980ae8f2Stb 	return 1;
101980ae8f2Stb }
102*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_set_sign);
103980ae8f2Stb 
104980ae8f2Stb int
DSA_meth_set_finish(DSA_METHOD * meth,int (* finish)(DSA *))105980ae8f2Stb DSA_meth_set_finish(DSA_METHOD *meth, int (*finish)(DSA *))
106980ae8f2Stb {
107980ae8f2Stb 	meth->finish = finish;
108980ae8f2Stb 	return 1;
109980ae8f2Stb }
110*81dbdadeSbeck LCRYPTO_ALIAS(DSA_meth_set_finish);
111