os/ossrv/ssl/libcrypto/src/crypto/bn/bnspeed.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /* unused */
     2 
     3 /* crypto/bn/bnspeed.c */
     4 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
     5  * All rights reserved.
     6  *
     7  * This package is an SSL implementation written
     8  * by Eric Young (eay@cryptsoft.com).
     9  * The implementation was written so as to conform with Netscapes SSL.
    10  * 
    11  * This library is free for commercial and non-commercial use as long as
    12  * the following conditions are aheared to.  The following conditions
    13  * apply to all code found in this distribution, be it the RC4, RSA,
    14  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
    15  * included with this distribution is covered by the same copyright terms
    16  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
    17  * 
    18  * Copyright remains Eric Young's, and as such any Copyright notices in
    19  * the code are not to be removed.
    20  * If this package is used in a product, Eric Young should be given attribution
    21  * as the author of the parts of the library used.
    22  * This can be in the form of a textual message at program startup or
    23  * in documentation (online or textual) provided with the package.
    24  * 
    25  * Redistribution and use in source and binary forms, with or without
    26  * modification, are permitted provided that the following conditions
    27  * are met:
    28  * 1. Redistributions of source code must retain the copyright
    29  *    notice, this list of conditions and the following disclaimer.
    30  * 2. Redistributions in binary form must reproduce the above copyright
    31  *    notice, this list of conditions and the following disclaimer in the
    32  *    documentation and/or other materials provided with the distribution.
    33  * 3. All advertising materials mentioning features or use of this software
    34  *    must display the following acknowledgement:
    35  *    "This product includes cryptographic software written by
    36  *     Eric Young (eay@cryptsoft.com)"
    37  *    The word 'cryptographic' can be left out if the rouines from the library
    38  *    being used are not cryptographic related :-).
    39  * 4. If you include any Windows specific code (or a derivative thereof) from 
    40  *    the apps directory (application code) you must include an acknowledgement:
    41  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
    42  * 
    43  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
    44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    46  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    47  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    53  * SUCH DAMAGE.
    54  * 
    55  * The licence and distribution terms for any publically available version or
    56  * derivative of this code cannot be changed.  i.e. this code cannot simply be
    57  * copied and put under another distribution licence
    58  * [including the GNU Public Licence.]
    59  */
    60 
    61 /* most of this code has been pilfered from my libdes speed.c program */
    62 
    63 #define BASENUM	1000000
    64 #undef PROG
    65 #define PROG bnspeed_main
    66 
    67 #include <stdio.h>
    68 #include <stdlib.h>
    69 #include <signal.h>
    70 #include <string.h>
    71 #include <openssl/crypto.h>
    72 #include <openssl/err.h>
    73 
    74 #if !defined(OPENSSL_SYS_MSDOS) && (!defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX)
    75 #define TIMES
    76 #endif
    77 
    78 #ifndef _IRIX
    79 #include <time.h>
    80 #endif
    81 #ifdef TIMES
    82 #include <sys/types.h>
    83 #include <sys/times.h>
    84 #endif
    85 
    86 /* Depending on the VMS version, the tms structure is perhaps defined.
    87    The __TMS macro will show if it was.  If it wasn't defined, we should
    88    undefine TIMES, since that tells the rest of the program how things
    89    should be handled.				-- Richard Levitte */
    90 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
    91 #undef TIMES
    92 #endif
    93 
    94 #ifndef TIMES
    95 #include <sys/timeb.h>
    96 #endif
    97 
    98 #if defined(sun) || defined(__ultrix)
    99 #define _POSIX_SOURCE
   100 #include <limits.h>
   101 #include <sys/param.h>
   102 #endif
   103 
   104 #include <openssl/bn.h>
   105 #include <openssl/x509.h>
   106 
   107 /* The following if from times(3) man page.  It may need to be changed */
   108 #ifndef HZ
   109 # ifndef CLK_TCK
   110 #  ifndef _BSD_CLK_TCK_ /* FreeBSD hack */
   111 #   define HZ	100.0
   112 #  else /* _BSD_CLK_TCK_ */
   113 #   define HZ ((double)_BSD_CLK_TCK_)
   114 #  endif
   115 # else /* CLK_TCK */
   116 #  define HZ ((double)CLK_TCK)
   117 # endif
   118 #endif
   119 
   120 #undef BUFSIZE
   121 #define BUFSIZE	((long)1024*8)
   122 int run=0;
   123 
   124 static double Time_F(int s);
   125 #define START	0
   126 #define STOP	1
   127 
   128 static double Time_F(int s)
   129 	{
   130 	double ret;
   131 #ifdef TIMES
   132 	static struct tms tstart,tend;
   133 
   134 	if (s == START)
   135 		{
   136 		times(&tstart);
   137 		return(0);
   138 		}
   139 	else
   140 		{
   141 		times(&tend);
   142 		ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
   143 		return((ret < 1e-3)?1e-3:ret);
   144 		}
   145 #else /* !times() */
   146 	static struct timeb tstart,tend;
   147 	long i;
   148 
   149 	if (s == START)
   150 		{
   151 		ftime(&tstart);
   152 		return(0);
   153 		}
   154 	else
   155 		{
   156 		ftime(&tend);
   157 		i=(long)tend.millitm-(long)tstart.millitm;
   158 		ret=((double)(tend.time-tstart.time))+((double)i)/1000.0;
   159 		return((ret < 0.001)?0.001:ret);
   160 		}
   161 #endif
   162 	}
   163 
   164 #define NUM_SIZES	5
   165 static int sizes[NUM_SIZES]={128,256,512,1024,2048};
   166 /*static int sizes[NUM_SIZES]={59,179,299,419,539}; */
   167 
   168 void do_mul(BIGNUM *r,BIGNUM *a,BIGNUM *b,BN_CTX *ctx); 
   169 
   170 int main(int argc, char **argv)
   171 	{
   172 	BN_CTX *ctx;
   173 	BIGNUM a,b,c;
   174 
   175 	ctx=BN_CTX_new();
   176 	BN_init(&a);
   177 	BN_init(&b);
   178 	BN_init(&c);
   179 
   180 	do_mul(&a,&b,&c,ctx);
   181 	}
   182 
   183 void do_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx)
   184 	{
   185 	int i,j,k;
   186 	double tm;
   187 	long num;
   188 
   189 	for (i=0; i<NUM_SIZES; i++)
   190 		{
   191 		num=BASENUM;
   192 		if (i) num/=(i*3);
   193 		BN_rand(a,sizes[i],1,0);
   194 		for (j=i; j<NUM_SIZES; j++)
   195 			{
   196 			BN_rand(b,sizes[j],1,0);
   197 			Time_F(START);
   198 			for (k=0; k<num; k++)
   199 				BN_mul(r,b,a,ctx);
   200 			tm=Time_F(STOP);
   201 			printf("mul %4d x %4d -> %8.3fms\n",sizes[i],sizes[j],tm*1000.0/num);
   202 			}
   203 		}
   204 
   205 	for (i=0; i<NUM_SIZES; i++)
   206 		{
   207 		num=BASENUM;
   208 		if (i) num/=(i*3);
   209 		BN_rand(a,sizes[i],1,0);
   210 		Time_F(START);
   211 		for (k=0; k<num; k++)
   212 			BN_sqr(r,a,ctx);
   213 		tm=Time_F(STOP);
   214 		printf("sqr %4d x %4d -> %8.3fms\n",sizes[i],sizes[i],tm*1000.0/num);
   215 		}
   216 
   217 	for (i=0; i<NUM_SIZES; i++)
   218 		{
   219 		num=BASENUM/10;
   220 		if (i) num/=(i*3);
   221 		BN_rand(a,sizes[i]-1,1,0);
   222 		for (j=i; j<NUM_SIZES; j++)
   223 			{
   224 			BN_rand(b,sizes[j],1,0);
   225 			Time_F(START);
   226 			for (k=0; k<100000; k++)
   227 				BN_div(r, NULL, b, a,ctx);
   228 			tm=Time_F(STOP);
   229 			printf("div %4d / %4d -> %8.3fms\n",sizes[j],sizes[i]-1,tm*1000.0/num);
   230 			}
   231 		}
   232 	}
   233