1 /* $OpenBSD: dsa_meth.c,v 1.5 2022/07/11 05:33:14 bcook Exp $ */ 2 /* 3 * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <stdlib.h> 19 #include <string.h> 20 21 #include <openssl/dsa.h> 22 #include <openssl/err.h> 23 24 #include "dsa_locl.h" 25 26 DSA_METHOD * 27 DSA_meth_new(const char *name, int flags) 28 { 29 DSA_METHOD *meth; 30 31 if ((meth = calloc(1, sizeof(*meth))) == NULL) 32 return NULL; 33 if ((meth->name = strdup(name)) == NULL) { 34 free(meth); 35 return NULL; 36 } 37 meth->flags = flags; 38 39 return meth; 40 } 41 42 void 43 DSA_meth_free(DSA_METHOD *meth) 44 { 45 if (meth == NULL) 46 return; 47 48 free(meth->name); 49 free(meth); 50 } 51 52 DSA_METHOD * 53 DSA_meth_dup(const DSA_METHOD *meth) 54 { 55 DSA_METHOD *copy; 56 57 if ((copy = calloc(1, sizeof(*copy))) == NULL) 58 return NULL; 59 memcpy(copy, meth, sizeof(*copy)); 60 if ((copy->name = strdup(meth->name)) == NULL) { 61 free(copy); 62 return NULL; 63 } 64 65 return copy; 66 } 67 68 const char * 69 DSA_meth_get0_name(const DSA_METHOD *meth) 70 { 71 return meth->name; 72 } 73 74 int 75 DSA_meth_set1_name(DSA_METHOD *meth, const char *name) 76 { 77 char *new_name; 78 79 if ((new_name = strdup(name)) == NULL) { 80 DSAerror(ERR_R_MALLOC_FAILURE); 81 return 0; 82 } 83 84 free(meth->name); 85 meth->name = new_name; 86 87 return 1; 88 } 89 90 int 91 DSA_meth_set_sign(DSA_METHOD *meth, 92 DSA_SIG *(*sign)(const unsigned char *, int, DSA *)) 93 { 94 meth->dsa_do_sign = sign; 95 return 1; 96 } 97 98 int 99 DSA_meth_set_finish(DSA_METHOD *meth, int (*finish)(DSA *)) 100 { 101 meth->finish = finish; 102 return 1; 103 } 104