1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/rsa/rsa_lib.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/crypto.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/lhash.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rsa.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/engine.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 70392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 71392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/fips.h> 72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst char RSA_version[]="RSA" OPENSSL_VERSION_PTEXT; 75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic const RSA_METHOD *default_RSA_meth=NULL; 77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromRSA *RSA_new(void) 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSA *r=RSA_new_method(NULL); 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return r; 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid RSA_set_default_method(const RSA_METHOD *meth) 86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default_RSA_meth = meth; 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst RSA_METHOD *RSA_get_default_method(void) 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (default_RSA_meth == NULL) 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 94392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 95392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FIPS_mode()) 96392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return FIPS_rsa_pkcs1_ssleay(); 97392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else 98392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return RSA_PKCS1_SSLeay(); 99392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef RSA_NULL 101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default_RSA_meth=RSA_null_method(); 102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#else 103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom default_RSA_meth=RSA_PKCS1_SSLeay(); 104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return default_RSA_meth; 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromconst RSA_METHOD *RSA_get_method(const RSA *rsa) 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return rsa->meth; 114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RSA_set_method(RSA *rsa, const RSA_METHOD *meth) 117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* NB: The caller is specifically setting a method, so it's not up to us 119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom * to deal with which ENGINE it comes from. */ 120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const RSA_METHOD *mtmp; 121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mtmp = rsa->meth; 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (mtmp->finish) mtmp->finish(rsa); 123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (rsa->engine) 125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(rsa->engine); 127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rsa->engine = NULL; 128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rsa->meth = meth; 131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (meth->init) meth->init(rsa); 132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromRSA *RSA_new_method(ENGINE *engine) 136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSA *ret; 138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=(RSA *)OPENSSL_malloc(sizeof(RSA)); 140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ret == NULL) 141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSAerr(RSA_F_RSA_NEW_METHOD,ERR_R_MALLOC_FAILURE); 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->meth = RSA_get_default_method(); 147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (engine) 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!ENGINE_init(engine)) 151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSAerr(RSA_F_RSA_NEW_METHOD, ERR_R_ENGINE_LIB); 153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(ret); 154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->engine = engine; 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->engine = ENGINE_get_default_RSA(); 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(ret->engine) 161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->meth = ENGINE_get_RSA(ret->engine); 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(!ret->meth) 164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSAerr(RSA_F_RSA_NEW_METHOD, 166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_R_ENGINE_LIB); 167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(ret->engine); 168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(ret); 169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->pad=0; 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->version=0; 176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->n=NULL; 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->e=NULL; 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->d=NULL; 179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->p=NULL; 180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->q=NULL; 181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->dmp1=NULL; 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->dmq1=NULL; 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->iqmp=NULL; 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->references=1; 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->_method_mod_n=NULL; 186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->_method_mod_p=NULL; 187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->_method_mod_q=NULL; 188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->blinding=NULL; 189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->mt_blinding=NULL; 190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret->bignum_data=NULL; 191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom ret->flags=ret->meth->flags & ~RSA_FLAG_NON_FIPS_ALLOW; 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data)) 193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ret->engine) 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(ret->engine); 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(ret); 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(NULL); 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((ret->meth->init != NULL) && !ret->meth->init(ret)) 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ret->engine) 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(ret->engine); 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, ret, &ret->ex_data); 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(ret); 210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret=NULL; 211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(ret); 213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid RSA_free(RSA *r) 216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i; 218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r == NULL) return; 220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i=CRYPTO_add(&r->references,-1,CRYPTO_LOCK_RSA); 222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef REF_PRINT 223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom REF_PRINT("RSA",r); 224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (i > 0) return; 226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef REF_CHECK 227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (i < 0) 228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom fprintf(stderr,"RSA_free, bad reference count\n"); 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom abort(); 231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->meth->finish) 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r->meth->finish(r); 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->engine) 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ENGINE_finish(r->engine); 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_free_ex_data(CRYPTO_EX_INDEX_RSA, r, &r->ex_data); 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->n != NULL) BN_clear_free(r->n); 244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->e != NULL) BN_clear_free(r->e); 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->d != NULL) BN_clear_free(r->d); 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->p != NULL) BN_clear_free(r->p); 247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->q != NULL) BN_clear_free(r->q); 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->dmp1 != NULL) BN_clear_free(r->dmp1); 249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->dmq1 != NULL) BN_clear_free(r->dmq1); 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->iqmp != NULL) BN_clear_free(r->iqmp); 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->blinding != NULL) BN_BLINDING_free(r->blinding); 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->mt_blinding != NULL) BN_BLINDING_free(r->mt_blinding); 253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->bignum_data != NULL) OPENSSL_free_locked(r->bignum_data); 254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom OPENSSL_free(r); 255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RSA_up_ref(RSA *r) 258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_RSA); 260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef REF_PRINT 261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom REF_PRINT("RSA",r); 262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef REF_CHECK 264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (i < 2) 265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom fprintf(stderr, "RSA_up_ref, bad reference count\n"); 267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom abort(); 268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif 270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return ((i > 1) ? 1 : 0); 271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, 274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) 275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_RSA, argl, argp, 277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom new_func, dup_func, free_func); 278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RSA_set_ex_data(RSA *r, int idx, void *arg) 281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(CRYPTO_set_ex_data(&r->ex_data,idx,arg)); 283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid *RSA_get_ex_data(const RSA *r, int idx) 286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(CRYPTO_get_ex_data(&r->ex_data,idx)); 288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint RSA_memory_lock(RSA *r) 291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int i,j,k,off; 293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *p; 294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIGNUM *bn,**t[6],*b; 295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_ULONG *ul; 296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r->d == NULL) return(1); 298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[0]= &r->d; 299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[1]= &r->p; 300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[2]= &r->q; 301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[3]= &r->dmp1; 302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[4]= &r->dmq1; 303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom t[5]= &r->iqmp; 304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom k=sizeof(BIGNUM)*6; 305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom off=k/sizeof(BN_ULONG)+1; 306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom j=1; 307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i=0; i<6; i++) 308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom j+= (*t[i])->top; 309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((p=OPENSSL_malloc_locked((off+j)*sizeof(BN_ULONG))) == NULL) 310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom RSAerr(RSA_F_RSA_MEMORY_LOCK,ERR_R_MALLOC_FAILURE); 312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(0); 313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 314221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bn=(BIGNUM *)p; 315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ul=(BN_ULONG *)&(p[off]); 316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i=0; i<6; i++) 317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom b= *(t[i]); 319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom *(t[i])= &(bn[i]); 320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy((char *)&(bn[i]),(char *)b,sizeof(BIGNUM)); 321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bn[i].flags=BN_FLG_STATIC_DATA; 322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bn[i].d=ul; 323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy((char *)ul,b->d,sizeof(BN_ULONG)*b->top); 324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ul+=b->top; 325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BN_clear_free(b); 326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* I should fix this so it can still be done */ 329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r->flags&= ~(RSA_FLAG_CACHE_PRIVATE|RSA_FLAG_CACHE_PUBLIC); 330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r->bignum_data=p; 332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return(1); 333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 334