os/ossrv/ssl/libcrypto/src/crypto/dh/dh_lib.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /* crypto/dh/dh_lib.c */
     2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
     3  * All rights reserved.
     4  *
     5  * This package is an SSL implementation written
     6  * by Eric Young (eay@cryptsoft.com).
     7  * The implementation was written so as to conform with Netscapes SSL.
     8  * 
     9  * This library is free for commercial and non-commercial use as long as
    10  * the following conditions are aheared to.  The following conditions
    11  * apply to all code found in this distribution, be it the RC4, RSA,
    12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
    13  * included with this distribution is covered by the same copyright terms
    14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
    15  * 
    16  * Copyright remains Eric Young's, and as such any Copyright notices in
    17  * the code are not to be removed.
    18  * If this package is used in a product, Eric Young should be given attribution
    19  * as the author of the parts of the library used.
    20  * This can be in the form of a textual message at program startup or
    21  * in documentation (online or textual) provided with the package.
    22  * 
    23  * Redistribution and use in source and binary forms, with or without
    24  * modification, are permitted provided that the following conditions
    25  * are met:
    26  * 1. Redistributions of source code must retain the copyright
    27  *    notice, this list of conditions and the following disclaimer.
    28  * 2. Redistributions in binary form must reproduce the above copyright
    29  *    notice, this list of conditions and the following disclaimer in the
    30  *    documentation and/or other materials provided with the distribution.
    31  * 3. All advertising materials mentioning features or use of this software
    32  *    must display the following acknowledgement:
    33  *    "This product includes cryptographic software written by
    34  *     Eric Young (eay@cryptsoft.com)"
    35  *    The word 'cryptographic' can be left out if the rouines from the library
    36  *    being used are not cryptographic related :-).
    37  * 4. If you include any Windows specific code (or a derivative thereof) from 
    38  *    the apps directory (application code) you must include an acknowledgement:
    39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
    40  * 
    41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
    42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    51  * SUCH DAMAGE.
    52  * 
    53  * The licence and distribution terms for any publically available version or
    54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
    55  * copied and put under another distribution licence
    56  * [including the GNU Public Licence.]
    57  */
    58 /*
    59  © Portions copyright (c) 2006 Nokia Corporation.  All rights reserved.
    60  */
    61 
    62 #include <stdio.h>
    63 #include "cryptlib.h"
    64 #include <openssl/bn.h>
    65 #include <openssl/dh.h>
    66 #ifndef OPENSSL_NO_ENGINE
    67 #include <openssl/engine.h>
    68 #endif
    69 #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__)))
    70 #include "libcrypto_wsd_macros.h"
    71 #include "libcrypto_wsd.h"
    72 #endif
    73 
    74 const char DH_version[]="Diffie-Hellman" OPENSSL_VERSION_PTEXT;
    75 
    76 #ifndef EMULATOR
    77 static const DH_METHOD *default_DH_method = NULL;
    78 #else
    79 GET_STATIC_VAR_FROM_TLS(default_DH_method,dh_lib,const DH_METHOD *)
    80 #define default_DH_method (*GET_WSD_VAR_NAME(default_DH_method,dh_lib, s)())
    81 #endif
    82 
    83 EXPORT_C void DH_set_default_method(const DH_METHOD *meth)
    84 	{
    85 	default_DH_method = meth;
    86 	}
    87 
    88 EXPORT_C const DH_METHOD *DH_get_default_method(void)
    89 	{
    90 	if(!default_DH_method)
    91 		default_DH_method = DH_OpenSSL();
    92 	return default_DH_method;
    93 	}
    94 
    95 EXPORT_C int DH_set_method(DH *dh, const DH_METHOD *meth)
    96 	{
    97 	/* NB: The caller is specifically setting a method, so it's not up to us
    98 	 * to deal with which ENGINE it comes from. */
    99         const DH_METHOD *mtmp;
   100         mtmp = dh->meth;
   101         if (mtmp->finish) mtmp->finish(dh);
   102 #ifndef OPENSSL_NO_ENGINE
   103 	if (dh->engine)
   104 		{
   105 		ENGINE_finish(dh->engine);
   106 		dh->engine = NULL;
   107 		}
   108 #endif
   109         dh->meth = meth;
   110         if (meth->init) meth->init(dh);
   111         return 1;
   112 	}
   113 
   114 EXPORT_C DH *DH_new(void)
   115 	{
   116 	return DH_new_method(NULL);
   117 	}
   118 
   119 EXPORT_C DH *DH_new_method(ENGINE *engine)
   120 	{
   121 	DH *ret;
   122 
   123 	ret=(DH *)OPENSSL_malloc(sizeof(DH));
   124 	if (ret == NULL)
   125 		{
   126 		DHerr(DH_F_DH_NEW_METHOD,ERR_R_MALLOC_FAILURE);
   127 		return(NULL);
   128 		}
   129 
   130 	ret->meth = DH_get_default_method();
   131 #ifndef OPENSSL_NO_ENGINE
   132 	if (engine)
   133 		{
   134 		if (!ENGINE_init(engine))
   135 			{
   136 			DHerr(DH_F_DH_NEW_METHOD, ERR_R_ENGINE_LIB);
   137 			OPENSSL_free(ret);
   138 			return NULL;
   139 			}
   140 		ret->engine = engine;
   141 		}
   142 	else
   143 		ret->engine = ENGINE_get_default_DH();
   144 	if(ret->engine)
   145 		{
   146 		ret->meth = ENGINE_get_DH(ret->engine);
   147 		if(!ret->meth)
   148 			{
   149 			DHerr(DH_F_DH_NEW_METHOD,ERR_R_ENGINE_LIB);
   150 			ENGINE_finish(ret->engine);
   151 			OPENSSL_free(ret);
   152 			return NULL;
   153 			}
   154 		}
   155 #endif
   156 
   157 	ret->pad=0;
   158 	ret->version=0;
   159 	ret->p=NULL;
   160 	ret->g=NULL;
   161 	ret->length=0;
   162 	ret->pub_key=NULL;
   163 	ret->priv_key=NULL;
   164 	ret->q=NULL;
   165 	ret->j=NULL;
   166 	ret->seed = NULL;
   167 	ret->seedlen = 0;
   168 	ret->counter = NULL;
   169 	ret->method_mont_p=NULL;
   170 	ret->references = 1;
   171 	ret->flags=ret->meth->flags;
   172 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
   173 	if ((ret->meth->init != NULL) && !ret->meth->init(ret))
   174 		{
   175 #ifndef OPENSSL_NO_ENGINE
   176 		if (ret->engine)
   177 			ENGINE_finish(ret->engine);
   178 #endif
   179 		CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, ret, &ret->ex_data);
   180 		OPENSSL_free(ret);
   181 		ret=NULL;
   182 		}
   183 	return(ret);
   184 	}
   185 
   186 EXPORT_C void DH_free(DH *r)
   187 	{
   188 	int i;
   189 	if(r == NULL) return;
   190 	i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DH);
   191 #ifdef REF_PRINT
   192 	REF_PRINT("DH",r);
   193 #endif
   194 	if (i > 0) return;
   195 #ifdef REF_CHECK
   196 	if (i < 0)
   197 		{
   198 		fprintf(stderr,"DH_free, bad reference count\n");
   199 		abort();
   200 	}
   201 #endif
   202 
   203 	if (r->meth->finish)
   204 		r->meth->finish(r);
   205 #ifndef OPENSSL_NO_ENGINE
   206 	if (r->engine)
   207 		ENGINE_finish(r->engine);
   208 #endif
   209 
   210 	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DH, r, &r->ex_data);
   211 
   212 	if (r->p != NULL) BN_clear_free(r->p);
   213 	if (r->g != NULL) BN_clear_free(r->g);
   214 	if (r->q != NULL) BN_clear_free(r->q);
   215 	if (r->j != NULL) BN_clear_free(r->j);
   216 	if (r->seed) OPENSSL_free(r->seed);
   217 	if (r->counter != NULL) BN_clear_free(r->counter);
   218 	if (r->pub_key != NULL) BN_clear_free(r->pub_key);
   219 	if (r->priv_key != NULL) BN_clear_free(r->priv_key);
   220 	OPENSSL_free(r);
   221 	}
   222 
   223 EXPORT_C int DH_up_ref(DH *r)
   224 	{
   225 	int i = CRYPTO_add(&r->references, 1, CRYPTO_LOCK_DH);
   226 #ifdef REF_PRINT
   227 	REF_PRINT("DH",r);
   228 #endif
   229 #ifdef REF_CHECK
   230 	if (i < 2)
   231 		{
   232 		fprintf(stderr, "DH_up, bad reference count\n");
   233 		abort();
   234 		}
   235 #endif
   236 	return ((i > 1) ? 1 : 0);
   237 	}
   238 
   239 EXPORT_C int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
   240 	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
   241         {
   242 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_DH, argl, argp,
   243 				new_func, dup_func, free_func);
   244         }
   245 
   246 EXPORT_C int DH_set_ex_data(DH *d, int idx, void *arg)
   247 	{
   248 	return(CRYPTO_set_ex_data(&d->ex_data,idx,arg));
   249 	}
   250 
   251 EXPORT_C void *DH_get_ex_data(DH *d, int idx)
   252 	{
   253 	return(CRYPTO_get_ex_data(&d->ex_data,idx));
   254 	}
   255 
   256 EXPORT_C int DH_size(const DH *dh)
   257 	{
   258 	return(BN_num_bytes(dh->p));
   259 	}