xref: /third_party/openssl/crypto/rsa/rsa_meth.c (revision e1051a39)
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 * RSA 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 <string.h>
17e1051a39Sopenharmony_ci#include "rsa_local.h"
18e1051a39Sopenharmony_ci#include <openssl/err.h>
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_ciRSA_METHOD *RSA_meth_new(const char *name, int flags)
21e1051a39Sopenharmony_ci{
22e1051a39Sopenharmony_ci    RSA_METHOD *meth = OPENSSL_zalloc(sizeof(*meth));
23e1051a39Sopenharmony_ci
24e1051a39Sopenharmony_ci    if (meth != NULL) {
25e1051a39Sopenharmony_ci        meth->flags = flags;
26e1051a39Sopenharmony_ci
27e1051a39Sopenharmony_ci        meth->name = OPENSSL_strdup(name);
28e1051a39Sopenharmony_ci        if (meth->name != NULL)
29e1051a39Sopenharmony_ci            return meth;
30e1051a39Sopenharmony_ci
31e1051a39Sopenharmony_ci        OPENSSL_free(meth);
32e1051a39Sopenharmony_ci    }
33e1051a39Sopenharmony_ci
34e1051a39Sopenharmony_ci    ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE);
35e1051a39Sopenharmony_ci    return NULL;
36e1051a39Sopenharmony_ci}
37e1051a39Sopenharmony_ci
38e1051a39Sopenharmony_civoid RSA_meth_free(RSA_METHOD *meth)
39e1051a39Sopenharmony_ci{
40e1051a39Sopenharmony_ci    if (meth != NULL) {
41e1051a39Sopenharmony_ci        OPENSSL_free(meth->name);
42e1051a39Sopenharmony_ci        OPENSSL_free(meth);
43e1051a39Sopenharmony_ci    }
44e1051a39Sopenharmony_ci}
45e1051a39Sopenharmony_ci
46e1051a39Sopenharmony_ciRSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth)
47e1051a39Sopenharmony_ci{
48e1051a39Sopenharmony_ci    RSA_METHOD *ret = OPENSSL_malloc(sizeof(*ret));
49e1051a39Sopenharmony_ci
50e1051a39Sopenharmony_ci    if (ret != NULL) {
51e1051a39Sopenharmony_ci        memcpy(ret, meth, sizeof(*meth));
52e1051a39Sopenharmony_ci
53e1051a39Sopenharmony_ci        ret->name = OPENSSL_strdup(meth->name);
54e1051a39Sopenharmony_ci        if (ret->name != NULL)
55e1051a39Sopenharmony_ci            return ret;
56e1051a39Sopenharmony_ci
57e1051a39Sopenharmony_ci        OPENSSL_free(ret);
58e1051a39Sopenharmony_ci    }
59e1051a39Sopenharmony_ci
60e1051a39Sopenharmony_ci    ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE);
61e1051a39Sopenharmony_ci    return NULL;
62e1051a39Sopenharmony_ci}
63e1051a39Sopenharmony_ci
64e1051a39Sopenharmony_ciconst char *RSA_meth_get0_name(const RSA_METHOD *meth)
65e1051a39Sopenharmony_ci{
66e1051a39Sopenharmony_ci    return meth->name;
67e1051a39Sopenharmony_ci}
68e1051a39Sopenharmony_ci
69e1051a39Sopenharmony_ciint RSA_meth_set1_name(RSA_METHOD *meth, const char *name)
70e1051a39Sopenharmony_ci{
71e1051a39Sopenharmony_ci    char *tmpname = OPENSSL_strdup(name);
72e1051a39Sopenharmony_ci
73e1051a39Sopenharmony_ci    if (tmpname == NULL) {
74e1051a39Sopenharmony_ci        ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE);
75e1051a39Sopenharmony_ci        return 0;
76e1051a39Sopenharmony_ci    }
77e1051a39Sopenharmony_ci
78e1051a39Sopenharmony_ci    OPENSSL_free(meth->name);
79e1051a39Sopenharmony_ci    meth->name = tmpname;
80e1051a39Sopenharmony_ci
81e1051a39Sopenharmony_ci    return 1;
82e1051a39Sopenharmony_ci}
83e1051a39Sopenharmony_ci
84e1051a39Sopenharmony_ciint RSA_meth_get_flags(const RSA_METHOD *meth)
85e1051a39Sopenharmony_ci{
86e1051a39Sopenharmony_ci    return meth->flags;
87e1051a39Sopenharmony_ci}
88e1051a39Sopenharmony_ci
89e1051a39Sopenharmony_ciint RSA_meth_set_flags(RSA_METHOD *meth, int flags)
90e1051a39Sopenharmony_ci{
91e1051a39Sopenharmony_ci    meth->flags = flags;
92e1051a39Sopenharmony_ci    return 1;
93e1051a39Sopenharmony_ci}
94e1051a39Sopenharmony_ci
95e1051a39Sopenharmony_civoid *RSA_meth_get0_app_data(const RSA_METHOD *meth)
96e1051a39Sopenharmony_ci{
97e1051a39Sopenharmony_ci    return meth->app_data;
98e1051a39Sopenharmony_ci}
99e1051a39Sopenharmony_ci
100e1051a39Sopenharmony_ciint RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data)
101e1051a39Sopenharmony_ci{
102e1051a39Sopenharmony_ci    meth->app_data = app_data;
103e1051a39Sopenharmony_ci    return 1;
104e1051a39Sopenharmony_ci}
105e1051a39Sopenharmony_ci
106e1051a39Sopenharmony_ciint (*RSA_meth_get_pub_enc(const RSA_METHOD *meth))
107e1051a39Sopenharmony_ci    (int flen, const unsigned char *from,
108e1051a39Sopenharmony_ci     unsigned char *to, RSA *rsa, int padding)
109e1051a39Sopenharmony_ci{
110e1051a39Sopenharmony_ci    return meth->rsa_pub_enc;
111e1051a39Sopenharmony_ci}
112e1051a39Sopenharmony_ci
113e1051a39Sopenharmony_ciint RSA_meth_set_pub_enc(RSA_METHOD *meth,
114e1051a39Sopenharmony_ci                         int (*pub_enc) (int flen, const unsigned char *from,
115e1051a39Sopenharmony_ci                                         unsigned char *to, RSA *rsa,
116e1051a39Sopenharmony_ci                                         int padding))
117e1051a39Sopenharmony_ci{
118e1051a39Sopenharmony_ci    meth->rsa_pub_enc = pub_enc;
119e1051a39Sopenharmony_ci    return 1;
120e1051a39Sopenharmony_ci}
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ciint (*RSA_meth_get_pub_dec(const RSA_METHOD *meth))
123e1051a39Sopenharmony_ci    (int flen, const unsigned char *from,
124e1051a39Sopenharmony_ci     unsigned char *to, RSA *rsa, int padding)
125e1051a39Sopenharmony_ci{
126e1051a39Sopenharmony_ci    return meth->rsa_pub_dec;
127e1051a39Sopenharmony_ci}
128e1051a39Sopenharmony_ci
129e1051a39Sopenharmony_ciint RSA_meth_set_pub_dec(RSA_METHOD *meth,
130e1051a39Sopenharmony_ci                         int (*pub_dec) (int flen, const unsigned char *from,
131e1051a39Sopenharmony_ci                                         unsigned char *to, RSA *rsa,
132e1051a39Sopenharmony_ci                                         int padding))
133e1051a39Sopenharmony_ci{
134e1051a39Sopenharmony_ci    meth->rsa_pub_dec = pub_dec;
135e1051a39Sopenharmony_ci    return 1;
136e1051a39Sopenharmony_ci}
137e1051a39Sopenharmony_ci
138e1051a39Sopenharmony_ciint (*RSA_meth_get_priv_enc(const RSA_METHOD *meth))
139e1051a39Sopenharmony_ci    (int flen, const unsigned char *from,
140e1051a39Sopenharmony_ci     unsigned char *to, RSA *rsa, int padding)
141e1051a39Sopenharmony_ci{
142e1051a39Sopenharmony_ci    return meth->rsa_priv_enc;
143e1051a39Sopenharmony_ci}
144e1051a39Sopenharmony_ci
145e1051a39Sopenharmony_ciint RSA_meth_set_priv_enc(RSA_METHOD *meth,
146e1051a39Sopenharmony_ci                          int (*priv_enc) (int flen, const unsigned char *from,
147e1051a39Sopenharmony_ci                                           unsigned char *to, RSA *rsa,
148e1051a39Sopenharmony_ci                                           int padding))
149e1051a39Sopenharmony_ci{
150e1051a39Sopenharmony_ci    meth->rsa_priv_enc = priv_enc;
151e1051a39Sopenharmony_ci    return 1;
152e1051a39Sopenharmony_ci}
153e1051a39Sopenharmony_ci
154e1051a39Sopenharmony_ciint (*RSA_meth_get_priv_dec(const RSA_METHOD *meth))
155e1051a39Sopenharmony_ci    (int flen, const unsigned char *from,
156e1051a39Sopenharmony_ci     unsigned char *to, RSA *rsa, int padding)
157e1051a39Sopenharmony_ci{
158e1051a39Sopenharmony_ci    return meth->rsa_priv_dec;
159e1051a39Sopenharmony_ci}
160e1051a39Sopenharmony_ci
161e1051a39Sopenharmony_ciint RSA_meth_set_priv_dec(RSA_METHOD *meth,
162e1051a39Sopenharmony_ci                          int (*priv_dec) (int flen, const unsigned char *from,
163e1051a39Sopenharmony_ci                                           unsigned char *to, RSA *rsa,
164e1051a39Sopenharmony_ci                                           int padding))
165e1051a39Sopenharmony_ci{
166e1051a39Sopenharmony_ci    meth->rsa_priv_dec = priv_dec;
167e1051a39Sopenharmony_ci    return 1;
168e1051a39Sopenharmony_ci}
169e1051a39Sopenharmony_ci
170e1051a39Sopenharmony_ci    /* Can be null */
171e1051a39Sopenharmony_ciint (*RSA_meth_get_mod_exp(const RSA_METHOD *meth))
172e1051a39Sopenharmony_ci    (BIGNUM *r0, const BIGNUM *i, RSA *rsa, BN_CTX *ctx)
173e1051a39Sopenharmony_ci{
174e1051a39Sopenharmony_ci    return meth->rsa_mod_exp;
175e1051a39Sopenharmony_ci}
176e1051a39Sopenharmony_ci
177e1051a39Sopenharmony_ciint RSA_meth_set_mod_exp(RSA_METHOD *meth,
178e1051a39Sopenharmony_ci                         int (*mod_exp) (BIGNUM *r0, const BIGNUM *i, RSA *rsa,
179e1051a39Sopenharmony_ci                                         BN_CTX *ctx))
180e1051a39Sopenharmony_ci{
181e1051a39Sopenharmony_ci    meth->rsa_mod_exp = mod_exp;
182e1051a39Sopenharmony_ci    return 1;
183e1051a39Sopenharmony_ci}
184e1051a39Sopenharmony_ci
185e1051a39Sopenharmony_ci    /* Can be null */
186e1051a39Sopenharmony_ciint (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth))
187e1051a39Sopenharmony_ci    (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
188e1051a39Sopenharmony_ci     const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx)
189e1051a39Sopenharmony_ci{
190e1051a39Sopenharmony_ci    return meth->bn_mod_exp;
191e1051a39Sopenharmony_ci}
192e1051a39Sopenharmony_ci
193e1051a39Sopenharmony_ciint RSA_meth_set_bn_mod_exp(RSA_METHOD *meth,
194e1051a39Sopenharmony_ci                            int (*bn_mod_exp) (BIGNUM *r,
195e1051a39Sopenharmony_ci                                               const BIGNUM *a,
196e1051a39Sopenharmony_ci                                               const BIGNUM *p,
197e1051a39Sopenharmony_ci                                               const BIGNUM *m,
198e1051a39Sopenharmony_ci                                               BN_CTX *ctx,
199e1051a39Sopenharmony_ci                                               BN_MONT_CTX *m_ctx))
200e1051a39Sopenharmony_ci{
201e1051a39Sopenharmony_ci    meth->bn_mod_exp = bn_mod_exp;
202e1051a39Sopenharmony_ci    return 1;
203e1051a39Sopenharmony_ci}
204e1051a39Sopenharmony_ci
205e1051a39Sopenharmony_ci    /* called at new */
206e1051a39Sopenharmony_ciint (*RSA_meth_get_init(const RSA_METHOD *meth)) (RSA *rsa)
207e1051a39Sopenharmony_ci{
208e1051a39Sopenharmony_ci    return meth->init;
209e1051a39Sopenharmony_ci}
210e1051a39Sopenharmony_ci
211e1051a39Sopenharmony_ciint RSA_meth_set_init(RSA_METHOD *meth, int (*init) (RSA *rsa))
212e1051a39Sopenharmony_ci{
213e1051a39Sopenharmony_ci    meth->init = init;
214e1051a39Sopenharmony_ci    return 1;
215e1051a39Sopenharmony_ci}
216e1051a39Sopenharmony_ci
217e1051a39Sopenharmony_ci    /* called at free */
218e1051a39Sopenharmony_ciint (*RSA_meth_get_finish(const RSA_METHOD *meth)) (RSA *rsa)
219e1051a39Sopenharmony_ci{
220e1051a39Sopenharmony_ci    return meth->finish;
221e1051a39Sopenharmony_ci}
222e1051a39Sopenharmony_ci
223e1051a39Sopenharmony_ciint RSA_meth_set_finish(RSA_METHOD *meth, int (*finish) (RSA *rsa))
224e1051a39Sopenharmony_ci{
225e1051a39Sopenharmony_ci    meth->finish = finish;
226e1051a39Sopenharmony_ci    return 1;
227e1051a39Sopenharmony_ci}
228e1051a39Sopenharmony_ci
229e1051a39Sopenharmony_ciint (*RSA_meth_get_sign(const RSA_METHOD *meth))
230e1051a39Sopenharmony_ci    (int type,
231e1051a39Sopenharmony_ci     const unsigned char *m, unsigned int m_length,
232e1051a39Sopenharmony_ci     unsigned char *sigret, unsigned int *siglen,
233e1051a39Sopenharmony_ci     const RSA *rsa)
234e1051a39Sopenharmony_ci{
235e1051a39Sopenharmony_ci    return meth->rsa_sign;
236e1051a39Sopenharmony_ci}
237e1051a39Sopenharmony_ci
238e1051a39Sopenharmony_ciint RSA_meth_set_sign(RSA_METHOD *meth,
239e1051a39Sopenharmony_ci                      int (*sign) (int type, const unsigned char *m,
240e1051a39Sopenharmony_ci                                   unsigned int m_length,
241e1051a39Sopenharmony_ci                                   unsigned char *sigret, unsigned int *siglen,
242e1051a39Sopenharmony_ci                                   const RSA *rsa))
243e1051a39Sopenharmony_ci{
244e1051a39Sopenharmony_ci    meth->rsa_sign = sign;
245e1051a39Sopenharmony_ci    return 1;
246e1051a39Sopenharmony_ci}
247e1051a39Sopenharmony_ci
248e1051a39Sopenharmony_ciint (*RSA_meth_get_verify(const RSA_METHOD *meth))
249e1051a39Sopenharmony_ci    (int dtype, const unsigned char *m,
250e1051a39Sopenharmony_ci     unsigned int m_length, const unsigned char *sigbuf,
251e1051a39Sopenharmony_ci     unsigned int siglen, const RSA *rsa)
252e1051a39Sopenharmony_ci{
253e1051a39Sopenharmony_ci    return meth->rsa_verify;
254e1051a39Sopenharmony_ci}
255e1051a39Sopenharmony_ci
256e1051a39Sopenharmony_ciint RSA_meth_set_verify(RSA_METHOD *meth,
257e1051a39Sopenharmony_ci                        int (*verify) (int dtype, const unsigned char *m,
258e1051a39Sopenharmony_ci                                       unsigned int m_length,
259e1051a39Sopenharmony_ci                                       const unsigned char *sigbuf,
260e1051a39Sopenharmony_ci                                       unsigned int siglen, const RSA *rsa))
261e1051a39Sopenharmony_ci{
262e1051a39Sopenharmony_ci    meth->rsa_verify = verify;
263e1051a39Sopenharmony_ci    return 1;
264e1051a39Sopenharmony_ci}
265e1051a39Sopenharmony_ci
266e1051a39Sopenharmony_ciint (*RSA_meth_get_keygen(const RSA_METHOD *meth))
267e1051a39Sopenharmony_ci    (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb)
268e1051a39Sopenharmony_ci{
269e1051a39Sopenharmony_ci    return meth->rsa_keygen;
270e1051a39Sopenharmony_ci}
271e1051a39Sopenharmony_ci
272e1051a39Sopenharmony_ciint RSA_meth_set_keygen(RSA_METHOD *meth,
273e1051a39Sopenharmony_ci                        int (*keygen) (RSA *rsa, int bits, BIGNUM *e,
274e1051a39Sopenharmony_ci                                       BN_GENCB *cb))
275e1051a39Sopenharmony_ci{
276e1051a39Sopenharmony_ci    meth->rsa_keygen = keygen;
277e1051a39Sopenharmony_ci    return 1;
278e1051a39Sopenharmony_ci}
279e1051a39Sopenharmony_ci
280e1051a39Sopenharmony_ciint (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth))
281e1051a39Sopenharmony_ci    (RSA *rsa, int bits, int primes, BIGNUM *e, BN_GENCB *cb)
282e1051a39Sopenharmony_ci{
283e1051a39Sopenharmony_ci    return meth->rsa_multi_prime_keygen;
284e1051a39Sopenharmony_ci}
285e1051a39Sopenharmony_ci
286e1051a39Sopenharmony_ciint RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth,
287e1051a39Sopenharmony_ci                                    int (*keygen) (RSA *rsa, int bits,
288e1051a39Sopenharmony_ci                                                   int primes, BIGNUM *e,
289e1051a39Sopenharmony_ci                                                   BN_GENCB *cb))
290e1051a39Sopenharmony_ci{
291e1051a39Sopenharmony_ci    meth->rsa_multi_prime_keygen = keygen;
292e1051a39Sopenharmony_ci    return 1;
293e1051a39Sopenharmony_ci}
294