| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197 | Index: libssl/Configure===================================================================RCS file: libssl/Configure,vretrieving revision 1.1.1.12retrieving revision 1.21diff -u -r1.1.1.12 -r1.21--- libssl/Configure	15 Sep 2008 23:36:40 -0000	1.1.1.12+++ libssl/Configure	15 Sep 2008 23:44:15 -0000	1.21@@ -34,6 +34,8 @@ #		(Default: KRB5_DIR/include) # --with-krb5-flavor  Declare what flavor of Kerberos 5 is used.  Currently #		supported values are "MIT" and "Heimdal".  A value is required.+# --with-cryptodev Force support for cryptodev (ie., ocf-linux)+# --with-cryptodev-digests Force support for cryptodev digests (generally slow) # # --test-sanity Make a number of sanity checks on the data in this file. #               This is a debugging tool for OpenSSL developers.@@ -538,6 +540,9 @@ ##### Compaq Non-Stop Kernel (Tandem) "tandem-c89","c89:-Ww -D__TANDEM -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1 -D_TANDEM_SOURCE -DB_ENDIAN::(unknown):::THIRTY_TWO_BIT:::", +# uClinux+"uClinux-dist","$ENV{'CC'}:\$(CFLAGS)::-D_REENTRANT::\$(LDFLAGS) \$(LDLIBS):BN_LLONG::::::::::::\$(LIBSSL_dlfcn):linux-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):$ENV{'RANLIB'}",+ );  my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A@@ -587,6 +592,8 @@ my $no_asm=0; my $no_dso=0; my $no_gmp=0;+my $have_cryptodev=0;+my $use_cryptodev_digests=0; my @skip=(); my $Makefile="Makefile"; my $des_locl="crypto/des/des_locl.h";@@ -714,6 +721,14 @@ 			{ 			exit(&test_sanity()); 			}+		elsif (/^--with-cryptodev$/)+			{+				$have_cryptodev = 1;+			}+		elsif (/^--with-cryptodev-digests$/)+			{+				$use_cryptodev_digests = 1;+			} 		elsif (/^reconfigure/ || /^reconf/) 			{ 			if (open(IN,"<$Makefile"))@@ -922,6 +937,7 @@ 			print " OPENSSL_NO_$ALGO"; 		 			if (/^err$/)	{ $flags .= "-DOPENSSL_NO_ERR "; }+			elsif (/^hw$/)	{ $flags .= "-DOPENSSL_NO_HW "; } 			elsif (/^asm$/)	{ $no_asm = 1; } 			} 		else@@ -1062,6 +1078,16 @@ 		   $withargs{"krb5-dir"} ne ""; 	} +# enable the linux cryptodev (ocf-linux) support+if ($have_cryptodev)+	{+	if ($use_cryptodev_digests)+		{+		$cflags = "-DUSE_CRYPTODEV_DIGESTS $cflags";+		}+	$cflags = "-DHAVE_CRYPTODEV $cflags";+	}+ # The DSO code currently always implements all functions so that no # applications will have to worry about that from a compilation point # of view. However, the "method"s may return zero unless that platformIndex: libssl/INSTALL===================================================================RCS file: libssl/INSTALL,vretrieving revision 1.1.1.8retrieving revision 1.3diff -u -r1.1.1.8 -r1.3--- libssl/INSTALL	15 Sep 2008 23:36:40 -0000	1.1.1.8+++ libssl/INSTALL	15 Sep 2008 23:44:15 -0000	1.3@@ -103,6 +103,12 @@                 define preprocessor symbols, specify additional libraries,                 library directories or other compiler options. +  --with-cryptodev Enabled the BSD cryptodev engine even if we are not using+		BSD.  Useful if you are running ocf-linux or something+		similar.  Once enabled you can also enable the use of+		cryptodev digests,  with is usually slower unless you have+		large amounts data.  Use --with-cryptodev-digests to force+		it.   Installation in Detail  ----------------------Index: libssl/Makefile.org===================================================================RCS file: libssl/Makefile.org,vretrieving revision 1.1.1.11retrieving revision 1.21diff -u -r1.1.1.11 -r1.21--- libssl/Makefile.org	15 Sep 2008 23:36:40 -0000	1.1.1.11+++ libssl/Makefile.org	15 Sep 2008 23:44:15 -0000	1.21@@ -367,7 +367,7 @@  links: 	@$(PERL) $(TOP)/util/mkdir-p.pl include/openssl-	@$(PERL) $(TOP)/util/mklink.pl include/openssl $(EXHEADER)+	@$(PERL) $(TOP)/util/mklink.pl include/openssl $(HEADER) $(EXHEADER) 	@set -e; target=links; $(RECURSIVE_BUILD_CMD)  gentests:Index: libssl/apps/apps.h===================================================================RCS file: libssl/apps/apps.h,vretrieving revision 1.1.1.7retrieving revision 1.6diff -u -r1.1.1.7 -r1.6--- libssl/apps/apps.h	15 Sep 2008 23:36:40 -0000	1.1.1.7+++ libssl/apps/apps.h	15 Sep 2008 23:44:15 -0000	1.6@@ -112,7 +112,7 @@ #ifndef HEADER_APPS_H #define HEADER_APPS_H -#include "e_os.h"+#include <openssl/e_os.h>  #include <openssl/bio.h> #include <openssl/x509.h>Index: libssl/apps/progs.h===================================================================RCS file: libssl/apps/progs.h,vretrieving revision 1.1.1.8retrieving revision 1.7diff -u -r1.1.1.8 -r1.7--- libssl/apps/progs.h	15 Sep 2008 23:36:40 -0000	1.1.1.8+++ libssl/apps/progs.h	15 Sep 2008 23:44:15 -0000	1.7@@ -129,7 +129,9 @@ #ifndef OPENSSL_NO_ENGINE 	{FUNC_TYPE_GENERAL,"engine",engine_main}, #endif+#ifndef OPENSSL_NO_OCSP 	{FUNC_TYPE_GENERAL,"ocsp",ocsp_main},+#endif 	{FUNC_TYPE_GENERAL,"prime",prime_main}, #ifndef OPENSSL_NO_MD2 	{FUNC_TYPE_MD,"md2",dgst_main},Index: libssl/apps/speed.c===================================================================RCS file: libssl/apps/speed.c,vretrieving revision 1.1.1.10retrieving revision 1.15diff -u -r1.1.1.10 -r1.15--- libssl/apps/speed.c	15 Sep 2008 23:36:40 -0000	1.1.1.10+++ libssl/apps/speed.c	15 Sep 2008 23:44:15 -0000	1.15@@ -292,7 +292,7 @@   "evp","sha256","sha512",   "aes-128 ige","aes-192 ige","aes-256 ige"}; static double results[ALGOR_NUM][SIZE_NUM];-static int lengths[SIZE_NUM]={16,64,256,1024,8*1024};+static int lengths[SIZE_NUM]={16,64,256,1024,2*1024,4*1024}; static double rsa_results[RSA_NUM][2]; static double dsa_results[DSA_NUM][2]; #ifndef OPENSSL_NO_ECDSA@@ -328,6 +328,79 @@ #define START	0 #define STOP	1 +#ifdef __linux__+/*+ * record CPU usage as well+ */++static int do_cpu = 0;++struct cpu_stat {+	unsigned int	user;+	unsigned int	nice;+	unsigned int	system;+	unsigned int	idle;+	unsigned int	total;+};++static unsigned int cpu_usage[ALGOR_NUM][SIZE_NUM];+static unsigned int rsa_cpu_usage[RSA_NUM][2];+static unsigned int dsa_cpu_usage[DSA_NUM][2];+static struct cpu_stat cpu_start, cpu_finish;++static void+get_cpu(int s)+{+	FILE *fp = NULL;+	unsigned char	buf[80];+	struct cpu_stat *st = s == START ? &cpu_start : &cpu_finish;++	memset(st, 0, sizeof(*st));++	if (fp == NULL)+		fp = fopen("/proc/stat", "r");+	if (!fp)+		return;+	if (fseek(fp, 0, SEEK_SET) == -1) {+		fclose(fp);+		return;+	}+	fscanf(fp, "%s %d %d %d %d", &buf[0], &st->user, &st->nice,+		&st->system, &st->idle);+	st->total = st->user + st->nice + st->system + st->idle;+	fclose(fp);+}++static unsigned int+calc_cpu()+{+	unsigned int total, res;++	total  = cpu_finish.total - cpu_start.total;+	if (total <= 0)+		return 0;+#if 1 // busy+	res   = ((cpu_finish.system + cpu_finish.user + cpu_finish.nice) -+			 (cpu_start.system + cpu_start.user + cpu_start.nice)) *+			 100 / total;+#endif+#if 0 // system+	res   = (cpu_finish.system - cpu_start.system) * 100 / total;+#endif+#if 0 // user+	res   = (cpu_finish.user   - cpu_start.user)   * 100 / total;+#endif+#if 0 // nice+	res   = (cpu_finish.nice   - cpu_start.nice)   * 100 / total;+#endif+#if 0 // idle+	res   = (cpu_finish.idle   - cpu_start.idle)   * 100 / total;+#endif+	return(res);+}++#endif+ #if defined(OPENSSL_SYS_NETWARE)     /* for NetWare the best we can do is use clock() which returns the@@ -358,6 +431,11 @@ 	{ 	double ret; +#ifdef __linux__+	if (do_cpu)+		get_cpu(s);+#endif+ #ifdef USE_TOD 	if(usertime) 		{@@ -832,6 +910,14 @@ 			j--;	/* Otherwise, -elapsed gets confused with 				   an algorithm. */ 			}+#ifdef __linux__+		else if	((argc > 0) && (strcmp(*argv,"-cpu") == 0))+			{+			do_cpu = 1;+			j--;	/* Otherwise, -cpu gets confused with+				   an algorithm. */+			}+#endif 		else if	((argc > 0) && (strcmp(*argv,"-evp") == 0)) 			{ 			argc--;@@ -1260,6 +1346,9 @@ #ifdef HAVE_FORK 			BIO_printf(bio_err,"-multi n        run n benchmarks in parallel.\n"); #endif+#ifdef __linux__+			BIO_printf(bio_err,"-cpu            calculate cpu utilisation.\n");+#endif 			goto end; 			} 		argc--;@@ -1267,11 +1356,6 @@ 		j++; 		} -#ifdef HAVE_FORK-	if(multi && do_multi(multi))-		goto show_res;-#endif- 	if (j == 0) 		{ 		for (i=0; i<ALGOR_NUM; i++)@@ -1604,6 +1688,11 @@ 	signal(SIGALRM,sig_done); #endif /* SIGALRM */ +#ifdef HAVE_FORK /* DM */+	if(multi && do_multi(multi))+		goto show_res;+#endif+ #ifndef OPENSSL_NO_MD2 	if (doit[D_MD2]) 		{@@ -2033,8 +2122,6 @@ 				/* -O3 -fschedule-insns messes up an 				 * optimization here!  names[D_EVP] 				 * somehow becomes NULL */-				print_message(names[D_EVP],save_count,-					lengths[j]);  				EVP_CIPHER_CTX_init(&ctx); 				if(decrypt)@@ -2043,6 +2130,9 @@ 					EVP_EncryptInit_ex(&ctx,evp_cipher,NULL,key16,iv); 				EVP_CIPHER_CTX_set_padding(&ctx, 0); +				print_message(names[D_EVP],save_count,+					lengths[j]);+ 				Time_F(START); 				if(decrypt) 					for (count=0,run=1; COND(save_count*4*lengths[0]/lengths[j]); count++)@@ -2107,6 +2197,8 @@ 					} 				} 			d=Time_F(STOP);+			if (do_cpu)+				rsa_cpu_usage[j][0] = calc_cpu(); 			BIO_printf(bio_err,mr ? "+R1:%ld:%d:%.2f\n" 				   : "%ld %d bit private RSA's in %.2fs\n", 				   count,rsa_bits[j],d);@@ -2142,6 +2234,8 @@ 					} 				} 			d=Time_F(STOP);+			if (do_cpu)+				rsa_cpu_usage[j][1] = calc_cpu(); 			BIO_printf(bio_err,mr ? "+R2:%ld:%d:%.2f\n" 				   : "%ld %d bit public RSA's in %.2fs\n", 				   count,rsa_bits[j],d);@@ -2201,6 +2295,8 @@ 					} 				} 			d=Time_F(STOP);+			if (do_cpu)+				dsa_cpu_usage[j][0] = calc_cpu(); 			BIO_printf(bio_err,mr ? "+R3:%ld:%d:%.2f\n" 				   : "%ld %d bit DSA signs in %.2fs\n", 				   count,dsa_bits[j],d);@@ -2236,6 +2332,8 @@ 					} 				} 			d=Time_F(STOP);+			if (do_cpu)+				dsa_cpu_usage[j][1] = calc_cpu(); 			BIO_printf(bio_err,mr ? "+R4:%ld:%d:%.2f\n" 				   : "%ld %d bit DSA verify in %.2fs\n", 				   count,dsa_bits[j],d);@@ -2530,14 +2628,23 @@ 			fprintf(stdout,"The 'numbers' are in 1000s of bytes per second processed.\n");  			fprintf(stdout,"type        "); 			}-		for (j=0;  j<SIZE_NUM; j++)+		for (j=0;  j<SIZE_NUM; j++) { 			fprintf(stdout,mr ? ":%d" : "%7d bytes",lengths[j]);+			if (do_cpu && !mr)+				fprintf(stdout, " /cpu");+		} 		fprintf(stdout,"\n"); 		}  	for (k=0; k<ALGOR_NUM; k++) 		{ 		if (!doit[k]) continue;+		if (k == D_EVP) {+			if (evp_cipher)+				names[D_EVP]=OBJ_nid2ln(evp_cipher->nid);+			else+				names[D_EVP]=OBJ_nid2ln(evp_md->type);+		} 		if(mr) 			fprintf(stdout,"+F:%d:%s",k,names[k]); 		else@@ -2548,6 +2655,8 @@ 				fprintf(stdout," %11.2fk",results[k][j]/1e3); 			else 				fprintf(stdout,mr ? ":%.2f" : " %11.2f ",results[k][j]);+			if (do_cpu)+				fprintf(stdout, mr ? "/%d" : "/%%%-3d", cpu_usage[k][j]); 			} 		fprintf(stdout,"\n"); 		}@@ -2562,13 +2671,18 @@ 			j=0; 			} 		if(mr)-			fprintf(stdout,"+F2:%u:%u:%f:%f\n",-				k,rsa_bits[k],rsa_results[k][0],-				rsa_results[k][1]);-		else-			fprintf(stdout,"rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",-				rsa_bits[k],rsa_results[k][0],rsa_results[k][1],-				1.0/rsa_results[k][0],1.0/rsa_results[k][1]);+			fprintf(stdout,"+F2:%u:%u:%f", k,rsa_bits[k],rsa_results[k][0]);+		else+			fprintf(stdout,"rsa %4u bits %8.6fs",rsa_bits[k],rsa_results[k][0]);+		if (do_cpu)+			fprintf(stdout, mr ? "/%d": "/%%%-3d", rsa_cpu_usage[k][0]);+		fprintf(stdout, mr ? ":%f" : " %8.6fs", rsa_results[k][1]);+		if (do_cpu)+			fprintf(stdout, mr ? "/%d": "/%%%-3d", rsa_cpu_usage[k][1]);+		if(!mr)+			fprintf(stdout, " %8.1f %8.1f",+					1.0/rsa_results[k][0],1.0/rsa_results[k][1]);+		fprintf(stdout, "\n"); 		} #endif #ifndef OPENSSL_NO_DSA@@ -2582,12 +2696,18 @@ 			j=0; 			} 		if(mr)-			fprintf(stdout,"+F3:%u:%u:%f:%f\n",-				k,dsa_bits[k],dsa_results[k][0],dsa_results[k][1]);+			fprintf(stdout,"+F3:%u:%u:%f", k,dsa_bits[k],dsa_results[k][0]); 		else-			fprintf(stdout,"dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f\n",-				dsa_bits[k],dsa_results[k][0],dsa_results[k][1],-				1.0/dsa_results[k][0],1.0/dsa_results[k][1]);+			fprintf(stdout,"dsa %4u bits %8.6fs",dsa_bits[k],dsa_results[k][0]);+		if (do_cpu)+			fprintf(stdout, mr ? "/%d": "/%%%-3d", dsa_cpu_usage[k][0]);+		fprintf(stdout, mr ? ":%f" : " %8.6fs", dsa_results[k][1]);+		if (do_cpu)+			fprintf(stdout, mr ? "/%d": "/%%%-3d", dsa_cpu_usage[k][1]);+		if(!mr)+			fprintf(stdout, " %8.1f %8.1f",+					1.0/dsa_results[k][0],1.0/dsa_results[k][1]);+		fprintf(stdout, "\n"); 		} #endif #ifndef OPENSSL_NO_ECDSA@@ -2712,8 +2832,10 @@  static void print_result(int alg,int run_no,int count,double time_used) 	{-	BIO_printf(bio_err,mr ? "+R:%d:%s:%f\n"-		   : "%d %s's in %.2fs\n",count,names[alg],time_used);+	if (do_cpu)+	    cpu_usage[alg][run_no] = calc_cpu();+	BIO_printf(bio_err,mr ? "+R:%ld:%s:%f\n"+		   : "%ld %s's in %.2fs\n",count,names[alg],time_used); 	results[alg][run_no]=((double)count)/time_used*lengths[run_no]; 	} @@ -2806,29 +2928,11 @@ 				p=buf+3; 				alg=atoi(sstrsep(&p,sep)); 				sstrsep(&p,sep);-				for(j=0 ; j < SIZE_NUM ; ++j)+				for(j=0 ; j < SIZE_NUM ; ++j) {+					if (do_cpu && strchr(p, '/'))+						cpu_usage[alg][j] = atoi(strchr(p, '/') + 1); 					results[alg][j]+=atof(sstrsep(&p,sep)); 				}-			else if(!strncmp(buf,"+F2:",4))-				{-				int k;-				double d;-				-				p=buf+4;-				k=atoi(sstrsep(&p,sep));-				sstrsep(&p,sep);--				d=atof(sstrsep(&p,sep));-				if(n)-					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d);-				else-					rsa_results[k][0]=d;--				d=atof(sstrsep(&p,sep));-				if(n)-					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);-				else-					rsa_results[k][1]=d; 				} 			else if(!strncmp(buf,"+F2:",4)) 				{@@ -2839,12 +2943,18 @@ 				k=atoi(sstrsep(&p,sep)); 				sstrsep(&p,sep); +				/* before we move the token along */+				if (do_cpu && strchr(p, '/'))+					rsa_cpu_usage[k][0] = atoi(strchr(p, '/') + 1); 				d=atof(sstrsep(&p,sep)); 				if(n) 					rsa_results[k][0]=1/(1/rsa_results[k][0]+1/d); 				else 					rsa_results[k][0]=d; +				/* before we move the token along */+				if (do_cpu && strchr(p, '/'))+					rsa_cpu_usage[k][1] = atoi(strchr(p, '/') + 1); 				d=atof(sstrsep(&p,sep)); 				if(n) 					rsa_results[k][1]=1/(1/rsa_results[k][1]+1/d);@@ -2860,12 +2970,18 @@ 				k=atoi(sstrsep(&p,sep)); 				sstrsep(&p,sep); +				/* before we move the token along */+				if (do_cpu && strchr(p, '/'))+					dsa_cpu_usage[k][0] = atoi(strchr(p, '/') + 1); 				d=atof(sstrsep(&p,sep)); 				if(n) 					dsa_results[k][0]=1/(1/dsa_results[k][0]+1/d); 				else 					dsa_results[k][0]=d; +				/* before we move the token along */+				if (do_cpu && strchr(p, '/'))+					dsa_cpu_usage[k][1] = atoi(strchr(p, '/') + 1); 				d=atof(sstrsep(&p,sep)); 				if(n) 					dsa_results[k][1]=1/(1/dsa_results[k][1]+1/d);Index: libssl/crypto/cryptlib.h===================================================================RCS file: libssl/crypto/cryptlib.h,vretrieving revision 1.1.1.5retrieving revision 1.4diff -u -r1.1.1.5 -r1.4--- libssl/crypto/cryptlib.h	15 Sep 2008 23:36:40 -0000	1.1.1.5+++ libssl/crypto/cryptlib.h	15 Sep 2008 23:44:15 -0000	1.4@@ -62,7 +62,7 @@ #include <stdlib.h> #include <string.h> -#include "e_os.h"+#include <openssl/e_os.h>  #ifdef OPENSSL_USE_APPLINK #define BIO_FLAGS_UPLINK 0x8000Index: libssl/crypto/engine/eng_all.c===================================================================RCS file: libssl/crypto/engine/eng_all.c,vretrieving revision 1.1.1.4retrieving revision 1.6diff -u -r1.1.1.4 -r1.6--- libssl/crypto/engine/eng_all.c	15 Sep 2008 23:36:41 -0000	1.1.1.4+++ libssl/crypto/engine/eng_all.c	15 Sep 2008 23:44:16 -0000	1.6@@ -104,7 +104,7 @@ #endif #endif #ifndef OPENSSL_NO_HW-#if defined(__OpenBSD__) || defined(__FreeBSD__)+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) 	ENGINE_load_cryptodev(); #endif #if defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_NO_CAPIENG)@@ -113,7 +113,7 @@ #endif 	} -#if defined(__OpenBSD__) || defined(__FreeBSD__)+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) void ENGINE_setup_bsd_cryptodev(void) { 	static int bsd_cryptodev_default_loaded = 0; 	if (!bsd_cryptodev_default_loaded) {Index: libssl/crypto/engine/eng_cryptodev.c===================================================================RCS file: libssl/crypto/engine/eng_cryptodev.c,vretrieving revision 1.1.1.1retrieving revision 1.9diff -u -r1.1.1.1 -r1.9--- libssl/crypto/engine/eng_cryptodev.c	3 Feb 2006 00:06:09 -0000	1.1.1.1+++ libssl/crypto/engine/eng_cryptodev.c	4 Aug 2008 00:51:09 -0000	1.9@@ -68,6 +68,16 @@ struct dev_crypto_state { 	struct session_op d_sess; 	int d_fd;++#ifdef USE_CRYPTODEV_DIGESTS+	char dummy_mac_key[20];++	unsigned char digest_res[20];+	char *mac_data;+	int mac_len;++	int copy;+#endif };  static u_int32_t cryptodev_asymfeat = 0;@@ -75,9 +85,11 @@ static int get_asym_dev_crypto(void); static int open_dev_crypto(void); static int get_dev_crypto(void);+#if 0 static int cryptodev_max_iv(int cipher); static int cryptodev_key_length_valid(int cipher, int len); static int cipher_nid_to_cryptodev(int nid);+#endif static int get_cryptodev_ciphers(const int **cnids); static int get_cryptodev_digests(const int **cnids); static int cryptodev_usable_ciphers(const int **nids);@@ -100,7 +112,7 @@ static int cryptodev_bn_mod_exp(BIGNUM *r, const BIGNUM *a,     const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); static int cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I,-    RSA *rsa);+    RSA *rsa, BN_CTX *ctx); static int cryptodev_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); static int cryptodev_dsa_bn_mod_exp(DSA *dsa, BIGNUM *r, BIGNUM *a,     const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);@@ -130,9 +142,12 @@ 	int	ivmax; 	int	keylen; } ciphers[] = {+	{ CRYPTO_ARC4,			NID_rc4,		0,	16, }, 	{ CRYPTO_DES_CBC,		NID_des_cbc,		8,	 8, }, 	{ CRYPTO_3DES_CBC,		NID_des_ede3_cbc,	8,	24, }, 	{ CRYPTO_AES_CBC,		NID_aes_128_cbc,	16,	16, },+	{ CRYPTO_AES_CBC,		NID_aes_192_cbc,	16,	24, },+	{ CRYPTO_AES_CBC,		NID_aes_256_cbc,	16,	32, }, 	{ CRYPTO_BLF_CBC,		NID_bf_cbc,		8,	16, }, 	{ CRYPTO_CAST_CBC,		NID_cast5_cbc,		8,	16, }, 	{ CRYPTO_SKIPJACK_CBC,		NID_undef,		0,	 0, },@@ -142,14 +157,15 @@ static struct { 	int	id; 	int	nid;+	int 	keylen; } digests[] = {-	{ CRYPTO_SHA1_HMAC,		NID_hmacWithSHA1,	},-	{ CRYPTO_RIPEMD160_HMAC,	NID_ripemd160,		},-	{ CRYPTO_MD5_KPDK,		NID_undef,		},-	{ CRYPTO_SHA1_KPDK,		NID_undef,		},-	{ CRYPTO_MD5,			NID_md5,		},-	{ CRYPTO_SHA1,			NID_undef,		},-	{ 0,				NID_undef,		},+	{ CRYPTO_SHA1_HMAC,		NID_hmacWithSHA1,	20},+	{ CRYPTO_RIPEMD160_HMAC,	NID_ripemd160,		16/*?*/},+	{ CRYPTO_MD5_KPDK,		NID_undef,		0},+	{ CRYPTO_SHA1_KPDK,		NID_undef,		0},+	{ CRYPTO_MD5,			NID_md5,		16},+	{ CRYPTO_SHA1,			NID_sha1,		20},+	{ 0,				NID_undef,		0}, };  /*@@ -176,10 +192,17 @@ static int get_dev_crypto(void) {-	int fd, retfd;+	static int fd = -1;+	int retfd; -	if ((fd = open_dev_crypto()) == -1)-		return (-1);+	if (fd == -1) {+		if ((fd = open_dev_crypto()) == -1)+			return (-1);+		if (fcntl(fd, F_SETFD, 1) == -1) {+			close(fd);+			return (-1);+		}+	} 	if (ioctl(fd, CRIOGET, &retfd) == -1) 		return (-1); @@ -202,6 +225,7 @@ 	return fd; } +#if 0 /*  * XXXX this needs to be set for each alg - and determined from  * a running card.@@ -245,6 +269,7 @@ 			return (ciphers[i].id); 	return (0); }+#endif  /*  * Find out what ciphers /dev/crypto will let us have a session for.@@ -264,7 +289,7 @@ 		return (0); 	} 	memset(&sess, 0, sizeof(sess));-	sess.key = (caddr_t)"123456781234567812345678";+	sess.key = (caddr_t)"123456789abcdefghijklmno";  	for (i = 0; ciphers[i].id && count < CRYPTO_ALGORITHM_MAX; i++) { 		if (ciphers[i].nid == NID_undef)@@ -303,10 +328,12 @@ 		return (0); 	} 	memset(&sess, 0, sizeof(sess));+	sess.mackey = (caddr_t)"123456789abcdefghijklmno"; 	for (i = 0; digests[i].id && count < CRYPTO_ALGORITHM_MAX; i++) { 		if (digests[i].nid == NID_undef) 			continue; 		sess.mac = digests[i].id;+		sess.mackeylen = digests[i].keylen; 		sess.cipher = 0; 		if (ioctl(fd, CIOCGSESSION, &sess) != -1 && 		    ioctl(fd, CIOCFSESSION, &sess.ses) != -1)@@ -351,6 +378,9 @@ static int cryptodev_usable_digests(const int **nids) {+#ifdef USE_CRYPTODEV_DIGESTS+	return (get_cryptodev_digests(nids));+#else 	/* 	 * XXXX just disable all digests for now, because it sucks. 	 * we need a better way to decide this - i.e. I may not@@ -365,6 +395,7 @@ 	 */ 	*nids = NULL; 	return (0);+#endif }  static int@@ -427,16 +458,20 @@ { 	struct dev_crypto_state *state = ctx->cipher_data; 	struct session_op *sess = &state->d_sess;-	int cipher;+	int cipher, i; -	if ((cipher = cipher_nid_to_cryptodev(ctx->cipher->nid)) == NID_undef)-		return (0);--	if (ctx->cipher->iv_len > cryptodev_max_iv(cipher))-		return (0);+	for (i = 0; ciphers[i].id; i++)+		if (ctx->cipher->nid == ciphers[i].nid &&+		    ctx->cipher->iv_len <= ciphers[i].ivmax &&+		    ctx->key_len == ciphers[i].keylen) {+			cipher = ciphers[i].id;+			break;+		} -	if (!cryptodev_key_length_valid(cipher, ctx->key_len))+	if (!ciphers[i].id) {+		state->d_fd = -1; 		return (0);+	}  	memset(sess, 0, sizeof(struct session_op)); @@ -496,6 +531,20 @@  * gets called when libcrypto requests a cipher NID.  */ +/* RC4 */+const EVP_CIPHER cryptodev_rc4 = {+	NID_rc4,+	1, 16, 0,+	EVP_CIPH_VARIABLE_LENGTH,+	cryptodev_init_key,+	cryptodev_cipher,+	cryptodev_cleanup,+	sizeof(struct dev_crypto_state),+	NULL,+	NULL,+	NULL+};+ /* DES CBC EVP */ const EVP_CIPHER cryptodev_des_cbc = { 	NID_des_cbc,@@ -563,6 +612,32 @@ 	NULL }; +const EVP_CIPHER cryptodev_aes_192_cbc = {+	NID_aes_192_cbc,+	16, 24, 16,+	EVP_CIPH_CBC_MODE,+	cryptodev_init_key,+	cryptodev_cipher,+	cryptodev_cleanup,+	sizeof(struct dev_crypto_state),+	EVP_CIPHER_set_asn1_iv,+	EVP_CIPHER_get_asn1_iv,+	NULL+};++const EVP_CIPHER cryptodev_aes_256_cbc = {+	NID_aes_256_cbc,+	16, 32, 16,+	EVP_CIPH_CBC_MODE,+	cryptodev_init_key,+	cryptodev_cipher,+	cryptodev_cleanup,+	sizeof(struct dev_crypto_state),+	EVP_CIPHER_set_asn1_iv,+	EVP_CIPHER_get_asn1_iv,+	NULL+};+ /*  * Registered by the ENGINE when used to find out how to deal with  * a particular NID in the ENGINE. this says what we'll do at the@@ -576,6 +651,9 @@ 		return (cryptodev_usable_ciphers(nids));  	switch (nid) {+	case NID_rc4:+		*cipher = &cryptodev_rc4;+		break; 	case NID_des_ede3_cbc: 		*cipher = &cryptodev_3des_cbc; 		break;@@ -591,6 +669,12 @@ 	case NID_aes_128_cbc: 		*cipher = &cryptodev_aes_cbc; 		break;+	case NID_aes_192_cbc:+		*cipher = &cryptodev_aes_192_cbc;+		break;+	case NID_aes_256_cbc:+		*cipher = &cryptodev_aes_256_cbc;+		break; 	default: 		*cipher = NULL; 		break;@@ -598,6 +682,234 @@ 	return (*cipher != NULL); } ++#ifdef USE_CRYPTODEV_DIGESTS++/* convert digest type to cryptodev */+static int+digest_nid_to_cryptodev(int nid)+{+	int i;++	for (i = 0; digests[i].id; i++)+		if (digests[i].nid == nid)+			return (digests[i].id);+	return (0);+}+++static int+digest_key_length(int nid)+{+	int i;++	for (i = 0; digests[i].id; i++)+		if (digests[i].nid == nid)+			return digests[i].keylen;+	return (0);+}+++static int cryptodev_digest_init(EVP_MD_CTX *ctx)+{+	struct dev_crypto_state *state = ctx->md_data;+	struct session_op *sess = &state->d_sess;+	int digest;++	if ((digest = digest_nid_to_cryptodev(ctx->digest->type)) == NID_undef){+		printf("cryptodev_digest_init: Can't get digest \n");+		return (0);+	}++	memset(state, 0, sizeof(struct dev_crypto_state));++	if ((state->d_fd = get_dev_crypto()) < 0) {+		printf("cryptodev_digest_init: Can't get Dev \n");+		return (0);+	}++	sess->mackey = state->dummy_mac_key;+	sess->mackeylen = digest_key_length(ctx->digest->type);+	sess->mac = digest;++	if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) {+		close(state->d_fd);+		state->d_fd = -1;+		printf("cryptodev_digest_init: Open session failed\n");+		return (0);+	}++	return (1);+}++static int cryptodev_digest_update(EVP_MD_CTX *ctx, const void *data,+		size_t count)+{+	struct crypt_op cryp;+	struct dev_crypto_state *state = ctx->md_data;+	struct session_op *sess = &state->d_sess;++	if (!data || state->d_fd < 0) {+		printf("cryptodev_digest_update: illegal inputs \n");+		return (0);+	}++	if (!count) {+		return (0);+	}++	if (!(ctx->flags & EVP_MD_CTX_FLAG_ONESHOT)) {+		/* if application doesn't support one buffer */+		state->mac_data = OPENSSL_realloc(state->mac_data, state->mac_len + count);++		if (!state->mac_data) {+			printf("cryptodev_digest_update: realloc failed\n");+			return (0);+		}++		memcpy(state->mac_data + state->mac_len, data, count);+   		state->mac_len += count;+	+		return (1);+	}++	memset(&cryp, 0, sizeof(cryp));++	cryp.ses = sess->ses;+	cryp.flags = 0;+	cryp.len = count;+	cryp.src = (caddr_t) data;+	cryp.dst = NULL;+	cryp.mac = state->digest_res;+	if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {+		printf("cryptodev_digest_update: digest failed\n");+		return (0);+	}+	return (1);+}+++static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md)+{+	struct crypt_op cryp;+	struct dev_crypto_state *state = ctx->md_data;+	struct session_op *sess = &state->d_sess;++	int ret = 1;++	if (!md || state->d_fd < 0) {+		printf("cryptodev_digest_final: illegal input\n");+		return(0);+	}++	if (! (ctx->flags & EVP_MD_CTX_FLAG_ONESHOT) ) {+		/* if application doesn't support one buffer */+		memset(&cryp, 0, sizeof(cryp));++		cryp.ses = sess->ses;+		cryp.flags = 0;+		cryp.len = state->mac_len;+		cryp.src = state->mac_data;+		cryp.dst = NULL;+		cryp.mac = md;++		if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) {+			printf("cryptodev_digest_final: digest failed\n");+			return (0);+		}++		return 1;+	}++	memcpy(md, state->digest_res, ctx->digest->md_size);++	return (ret);+}+++static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx)+{+	int ret = 1;+	struct dev_crypto_state *state = ctx->md_data;+	struct session_op *sess = &state->d_sess;++	if (state->d_fd < 0) {+		printf("cryptodev_digest_cleanup: illegal input\n");+		return (0);+	}++	if (state->mac_data) {+		OPENSSL_free(state->mac_data);+		state->mac_data = NULL;+		state->mac_len = 0;+	}++	if (state->copy)+		return 1;++	if (ioctl(state->d_fd, CIOCFSESSION, &sess->ses) < 0) {+		printf("cryptodev_digest_cleanup: failed to close session\n");+		ret = 0;+	} else {+		ret = 1;+	}+	close(state->d_fd);	+	state->d_fd = -1;++	return (ret);+}++static int cryptodev_digest_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)+{+	struct dev_crypto_state *fstate = from->md_data;+	struct dev_crypto_state *dstate = to->md_data;++	memcpy(dstate, fstate, sizeof(struct dev_crypto_state));++	if (fstate->mac_len != 0) {+		dstate->mac_data = OPENSSL_malloc(fstate->mac_len);+		memcpy(dstate->mac_data, fstate->mac_data, fstate->mac_len);+	}++	dstate->copy = 1;++	return 1;+}+++const EVP_MD cryptodev_sha1 = {+	NID_sha1,+	NID_undef, +	SHA_DIGEST_LENGTH, +	EVP_MD_FLAG_ONESHOT,+	cryptodev_digest_init,+	cryptodev_digest_update,+	cryptodev_digest_final,+	cryptodev_digest_copy,+	cryptodev_digest_cleanup,+	EVP_PKEY_NULL_method,+	SHA_CBLOCK,+	sizeof(struct dev_crypto_state),+};++const EVP_MD cryptodev_md5 = {+	NID_md5,+	NID_undef, +	16 /* MD5_DIGEST_LENGTH */, +	EVP_MD_FLAG_ONESHOT,+	cryptodev_digest_init,+	cryptodev_digest_update,+	cryptodev_digest_final,+	cryptodev_digest_copy,+	cryptodev_digest_cleanup,+	EVP_PKEY_NULL_method,+	64 /* MD5_CBLOCK */,+	sizeof(struct dev_crypto_state),+};++#endif /* USE_CRYPTODEV_DIGESTS */++ static int cryptodev_engine_digests(ENGINE *e, const EVP_MD **digest,     const int **nids, int nid)@@ -606,10 +918,15 @@ 		return (cryptodev_usable_digests(nids));  	switch (nid) {+#ifdef USE_CRYPTODEV_DIGESTS 	case NID_md5:-		*digest = NULL; /* need to make a clean md5 critter */+		*digest = &cryptodev_md5;  		break;+	case NID_sha1:+		*digest = &cryptodev_sha1;+ 		break; 	default:+#endif /* USE_CRYPTODEV_DIGESTS */ 		*digest = NULL; 		break; 	}@@ -625,7 +942,7 @@ bn2crparam(const BIGNUM *a, struct crparam *crp) { 	int i, j, k;-	ssize_t words, bytes, bits;+	ssize_t bytes, bits; 	u_char *b;  	crp->crp_p = NULL;@@ -637,6 +954,7 @@ 	b = malloc(bytes); 	if (b == NULL) 		return (1);+	memset(b, 0, bytes);  	crp->crp_p = b; 	crp->crp_nbits = bits;@@ -681,7 +999,7 @@ { 	int i; -	for (i = 0; i <= kop->crk_iparams + kop->crk_oparams; i++) {+	for (i = 0; i < kop->crk_iparams + kop->crk_oparams; i++) { 		if (kop->crk_param[i].crp_p) 			free(kop->crk_param[i].crp_p); 		kop->crk_param[i].crp_p = NULL;@@ -756,12 +1074,10 @@ }  static int-cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa)+cryptodev_rsa_nocrt_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { 	int r;-	BN_CTX *ctx;--	ctx = BN_CTX_new();+	ctx = BN_CTX_new(); /* not sure why we reallocate this. DM */ 	r = cryptodev_bn_mod_exp(r0, I, rsa->d, rsa->n, ctx, NULL); 	BN_CTX_free(ctx); 	return (r);Index: libssl/crypto/engine/engine.h===================================================================RCS file: libssl/crypto/engine/engine.h,vretrieving revision 1.1.1.6retrieving revision 1.6diff -u -r1.1.1.6 -r1.6--- libssl/crypto/engine/engine.h	15 Sep 2008 23:36:41 -0000	1.1.1.6+++ libssl/crypto/engine/engine.h	15 Sep 2008 23:44:16 -0000	1.6@@ -703,7 +703,7 @@  * values. */ void *ENGINE_get_static_state(void); -#if defined(__OpenBSD__) || defined(__FreeBSD__)+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) void ENGINE_setup_bsd_cryptodev(void); #endif Index: libssl/crypto/evp/c_all.c===================================================================RCS file: libssl/crypto/evp/c_all.c,vretrieving revision 1.1.1.4retrieving revision 1.3diff -u -r1.1.1.4 -r1.3--- libssl/crypto/evp/c_all.c	3 Feb 2006 00:06:07 -0000	1.1.1.4+++ libssl/crypto/evp/c_all.c	23 Jul 2007 12:23:31 -0000	1.3@@ -83,7 +83,7 @@ 	OpenSSL_add_all_ciphers(); 	OpenSSL_add_all_digests(); #ifndef OPENSSL_NO_ENGINE-# if defined(__OpenBSD__) || defined(__FreeBSD__)+# if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV) 	ENGINE_setup_bsd_cryptodev(); # endif #endifIndex: libssl/crypto/evp/c_alld.c===================================================================RCS file: libssl/crypto/evp/c_alld.c,vretrieving revision 1.1.1.4retrieving revision 1.3diff -u -r1.1.1.4 -r1.3--- libssl/crypto/evp/c_alld.c	3 Feb 2006 00:06:07 -0000	1.1.1.4+++ libssl/crypto/evp/c_alld.c	3 Feb 2006 00:36:44 -0000	1.3@@ -81,7 +81,7 @@ 	EVP_add_digest(EVP_dss()); #endif #endif-#ifndef OPENSSL_NO_SHA+#if !defined(OPENSSL_NO_SHA) && !defined(OPENSSL_NO_SHA1) 	EVP_add_digest(EVP_sha1()); 	EVP_add_digest_alias(SN_sha1,"ssl3-sha1"); 	EVP_add_digest_alias(SN_sha1WithRSAEncryption,SN_sha1WithRSA);Index: libssl/engines/Makefile===================================================================RCS file: libssl/engines/Makefile,vretrieving revision 1.1.1.3retrieving revision 1.3diff -u -r1.1.1.3 -r1.3--- libssl/engines/Makefile	15 Sep 2008 23:36:41 -0000	1.1.1.3+++ libssl/engines/Makefile	15 Sep 2008 23:44:16 -0000	1.3@@ -96,6 +96,7 @@ 			( echo installing $$l; \ 			  if [ "$(PLATFORM)" != "Cygwin" ]; then \ 				case "$(CFLAGS)" in \+				*OPENSSL_NO_HW*)	continue;;	\ 				*DSO_DLFCN*)	sfx="so";;	\ 				*DSO_DL*)	sfx="sl";;	\ 				*)		sfx="bad";;	\
 |