rsa.h 21.3 KB
Newer Older
R
Rich Salz 已提交
1
/*
M
Matt Caswell 已提交
2
 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3
 *
R
Rich Salz 已提交
4 5 6 7
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8 9 10
 */

#ifndef HEADER_RSA_H
11
# define HEADER_RSA_H
12

13
# include <openssl/opensslconf.h>
14

R
Rich Salz 已提交
15 16
# ifndef OPENSSL_NO_RSA
# include <openssl/asn1.h>
17
# include <openssl/bio.h>
18 19
# include <openssl/crypto.h>
# include <openssl/ossl_typ.h>
20
# if OPENSSL_API_COMPAT < 0x10100000L
21 22
#  include <openssl/bn.h>
# endif
23
# include <openssl/rsaerr.h>
R
Rich Salz 已提交
24
# ifdef  __cplusplus
25
extern "C" {
R
Rich Salz 已提交
26
# endif
27

28
/* The types RSA and RSA_METHOD are defined in ossl_typ.h */
29 30 31 32 33 34 35 36 37 38 39

# ifndef OPENSSL_RSA_MAX_MODULUS_BITS
#  define OPENSSL_RSA_MAX_MODULUS_BITS   16384
# endif

# define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 1024

# ifndef OPENSSL_RSA_SMALL_MODULUS_BITS
#  define OPENSSL_RSA_SMALL_MODULUS_BITS 3072
# endif
# ifndef OPENSSL_RSA_MAX_PUBEXP_BITS
40 41

/* exponent limit enforced for "large" modulus only */
42 43
#  define OPENSSL_RSA_MAX_PUBEXP_BITS    64
# endif
44

45 46
# define RSA_3   0x3L
# define RSA_F4  0x10001L
47

P
Paul Yang 已提交
48 49 50 51 52 53
/* based on RFC 8017 appendix A.1.2 */
# define RSA_ASN1_VERSION_DEFAULT        0
# define RSA_ASN1_VERSION_MULTI          1

# define RSA_DEFAULT_PRIME_NUM           2

54 55
# define RSA_METHOD_FLAG_NO_CHECK        0x0001/* don't check pub/private
                                                * match */
56

57 58 59 60 61 62
# define RSA_FLAG_CACHE_PUBLIC           0x0002
# define RSA_FLAG_CACHE_PRIVATE          0x0004
# define RSA_FLAG_BLINDING               0x0008
# define RSA_FLAG_THREAD_SAFE            0x0010
/*
 * This flag means the private key operations will be handled by rsa_mod_exp
63
 * and that they do not depend on the private key components being present:
64 65
 * for example a key stored in external hardware. Without this flag
 * bn_mod_exp gets called when private key components are absent.
66
 */
67
# define RSA_FLAG_EXT_PKEY               0x0020
68

69 70 71 72 73 74
/*
 * new with 0.9.6j and 0.9.7b; the built-in
 * RSA implementation now uses blinding by
 * default (ignoring RSA_FLAG_BLINDING),
 * but other engines might not need it
 */
75
# define RSA_FLAG_NO_BLINDING            0x0080
76
# if OPENSSL_API_COMPAT < 0x10100000L
77
/*
78
 * Does nothing. Previously this switched off constant time behaviour.
79
 */
80 81
#  define RSA_FLAG_NO_CONSTTIME           0x0000
# endif
82
# if OPENSSL_API_COMPAT < 0x00908000L
83 84 85 86 87 88 89 90 91
/* deprecated name for the flag*/
/*
 * new with 0.9.7h; the built-in RSA
 * implementation now uses constant time
 * modular exponentiation for secret exponents
 * by default. This flag causes the
 * faster variable sliding window method to
 * be used for all exponents.
 */
92 93 94 95
#  define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME
# endif

# define EVP_PKEY_CTX_set_rsa_padding(ctx, pad) \
96
        RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_RSA_PADDING, pad, NULL)
97 98

# define EVP_PKEY_CTX_get_rsa_padding(ctx, ppad) \
99
        RSA_pkey_ctx_ctrl(ctx, -1, EVP_PKEY_CTRL_GET_RSA_PADDING, 0, ppad)
100 101

