1 /* 2 * Copyright 2006-2021 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #ifndef OSSL_CRYPTO_RSA_LOCAL_H 11 #define OSSL_CRYPTO_RSA_LOCAL_H 12 13 #include "internal/refcount.h" 14 #include "crypto/rsa.h" 15 16 #define RSA_MAX_PRIME_NUM 5 17 18 typedef struct rsa_prime_info_st { 19 BIGNUM *r; 20 BIGNUM *d; 21 BIGNUM *t; 22 /* save product of primes prior to this one */ 23 BIGNUM *pp; 24 BN_MONT_CTX *m; 25 } RSA_PRIME_INFO; 26 27 DECLARE_ASN1_ITEM(RSA_PRIME_INFO) 28 DEFINE_STACK_OF(RSA_PRIME_INFO) 29 30 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 31 struct rsa_acvp_test_st { 32 /* optional inputs */ 33 BIGNUM *Xp1; 34 BIGNUM *Xp2; 35 BIGNUM *Xq1; 36 BIGNUM *Xq2; 37 BIGNUM *Xp; 38 BIGNUM *Xq; 39 40 /* optional outputs */ 41 BIGNUM *p1; 42 BIGNUM *p2; 43 BIGNUM *q1; 44 BIGNUM *q2; 45 }; 46 #endif 47 48 struct rsa_st { 49 /* 50 * #legacy 51 * The first field is used to pickup errors where this is passed 52 * instead of an EVP_PKEY. It is always zero. 53 * THIS MUST REMAIN THE FIRST FIELD. 54 */ 55 int dummy_zero; 56 57 OSSL_LIB_CTX *libctx; 58 int32_t version; 59 const RSA_METHOD *meth; 60 /* functional reference if 'meth' is ENGINE-provided */ 61 ENGINE *engine; 62 BIGNUM *n; 63 BIGNUM *e; 64 BIGNUM *d; 65 BIGNUM *p; 66 BIGNUM *q; 67 BIGNUM *dmp1; 68 BIGNUM *dmq1; 69 BIGNUM *iqmp; 70 71 /* 72 * If a PSS only key this contains the parameter restrictions. 73 * There are two structures for the same thing, used in different cases. 74 */ 75 /* This is used uniquely by OpenSSL provider implementations. */ 76 RSA_PSS_PARAMS_30 pss_params; 77 78 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 79 RSA_ACVP_TEST *acvp_test; 80 #endif 81 82 #ifndef FIPS_MODULE 83 /* This is used uniquely by rsa_ameth.c and rsa_pmeth.c. */ 84 RSA_PSS_PARAMS *pss; 85 /* for multi-prime RSA, defined in RFC 8017 */ 86 STACK_OF(RSA_PRIME_INFO) *prime_infos; 87 /* Be careful using this if the RSA structure is shared */ 88 CRYPTO_EX_DATA ex_data; 89 #endif 90 CRYPTO_REF_COUNT references; 91 int flags; 92 /* Used to cache montgomery values */ 93 BN_MONT_CTX *_method_mod_n; 94 BN_MONT_CTX *_method_mod_p; 95 BN_MONT_CTX *_method_mod_q; 96 BN_BLINDING *blinding; 97 BN_BLINDING *mt_blinding; 98 CRYPTO_RWLOCK *lock; 99 100 int dirty_cnt; 101 }; 102 103 struct rsa_meth_st { 104 char *name; 105 int (*rsa_pub_enc) (int flen, const unsigned char *from, 106 unsigned char *to, RSA *rsa, int padding); 107 int (*rsa_pub_dec) (int flen, const unsigned char *from, 108 unsigned char *to, RSA *rsa, int padding); 109 int (*rsa_priv_enc) (int flen, const unsigned char *from, 110 unsigned char *to, RSA *rsa, int padding); 111 int (*rsa_priv_dec) (int flen, const unsigned char *from, 112 unsigned char *to, RSA *rsa, int padding); 113 /* Can be null */ 114 int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); 115 /* Can be null */ 116 int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, 117 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); 118 /* called at new */ 119 int (*init) (RSA *rsa); 120 /* called at free */ 121 int (*finish) (RSA *rsa); 122 /* RSA_METHOD_FLAG_* things */ 123 int flags; 124 /* may be needed! */ 125 char *app_data; 126 /* 127 * New sign and verify functions: some libraries don't allow arbitrary 128 * data to be signed/verified: this allows them to be used. Note: for 129 * this to work the RSA_public_decrypt() and RSA_private_encrypt() should 130 * *NOT* be used. RSA_sign(), RSA_verify() should be used instead. 131 */ 132 int (*rsa_sign) (int type, 133 const unsigned char *m, unsigned int m_length, 134 unsigned char *sigret, unsigned int *siglen, 135 const RSA *rsa); 136 int (*rsa_verify) (int dtype, const unsigned char *m, 137 unsigned int m_length, const unsigned char *sigbuf, 138 unsigned int siglen, const RSA *rsa); 139 /* 140 * If this callback is NULL, the builtin software RSA key-gen will be 141 * used. This is for behavioural compatibility whilst the code gets 142 * rewired, but one day it would be nice to assume there are no such 143 * things as "builtin software" implementations. 144 */ 145 int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); 146 int (*rsa_multi_prime_keygen) (RSA *rsa, int bits, int primes, 147 BIGNUM *e, BN_GENCB *cb); 148 }; 149 150 /* Macros to test if a pkey or ctx is for a PSS key */ 151 #define pkey_is_pss(pkey) (pkey->ameth->pkey_id == EVP_PKEY_RSA_PSS) 152 #define pkey_ctx_is_pss(ctx) (ctx->pmeth->pkey_id == EVP_PKEY_RSA_PSS) 153 154 RSA_PSS_PARAMS *ossl_rsa_pss_params_create(const EVP_MD *sigmd, 155 const EVP_MD *mgf1md, int saltlen); 156 int ossl_rsa_pss_get_param(const RSA_PSS_PARAMS *pss, const EVP_MD **pmd, 157 const EVP_MD **pmgf1md, int *psaltlen); 158 /* internal function to clear and free multi-prime parameters */ 159 void ossl_rsa_multip_info_free_ex(RSA_PRIME_INFO *pinfo); 160 void ossl_rsa_multip_info_free(RSA_PRIME_INFO *pinfo); 161 RSA_PRIME_INFO *ossl_rsa_multip_info_new(void); 162 int ossl_rsa_multip_calc_product(RSA *rsa); 163 int ossl_rsa_multip_cap(int bits); 164 165 int ossl_rsa_sp800_56b_validate_strength(int nbits, int strength); 166 int ossl_rsa_check_pminusq_diff(BIGNUM *diff, const BIGNUM *p, const BIGNUM *q, 167 int nbits); 168 int ossl_rsa_get_lcm(BN_CTX *ctx, const BIGNUM *p, const BIGNUM *q, 169 BIGNUM *lcm, BIGNUM *gcd, BIGNUM *p1, BIGNUM *q1, 170 BIGNUM *p1q1); 171 172 int ossl_rsa_check_public_exponent(const BIGNUM *e); 173 int ossl_rsa_check_private_exponent(const RSA *rsa, int nbits, BN_CTX *ctx); 174 int ossl_rsa_check_prime_factor(BIGNUM *p, BIGNUM *e, int nbits, BN_CTX *ctx); 175 int ossl_rsa_check_prime_factor_range(const BIGNUM *p, int nbits, BN_CTX *ctx); 176 int ossl_rsa_check_crt_components(const RSA *rsa, BN_CTX *ctx); 177 178 int ossl_rsa_sp800_56b_pairwise_test(RSA *rsa, BN_CTX *ctx); 179 int ossl_rsa_sp800_56b_check_public(const RSA *rsa); 180 int ossl_rsa_sp800_56b_check_private(const RSA *rsa); 181 int ossl_rsa_sp800_56b_check_keypair(const RSA *rsa, const BIGNUM *efixed, 182 int strength, int nbits); 183 int ossl_rsa_sp800_56b_generate_key(RSA *rsa, int nbits, const BIGNUM *efixed, 184 BN_GENCB *cb); 185 186 int ossl_rsa_sp800_56b_derive_params_from_pq(RSA *rsa, int nbits, 187 const BIGNUM *e, BN_CTX *ctx); 188 int ossl_rsa_fips186_4_gen_prob_primes(RSA *rsa, RSA_ACVP_TEST *test, 189 int nbits, const BIGNUM *e, BN_CTX *ctx, 190 BN_GENCB *cb); 191 192 int ossl_rsa_padding_add_PKCS1_type_2_ex(OSSL_LIB_CTX *libctx, unsigned char *to, 193 int tlen, const unsigned char *from, 194 int flen); 195 196 #endif /* OSSL_CRYPTO_RSA_LOCAL_H */ 197