1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2016-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * DSA low level APIs are deprecated for public use, but still ok for 12e1051a39Sopenharmony_ci * internal use. 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci#include "internal/deprecated.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include "dsa_local.h" 17e1051a39Sopenharmony_ci#include <string.h> 18e1051a39Sopenharmony_ci#include <openssl/err.h> 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 21e1051a39Sopenharmony_ciDSA_METHOD *DSA_meth_new(const char *name, int flags) 22e1051a39Sopenharmony_ci{ 23e1051a39Sopenharmony_ci DSA_METHOD *dsam = OPENSSL_zalloc(sizeof(*dsam)); 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_ci if (dsam != NULL) { 26e1051a39Sopenharmony_ci dsam->flags = flags; 27e1051a39Sopenharmony_ci 28e1051a39Sopenharmony_ci dsam->name = OPENSSL_strdup(name); 29e1051a39Sopenharmony_ci if (dsam->name != NULL) 30e1051a39Sopenharmony_ci return dsam; 31e1051a39Sopenharmony_ci 32e1051a39Sopenharmony_ci OPENSSL_free(dsam); 33e1051a39Sopenharmony_ci } 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE); 36e1051a39Sopenharmony_ci return NULL; 37e1051a39Sopenharmony_ci} 38e1051a39Sopenharmony_ci 39e1051a39Sopenharmony_civoid DSA_meth_free(DSA_METHOD *dsam) 40e1051a39Sopenharmony_ci{ 41e1051a39Sopenharmony_ci if (dsam != NULL) { 42e1051a39Sopenharmony_ci OPENSSL_free(dsam->name); 43e1051a39Sopenharmony_ci OPENSSL_free(dsam); 44e1051a39Sopenharmony_ci } 45e1051a39Sopenharmony_ci} 46e1051a39Sopenharmony_ci 47e1051a39Sopenharmony_ciDSA_METHOD *DSA_meth_dup(const DSA_METHOD *dsam) 48e1051a39Sopenharmony_ci{ 49e1051a39Sopenharmony_ci DSA_METHOD *ret = OPENSSL_malloc(sizeof(*ret)); 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ci if (ret != NULL) { 52e1051a39Sopenharmony_ci memcpy(ret, dsam, sizeof(*dsam)); 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ci ret->name = OPENSSL_strdup(dsam->name); 55e1051a39Sopenharmony_ci if (ret->name != NULL) 56e1051a39Sopenharmony_ci return ret; 57e1051a39Sopenharmony_ci 58e1051a39Sopenharmony_ci OPENSSL_free(ret); 59e1051a39Sopenharmony_ci } 60e1051a39Sopenharmony_ci 61e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE); 62e1051a39Sopenharmony_ci return NULL; 63e1051a39Sopenharmony_ci} 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ciconst char *DSA_meth_get0_name(const DSA_METHOD *dsam) 66e1051a39Sopenharmony_ci{ 67e1051a39Sopenharmony_ci return dsam->name; 68e1051a39Sopenharmony_ci} 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ciint DSA_meth_set1_name(DSA_METHOD *dsam, const char *name) 71e1051a39Sopenharmony_ci{ 72e1051a39Sopenharmony_ci char *tmpname = OPENSSL_strdup(name); 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci if (tmpname == NULL) { 75e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE); 76e1051a39Sopenharmony_ci return 0; 77e1051a39Sopenharmony_ci } 78e1051a39Sopenharmony_ci 79e1051a39Sopenharmony_ci OPENSSL_free(dsam->name); 80e1051a39Sopenharmony_ci dsam->name = tmpname; 81e1051a39Sopenharmony_ci 82e1051a39Sopenharmony_ci return 1; 83e1051a39Sopenharmony_ci} 84e1051a39Sopenharmony_ci 85e1051a39Sopenharmony_ciint DSA_meth_get_flags(const DSA_METHOD *dsam) 86e1051a39Sopenharmony_ci{ 87e1051a39Sopenharmony_ci return dsam->flags; 88e1051a39Sopenharmony_ci} 89e1051a39Sopenharmony_ci 90e1051a39Sopenharmony_ciint DSA_meth_set_flags(DSA_METHOD *dsam, int flags) 91e1051a39Sopenharmony_ci{ 92e1051a39Sopenharmony_ci dsam->flags = flags; 93e1051a39Sopenharmony_ci return 1; 94e1051a39Sopenharmony_ci} 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_civoid *DSA_meth_get0_app_data(const DSA_METHOD *dsam) 97e1051a39Sopenharmony_ci{ 98e1051a39Sopenharmony_ci return dsam->app_data; 99e1051a39Sopenharmony_ci} 100e1051a39Sopenharmony_ci 101e1051a39Sopenharmony_ciint DSA_meth_set0_app_data(DSA_METHOD *dsam, void *app_data) 102e1051a39Sopenharmony_ci{ 103e1051a39Sopenharmony_ci dsam->app_data = app_data; 104e1051a39Sopenharmony_ci return 1; 105e1051a39Sopenharmony_ci} 106e1051a39Sopenharmony_ci 107e1051a39Sopenharmony_ciDSA_SIG *(*DSA_meth_get_sign(const DSA_METHOD *dsam)) 108e1051a39Sopenharmony_ci (const unsigned char *, int, DSA *) 109e1051a39Sopenharmony_ci{ 110e1051a39Sopenharmony_ci return dsam->dsa_do_sign; 111e1051a39Sopenharmony_ci} 112e1051a39Sopenharmony_ci 113e1051a39Sopenharmony_ciint DSA_meth_set_sign(DSA_METHOD *dsam, 114e1051a39Sopenharmony_ci DSA_SIG *(*sign) (const unsigned char *, int, DSA *)) 115e1051a39Sopenharmony_ci{ 116e1051a39Sopenharmony_ci dsam->dsa_do_sign = sign; 117e1051a39Sopenharmony_ci return 1; 118e1051a39Sopenharmony_ci} 119e1051a39Sopenharmony_ci 120e1051a39Sopenharmony_ciint (*DSA_meth_get_sign_setup(const DSA_METHOD *dsam)) 121e1051a39Sopenharmony_ci (DSA *, BN_CTX *, BIGNUM **, BIGNUM **) 122e1051a39Sopenharmony_ci{ 123e1051a39Sopenharmony_ci return dsam->dsa_sign_setup; 124e1051a39Sopenharmony_ci} 125e1051a39Sopenharmony_ci 126e1051a39Sopenharmony_ciint DSA_meth_set_sign_setup(DSA_METHOD *dsam, 127e1051a39Sopenharmony_ci int (*sign_setup) (DSA *, BN_CTX *, BIGNUM **, BIGNUM **)) 128e1051a39Sopenharmony_ci{ 129e1051a39Sopenharmony_ci dsam->dsa_sign_setup = sign_setup; 130e1051a39Sopenharmony_ci return 1; 131e1051a39Sopenharmony_ci} 132e1051a39Sopenharmony_ci 133e1051a39Sopenharmony_ciint (*DSA_meth_get_verify(const DSA_METHOD *dsam)) 134e1051a39Sopenharmony_ci (const unsigned char *, int, DSA_SIG *, DSA *) 135e1051a39Sopenharmony_ci{ 136e1051a39Sopenharmony_ci return dsam->dsa_do_verify; 137e1051a39Sopenharmony_ci} 138e1051a39Sopenharmony_ci 139e1051a39Sopenharmony_ciint DSA_meth_set_verify(DSA_METHOD *dsam, 140e1051a39Sopenharmony_ci int (*verify) (const unsigned char *, int, DSA_SIG *, DSA *)) 141e1051a39Sopenharmony_ci{ 142e1051a39Sopenharmony_ci dsam->dsa_do_verify = verify; 143e1051a39Sopenharmony_ci return 1; 144e1051a39Sopenharmony_ci} 145e1051a39Sopenharmony_ci 146e1051a39Sopenharmony_ciint (*DSA_meth_get_mod_exp(const DSA_METHOD *dsam)) 147e1051a39Sopenharmony_ci (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, 148e1051a39Sopenharmony_ci const BIGNUM *, const BIGNUM *, BN_CTX *, BN_MONT_CTX *) 149e1051a39Sopenharmony_ci{ 150e1051a39Sopenharmony_ci return dsam->dsa_mod_exp; 151e1051a39Sopenharmony_ci} 152e1051a39Sopenharmony_ci 153e1051a39Sopenharmony_ciint DSA_meth_set_mod_exp(DSA_METHOD *dsam, 154e1051a39Sopenharmony_ci int (*mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, 155e1051a39Sopenharmony_ci const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *, 156e1051a39Sopenharmony_ci BN_MONT_CTX *)) 157e1051a39Sopenharmony_ci{ 158e1051a39Sopenharmony_ci dsam->dsa_mod_exp = mod_exp; 159e1051a39Sopenharmony_ci return 1; 160e1051a39Sopenharmony_ci} 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ciint (*DSA_meth_get_bn_mod_exp(const DSA_METHOD *dsam)) 163e1051a39Sopenharmony_ci (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *, 164e1051a39Sopenharmony_ci BN_MONT_CTX *) 165e1051a39Sopenharmony_ci{ 166e1051a39Sopenharmony_ci return dsam->bn_mod_exp; 167e1051a39Sopenharmony_ci} 168e1051a39Sopenharmony_ci 169e1051a39Sopenharmony_ciint DSA_meth_set_bn_mod_exp(DSA_METHOD *dsam, 170e1051a39Sopenharmony_ci int (*bn_mod_exp) (DSA *, BIGNUM *, const BIGNUM *, const BIGNUM *, 171e1051a39Sopenharmony_ci const BIGNUM *, BN_CTX *, BN_MONT_CTX *)) 172e1051a39Sopenharmony_ci{ 173e1051a39Sopenharmony_ci dsam->bn_mod_exp = bn_mod_exp; 174e1051a39Sopenharmony_ci return 1; 175e1051a39Sopenharmony_ci} 176e1051a39Sopenharmony_ci 177e1051a39Sopenharmony_ciint (*DSA_meth_get_init(const DSA_METHOD *dsam))(DSA *) 178e1051a39Sopenharmony_ci{ 179e1051a39Sopenharmony_ci return dsam->init; 180e1051a39Sopenharmony_ci} 181e1051a39Sopenharmony_ci 182e1051a39Sopenharmony_ciint DSA_meth_set_init(DSA_METHOD *dsam, int (*init)(DSA *)) 183e1051a39Sopenharmony_ci{ 184e1051a39Sopenharmony_ci dsam->init = init; 185e1051a39Sopenharmony_ci return 1; 186e1051a39Sopenharmony_ci} 187e1051a39Sopenharmony_ci 188e1051a39Sopenharmony_ciint (*DSA_meth_get_finish(const DSA_METHOD *dsam)) (DSA *) 189e1051a39Sopenharmony_ci{ 190e1051a39Sopenharmony_ci return dsam->finish; 191e1051a39Sopenharmony_ci} 192e1051a39Sopenharmony_ci 193e1051a39Sopenharmony_ciint DSA_meth_set_finish(DSA_METHOD *dsam, int (*finish) (DSA *)) 194e1051a39Sopenharmony_ci{ 195e1051a39Sopenharmony_ci dsam->finish = finish; 196e1051a39Sopenharmony_ci return 1; 197e1051a39Sopenharmony_ci} 198e1051a39Sopenharmony_ci 199e1051a39Sopenharmony_ciint (*DSA_meth_get_paramgen(const DSA_METHOD *dsam)) 200e1051a39Sopenharmony_ci (DSA *, int, const unsigned char *, int, int *, unsigned long *, 201e1051a39Sopenharmony_ci BN_GENCB *) 202e1051a39Sopenharmony_ci{ 203e1051a39Sopenharmony_ci return dsam->dsa_paramgen; 204e1051a39Sopenharmony_ci} 205e1051a39Sopenharmony_ci 206e1051a39Sopenharmony_ciint DSA_meth_set_paramgen(DSA_METHOD *dsam, 207e1051a39Sopenharmony_ci int (*paramgen) (DSA *, int, const unsigned char *, int, int *, 208e1051a39Sopenharmony_ci unsigned long *, BN_GENCB *)) 209e1051a39Sopenharmony_ci{ 210e1051a39Sopenharmony_ci dsam->dsa_paramgen = paramgen; 211e1051a39Sopenharmony_ci return 1; 212e1051a39Sopenharmony_ci} 213e1051a39Sopenharmony_ci 214e1051a39Sopenharmony_ciint (*DSA_meth_get_keygen(const DSA_METHOD *dsam)) (DSA *) 215e1051a39Sopenharmony_ci{ 216e1051a39Sopenharmony_ci return dsam->dsa_keygen; 217e1051a39Sopenharmony_ci} 218e1051a39Sopenharmony_ci 219e1051a39Sopenharmony_ciint DSA_meth_set_keygen(DSA_METHOD *dsam, int (*keygen) (DSA *)) 220e1051a39Sopenharmony_ci{ 221e1051a39Sopenharmony_ci dsam->dsa_keygen = keygen; 222e1051a39Sopenharmony_ci return 1; 223e1051a39Sopenharmony_ci} 224e1051a39Sopenharmony_ci#endif 225