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