# define EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, len) \
102 103
        RSA_pkey_ctx_ctrl(ctx, (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \
                          EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL)
104 105 106 107 108 109 110 111
/* Salt length matches digest */
# define RSA_PSS_SALTLEN_DIGEST -1
/* Verify only: auto detect salt length */
# define RSA_PSS_SALTLEN_AUTO   -2
/* Set salt length to maximum possible */
# define RSA_PSS_SALTLEN_MAX    -3
/* Old compatible max salt length for sign only */
# define RSA_PSS_SALTLEN_MAX_SIGN    -2
112

D
Dr. Stephen Henson 已提交
113 114 115 116
# define EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen(ctx, len) \
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \
                          EVP_PKEY_CTRL_RSA_PSS_SALTLEN, len, NULL)

117
# define EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx, plen) \
118 119
        RSA_pkey_ctx_ctrl(ctx, (EVP_PKEY_OP_SIGN|EVP_PKEY_OP_VERIFY), \
                          EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN, 0, plen)
120 121

# define EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) \
122 123
        RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \
                          EVP_PKEY_CTRL_RSA_KEYGEN_BITS, bits, NULL)
124 125

# define EVP_PKEY_CTX_set_rsa_keygen_pubexp(ctx, pubexp) \
126 127
        RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \
                          EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP, 0, pubexp)
128

P
Paul Yang 已提交
129 130 131 132
# define EVP_PKEY_CTX_set_rsa_keygen_primes(ctx, primes) \
        RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_KEYGEN, \
                          EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES, primes, NULL)

133
# define  EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, md) \
134
        RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \
135
                          EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md))
136

137
# define  EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md(ctx, md) \
D
Dr. Stephen Henson 已提交
138
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS, EVP_PKEY_OP_KEYGEN, \
139
                          EVP_PKEY_CTRL_RSA_MGF1_MD, 0, (void *)(md))
D
Dr. Stephen Henson 已提交
140

141 142 143
# define  EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) \
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                          EVP_PKEY_CTRL_RSA_OAEP_MD, 0, (void *)(md))
144 145

# define  EVP_PKEY_CTX_get_rsa_mgf1_md(ctx, pmd) \
146
        RSA_pkey_ctx_ctrl(ctx, EVP_PKEY_OP_TYPE_SIG | EVP_PKEY_OP_TYPE_CRYPT, \
147
                          EVP_PKEY_CTRL_GET_RSA_MGF1_MD, 0, (void *)(pmd))
148 149

# define  EVP_PKEY_CTX_get_rsa_oaep_md(ctx, pmd) \
150 151
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                          EVP_PKEY_CTRL_GET_RSA_OAEP_MD, 0, (void *)(pmd))
152 153

# define  EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, l, llen) \
154 155
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                          EVP_PKEY_CTRL_RSA_OAEP_LABEL, llen, (void *)(l))
156

157 158 159
# define  EVP_PKEY_CTX_get0_rsa_oaep_label(ctx, l) \
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, EVP_PKEY_OP_TYPE_CRYPT,  \
                          EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL, 0, (void *)(l))
160

161
# define  EVP_PKEY_CTX_set_rsa_pss_keygen_md(ctx, md) \
162 163 164
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA_PSS,  \
                          EVP_PKEY_OP_TYPE_KEYGEN, EVP_PKEY_CTRL_MD,  \
                          0, (void *)(md))
D
Dr. Stephen Henson 已提交
165

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
# define EVP_PKEY_CTRL_RSA_PADDING       (EVP_PKEY_ALG_CTRL + 1)
# define EVP_PKEY_CTRL_RSA_PSS_SALTLEN   (EVP_PKEY_ALG_CTRL + 2)

# define EVP_PKEY_CTRL_RSA_KEYGEN_BITS   (EVP_PKEY_ALG_CTRL + 3)
# define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 4)
# define EVP_PKEY_CTRL_RSA_MGF1_MD       (EVP_PKEY_ALG_CTRL + 5)

# define EVP_PKEY_CTRL_GET_RSA_PADDING           (EVP_PKEY_ALG_CTRL + 6)
# define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN       (EVP_PKEY_ALG_CTRL + 7)
# define EVP_PKEY_CTRL_GET_RSA_MGF1_MD           (EVP_PKEY_ALG_CTRL + 8)

