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