# define EVP_PKEY_CTRL_RSA_OAEP_MD       (EVP_PKEY_ALG_CTRL + 9)
# define EVP_PKEY_CTRL_RSA_OAEP_LABEL    (EVP_PKEY_ALG_CTRL + 10)

# define EVP_PKEY_CTRL_GET_RSA_OAEP_MD   (EVP_PKEY_ALG_CTRL + 11)
# define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12)

P
Paul Yang 已提交
183 184
# define EVP_PKEY_CTRL_RSA_KEYGEN_PRIMES  (EVP_PKEY_ALG_CTRL + 13)

185 186 187 188 189
# define RSA_PKCS1_PADDING       1
# define RSA_SSLV23_PADDING      2
# define RSA_NO_PADDING          3
# define RSA_PKCS1_OAEP_PADDING  4
# define RSA_X931_PADDING        5
D
Dr. Stephen Henson 已提交
190
/* EVP_PKEY_ only */
191
# define RSA_PKCS1_PSS_PADDING   6
192

193
# define RSA_PKCS1_PADDING_SIZE  11
194

195 196
# define RSA_set_app_data(s,arg)         RSA_set_ex_data(s,0,arg)
# define RSA_get_app_data(s)             RSA_get_ex_data(s,0)
197

198 199
RSA *RSA_new(void);
RSA *RSA_new_method(ENGINE *engine);
200
int RSA_bits(const RSA *rsa);
201 202
int RSA_size(const RSA *rsa);
int RSA_security_bits(const RSA *rsa);
203

R
Richard Levitte 已提交
204 205 206
int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);
int RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q);
int RSA_set0_crt_params(RSA *r,BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp);
P
Paul Yang 已提交
207 208
int RSA_set0_multi_prime_params(RSA *r, BIGNUM *primes[], BIGNUM *exps[],
                                BIGNUM *coeffs[], int pnum);
209 210 211
void RSA_get0_key(const RSA *r,
                  const BIGNUM **n, const BIGNUM **e, const BIGNUM **d);
void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q);
P
Paul Yang 已提交
212 213
int RSA_get_multi_prime_extra_count(const RSA *r);
int RSA_get0_multi_prime_factors(const RSA *r, const BIGNUM *primes[]);
R
Richard Levitte 已提交
214
void RSA_get0_crt_params(const RSA *r,
215 216
                         const BIGNUM **dmp1, const BIGNUM **dmq1,
                         const BIGNUM **iqmp);
P
Paul Yang 已提交
217 218
int RSA_get0_multi_prime_crt_params(const RSA *r, const BIGNUM *exps[],
                                    const BIGNUM *coeffs[]);
R
Richard Levitte 已提交
219 220 221
void RSA_clear_flags(RSA *r, int flags);
int RSA_test_flags(const RSA *r, int flags);
void RSA_set_flags(RSA *r, int flags);
P
Paul Yang 已提交
222
int RSA_get_version(RSA *r);
223
ENGINE *RSA_get0_engine(const RSA *r);
R
Richard Levitte 已提交
224

225
/* Deprecated version */
226 227 228
DEPRECATEDIN_0_9_8(RSA *RSA_generate_key(int bits, unsigned long e, void
                                         (*callback) (int, int, void *),
                                         void *cb_arg))
229 230

/* New version */
231
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
P
Paul Yang 已提交
232 233 234
/* Multi-prime version */
int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes,
                                 BIGNUM *e, BN_GENCB *cb);
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254

int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1,
                       BIGNUM *q2, const BIGNUM *Xp1, const BIGNUM *Xp2,
                       const BIGNUM *Xp, const BIGNUM *Xq1, const BIGNUM *Xq2,
                       const BIGNUM *Xq, const BIGNUM *e, BN_GENCB *cb);
int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e,
                             BN_GENCB *cb);

int RSA_check_key(const RSA *);
int RSA_check_key_ex(const RSA *, BN_GENCB *cb);
        /* next 4 return -1 on error */
int RSA_public_encrypt(int flen, const unsigned char *from,
                       unsigned char *to, RSA *rsa, int padding);
int RSA_private_encrypt(int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);
int RSA_public_decrypt(int flen, const unsigned char *from,
                       unsigned char *to, RSA *rsa, int padding);
int RSA_private_decrypt(int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);
void RSA_free(RSA *r);
255
/* "up" the RSA object's reference count */
256
int RSA_up_ref(RSA *r);
257

258
int RSA_flags(const RSA *r);
259

260 261
void RSA_set_default_method(const RSA_METHOD *meth);
const RSA_METHOD *RSA_get_default_method(void);
262
const RSA_METHOD *RSA_null_method(void);
R
Richard Levitte 已提交
263
const RSA_METHOD *RSA_get_method(const RSA *rsa);
264
int RSA_set_method(RSA *rsa, const RSA_METHOD *meth);
265

R
Rich Salz 已提交
266 267
/* these are the actual RSA functions */
const RSA_METHOD *RSA_PKCS1_OpenSSL(void);
268

269 270
int RSA_pkey_ctx_ctrl(EVP_PKEY_CTX *ctx, int optype, int cmd, int p1, void *p2);

271 272 273
DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey)
DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey)

274 275 276 277 278
typedef struct rsa_pss_params_st {
    X509_ALGOR *hashAlgorithm;
    X509_ALGOR *maskGenAlgorithm;
    ASN1_INTEGER *saltLength;
    ASN1_INTEGER *trailerField;
D
Dr. Stephen Henson 已提交
279 280
    /* Decoded hash algorithm from maskGenAlgorithm */
    X509_ALGOR *maskHash;
281
} RSA_PSS_PARAMS;
282

283
DECLARE_ASN1_FUNCTIONS(RSA_PSS_PARAMS)
284

285 286 287 288
typedef struct rsa_oaep_params_st {
    X509_ALGOR *hashFunc;
    X509_ALGOR *maskGenFunc;
    X509_ALGOR *pSourceFunc;
D
Dr. Stephen Henson 已提交
289 290
    /* Decoded hash algorithm from maskGenFunc */
    X509_ALGOR *maskHash;
291
} RSA_OAEP_PARAMS;
292 293 294

DECLARE_ASN1_FUNCTIONS(RSA_OAEP_PARAMS)

295 296 297
# ifndef OPENSSL_NO_STDIO
int RSA_print_fp(FILE *fp, const RSA *r, int offset);
# endif
298

299
int RSA_print(BIO *bp, const RSA *r, int offset);
300

301 302 303 304
/*
 * The following 2 functions sign and verify a X509_SIG ASN1 object inside
 * PKCS#1 padded RSA encryption
 */
305
int RSA_sign(int type, const unsigned char *m, unsigned int m_length,
306
             unsigned char *sigret, unsigned int *siglen, RSA *rsa);
307
int RSA_verify(int type, const unsigned char *m, unsigned int m_length,
308
               const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
309

310 311 312 313
/*
 * The following 2 function sign and verify a ASN1_OCTET_STRING object inside
 * PKCS#1 padded RSA encryption
 */
R
Richard Levitte 已提交
314
int RSA_sign_ASN1_OCTET_STRING(int type,
315 316 317 318 319 320
                               const unsigned char *m, unsigned int m_length,
                               unsigned char *sigret, unsigned int *siglen,
                               RSA *rsa);
int RSA_verify_ASN1_OCTET_STRING(int type, const unsigned char *m,
                                 unsigned int m_length, unsigned char *sigbuf,
                                 unsigned int siglen, RSA *rsa);
321

322 323
int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);
void RSA_blinding_off(RSA *rsa);
324
BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx);
325

326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen,
                                 const unsigned char *f, int fl);
int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen,
                                   const unsigned char *f, int fl,
                                   int rsa_len);
int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen,
                                 const unsigned char *f, int fl);
int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
                                   const unsigned char *f, int fl,
                                   int rsa_len);
int PKCS1_MGF1(unsigned char *mask, long len, const unsigned char *seed,
               long seedlen, const EVP_MD *dgst);
int RSA_padding_add_PKCS1_OAEP(unsigned char *to, int tlen,
                               const unsigned char *f, int fl,
                               const unsigned char *p, int pl);
int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
                                 const unsigned char *f, int fl, int rsa_len,
                                 const unsigned char *p, int pl);
D
Dr. Stephen Henson 已提交
344
int RSA_padding_add_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
345 346 347
                                    const unsigned char *from, int flen,
                                    const unsigned char *param, int plen,
                                    const EVP_MD *md, const EVP_MD *mgf1md);
D
Dr. Stephen Henson 已提交
348
int RSA_padding_check_PKCS1_OAEP_mgf1(unsigned char *to, int tlen,
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
                                      const unsigned char *from, int flen,
                                      int num, const unsigned char *param,
                                      int plen, const EVP_MD *md,
                                      const EVP_MD *mgf1md);
int RSA_padding_add_SSLv23(unsigned char *to, int tlen,
                           const unsigned char *f, int fl);
int RSA_padding_check_SSLv23(unsigned char *to, int tlen,
                             const unsigned char *f, int fl, int rsa_len);
int RSA_padding_add_none(unsigned char *to, int tlen, const unsigned char *f,
                         int fl);
int RSA_padding_check_none(unsigned char *to, int tlen,
                           const unsigned char *f, int fl, int rsa_len);
int RSA_padding_add_X931(unsigned char *to, int tlen, const unsigned char *f,
                         int fl);
int RSA_padding_check_X931(unsigned char *to, int tlen,
                           const unsigned char *f, int fl, int rsa_len);
365
int RSA_X931_hash_id(int nid);
366

367
int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash,
368 369
                         const EVP_MD *Hash, const unsigned char *EM,
                         int sLen);
370
int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM,
371 372
                              const unsigned char *mHash, const EVP_MD *Hash,
                              int sLen);
373

D
Dr. Stephen Henson 已提交
374
int RSA_verify_PKCS1_PSS_mgf1(RSA *rsa, const unsigned char *mHash,
375 376
                              const EVP_MD *Hash, const EVP_MD *mgf1Hash,
                              const unsigned char *EM, int sLen);
D
Dr. Stephen Henson 已提交
377 378

int RSA_padding_add_PKCS1_PSS_mgf1(RSA *rsa, unsigned char *EM,
379 380 381
                                   const unsigned char *mHash,
                                   const EVP_MD *Hash, const EVP_MD *mgf1Hash,
                                   int sLen);
D
Dr. Stephen Henson 已提交
382

383 384
#define RSA_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, l, p, newf, dupf, freef)
385
int RSA_set_ex_data(RSA *r, int idx, void *arg);
R
Richard Levitte 已提交
386
void *RSA_get_ex_data(const RSA *r, int idx);
387

L
Lutz Jänicke 已提交
388 389 390
RSA *RSAPublicKey_dup(RSA *rsa);
RSA *RSAPrivateKey_dup(RSA *rsa);

391 392 393 394 395
/*
 * If this flag is set the RSA method is FIPS compliant and can be used in
 * FIPS mode. This is set in the validated module method. If an application
 * sets this flag in its own methods it is its responsibility to ensure the
 * result is compliant.
D
Dr. Stephen Henson 已提交
396 397
 */

398
# define RSA_FLAG_FIPS_METHOD                    0x0400
D
Dr. Stephen Henson 已提交
399

400 401
/*
 * If this flag is set the operations normally disabled in FIPS mode are
D
Dr. Stephen Henson 已提交
402 403 404 405
 * permitted it is then the applications responsibility to ensure that the
 * usage is compliant.
 */

406 407 408
# define RSA_FLAG_NON_FIPS_ALLOW                 0x0400
/*
 * Application has decided PRNG is good enough to generate a key: don't
409 410
 * check.
 */
411
# define RSA_FLAG_CHECKED                        0x0800
D
Dr. Stephen Henson 已提交
412

413 414 415 416 417
RSA_METHOD *RSA_meth_new(const char *name, int flags);
void RSA_meth_free(RSA_METHOD *meth);
RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth);
const char *RSA_meth_get0_name(const RSA_METHOD *meth);
int RSA_meth_set1_name(RSA_METHOD *meth, const char *name);
418
int RSA_meth_get_flags(const RSA_METHOD *meth);
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
int RSA_meth_set_flags(RSA_METHOD *meth, int flags);
void *RSA_meth_get0_app_data(const RSA_METHOD *meth);
int RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data);
int (*RSA_meth_get_pub_enc(const RSA_METHOD *meth))
    (int flen, const unsigned char *from,
     unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_pub_enc(RSA_METHOD *rsa,
                         int (*pub_enc) (int flen, const unsigned char *from,
                                         unsigned char *to, RSA *rsa,
                                         int padding));
int (*RSA_meth_get_pub_dec(const RSA_METHOD *meth))
    (int flen, const unsigned char *from,
     unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_pub_dec(RSA_METHOD *rsa,
                         int (*pub_dec) (int flen, const unsigned char *from,
                                         unsigned char *to, RSA *rsa,
                                         int padding));
int (*RSA_meth_get_priv_enc(const RSA_METHOD *meth))
    (int flen, const unsigned char *from,
     unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_priv_enc(RSA_METHOD *rsa,
                          int (*priv_enc) (int flen, const unsigned char *from,
                                           unsigned char *to, RSA *rsa,
                                           int padding));
int (*RSA_meth_get_priv_dec(const RSA_METHOD *meth))
    (int flen, const unsigned char *from,
     unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_priv_dec(RSA_METHOD *rsa,
                          int (*priv_dec) (int flen, const unsigned char *from,
                                           unsigned char *to, RSA *rsa,
                                           int padding));
int (*RSA_meth_get_mod_exp(const RSA_METHOD *meth))
    (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
int RSA_meth_set_mod_exp(RSA_METHOD *rsa,
                         int (*mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa,
                                         BN_CTX *ctx));
int (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth))
    (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
     const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int RSA_meth_set_bn_mod_exp(RSA_METHOD *rsa,
                            int (*bn_mod_exp) (BIGNUM *r,
                                               const BIGNUM *a,
                                               const BIGNUM *p,
                                               const BIGNUM *m,
                                               BN_CTX *ctx,
                                               BN_MONT_CTX *m_ctx));
int (*RSA_meth_get_init(const RSA_METHOD *meth)) (RSA *rsa);
int RSA_meth_set_init(RSA_METHOD *rsa, int (*init) (RSA *rsa));
int (*RSA_meth_get_finish(const RSA_METHOD *meth)) (RSA *rsa);
int RSA_meth_set_finish(RSA_METHOD *rsa, int (*finish) (RSA *rsa));
int (*RSA_meth_get_sign(const RSA_METHOD *meth))
    (int type,
     const unsigned char *m, unsigned int m_length,
     unsigned char *sigret, unsigned int *siglen,
     const RSA *rsa);
int RSA_meth_set_sign(RSA_METHOD *rsa,
                      int (*sign) (int type, const unsigned char *m,
                                   unsigned int m_length,
                                   unsigned char *sigret, unsigned int *siglen,
                                   const RSA *rsa));
int (*RSA_meth_get_verify(const RSA_METHOD *meth))
    (int dtype, const unsigned char *m,
     unsigned int m_length, const unsigned char *sigbuf,
     unsigned int siglen, const RSA *rsa);
int RSA_meth_set_verify(RSA_METHOD *rsa,
                        int (*verify) (int dtype, const unsigned char *m,
                                       unsigned int m_length,
                                       const unsigned char *sigbuf,
                                       unsigned int siglen, const RSA *rsa));
int (*RSA_meth_get_keygen(const RSA_METHOD *meth))
    (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
int RSA_meth_set_keygen(RSA_METHOD *rsa,
                        int (*keygen) (RSA *rsa, int bits, BIGNUM *e,
                                       BN_GENCB *cb));
P
Paul Yang 已提交
493 494 495 496 497 498
int (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth))
    (RSA *rsa, int bits, int primes, BIGNUM *e, BN_GENCB *cb);
int RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth,
                                    int (*keygen) (RSA *rsa, int bits,
                                                   int primes, BIGNUM *e,
                                                   BN_GENCB *cb));
499

R
Rich Salz 已提交
500
#  ifdef  __cplusplus
501
}
R
Rich Salz 已提交
502
#  endif
R
Rich Salz 已提交
503
# endif
504
#endif