<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-980</id>
	<title>Nabble - OpenSSL - Dev</title>
	<updated>2009-12-20T13:50:38Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/OpenSSL---Dev-f980.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/OpenSSL---Dev-f980.html" />
	<subtitle type="html"></subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-26867576</id>
	<title>Bug in IBM contributed AES-CCM code (large AAD)</title>
	<published>2009-12-20T13:50:38Z</published>
	<updated>2009-12-20T13:50:38Z</updated>
	<author>
		<name>Peter Waltenberg</name>
	</author>
	<content type="html">I'll post a full patch at some point - but in the interim.
&lt;br&gt;This isn't so much a bug as something I forgot to go back and fix when I
&lt;br&gt;coded it originally.
&lt;br&gt;CCM will fail with AAD &amp;gt; 0xff00 bytes as I forgot to add the formatting
&lt;br&gt;bytes for the larger AAD's.
&lt;br&gt;Note that it still hasn't been tested with AAD's &amp;gt; 2^32 bytes .
&lt;br&gt;&lt;br&gt;With normal use of CCM this was probably harmless, as it's typically used
&lt;br&gt;with small packets.
&lt;br&gt;&lt;br&gt;--- openssl-0.9.8e.orig/crypto/aes/aes_ccm.c &amp;nbsp; &amp;nbsp;2009-12-18
&lt;br&gt;08:38:39.000000000 +1000
&lt;br&gt;+++ openssl-0.9.8e/crypto/aes/aes_ccm.c 2009-12-18 10:29:51.000000000 +1000
&lt;br&gt;@@ -180,7 +180,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned int aadbytes = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned int offset = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int outl = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;unsigned int i,j;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned int i,j,k;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int aadenc = 2;
&lt;br&gt;&amp;nbsp;#if defined(AES_CCM_DEBUG)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int b = 0; /* Index counters to aid formatting during debug */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int s = 0;
&lt;br&gt;@@ -283,15 +284,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(aad != NULL &amp;&amp; aadlen &amp;gt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(aadlen &amp;lt; (0x10000L - 0x100L)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadbytes = 2;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadenc = 2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else if(aadlen &amp;lt;= 0xFFFFFFFF) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadbytes = 6;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadenc = 4;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[0] = 0xff;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[1] = 0xfe;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadbytes = 10;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; aadenc = 8;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[0] = 0xff;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[1] = 0xff;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j = aadlen;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = aadbytes-1; i &amp;gt; 0; i--) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[i] = j &amp; 0xff;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j &amp;gt;&amp;gt;= 8;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = 0, k = aadbytes-1; i &amp;lt; aadenc; i++,k--) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A0[k] = j &amp; 0xff;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; j = j / 256;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Now roll through the aad ? */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -364,7 +372,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* AES_encrypt(CTR,A0,akey); */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EVP_EncryptUpdate(ctx,A0,&amp;outl,CTR,AES_BLOCK_SIZE);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printbinCTR(&amp;quot;S&amp;quot;,&amp;s,A0,AES_BLOCK_SIZE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Increment the ounter */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Increment the counter */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AES_CCM_inc(CTR,q);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* XOR the encrypted counter with the incoming data */
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26867576&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26867576&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--1794---PATCH--SRP-ciphersuites-in-1.0.1-and-1.1.0-%28updated%29-tp26849767p26867576.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26850020</id>
	<title>Re: [openssl.org #1794] [PATCH] SRP ciphersuites in 1.0.1 and 1.1.0 (updated)</title>
	<published>2009-12-18T13:32:03Z</published>
	<updated>2009-12-18T13:32:03Z</updated>
	<author>
		<name>Richard Salz</name>
	</author>
	<content type="html">Wow,
&lt;br&gt;&lt;br&gt;You keep updating and submitting these patches. &amp;nbsp;I hope you find a 
&lt;br&gt;core-team commit in your christmas stocking, finally :)
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /r$
&lt;br&gt;&lt;br&gt;--
&lt;br&gt;STSM, WebSphere Appliance Architect
&lt;br&gt;&lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/blogs/soma/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://www.ibm.com/developerworks/mydeveloperworks/blogs/soma/&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26850020&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26850020&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--1794---PATCH--SRP-ciphersuites-in-1.0.1-and-1.1.0-%28updated%29-tp26849767p26850020.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26849767</id>
	<title>[openssl.org #1794] [PATCH] SRP ciphersuites in 1.0.1 and 1.1.0 (updated)</title>
	<published>2009-12-18T13:07:39Z</published>
	<updated>2009-12-18T13:07:39Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">This patch adds full RFC 5054 support in OpenSSL 1.0.1 and 1.1.0, and
&lt;br&gt;has been updated to apply cleanly to the 20091218 dev snapshot. This
&lt;br&gt;version of the patch supercedes the earlier patches submitted under this
&lt;br&gt;ticket. Please let me know what the next steps are for the integration
&lt;br&gt;of this patch into OpenSSL 1.0.1 and 1.1.0.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Tom
&lt;br&gt;&lt;br&gt;&lt;br /&gt;diff -ruN openssl-SNAP-20091218-orig/apps/demoSRP/srp_verifier.txt openssl-SNAP-20091218-srp/apps/demoSRP/srp_verifier.txt
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/demoSRP/srp_verifier.txt	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/demoSRP/srp_verifier.txt	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1,6 @@
&lt;br&gt;+# This is a file that will be filled by the openssl srp routine.
&lt;br&gt;+# You can initialize the file with additional groups, these are
&lt;br&gt;+# records starting with a I followed by the g and N values and the id.
&lt;br&gt;+# The exact values ... you have to dig this out from the source of srp.c
&lt;br&gt;+# or srp_vfy.c
&lt;br&gt;+# The last value of an I is used as the default group for new users. &amp;nbsp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/demoSRP/srp_verifier.txt.attr openssl-SNAP-20091218-srp/apps/demoSRP/srp_verifier.txt.attr
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/demoSRP/srp_verifier.txt.attr	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/demoSRP/srp_verifier.txt.attr	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1 @@
&lt;br&gt;+unique_subject = yes
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/Makefile openssl-SNAP-20091218-srp/apps/Makefile
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/Makefile	2009-10-15 18:00:13.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/Makefile	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -39,7 +39,7 @@
&lt;br&gt;&amp;nbsp;	ca crl rsa rsautl dsa dsaparam ec ecparam \
&lt;br&gt;&amp;nbsp;	x509 genrsa gendsa genpkey s_server s_client speed \
&lt;br&gt;&amp;nbsp;	s_time version pkcs7 cms crl2pkcs7 sess_id ciphers nseq pkcs12 \
&lt;br&gt;-	pkcs8 pkey pkeyparam pkeyutl spkac smime rand engine ocsp prime ts
&lt;br&gt;+	pkcs8 pkey pkeyparam pkeyutl spkac smime rand engine ocsp prime ts srp
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;PROGS= $(PROGRAM).c
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -56,7 +56,7 @@
&lt;br&gt;&amp;nbsp;	x509.o genrsa.o gendsa.o genpkey.o s_server.o s_client.o speed.o \
&lt;br&gt;&amp;nbsp;	s_time.o $(A_OBJ) $(S_OBJ) $(RAND_OBJ) version.o sess_id.o \
&lt;br&gt;&amp;nbsp;	ciphers.o nseq.o pkcs12.o pkcs8.o pkey.o pkeyparam.o pkeyutl.o \
&lt;br&gt;-	spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o
&lt;br&gt;+	spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o srp.o
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;E_SRC=	verify.c asn1pars.c req.c dgst.c dh.c enc.c passwd.c gendh.c errstr.c ca.c \
&lt;br&gt;&amp;nbsp;	pkcs7.c crl2p7.c crl.c \
&lt;br&gt;@@ -64,7 +64,7 @@
&lt;br&gt;&amp;nbsp;	x509.c genrsa.c gendsa.c genpkey.c s_server.c s_client.c speed.c \
&lt;br&gt;&amp;nbsp;	s_time.c $(A_SRC) $(S_SRC) $(RAND_SRC) version.c sess_id.c \
&lt;br&gt;&amp;nbsp;	ciphers.c nseq.c pkcs12.c pkcs8.c pkey.c pkeyparam.c pkeyutl.c \
&lt;br&gt;-	spkac.c smime.c cms.c rand.c engine.c ocsp.c prime.c ts.c
&lt;br&gt;+	spkac.c smime.c cms.c rand.c engine.c ocsp.c prime.c ts.c srp.c
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;SRC=$(E_SRC)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/progs.h openssl-SNAP-20091218-srp/apps/progs.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/progs.h	2009-06-30 16:00:19.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/progs.h	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -44,6 +44,7 @@
&lt;br&gt;&amp;nbsp;extern int rand_main(int argc,char *argv[]);
&lt;br&gt;&amp;nbsp;extern int engine_main(int argc,char *argv[]);
&lt;br&gt;&amp;nbsp;extern int ocsp_main(int argc,char *argv[]);
&lt;br&gt;+extern int srp_main(int argc,char *argv[]);
&lt;br&gt;&amp;nbsp;extern int prime_main(int argc,char *argv[]);
&lt;br&gt;&amp;nbsp;extern int ts_main(int argc,char *argv[]);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -145,6 +146,9 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_OCSP
&lt;br&gt;&amp;nbsp;	{FUNC_TYPE_GENERAL,&amp;quot;ocsp&amp;quot;,ocsp_main},
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	{FUNC_TYPE_GENERAL,&amp;quot;srp&amp;quot;,srp_main},
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	{FUNC_TYPE_GENERAL,&amp;quot;prime&amp;quot;,prime_main},
&lt;br&gt;&amp;nbsp;	{FUNC_TYPE_GENERAL,&amp;quot;ts&amp;quot;,ts_main},
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_MD2
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/s_client.c openssl-SNAP-20091218-srp/apps/s_client.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/s_client.c	2009-12-16 21:00:16.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/s_client.c	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -163,6 +163,9 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/rand.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/ocsp.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/bn.h&amp;gt;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#include &amp;quot;s_apps.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;timeouts.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -316,6 +319,13 @@
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -jpake arg &amp;nbsp; &amp;nbsp;- JPAKE secret to use\n&amp;quot;);
&lt;br&gt;&amp;nbsp;# endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srpuser user &amp;nbsp; &amp;nbsp; - SRP authentification for 'user'\n&amp;quot;);
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srppass arg &amp;nbsp; &amp;nbsp; &amp;nbsp;- password for 'user'\n&amp;quot;);
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srp_lateuser &amp;nbsp; &amp;nbsp; - SRP username into second ClientHello message\n&amp;quot;);
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srp_moregroups &amp;nbsp; - Tolerate other than the known g N values.\n&amp;quot;);
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srp_strength int - minimal mength in bits for N (default %d).\n&amp;quot;,SRP_MINIMAL_N);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -ssl2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - just use SSLv2\n&amp;quot;);
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -ssl3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - just use SSLv3\n&amp;quot;);
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -tls1_1 &amp;nbsp; &amp;nbsp; &amp;nbsp; - just use TLSv1.1\n&amp;quot;);
&lt;br&gt;@@ -367,6 +377,112 @@
&lt;br&gt;&amp;nbsp;	
&lt;br&gt;&amp;nbsp;	return SSL_TLSEXT_ERR_OK;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;+
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+
&lt;br&gt;+/* This is a context that we pass to all callbacks */
&lt;br&gt;+typedef struct srp_arg_st
&lt;br&gt;+	{
&lt;br&gt;+	char *srppassin;
&lt;br&gt;+	char *srplogin;
&lt;br&gt;+	int msg; &amp;nbsp; /* copy from c_msg */
&lt;br&gt;+	int debug; /* copy from c_debug */
&lt;br&gt;+	int amp; &amp;nbsp; /* allow more groups */
&lt;br&gt;+	int strength /* minimal size for N */ ;
&lt;br&gt;+	} SRP_ARG;
&lt;br&gt;+
&lt;br&gt;+#define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
&lt;br&gt;+
&lt;br&gt;+int SRP_Verify_N_and_g(BIGNUM *N, BIGNUM *g)
&lt;br&gt;+	{
&lt;br&gt;+	BN_CTX *bn_ctx = BN_CTX_new();
&lt;br&gt;+	BIGNUM *p = BN_new();
&lt;br&gt;+	BIGNUM *r = BN_new();
&lt;br&gt;+	int ret =
&lt;br&gt;+		g != NULL &amp;&amp; N != NULL &amp;&amp; bn_ctx != NULL &amp;&amp; BN_is_odd(N) &amp;&amp;
&lt;br&gt;+		BN_is_prime(N,SRP_NUMBER_ITERATIONS_FOR_PRIME,NULL,bn_ctx,NULL) &amp;&amp;
&lt;br&gt;+		p != NULL &amp;&amp; BN_rshift1(p, N) &amp;&amp;
&lt;br&gt;+
&lt;br&gt;+		/* p = (N-1)/2 */
&lt;br&gt;+		BN_is_prime(p,SRP_NUMBER_ITERATIONS_FOR_PRIME,NULL,bn_ctx,NULL) &amp;&amp;
&lt;br&gt;+		r != NULL &amp;&amp;
&lt;br&gt;+
&lt;br&gt;+		/* verify g^((N-1)/2) == -1 (mod N) */
&lt;br&gt;+		BN_mod_exp(r, g, p, N, bn_ctx) &amp;&amp;
&lt;br&gt;+		BN_add_word(r, 1) &amp;&amp;
&lt;br&gt;+		BN_cmp(r, N) == 0;
&lt;br&gt;+
&lt;br&gt;+	if(r)
&lt;br&gt;+		BN_free(r);
&lt;br&gt;+	if(p)
&lt;br&gt;+		BN_free(p);
&lt;br&gt;+	if(bn_ctx)
&lt;br&gt;+		BN_CTX_free(bn_ctx);
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_ARG *srp_arg = (SRP_ARG *)arg;
&lt;br&gt;+	BIGNUM *N = NULL, *g = NULL;
&lt;br&gt;+	if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
&lt;br&gt;+		return 0;
&lt;br&gt;+	if (srp_arg-&amp;gt;debug || srp_arg-&amp;gt;msg || srp_arg-&amp;gt;amp == 1)
&lt;br&gt;+		{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;		BIO_printf(bio_err, &amp;quot;SRP parameters:\n&amp;quot;); 
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;\tN=&amp;quot;); BN_print(bio_err,N);
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;\n\tg=&amp;quot;); BN_print(bio_err,g);
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;\n&amp;quot;);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	if (SRP_check_known_gN_param(g,N))
&lt;br&gt;+		return 1;
&lt;br&gt;+
&lt;br&gt;+	if (srp_arg-&amp;gt;amp == 1)
&lt;br&gt;+		{
&lt;br&gt;+		if (srp_arg-&amp;gt;debug)
&lt;br&gt;+			BIO_printf(bio_err, &amp;quot;SRP param N and g are not known params, going to check deeper.\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+/* The srp_moregroups must be used with caution, testing primes costs time. 
&lt;br&gt;+ &amp;nbsp; Implementors should rather add the value to the known ones.
&lt;br&gt;+ &amp;nbsp; The minimal size has already been tested.
&lt;br&gt;+*/
&lt;br&gt;+		if (BN_num_bits(g) &amp;lt;= BN_BITS &amp;&amp; SRP_Verify_N_and_g(N,g))
&lt;br&gt;+			return 1;
&lt;br&gt;+		}	
&lt;br&gt;+	BIO_printf(bio_err, &amp;quot;SRP param N and g rejected.\n&amp;quot;);
&lt;br&gt;+	return 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#define PWD_STRLEN 1024
&lt;br&gt;+
&lt;br&gt;+static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_ARG *srp_arg = (SRP_ARG *)arg;
&lt;br&gt;+	char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
&lt;br&gt;+	PW_CB_DATA cb_tmp;
&lt;br&gt;+	int l;
&lt;br&gt;+
&lt;br&gt;+	cb_tmp.password = (char *)srp_arg-&amp;gt;srppassin;
&lt;br&gt;+	cb_tmp.prompt_info = &amp;quot;SRP user&amp;quot;;
&lt;br&gt;+	if ((l = password_callback(pass, PWD_STRLEN, 0, &amp;cb_tmp))&amp;lt;0)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf (bio_err, &amp;quot;Can't read Password\n&amp;quot;);
&lt;br&gt;+		OPENSSL_free(pass);
&lt;br&gt;+		return NULL;
&lt;br&gt;+		}
&lt;br&gt;+	*(pass+l)= '\0';
&lt;br&gt;+
&lt;br&gt;+	return pass;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+static char * MS_CALLBACK missing_srp_username_callback(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_ARG *srp_arg = (SRP_ARG *)arg;
&lt;br&gt;+	return BUF_strdup(srp_arg-&amp;gt;srplogin);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;enum
&lt;br&gt;@@ -440,6 +556,11 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_JPAKE
&lt;br&gt;&amp;nbsp;	char *jpake_secret = NULL;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	char * srppass = NULL;
&lt;br&gt;+	int srp_lateuser = 0;
&lt;br&gt;+	SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#if !defined(OPENSSL_NO_SSL2) &amp;&amp; !defined(OPENSSL_NO_SSL3)
&lt;br&gt;&amp;nbsp;	meth=SSLv23_client_method();
&lt;br&gt;@@ -589,6 +710,37 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srpuser&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srp_arg.srplogin= *(++argv);
&lt;br&gt;+			meth=TLSv1_client_method();
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srppass&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srppass= *(++argv);
&lt;br&gt;+			meth=TLSv1_client_method();
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srp_strength&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srp_arg.strength=atoi(*(++argv));
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;SRP minimal length for N is %d\n&amp;quot;,srp_arg.strength);
&lt;br&gt;+			meth=TLSv1_client_method();
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srp_lateuser&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			srp_lateuser= 1;
&lt;br&gt;+			meth=TLSv1_client_method();
&lt;br&gt;+			}
&lt;br&gt;+		else if	(strcmp(*argv,&amp;quot;-srp_moregroups&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			srp_arg.amp=1;
&lt;br&gt;+			meth=TLSv1_client_method();
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_SSL2
&lt;br&gt;&amp;nbsp;		else if	(strcmp(*argv,&amp;quot;-ssl2&amp;quot;) == 0)
&lt;br&gt;&amp;nbsp;			meth=SSLv2_client_method();
&lt;br&gt;@@ -840,6 +992,14 @@
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if(!app_passwd(bio_err, srppass, NULL, &amp;srp_arg.srppassin, NULL))
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err, &amp;quot;Error getting password\n&amp;quot;);
&lt;br&gt;+		goto end;
&lt;br&gt;+		}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	ctx=SSL_CTX_new(meth);
&lt;br&gt;&amp;nbsp;	if (ctx == NULL)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;@@ -919,6 +1079,26 @@
&lt;br&gt;&amp;nbsp;		SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
&lt;br&gt;&amp;nbsp;		SSL_CTX_set_tlsext_servername_arg(ctx, &amp;tlsextcbp);
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (srp_arg.srplogin)
&lt;br&gt;+		{
&lt;br&gt;+		if (srp_lateuser) 
&lt;br&gt;+			SSL_CTX_set_srp_missing_srp_username_callback(ctx,missing_srp_username_callback);
&lt;br&gt;+		else if (!SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;Unable to set SRP username\n&amp;quot;);
&lt;br&gt;+			goto end;
&lt;br&gt;+			}
&lt;br&gt;+		srp_arg.msg = c_msg;
&lt;br&gt;+		srp_arg.debug = c_debug ;
&lt;br&gt;+		SSL_CTX_set_srp_cb_arg(ctx,&amp;srp_arg);
&lt;br&gt;+		SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
&lt;br&gt;+		SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
&lt;br&gt;+		if (c_msg || c_debug || srp_arg.amp == 0)
&lt;br&gt;+			SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	con=SSL_new(ctx);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/srp.c openssl-SNAP-20091218-srp/apps/srp.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/srp.c	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/srp.c	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1,753 @@
&lt;br&gt;+/* apps/srp.c */
&lt;br&gt;+/* Written by Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) &amp;nbsp;
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#include &amp;lt;openssl/opensslconf.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;lt;stdio.h&amp;gt;
&lt;br&gt;+#include &amp;lt;stdlib.h&amp;gt;
&lt;br&gt;+#include &amp;lt;string.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/conf.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/bio.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/err.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/txt_db.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/buffer.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;apps.h&amp;quot;
&lt;br&gt;+
&lt;br&gt;+#undef PROG
&lt;br&gt;+#define PROG srp_main
&lt;br&gt;+
&lt;br&gt;+#define BASE_SECTION	&amp;quot;srp&amp;quot;
&lt;br&gt;+#define CONFIG_FILE &amp;quot;openssl.cnf&amp;quot;
&lt;br&gt;+
&lt;br&gt;+#define ENV_RANDFILE		&amp;quot;RANDFILE&amp;quot;
&lt;br&gt;+
&lt;br&gt;+#define ENV_DATABASE		&amp;quot;srpvfile&amp;quot;
&lt;br&gt;+#define ENV_DEFAULT_SRP		&amp;quot;default_srp&amp;quot;
&lt;br&gt;+
&lt;br&gt;+static char *srp_usage[]={
&lt;br&gt;+&amp;quot;usage: srp [args] [user] \n&amp;quot;,
&lt;br&gt;+&amp;quot;\n&amp;quot;,
&lt;br&gt;+&amp;quot; -verbose &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Talk alot while doing things\n&amp;quot;,
&lt;br&gt;+&amp;quot; -config file &amp;nbsp; &amp;nbsp;A config file\n&amp;quot;,
&lt;br&gt;+&amp;quot; -name arg &amp;nbsp; &amp;nbsp; &amp;nbsp; The particular srp definition to use\n&amp;quot;,
&lt;br&gt;+&amp;quot; -srpvfile arg &amp;nbsp; The srp verifier file name\n&amp;quot;,
&lt;br&gt;+&amp;quot; -add &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add an user and srp verifier\n&amp;quot;,
&lt;br&gt;+&amp;quot; -modify &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; modify the srp verifier of an existing user\n&amp;quot;,
&lt;br&gt;+&amp;quot; -delete &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete user from verifier file\n&amp;quot;,
&lt;br&gt;+&amp;quot; -list &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list user\n&amp;quot;,
&lt;br&gt;+&amp;quot; -gn arg &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g and N values to be used for new verifier\n&amp;quot;,
&lt;br&gt;+&amp;quot; -userinfo arg &amp;nbsp; additional info to be set for user\n&amp;quot;,
&lt;br&gt;+&amp;quot; -passin arg &amp;nbsp; &amp;nbsp; input file pass phrase source\n&amp;quot;,
&lt;br&gt;+&amp;quot; -passout arg &amp;nbsp; &amp;nbsp;output file pass phrase source\n&amp;quot;,
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+&amp;quot; -engine e &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - use engine e, possibly a hardware device.\n&amp;quot;,
&lt;br&gt;+#endif
&lt;br&gt;+NULL
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+#ifdef EFENCE
&lt;br&gt;+extern int EF_PROTECT_FREE;
&lt;br&gt;+extern int EF_PROTECT_BELOW;
&lt;br&gt;+extern int EF_ALIGNMENT;
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+static CONF *conf=NULL;
&lt;br&gt;+static char *section=NULL;
&lt;br&gt;+
&lt;br&gt;+#define VERBOSE if (verbose) 
&lt;br&gt;+#define VVERBOSE if (verbose&amp;gt;1) 
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+int MAIN(int, char **);
&lt;br&gt;+
&lt;br&gt;+int get_index(CA_DB *db, char* id, char type)
&lt;br&gt;+	{
&lt;br&gt;+	char ** pp;
&lt;br&gt;+	int i;
&lt;br&gt;+	if (id == NULL) return -1;
&lt;br&gt;+	if (type == DB_SRP_INDEX) 
&lt;br&gt;+	for (i = 0; i &amp;lt; sk_num(db-&amp;gt;db-&amp;gt;data); i++)
&lt;br&gt;+		{
&lt;br&gt;+		pp=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,i);
&lt;br&gt;+		if (pp[DB_srptype][0] == DB_SRP_INDEX &amp;nbsp;&amp;&amp; !strcmp(id,pp[DB_srpid])) 
&lt;br&gt;+			return i;
&lt;br&gt;+		}
&lt;br&gt;+	else for (i = 0; i &amp;lt; sk_num(db-&amp;gt;db-&amp;gt;data); i++)
&lt;br&gt;+		{
&lt;br&gt;+		pp=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,i);
&lt;br&gt;+
&lt;br&gt;+		if (pp[DB_srptype][0] != DB_SRP_INDEX &amp;&amp; !strcmp(id,pp[DB_srpid])) 
&lt;br&gt;+			return i;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	return -1 ; 
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+void print_entry(CA_DB *db, BIO * bio, int index,int verbose, char * s)
&lt;br&gt;+	{
&lt;br&gt;+	if (index &amp;gt;= 0 &amp;&amp; verbose)
&lt;br&gt;+		{
&lt;br&gt;+		int j;
&lt;br&gt;+		char ** pp=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,index);
&lt;br&gt;+		BIO_printf(bio,&amp;quot;%s \&amp;quot;%s\&amp;quot;\n&amp;quot;,s,pp[DB_srpid]);
&lt;br&gt;+		for (j = 0; j &amp;lt; DB_NUMBER; j++)
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot; &amp;nbsp;%d = \&amp;quot;%s\&amp;quot;\n&amp;quot;,j,pp[j]);
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+void print_index(CA_DB *db, BIO * bio, int indexindex,int verbose)
&lt;br&gt;+	{
&lt;br&gt;+	print_entry(db,bio,indexindex, verbose, &amp;quot;g N entry&amp;quot;) ;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+void print_user(CA_DB *db, BIO * bio, int userindex,int verbose)
&lt;br&gt;+	{
&lt;br&gt;+	if (verbose &amp;gt; 0)
&lt;br&gt;+		{
&lt;br&gt;+		char ** pp= (char **)sk_value(db-&amp;gt;db-&amp;gt;data,userindex);
&lt;br&gt;+
&lt;br&gt;+		if (pp[DB_srptype][0] != 'I')
&lt;br&gt;+			{
&lt;br&gt;+			print_entry(db,bio,userindex, verbose, &amp;quot;User entry&amp;quot;);
&lt;br&gt;+			print_entry(db,bio,get_index(db, pp[DB_srpgN],'I'),verbose,&amp;quot;g N entry&amp;quot;) ;
&lt;br&gt;+			}
&lt;br&gt;+
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int update_index(CA_DB *db, BIO * bio, char ** row)
&lt;br&gt;+	{
&lt;br&gt;+	char ** irow;
&lt;br&gt;+	int i;
&lt;br&gt;+
&lt;br&gt;+	if ((irow=(char **)OPENSSL_malloc(sizeof(char *)*(DB_NUMBER+1))) == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;Memory allocation failure\n&amp;quot;);
&lt;br&gt;+		return 0;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	for (i=0; i&amp;lt;DB_NUMBER; i++)
&lt;br&gt;+		{
&lt;br&gt;+		irow[i]=row[i];
&lt;br&gt;+		row[i]=NULL;
&lt;br&gt;+		}
&lt;br&gt;+	irow[DB_NUMBER]=NULL;
&lt;br&gt;+
&lt;br&gt;+	if (!TXT_DB_insert(db-&amp;gt;db,irow))
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio,&amp;quot;failed to update srpvfile\n&amp;quot;);
&lt;br&gt;+		BIO_printf(bio,&amp;quot;TXT_DB error number %ld\n&amp;quot;,db-&amp;gt;db-&amp;gt;error);
&lt;br&gt;+		OPENSSL_free(irow);
&lt;br&gt;+		return 0;
&lt;br&gt;+		}
&lt;br&gt;+	return 1;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+static void lookup_fail(char *name, char *tag)
&lt;br&gt;+	{
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot;variable lookup failed for %s::%s\n&amp;quot;,name,tag);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+char * srp_verify_user(char * user,char * srp_verifier, char * srp_usersalt,char * g, char * N, char * passin, BIO *bio, int verbose)
&lt;br&gt;+	{
&lt;br&gt;+ 	char password[1024];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PW_CB_DATA cb_tmp;
&lt;br&gt;+	char *verifier = NULL;
&lt;br&gt;+	char *gNid = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cb_tmp.prompt_info = user;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cb_tmp.password = passin;
&lt;br&gt;+
&lt;br&gt;+ 	if (password_callback(password,1024,0,&amp;cb_tmp) &amp;gt;0)
&lt;br&gt;+		{
&lt;br&gt;+		VERBOSE BIO_printf(bio,&amp;quot;Validating\n &amp;nbsp; user=\&amp;quot;%s\&amp;quot;\n srp_verifier=\&amp;quot;%s\&amp;quot;\n srp_usersalt=\&amp;quot;%s\&amp;quot;\n g=\&amp;quot;%s\&amp;quot;\n N=\&amp;quot;%s\&amp;quot;\n&amp;quot;,user,srp_verifier,srp_usersalt,g,N);
&lt;br&gt;+BIO_printf(bio,&amp;quot;Pass %s\n&amp;quot;,password);
&lt;br&gt;+
&lt;br&gt;+		if (!(gNid=SRP_create_verifier(user, password, &amp;srp_usersalt, &amp;verifier, N, g)))
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio,&amp;quot;Internal error validating SRP verifier\n&amp;quot;);
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			{
&lt;br&gt;+			if (strcmp(verifier,srp_verifier))
&lt;br&gt;+				gNid = NULL;
&lt;br&gt;+			OPENSSL_free(verifier);
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	return gNid;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+char * srp_create_user(char * user,char **srp_verifier, char **srp_usersalt,char *g, char *N, char *passout, BIO *bio, int verbose)
&lt;br&gt;+	{
&lt;br&gt;+ 	char password[1024];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PW_CB_DATA cb_tmp;
&lt;br&gt;+	char *gNid = NULL;
&lt;br&gt;+	char *salt = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cb_tmp.prompt_info = user;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cb_tmp.password = passout;
&lt;br&gt;+
&lt;br&gt;+	if (password_callback(password,1024,1,&amp;cb_tmp) &amp;gt;0)
&lt;br&gt;+		{
&lt;br&gt;+		VERBOSE BIO_printf(bio,&amp;quot;Creating\n user=\&amp;quot;%s\&amp;quot;\n g=\&amp;quot;%s\&amp;quot;\n N=\&amp;quot;%s\&amp;quot;\n&amp;quot;,user,g,N);
&lt;br&gt;+		if (!(gNid =SRP_create_verifier(user, password, &amp;salt, srp_verifier, N, g)))
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio,&amp;quot;Internal error creating SRP verifier\n&amp;quot;);
&lt;br&gt;+			}
&lt;br&gt;+		else 
&lt;br&gt;+			*srp_usersalt = salt;
&lt;br&gt;+		VVERBOSE BIO_printf(bio,&amp;quot;gNid=%s salt =\&amp;quot;%s\&amp;quot;\n verifier =\&amp;quot;%s\&amp;quot;\n&amp;quot;, gNid,salt, *srp_verifier);
&lt;br&gt;+
&lt;br&gt;+		}
&lt;br&gt;+	return gNid;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int MAIN(int argc, char **argv)
&lt;br&gt;+	{
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+	ENGINE *e = NULL;
&lt;br&gt;+#endif
&lt;br&gt;+	int add_user = 0;
&lt;br&gt;+	int list_user= 0;
&lt;br&gt;+	int delete_user= 0;
&lt;br&gt;+	int modify_user= 0;
&lt;br&gt;+	char * user = NULL;
&lt;br&gt;+
&lt;br&gt;+	char *passargin = NULL, *passargout = NULL;
&lt;br&gt;+	char *passin = NULL, *passout = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;char * gN = NULL;
&lt;br&gt;+	int gNindex = -1;
&lt;br&gt;+	char ** gNrow = NULL;
&lt;br&gt;+	int maxgN = -1;
&lt;br&gt;+
&lt;br&gt;+	char * userinfo = NULL;
&lt;br&gt;+
&lt;br&gt;+	int badops=0;
&lt;br&gt;+	int ret=1;
&lt;br&gt;+	int errors=0;
&lt;br&gt;+	int verbose=0;
&lt;br&gt;+	int doupdatedb=0;
&lt;br&gt;+	char *configfile=NULL;
&lt;br&gt;+	char *dbfile=NULL;
&lt;br&gt;+	CA_DB *db=NULL;
&lt;br&gt;+	char **pp ;
&lt;br&gt;+	int i;
&lt;br&gt;+	long errorline = -1;
&lt;br&gt;+	char *randfile=NULL;
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+	char *engine = NULL;
&lt;br&gt;+#endif
&lt;br&gt;+	char *tofree=NULL;
&lt;br&gt;+	DB_ATTR db_attr;
&lt;br&gt;+
&lt;br&gt;+#ifdef EFENCE
&lt;br&gt;+EF_PROTECT_FREE=1;
&lt;br&gt;+EF_PROTECT_BELOW=1;
&lt;br&gt;+EF_ALIGNMENT=0;
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+	apps_startup();
&lt;br&gt;+
&lt;br&gt;+	conf = NULL;
&lt;br&gt;+	section = NULL;
&lt;br&gt;+
&lt;br&gt;+	if (bio_err == NULL)
&lt;br&gt;+		if ((bio_err=BIO_new(BIO_s_file())) != NULL)
&lt;br&gt;+			BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT);
&lt;br&gt;+
&lt;br&gt;+	argc--;
&lt;br&gt;+	argv++;
&lt;br&gt;+	while (argc &amp;gt;= 1 &amp;&amp; badops == 0)
&lt;br&gt;+		{
&lt;br&gt;+		if	(strcmp(*argv,&amp;quot;-verbose&amp;quot;) == 0)
&lt;br&gt;+			verbose++;
&lt;br&gt;+		else if	(strcmp(*argv,&amp;quot;-config&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			configfile= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-name&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			section= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if	(strcmp(*argv,&amp;quot;-srpvfile&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			dbfile= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-add&amp;quot;) == 0)
&lt;br&gt;+			add_user=1;
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-delete&amp;quot;) == 0)
&lt;br&gt;+			delete_user=1;
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-modify&amp;quot;) == 0)
&lt;br&gt;+			modify_user=1;
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-list&amp;quot;) == 0)
&lt;br&gt;+			list_user=1;
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-gn&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			gN= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-userinfo&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			userinfo= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-passin&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			passargin= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-passout&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			passargout= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-engine&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			engine= *(++argv);
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+		else if (**argv == '-')
&lt;br&gt;+			{
&lt;br&gt;+bad:
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;unknown option %s\n&amp;quot;,*argv);
&lt;br&gt;+			badops=1;
&lt;br&gt;+			break;
&lt;br&gt;+			}
&lt;br&gt;+		else 
&lt;br&gt;+			break;
&lt;br&gt;+	
&lt;br&gt;+		argc--;
&lt;br&gt;+		argv++;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	if (dbfile &amp;&amp; configfile)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;-dbfile and -configfile cannot be specified together.\n&amp;quot;);
&lt;br&gt;+		badops = 1;
&lt;br&gt;+		}
&lt;br&gt;+	if (add_user+delete_user+modify_user+list_user != 1)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;Exactly one of the options -add, -delete, -modify -list must be specified.\n&amp;quot;);
&lt;br&gt;+		badops = 1;
&lt;br&gt;+		}
&lt;br&gt;+	if (delete_user+modify_user+delete_user== 1 &amp;&amp; argc &amp;lt;= 0)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;Need at least one user for options -add, -delete, -modify. \n&amp;quot;);
&lt;br&gt;+		badops = 1;
&lt;br&gt;+		}
&lt;br&gt;+	if ((passin || passout) &amp;&amp; argc != 1 )
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;-passin, -passout arguments only valid with one user.\n&amp;quot;);
&lt;br&gt;+		badops = 1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	if (badops)
&lt;br&gt;+		{
&lt;br&gt;+		for (pp=srp_usage; (*pp != NULL); pp++)
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;%s&amp;quot;,*pp);
&lt;br&gt;+
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot; -rand file%cfile%c...\n&amp;quot;, LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; load the file (or the files in the directory) into\n&amp;quot;);
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the random number generator\n&amp;quot;);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	ERR_load_crypto_strings();
&lt;br&gt;+
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+	e = setup_engine(bio_err, engine, 0);
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+	if(!app_passwd(bio_err, passargin, passargout, &amp;passin, &amp;passout))
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err, &amp;quot;Error getting passwords\n&amp;quot;);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!dbfile)
&lt;br&gt;+		{
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+	/*****************************************************************/
&lt;br&gt;+		tofree=NULL;
&lt;br&gt;+		if (configfile == NULL) configfile = getenv(&amp;quot;OPENSSL_CONF&amp;quot;);
&lt;br&gt;+		if (configfile == NULL) configfile = getenv(&amp;quot;SSLEAY_CONF&amp;quot;);
&lt;br&gt;+		if (configfile == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			const char *s=X509_get_default_cert_area();
&lt;br&gt;+			size_t len;
&lt;br&gt;+
&lt;br&gt;+#ifdef OPENSSL_SYS_VMS
&lt;br&gt;+			len = strlen(s)+sizeof(CONFIG_FILE);
&lt;br&gt;+			tofree=OPENSSL_malloc(len);
&lt;br&gt;+			strcpy(tofree,s);
&lt;br&gt;+#else
&lt;br&gt;+			len = strlen(s)+sizeof(CONFIG_FILE)+1;
&lt;br&gt;+			tofree=OPENSSL_malloc(len);
&lt;br&gt;+			BUF_strlcpy(tofree,s,len);
&lt;br&gt;+			BUF_strlcat(tofree,&amp;quot;/&amp;quot;,len);
&lt;br&gt;+#endif
&lt;br&gt;+			BUF_strlcat(tofree,CONFIG_FILE,len);
&lt;br&gt;+			configfile=tofree;
&lt;br&gt;+			}
&lt;br&gt;+
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;Using configuration from %s\n&amp;quot;,configfile);
&lt;br&gt;+		conf = NCONF_new(NULL);
&lt;br&gt;+		if (NCONF_load(conf,configfile,&amp;errorline) &amp;lt;= 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (errorline &amp;lt;= 0)
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;error loading the config file '%s'\n&amp;quot;,
&lt;br&gt;+					configfile);
&lt;br&gt;+			else
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;error on line %ld of config file '%s'\n&amp;quot;
&lt;br&gt;+					,errorline,configfile);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		if(tofree)
&lt;br&gt;+			{
&lt;br&gt;+			OPENSSL_free(tofree);
&lt;br&gt;+			tofree = NULL;
&lt;br&gt;+			}
&lt;br&gt;+
&lt;br&gt;+		if (!load_config(bio_err, conf))
&lt;br&gt;+			goto err;
&lt;br&gt;+
&lt;br&gt;+	/* Lets get the config section we are using */
&lt;br&gt;+		if (section == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			VERBOSE BIO_printf(bio_err,&amp;quot;trying to read &amp;quot; ENV_DEFAULT_SRP &amp;quot; in \&amp;quot; BASE_SECTION \&amp;quot;\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+			section=NCONF_get_string(conf,BASE_SECTION,ENV_DEFAULT_SRP);
&lt;br&gt;+			if (section == NULL)
&lt;br&gt;+				{
&lt;br&gt;+				lookup_fail(BASE_SECTION,ENV_DEFAULT_SRP);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+		if (randfile == NULL &amp;&amp; conf)
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	randfile = NCONF_get_string(conf, BASE_SECTION, &amp;quot;RANDFILE&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;trying to read &amp;quot; ENV_DATABASE &amp;quot; in section \&amp;quot;%s\&amp;quot;\n&amp;quot;,section);
&lt;br&gt;+
&lt;br&gt;+		if ((dbfile=NCONF_get_string(conf,section,ENV_DATABASE)) == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			lookup_fail(section,ENV_DATABASE);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	}
&lt;br&gt;+	if (randfile == NULL)
&lt;br&gt;+		ERR_clear_error();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; 	else 
&lt;br&gt;+		app_RAND_load_file(randfile, bio_err, 0);
&lt;br&gt;+
&lt;br&gt;+	VERBOSE BIO_printf(bio_err,&amp;quot;Trying to read SRP verifier file \&amp;quot;%s\&amp;quot;\n&amp;quot;,dbfile);
&lt;br&gt;+
&lt;br&gt;+	db = load_index(dbfile, &amp;db_attr);
&lt;br&gt;+	if (db == NULL) goto err;
&lt;br&gt;+
&lt;br&gt;+	/* Lets check some fields */
&lt;br&gt;+	for (i=0; i&amp;lt;sk_num(db-&amp;gt;db-&amp;gt;data); i++)
&lt;br&gt;+		{
&lt;br&gt;+		pp=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,i);
&lt;br&gt;+	
&lt;br&gt;+		if (pp[DB_srptype][0] == DB_SRP_INDEX)
&lt;br&gt;+			{
&lt;br&gt;+			maxgN = i;
&lt;br&gt;+			if (gNindex &amp;lt; 0 &amp;&amp; gN != NULL &amp;&amp; !strcmp(gN,pp[DB_srpid]))
&lt;br&gt;+				gNindex = i;
&lt;br&gt;+
&lt;br&gt;+			print_index(db,bio_err,i,verbose&amp;gt;1) ;
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	
&lt;br&gt;+	VERBOSE BIO_printf(bio_err,&amp;quot;Database initialised\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	if (gNindex &amp;gt;= 0)
&lt;br&gt;+		{
&lt;br&gt;+		gNrow=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,gNindex);
&lt;br&gt;+		print_entry(db,bio_err,gNindex,verbose&amp;gt;1,&amp;quot;Default g and N&amp;quot;) ;
&lt;br&gt;+		}
&lt;br&gt;+	else if (maxgN &amp;gt; 0 &amp;&amp; !SRP_get_default_gN(gN))
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err,&amp;quot;No g and N value for index \&amp;quot;%s\&amp;quot;\n&amp;quot;,gN);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+		{
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;Database has no g N information.\n&amp;quot;);
&lt;br&gt;+		gNrow = NULL;
&lt;br&gt;+		}
&lt;br&gt;+	
&lt;br&gt;+
&lt;br&gt;+	VVERBOSE BIO_printf(bio_err,&amp;quot;Starting user processing\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+	if (argc &amp;gt; 0)
&lt;br&gt;+		user = *(argv++) ;
&lt;br&gt;+
&lt;br&gt;+	while (list_user || user)
&lt;br&gt;+		{
&lt;br&gt;+		int userindex = -1;
&lt;br&gt;+		if (user) 
&lt;br&gt;+			VVERBOSE BIO_printf(bio_err,&amp;quot;Processing user \&amp;quot;%s\&amp;quot;\n&amp;quot;,user);
&lt;br&gt;+		if ((userindex = get_index(db, user, 'U')) &amp;gt;= 0)
&lt;br&gt;+			{
&lt;br&gt;+			print_user(db,bio_err,userindex,(verbose &amp;gt;0) || list_user) ;
&lt;br&gt;+			}
&lt;br&gt;+		
&lt;br&gt;+		if (list_user)
&lt;br&gt;+			{
&lt;br&gt;+			if (user == NULL)
&lt;br&gt;+				{
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;List all users\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+				for (i=0; i&amp;lt;sk_num(db-&amp;gt;db-&amp;gt;data); i++)
&lt;br&gt;+					{
&lt;br&gt;+					print_user(db,bio_err,i,1) ;
&lt;br&gt;+					}
&lt;br&gt;+				list_user = 0;
&lt;br&gt;+				}
&lt;br&gt;+			else if (userindex &amp;lt; 0)
&lt;br&gt;+				{
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; does not exist, ignored. t\n&amp;quot;,user);
&lt;br&gt;+				errors++;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else if (add_user)
&lt;br&gt;+			{
&lt;br&gt;+			if (userindex&amp;gt;=0)
&lt;br&gt;+				{
&lt;br&gt;+				/* reactivation of a new user */
&lt;br&gt;+				char ** row= (char **)sk_value(db-&amp;gt;db-&amp;gt;data,userindex);
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; reactivated.\n&amp;quot;,user);
&lt;br&gt;+				row[DB_srptype][0] = 'V' ;
&lt;br&gt;+
&lt;br&gt;+				doupdatedb = 1;
&lt;br&gt;+				}
&lt;br&gt;+			else
&lt;br&gt;+				{
&lt;br&gt;+				char *row[DB_NUMBER] ; char * gNid;
&lt;br&gt;+				row[DB_srpverifier] = NULL;
&lt;br&gt;+				row[DB_srpsalt] = NULL;
&lt;br&gt;+				row[DB_srpinfo] = NULL;
&lt;br&gt;+				if (!(gNid = srp_create_user(user,&amp;(row[DB_srpverifier]), &amp;(row[DB_srpsalt]),gNrow?gNrow[DB_srpsalt]:gN,gNrow?gNrow[DB_srpverifier]:NULL, passout, bio_err,verbose)))
&lt;br&gt;+					{
&lt;br&gt;+						BIO_printf(bio_err,&amp;quot;Cannot create srp verifier for user \&amp;quot;%s\&amp;quot;, operation abandoned .\n&amp;quot;,user);
&lt;br&gt;+						errors++ ;
&lt;br&gt;+						goto err;
&lt;br&gt;+					}
&lt;br&gt;+				row[DB_srpid] = BUF_strdup(user);
&lt;br&gt;+				row[DB_srptype] = BUF_strdup(&amp;quot;v&amp;quot;);
&lt;br&gt;+				row[DB_srpgN] = BUF_strdup(gNid);
&lt;br&gt;+
&lt;br&gt;+				if (!row[DB_srpid] || !row[DB_srpgN] || !row[DB_srptype] || !row[DB_srpverifier] || !row[DB_srpsalt] ||
&lt;br&gt;+					(userinfo &amp;&amp; (!(row[DB_srpinfo] = BUF_strdup(userinfo)))) || 
&lt;br&gt;+					!update_index(db, bio_err, row))
&lt;br&gt;+					{
&lt;br&gt;+					if (row[DB_srpid]) OPENSSL_free(row[DB_srpid]);
&lt;br&gt;+					if (row[DB_srpgN]) OPENSSL_free(row[DB_srpgN]);
&lt;br&gt;+					if (row[DB_srpinfo]) OPENSSL_free(row[DB_srpinfo]);
&lt;br&gt;+					if (row[DB_srptype]) OPENSSL_free(row[DB_srptype]);
&lt;br&gt;+					if (row[DB_srpverifier]) OPENSSL_free(row[DB_srpverifier]);
&lt;br&gt;+					if (row[DB_srpsalt]) OPENSSL_free(row[DB_srpsalt]);
&lt;br&gt;+					goto err;
&lt;br&gt;+					}
&lt;br&gt;+				doupdatedb = 1;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else if (modify_user)
&lt;br&gt;+			{
&lt;br&gt;+			if (userindex&amp;lt;0)
&lt;br&gt;+				{
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; does not exist, operation ignored.\n&amp;quot;,user);
&lt;br&gt;+				errors++ ;
&lt;br&gt;+				}
&lt;br&gt;+			else
&lt;br&gt;+				{
&lt;br&gt;+
&lt;br&gt;+				char ** row=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,userindex);
&lt;br&gt;+				char type = row[DB_srptype][0] ;
&lt;br&gt;+				if (type == 'v')
&lt;br&gt;+					{
&lt;br&gt;+					BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; already updated, operation ignored.\n&amp;quot;,user);
&lt;br&gt;+					errors++ ;
&lt;br&gt;+					}
&lt;br&gt;+				else
&lt;br&gt;+					{
&lt;br&gt;+					char * gNid ;
&lt;br&gt;+
&lt;br&gt;+					if (row[DB_srptype][0] == 'V')
&lt;br&gt;+						{
&lt;br&gt;+						int user_gN ;
&lt;br&gt;+						char ** irow = NULL;
&lt;br&gt;+						VERBOSE BIO_printf(bio_err,&amp;quot;Verifying password for user \&amp;quot;%s\&amp;quot;\n&amp;quot;,user);
&lt;br&gt;+						if ( (user_gN = get_index(db, row[DB_srpgN],DB_SRP_INDEX)) &amp;gt;= 0)
&lt;br&gt;+							irow=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,userindex);
&lt;br&gt;+
&lt;br&gt;+ 						if (!srp_verify_user(user,row[DB_srpverifier], row[DB_srpsalt],irow?irow[DB_srpsalt]:row[DB_srpgN], irow?irow[DB_srpverifier]:NULL, passin, bio_err,verbose))
&lt;br&gt;+							{
&lt;br&gt;+							BIO_printf(bio_err,&amp;quot;Invalid password for user \&amp;quot;%s\&amp;quot;, operation abandoned.\n&amp;quot;,user);
&lt;br&gt;+							errors++ ;
&lt;br&gt;+							goto err;
&lt;br&gt;+							}
&lt;br&gt;+						} 
&lt;br&gt;+					VERBOSE BIO_printf(bio_err,&amp;quot;Password for user \&amp;quot;%s\&amp;quot; ok.\n&amp;quot;,user);
&lt;br&gt;+
&lt;br&gt;+					if (!(gNid=srp_create_user(user,&amp;(row[DB_srpverifier]), &amp;(row[DB_srpsalt]),gNrow?gNrow[DB_srpsalt]:NULL, gNrow?gNrow[DB_srpverifier]:NULL, passout, bio_err,verbose)))
&lt;br&gt;+						{
&lt;br&gt;+							BIO_printf(bio_err,&amp;quot;Cannot create srp verifier for user \&amp;quot;%s\&amp;quot;, operation abandonned .\n&amp;quot;);
&lt;br&gt;+							errors++ ;
&lt;br&gt;+							goto err;
&lt;br&gt;+						}
&lt;br&gt;+
&lt;br&gt;+					row[DB_srptype][0] = 'v';
&lt;br&gt;+					row[DB_srpgN] = BUF_strdup(gNid);
&lt;br&gt;+ 
&lt;br&gt;+					if (!row[DB_srpid] || !row[DB_srpgN] || !row[DB_srptype] || !row[DB_srpverifier] || !row[DB_srpsalt] ||
&lt;br&gt;+						(userinfo &amp;&amp; (!(row[DB_srpinfo] = BUF_strdup(userinfo))))) &amp;nbsp;
&lt;br&gt;+						goto err;
&lt;br&gt;+
&lt;br&gt;+					doupdatedb = 1;
&lt;br&gt;+					}
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else if (delete_user)
&lt;br&gt;+			{
&lt;br&gt;+			if (userindex&amp;lt;0)
&lt;br&gt;+				{
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; does not exist, operation ignored. t\n&amp;quot;,user);
&lt;br&gt;+				errors++;
&lt;br&gt;+				}
&lt;br&gt;+			else
&lt;br&gt;+				{
&lt;br&gt;+				char ** pp= (char **)sk_value(db-&amp;gt;db-&amp;gt;data,userindex);
&lt;br&gt;+				BIO_printf(bio_err,&amp;quot;user \&amp;quot;%s\&amp;quot; revoked. t\n&amp;quot;,user);
&lt;br&gt;+
&lt;br&gt;+				pp[DB_srptype][0] = 'R' ;
&lt;br&gt;+				
&lt;br&gt;+				doupdatedb = 1;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		if (--argc &amp;gt; 0)
&lt;br&gt;+			user = *(argv++) ;
&lt;br&gt;+		else
&lt;br&gt;+			{
&lt;br&gt;+			user = NULL;
&lt;br&gt;+			list_user = 0;
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	VERBOSE BIO_printf(bio_err,&amp;quot;User procession done.\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+	if (doupdatedb)
&lt;br&gt;+		{
&lt;br&gt;+		/* Lets check some fields */
&lt;br&gt;+		for (i=0; i&amp;lt;sk_num(db-&amp;gt;db-&amp;gt;data); i++)
&lt;br&gt;+			{
&lt;br&gt;+			pp=(char **)sk_value(db-&amp;gt;db-&amp;gt;data,i);
&lt;br&gt;+	
&lt;br&gt;+			if (pp[DB_srptype][0] == 'v')
&lt;br&gt;+				{
&lt;br&gt;+				pp[DB_srptype][0] = 'V';
&lt;br&gt;+				print_user(db,bio_err,i,verbose) ;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;Trying to update srpvfile.\n&amp;quot;);
&lt;br&gt;+		if (!save_index(dbfile,&amp;quot;new&amp;quot;,db)) goto err;
&lt;br&gt;+				
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;Temporary srpvfile created.\n&amp;quot;);
&lt;br&gt;+		if (!rotate_index(dbfile,&amp;quot;new&amp;quot;,&amp;quot;old&amp;quot;)) goto err;
&lt;br&gt;+
&lt;br&gt;+		VERBOSE BIO_printf(bio_err,&amp;quot;srpvfile updated.\n&amp;quot;);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	ret = (errors != 0);
&lt;br&gt;+err:
&lt;br&gt;+	if (errors != 0)
&lt;br&gt;+	VERBOSE BIO_printf(bio_err,&amp;quot;User errors %d.\n&amp;quot;,errors);
&lt;br&gt;+
&lt;br&gt;+	VERBOSE BIO_printf(bio_err,&amp;quot;SRP terminating with code %d.\n&amp;quot;,ret);
&lt;br&gt;+	if(tofree)
&lt;br&gt;+		OPENSSL_free(tofree);
&lt;br&gt;+	if (ret) ERR_print_errors(bio_err);
&lt;br&gt;+	if (randfile) app_RAND_write_file(randfile, bio_err);
&lt;br&gt;+	if (conf) NCONF_free(conf);
&lt;br&gt;+	if (db) free_index(db);
&lt;br&gt;+
&lt;br&gt;+	OBJ_cleanup();
&lt;br&gt;+	apps_shutdown();
&lt;br&gt;+	OPENSSL_EXIT(ret);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/apps/s_server.c openssl-SNAP-20091218-srp/apps/s_server.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/apps/s_server.c	2009-12-08 14:00:08.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/apps/s_server.c	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -186,6 +186,9 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_RSA
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/rsa.h&amp;gt;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#include &amp;quot;s_apps.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;timeouts.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -369,6 +372,39 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+/* This is a context that we pass to callbacks */
&lt;br&gt;+typedef struct srpsrvparm_st
&lt;br&gt;+	{
&lt;br&gt;+	int verbose;
&lt;br&gt;+	char *login;
&lt;br&gt;+	SRP_VBASE *vb;
&lt;br&gt;+	} srpsrvparm;
&lt;br&gt;+
&lt;br&gt;+static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	srpsrvparm * p = (srpsrvparm *) arg;
&lt;br&gt;+	SRP_user_pwd *user;
&lt;br&gt;+
&lt;br&gt;+	p-&amp;gt;login = BUF_strdup(SSL_get_srp_username(s));
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot;SRP username = \&amp;quot;%s\&amp;quot;\n&amp;quot;,p-&amp;gt;login);
&lt;br&gt;+
&lt;br&gt;+	user = SRP_VBASE_get_by_user(p-&amp;gt;vb,p-&amp;gt;login);	
&lt;br&gt;+	if (user == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		BIO_printf(bio_err, &amp;quot;User %s doesn't exist\n&amp;quot;, p-&amp;gt;login);
&lt;br&gt;+		return SSL3_AL_FATAL;
&lt;br&gt;+		}
&lt;br&gt;+	if (SSL_set_srp_server_param(s,user-&amp;gt;N,user-&amp;gt;g,user-&amp;gt;s,user-&amp;gt;v, user-&amp;gt;info)&amp;lt;0)
&lt;br&gt;+		{
&lt;br&gt;+		*ad = SSL_AD_INTERNAL_ERROR;
&lt;br&gt;+		return SSL3_AL_FATAL;
&lt;br&gt;+		}
&lt;br&gt;+	return SSL_ERROR_NONE;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#ifdef MONOLITH
&lt;br&gt;&amp;nbsp;static void s_server_init(void)
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;@@ -456,6 +492,10 @@
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -jpake arg &amp;nbsp; &amp;nbsp;- JPAKE secret to use\n&amp;quot;);
&lt;br&gt;&amp;nbsp;# endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srpvfile file &amp;nbsp; &amp;nbsp; &amp;nbsp;- The verifier file for SRP\n&amp;quot;);
&lt;br&gt;+	BIO_printf(bio_err,&amp;quot; -srpuserseed string - A seed string for a default user salt.\n&amp;quot;);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -ssl2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - Just talk SSLv2\n&amp;quot;);
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -ssl3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - Just talk SSLv3\n&amp;quot;);
&lt;br&gt;&amp;nbsp;	BIO_printf(bio_err,&amp;quot; -tls1_1 &amp;nbsp; &amp;nbsp; &amp;nbsp; - Just talk TLSv1_1\n&amp;quot;);
&lt;br&gt;@@ -874,12 +914,21 @@
&lt;br&gt;&amp;nbsp;	/* by default do not send a PSK identity hint */
&lt;br&gt;&amp;nbsp;	static char *psk_identity_hint=NULL;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	char * srpuserseed = NULL;
&lt;br&gt;+	char * srp_verifier_file = NULL;
&lt;br&gt;+	srpsrvparm p;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#if !defined(OPENSSL_NO_SSL2) &amp;&amp; !defined(OPENSSL_NO_SSL3)
&lt;br&gt;&amp;nbsp;	meth=SSLv23_server_method();
&lt;br&gt;&amp;nbsp;#elif !defined(OPENSSL_NO_SSL3)
&lt;br&gt;&amp;nbsp;	meth=SSLv3_server_method();
&lt;br&gt;&amp;nbsp;#elif !defined(OPENSSL_NO_SSL2)
&lt;br&gt;&amp;nbsp;	meth=SSLv2_server_method();
&lt;br&gt;+#elif !defined(OPENSSL_NO_TLS1)
&lt;br&gt;+	meth=TLSv1_server_method();
&lt;br&gt;+#else
&lt;br&gt;+ &amp;nbsp;/* &amp;nbsp;#error no SSL version enabled */
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	local_argc=argc;
&lt;br&gt;@@ -1112,6 +1161,20 @@
&lt;br&gt;&amp;nbsp;				}
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srpvfile&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srp_verifier_file= *(++argv);
&lt;br&gt;+			meth=TLSv1_server_method();
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srpuserseed&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srpuserseed= *(++argv);
&lt;br&gt;+			meth=TLSv1_server_method();
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;		else if	(strcmp(*argv,&amp;quot;-www&amp;quot;) == 0)
&lt;br&gt;&amp;nbsp;			{ www=1; }
&lt;br&gt;&amp;nbsp;		else if	(strcmp(*argv,&amp;quot;-WWW&amp;quot;) == 0)
&lt;br&gt;@@ -1690,6 +1753,21 @@
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (srp_verifier_file != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		p.vb = SRP_VBASE_new(srpuserseed);
&lt;br&gt;+		if ((ret = SRP_VBASE_init(p.vb, srp_verifier_file)) != SRP_NO_ERROR)
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;Cannot initialize SRP verifier file \&amp;quot;%s\&amp;quot;:ret=%d\n&amp;quot;,srp_verifier_file,ret);
&lt;br&gt;+				goto end;
&lt;br&gt;+			}
&lt;br&gt;+		SSL_CTX_set_verify(ctx,SSL_VERIFY_NONE,verify_callback);
&lt;br&gt;+		SSL_CTX_set_srp_cb_arg(ctx, &amp;p); &amp;nbsp;			
&lt;br&gt;+		SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb);
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	if (CAfile != NULL)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;&amp;nbsp;		SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/Configure openssl-SNAP-20091218-srp/Configure
&lt;br&gt;--- openssl-SNAP-20091218-orig/Configure	2009-12-09 16:00:20.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/Configure	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -943,6 +943,12 @@
&lt;br&gt;&amp;nbsp;	$disabled{&amp;quot;gost&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+# SRP requires TLSEXT
&lt;br&gt;+if (defined($disabled{&amp;quot;tlsext&amp;quot;}))
&lt;br&gt;+	{
&lt;br&gt;+	$disabled{&amp;quot;srp&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;if ($target eq &amp;quot;TABLE&amp;quot;) {
&lt;br&gt;&amp;nbsp;	foreach $target (sort keys %table) {
&lt;br&gt;&amp;nbsp;		print_table_entry($target);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/Makefile openssl-SNAP-20091218-srp/crypto/srp/Makefile
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/Makefile	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/Makefile	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1,91 @@
&lt;br&gt;+DIR=	srp
&lt;br&gt;+TOP=	../..
&lt;br&gt;+CC=	cc
&lt;br&gt;+INCLUDES= -I.. -I$(TOP) -I../../include
&lt;br&gt;+CFLAG=-g
&lt;br&gt;+INSTALL_PREFIX=
&lt;br&gt;+OPENSSLDIR= &amp;nbsp; &amp;nbsp; /usr/local/ssl
&lt;br&gt;+INSTALLTOP=/usr/local/ssl
&lt;br&gt;+MAKE=		make -f Makefile.ssl
&lt;br&gt;+MAKEDEPPROG=	makedepend
&lt;br&gt;+MAKEDEPEND=	$(TOP)/util/domd $(TOP) -MD $(MAKEDEPPROG)
&lt;br&gt;+MAKEFILE=	Makefile.ssl
&lt;br&gt;+AR=		ar r
&lt;br&gt;+
&lt;br&gt;+CFLAGS= $(INCLUDES) $(CFLAG)
&lt;br&gt;+
&lt;br&gt;+GENERAL=Makefile
&lt;br&gt;+TEST=srptest.c
&lt;br&gt;+APPS=
&lt;br&gt;+
&lt;br&gt;+LIB=$(TOP)/libcrypto.a
&lt;br&gt;+LIBSRC=srp_lib.c srp_vfy.c
&lt;br&gt;+LIBOBJ=srp_lib.o srp_vfy.o
&lt;br&gt;+
&lt;br&gt;+SRC= $(LIBSRC)
&lt;br&gt;+
&lt;br&gt;+EXHEADER= srp.h
&lt;br&gt;+HEADER=	$(EXHEADER)
&lt;br&gt;+
&lt;br&gt;+top:
&lt;br&gt;+	(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
&lt;br&gt;+
&lt;br&gt;+all:	lib
&lt;br&gt;+
&lt;br&gt;+lib:	$(LIBOBJ)
&lt;br&gt;+	$(AR) $(LIB) $(LIBOBJ)
&lt;br&gt;+	$(RANLIB) $(LIB) || echo Never mind.
&lt;br&gt;+	@touch lib
&lt;br&gt;+
&lt;br&gt;+links:
&lt;br&gt;+	@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
&lt;br&gt;+	@$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
&lt;br&gt;+	@$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
&lt;br&gt;+
&lt;br&gt;+install:
&lt;br&gt;+	@for i in $(EXHEADER) ; \
&lt;br&gt;+	do &amp;nbsp;\
&lt;br&gt;+	(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
&lt;br&gt;+	chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
&lt;br&gt;+	done;
&lt;br&gt;+
&lt;br&gt;+tags:
&lt;br&gt;+	ctags $(SRC)
&lt;br&gt;+
&lt;br&gt;+tests:
&lt;br&gt;+
&lt;br&gt;+srptest: top srptest.c $(LIB)
&lt;br&gt;+	$(CC) $(CFLAGS) -Wall -Werror -g -o srptest srptest.c $(LIB)
&lt;br&gt;+
&lt;br&gt;+lint:
&lt;br&gt;+	lint -DLINT $(INCLUDES) $(SRC)&amp;gt;fluff
&lt;br&gt;+
&lt;br&gt;+depend:
&lt;br&gt;+	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
&lt;br&gt;+
&lt;br&gt;+dclean:
&lt;br&gt;+	$(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) &amp;gt;Makefile.new
&lt;br&gt;+	mv -f Makefile.new $(MAKEFILE)
&lt;br&gt;+
&lt;br&gt;+clean:
&lt;br&gt;+	rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
&lt;br&gt;+
&lt;br&gt;+# DO NOT DELETE THIS LINE -- make depend depends on it.
&lt;br&gt;+
&lt;br&gt;+srp_lib.o: ../../e_os.h ../../include/openssl/bio.h ../../include/openssl/bn.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/safestack.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/sha.h ../../include/openssl/srp.h
&lt;br&gt;+srp_lib.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
&lt;br&gt;+srp_lib.o: ../cryptlib.h srp_grps.h srp_lcl.h srp_lib.c
&lt;br&gt;+srp_vfy.o: ../../e_os.h ../../include/openssl/bio.h ../../include/openssl/bn.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/rand.h ../../include/openssl/safestack.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/sha.h ../../include/openssl/srp.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
&lt;br&gt;+srp_vfy.o: ../../include/openssl/txt_db.h ../cryptlib.h srp_lcl.h srp_vfy.c
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srp_grps.h openssl-SNAP-20091218-srp/crypto/srp/srp_grps.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srp_grps.h	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srp_grps.h	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1,517 @@
&lt;br&gt;+/* start of generated data */
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_1024_value[] = {
&lt;br&gt;+	bn_pack4(9FC6,1D2F,C0EB,06E3),
&lt;br&gt;+	bn_pack4(FD51,38FE,8376,435B),
&lt;br&gt;+	bn_pack4(2FD4,CBF4,976E,AA9A),
&lt;br&gt;+	bn_pack4(68ED,BC3C,0572,6CC0),
&lt;br&gt;+	bn_pack4(C529,F566,660E,57EC),
&lt;br&gt;+	bn_pack4(8255,9B29,7BCF,1885),
&lt;br&gt;+	bn_pack4(CE8E,F4AD,69B1,5D49),
&lt;br&gt;+	bn_pack4(5DC7,D7B4,6154,D6B6),
&lt;br&gt;+	bn_pack4(8E49,5C1D,6089,DAD1),
&lt;br&gt;+	bn_pack4(E0D5,D8E2,50B9,8BE4),
&lt;br&gt;+	bn_pack4(383B,4813,D692,C6E0),
&lt;br&gt;+	bn_pack4(D674,DF74,96EA,81D3),
&lt;br&gt;+	bn_pack4(9EA2,314C,9C25,6576),
&lt;br&gt;+	bn_pack4(6072,6187,75FF,3C0B),
&lt;br&gt;+	bn_pack4(9C33,F80A,FA8F,C5E8),
&lt;br&gt;+	bn_pack4(EEAF,0AB9,ADB3,8DD6)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_1024 = {
&lt;br&gt;+	bn_group_1024_value,
&lt;br&gt;+	(sizeof bn_group_1024_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_1024_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_1536_value[] = {
&lt;br&gt;+	bn_pack4(CF76,E3FE,D135,F9BB),
&lt;br&gt;+	bn_pack4(1518,0F93,499A,234D),
&lt;br&gt;+	bn_pack4(8CE7,A28C,2442,C6F3),
&lt;br&gt;+	bn_pack4(5A02,1FFF,5E91,479E),
&lt;br&gt;+	bn_pack4(7F8A,2FE9,B8B5,292E),
&lt;br&gt;+	bn_pack4(837C,264A,E3A9,BEB8),
&lt;br&gt;+	bn_pack4(E442,734A,F7CC,B7AE),
&lt;br&gt;+	bn_pack4(6577,2E43,7D6C,7F8C),
&lt;br&gt;+	bn_pack4(DB2F,D53D,24B7,C486),
&lt;br&gt;+	bn_pack4(6EDF,0195,3934,9627),
&lt;br&gt;+	bn_pack4(158B,FD3E,2B9C,8CF5),
&lt;br&gt;+	bn_pack4(764E,3F4B,53DD,9DA1),
&lt;br&gt;+	bn_pack4(4754,8381,DBC5,B1FC),
&lt;br&gt;+	bn_pack4(9B60,9E0B,E3BA,B63D),
&lt;br&gt;+	bn_pack4(8134,B1C8,B979,8914),
&lt;br&gt;+	bn_pack4(DF02,8A7C,EC67,F0D0),
&lt;br&gt;+	bn_pack4(80B6,55BB,9A22,E8DC),
&lt;br&gt;+	bn_pack4(1558,903B,A0D0,F843),
&lt;br&gt;+	bn_pack4(51C6,A94B,E460,7A29),
&lt;br&gt;+	bn_pack4(5F4F,5F55,6E27,CBDE),
&lt;br&gt;+	bn_pack4(BEEE,A961,4B19,CC4D),
&lt;br&gt;+	bn_pack4(DBA5,1DF4,99AC,4C80),
&lt;br&gt;+	bn_pack4(B1F1,2A86,17A4,7BBB),
&lt;br&gt;+	bn_pack4(9DEF,3CAF,B939,277A)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_1536 = {
&lt;br&gt;+	bn_group_1536_value,
&lt;br&gt;+	(sizeof bn_group_1536_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_1536_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_2048_value[] = {
&lt;br&gt;+	bn_pack4(0FA7,111F,9E4A,FF73),
&lt;br&gt;+	bn_pack4(9B65,E372,FCD6,8EF2),
&lt;br&gt;+	bn_pack4(35DE,236D,525F,5475),
&lt;br&gt;+	bn_pack4(94B5,C803,D89F,7AE4),
&lt;br&gt;+	bn_pack4(71AE,35F8,E9DB,FBB6),
&lt;br&gt;+	bn_pack4(2A56,98F3,A8D0,C382),
&lt;br&gt;+	bn_pack4(9CCC,041C,7BC3,08D8),
&lt;br&gt;+	bn_pack4(AF87,4E73,03CE,5329),
&lt;br&gt;+	bn_pack4(6160,2790,04E5,7AE6),
&lt;br&gt;+	bn_pack4(032C,FBDB,F52F,B378),
&lt;br&gt;+	bn_pack4(5EA7,7A27,75D2,ECFA),
&lt;br&gt;+	bn_pack4(5445,23B5,24B0,D57D),
&lt;br&gt;+	bn_pack4(5B9D,32E6,88F8,7748),
&lt;br&gt;+	bn_pack4(F1D2,B907,8717,461A),
&lt;br&gt;+	bn_pack4(76BD,207A,436C,6481),
&lt;br&gt;+	bn_pack4(CA97,B43A,23FB,8016),
&lt;br&gt;+	bn_pack4(1D28,1E44,6B14,773B),
&lt;br&gt;+	bn_pack4(7359,D041,D5C3,3EA7),
&lt;br&gt;+	bn_pack4(A80D,740A,DBF4,FF74),
&lt;br&gt;+	bn_pack4(55F9,7993,EC97,5EEA),
&lt;br&gt;+	bn_pack4(2918,A996,2F0B,93B8),
&lt;br&gt;+	bn_pack4(661A,05FB,D5FA,AAE8),
&lt;br&gt;+	bn_pack4(CF60,9517,9A16,3AB3),
&lt;br&gt;+	bn_pack4(E808,3969,EDB7,67B0),
&lt;br&gt;+	bn_pack4(CD7F,48A9,DA04,FD50),
&lt;br&gt;+	bn_pack4(D523,12AB,4B03,310D),
&lt;br&gt;+	bn_pack4(8193,E075,7767,A13D),
&lt;br&gt;+	bn_pack4(A373,29CB,B4A0,99ED),
&lt;br&gt;+	bn_pack4(FC31,9294,3DB5,6050),
&lt;br&gt;+	bn_pack4(AF72,B665,1987,EE07),
&lt;br&gt;+	bn_pack4(F166,DE5E,1389,582F),
&lt;br&gt;+	bn_pack4(AC6B,DB41,324A,9A9B)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_2048 = {
&lt;br&gt;+	bn_group_2048_value,
&lt;br&gt;+	(sizeof bn_group_2048_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_2048_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_3072_value[] = {
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF),
&lt;br&gt;+	bn_pack4(4B82,D120,A93A,D2CA),
&lt;br&gt;+	bn_pack4(43DB,5BFC,E0FD,108E),
&lt;br&gt;+	bn_pack4(08E2,4FA0,74E5,AB31),
&lt;br&gt;+	bn_pack4(7709,88C0,BAD9,46E2),
&lt;br&gt;+	bn_pack4(BBE1,1757,7A61,5D6C),
&lt;br&gt;+	bn_pack4(521F,2B18,177B,200C),
&lt;br&gt;+	bn_pack4(D876,0273,3EC8,6A64),
&lt;br&gt;+	bn_pack4(F12F,FA06,D98A,0864),
&lt;br&gt;+	bn_pack4(CEE3,D226,1AD2,EE6B),
&lt;br&gt;+	bn_pack4(1E8C,94E0,4A25,619D),
&lt;br&gt;+	bn_pack4(ABF5,AE8C,DB09,33D7),
&lt;br&gt;+	bn_pack4(B397,0F85,A6E1,E4C7),
&lt;br&gt;+	bn_pack4(8AEA,7157,5D06,0C7D),
&lt;br&gt;+	bn_pack4(ECFB,8504,58DB,EF0A),
&lt;br&gt;+	bn_pack4(A855,21AB,DF1C,BA64),
&lt;br&gt;+	bn_pack4(AD33,170D,0450,7A33),
&lt;br&gt;+	bn_pack4(1572,8E5A,8AAA,C42D),
&lt;br&gt;+	bn_pack4(15D2,2618,98FA,0510),
&lt;br&gt;+	bn_pack4(3995,497C,EA95,6AE5),
&lt;br&gt;+	bn_pack4(DE2B,CBF6,9558,1718),
&lt;br&gt;+	bn_pack4(B5C5,5DF0,6F4C,52C9),
&lt;br&gt;+	bn_pack4(9B27,83A2,EC07,A28F),
&lt;br&gt;+	bn_pack4(E39E,772C,180E,8603),
&lt;br&gt;+	bn_pack4(3290,5E46,2E36,CE3B),
&lt;br&gt;+	bn_pack4(F174,6C08,CA18,217C),
&lt;br&gt;+	bn_pack4(670C,354E,4ABC,9804),
&lt;br&gt;+	bn_pack4(9ED5,2907,7096,966D),
&lt;br&gt;+	bn_pack4(1C62,F356,2085,52BB),
&lt;br&gt;+	bn_pack4(8365,5D23,DCA3,AD96),
&lt;br&gt;+	bn_pack4(6916,3FA8,FD24,CF5F),
&lt;br&gt;+	bn_pack4(98DA,4836,1C55,D39A),
&lt;br&gt;+	bn_pack4(C200,7CB8,A163,BF05),
&lt;br&gt;+	bn_pack4(4928,6651,ECE4,5B3D),
&lt;br&gt;+	bn_pack4(AE9F,2411,7C4B,1FE6),
&lt;br&gt;+	bn_pack4(EE38,6BFB,5A89,9FA5),
&lt;br&gt;+	bn_pack4(0BFF,5CB6,F406,B7ED),
&lt;br&gt;+	bn_pack4(F44C,42E9,A637,ED6B),
&lt;br&gt;+	bn_pack4(E485,B576,625E,7EC6),
&lt;br&gt;+	bn_pack4(4FE1,356D,6D51,C245),
&lt;br&gt;+	bn_pack4(302B,0A6D,F25F,1437),
&lt;br&gt;+	bn_pack4(EF95,19B3,CD3A,431B),
&lt;br&gt;+	bn_pack4(514A,0879,8E34,04DD),
&lt;br&gt;+	bn_pack4(020B,BEA6,3B13,9B22),
&lt;br&gt;+	bn_pack4(2902,4E08,8A67,CC74),
&lt;br&gt;+	bn_pack4(C4C6,628B,80DC,1CD1),
&lt;br&gt;+	bn_pack4(C90F,DAA2,2168,C234),
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_3072 = {
&lt;br&gt;+	bn_group_3072_value,
&lt;br&gt;+	(sizeof bn_group_3072_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_3072_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_4096_value[] = {
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF),
&lt;br&gt;+	bn_pack4(4DF4,35C9,3406,3199),
&lt;br&gt;+	bn_pack4(86FF,B7DC,90A6,C08F),
&lt;br&gt;+	bn_pack4(93B4,EA98,8D8F,DDC1),
&lt;br&gt;+	bn_pack4(D006,9127,D5B0,5AA9),
&lt;br&gt;+	bn_pack4(B81B,DD76,2170,481C),
&lt;br&gt;+	bn_pack4(1F61,2970,CEE2,D7AF),
&lt;br&gt;+	bn_pack4(233B,A186,515B,E7ED),
&lt;br&gt;+	bn_pack4(99B2,964F,A090,C3A2),
&lt;br&gt;+	bn_pack4(287C,5947,4E6B,C05D),
&lt;br&gt;+	bn_pack4(2E8E,FC14,1FBE,CAA6),
&lt;br&gt;+	bn_pack4(DBBB,C2DB,04DE,8EF9),
&lt;br&gt;+	bn_pack4(2583,E9CA,2AD4,4CE8),
&lt;br&gt;+	bn_pack4(1A94,6834,B615,0BDA),
&lt;br&gt;+	bn_pack4(99C3,2718,6AF4,E23C),
&lt;br&gt;+	bn_pack4(8871,9A10,BDBA,5B26),
&lt;br&gt;+	bn_pack4(1A72,3C12,A787,E6D7),
&lt;br&gt;+	bn_pack4(4B82,D120,A921,0801),
&lt;br&gt;+	bn_pack4(43DB,5BFC,E0FD,108E),
&lt;br&gt;+	bn_pack4(08E2,4FA0,74E5,AB31),
&lt;br&gt;+	bn_pack4(7709,88C0,BAD9,46E2),
&lt;br&gt;+	bn_pack4(BBE1,1757,7A61,5D6C),
&lt;br&gt;+	bn_pack4(521F,2B18,177B,200C),
&lt;br&gt;+	bn_pack4(D876,0273,3EC8,6A64),
&lt;br&gt;+	bn_pack4(F12F,FA06,D98A,0864),
&lt;br&gt;+	bn_pack4(CEE3,D226,1AD2,EE6B),
&lt;br&gt;+	bn_pack4(1E8C,94E0,4A25,619D),
&lt;br&gt;+	bn_pack4(ABF5,AE8C,DB09,33D7),
&lt;br&gt;+	bn_pack4(B397,0F85,A6E1,E4C7),
&lt;br&gt;+	bn_pack4(8AEA,7157,5D06,0C7D),
&lt;br&gt;+	bn_pack4(ECFB,8504,58DB,EF0A),
&lt;br&gt;+	bn_pack4(A855,21AB,DF1C,BA64),
&lt;br&gt;+	bn_pack4(AD33,170D,0450,7A33),
&lt;br&gt;+	bn_pack4(1572,8E5A,8AAA,C42D),
&lt;br&gt;+	bn_pack4(15D2,2618,98FA,0510),
&lt;br&gt;+	bn_pack4(3995,497C,EA95,6AE5),
&lt;br&gt;+	bn_pack4(DE2B,CBF6,9558,1718),
&lt;br&gt;+	bn_pack4(B5C5,5DF0,6F4C,52C9),
&lt;br&gt;+	bn_pack4(9B27,83A2,EC07,A28F),
&lt;br&gt;+	bn_pack4(E39E,772C,180E,8603),
&lt;br&gt;+	bn_pack4(3290,5E46,2E36,CE3B),
&lt;br&gt;+	bn_pack4(F174,6C08,CA18,217C),
&lt;br&gt;+	bn_pack4(670C,354E,4ABC,9804),
&lt;br&gt;+	bn_pack4(9ED5,2907,7096,966D),
&lt;br&gt;+	bn_pack4(1C62,F356,2085,52BB),
&lt;br&gt;+	bn_pack4(8365,5D23,DCA3,AD96),
&lt;br&gt;+	bn_pack4(6916,3FA8,FD24,CF5F),
&lt;br&gt;+	bn_pack4(98DA,4836,1C55,D39A),
&lt;br&gt;+	bn_pack4(C200,7CB8,A163,BF05),
&lt;br&gt;+	bn_pack4(4928,6651,ECE4,5B3D),
&lt;br&gt;+	bn_pack4(AE9F,2411,7C4B,1FE6),
&lt;br&gt;+	bn_pack4(EE38,6BFB,5A89,9FA5),
&lt;br&gt;+	bn_pack4(0BFF,5CB6,F406,B7ED),
&lt;br&gt;+	bn_pack4(F44C,42E9,A637,ED6B),
&lt;br&gt;+	bn_pack4(E485,B576,625E,7EC6),
&lt;br&gt;+	bn_pack4(4FE1,356D,6D51,C245),
&lt;br&gt;+	bn_pack4(302B,0A6D,F25F,1437),
&lt;br&gt;+	bn_pack4(EF95,19B3,CD3A,431B),
&lt;br&gt;+	bn_pack4(514A,0879,8E34,04DD),
&lt;br&gt;+	bn_pack4(020B,BEA6,3B13,9B22),
&lt;br&gt;+	bn_pack4(2902,4E08,8A67,CC74),
&lt;br&gt;+	bn_pack4(C4C6,628B,80DC,1CD1),
&lt;br&gt;+	bn_pack4(C90F,DAA2,2168,C234),
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_4096 = {
&lt;br&gt;+	bn_group_4096_value,
&lt;br&gt;+	(sizeof bn_group_4096_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_4096_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_6144_value[] = {
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF),
&lt;br&gt;+	bn_pack4(E694,F91E,6DCC,4024),
&lt;br&gt;+	bn_pack4(12BF,2D5B,0B74,74D6),
&lt;br&gt;+	bn_pack4(043E,8F66,3F48,60EE),
&lt;br&gt;+	bn_pack4(387F,E8D7,6E3C,0468),
&lt;br&gt;+	bn_pack4(DA56,C9EC,2EF2,9632),
&lt;br&gt;+	bn_pack4(EB19,CCB1,A313,D55C),
&lt;br&gt;+	bn_pack4(F550,AA3D,8A1F,BFF0),
&lt;br&gt;+	bn_pack4(06A1,D58B,B7C5,DA76),
&lt;br&gt;+	bn_pack4(A797,15EE,F29B,E328),
&lt;br&gt;+	bn_pack4(14CC,5ED2,0F80,37E0),
&lt;br&gt;+	bn_pack4(CC8F,6D7E,BF48,E1D8),
&lt;br&gt;+	bn_pack4(4BD4,07B2,2B41,54AA),
&lt;br&gt;+	bn_pack4(0F1D,45B7,FF58,5AC5),
&lt;br&gt;+	bn_pack4(23A9,7A7E,36CC,88BE),
&lt;br&gt;+	bn_pack4(59E7,C97F,BEC7,E8F3),
&lt;br&gt;+	bn_pack4(B5A8,4031,900B,1C9E),
&lt;br&gt;+	bn_pack4(D55E,702F,4698,0C82),
&lt;br&gt;+	bn_pack4(F482,D7CE,6E74,FEF6),
&lt;br&gt;+	bn_pack4(F032,EA15,D172,1D03),
&lt;br&gt;+	bn_pack4(5983,CA01,C64B,92EC),
&lt;br&gt;+	bn_pack4(6FB8,F401,378C,D2BF),
&lt;br&gt;+	bn_pack4(3320,5151,2BD7,AF42),
&lt;br&gt;+	bn_pack4(DB7F,1447,E6CC,254B),
&lt;br&gt;+	bn_pack4(44CE,6CBA,CED4,BB1B),
&lt;br&gt;+	bn_pack4(DA3E,DBEB,CF9B,14ED),
&lt;br&gt;+	bn_pack4(1797,27B0,865A,8918),
&lt;br&gt;+	bn_pack4(B06A,53ED,9027,D831),
&lt;br&gt;+	bn_pack4(E5DB,382F,4130,01AE),
&lt;br&gt;+	bn_pack4(F8FF,9406,AD9E,530E),
&lt;br&gt;+	bn_pack4(C975,1E76,3DBA,37BD),
&lt;br&gt;+	bn_pack4(C1D4,DCB2,6026,46DE),
&lt;br&gt;+	bn_pack4(36C3,FAB4,D27C,7026),
&lt;br&gt;+	bn_pack4(4DF4,35C9,3402,8492),
&lt;br&gt;+	bn_pack4(86FF,B7DC,90A6,C08F),
&lt;br&gt;+	bn_pack4(93B4,EA98,8D8F,DDC1),
&lt;br&gt;+	bn_pack4(D006,9127,D5B0,5AA9),
&lt;br&gt;+	bn_pack4(B81B,DD76,2170,481C),
&lt;br&gt;+	bn_pack4(1F61,2970,CEE2,D7AF),
&lt;br&gt;+	bn_pack4(233B,A186,515B,E7ED),
&lt;br&gt;+	bn_pack4(99B2,964F,A090,C3A2),
&lt;br&gt;+	bn_pack4(287C,5947,4E6B,C05D),
&lt;br&gt;+	bn_pack4(2E8E,FC14,1FBE,CAA6),
&lt;br&gt;+	bn_pack4(DBBB,C2DB,04DE,8EF9),
&lt;br&gt;+	bn_pack4(2583,E9CA,2AD4,4CE8),
&lt;br&gt;+	bn_pack4(1A94,6834,B615,0BDA),
&lt;br&gt;+	bn_pack4(99C3,2718,6AF4,E23C),
&lt;br&gt;+	bn_pack4(8871,9A10,BDBA,5B26),
&lt;br&gt;+	bn_pack4(1A72,3C12,A787,E6D7),
&lt;br&gt;+	bn_pack4(4B82,D120,A921,0801),
&lt;br&gt;+	bn_pack4(43DB,5BFC,E0FD,108E),
&lt;br&gt;+	bn_pack4(08E2,4FA0,74E5,AB31),
&lt;br&gt;+	bn_pack4(7709,88C0,BAD9,46E2),
&lt;br&gt;+	bn_pack4(BBE1,1757,7A61,5D6C),
&lt;br&gt;+	bn_pack4(521F,2B18,177B,200C),
&lt;br&gt;+	bn_pack4(D876,0273,3EC8,6A64),
&lt;br&gt;+	bn_pack4(F12F,FA06,D98A,0864),
&lt;br&gt;+	bn_pack4(CEE3,D226,1AD2,EE6B),
&lt;br&gt;+	bn_pack4(1E8C,94E0,4A25,619D),
&lt;br&gt;+	bn_pack4(ABF5,AE8C,DB09,33D7),
&lt;br&gt;+	bn_pack4(B397,0F85,A6E1,E4C7),
&lt;br&gt;+	bn_pack4(8AEA,7157,5D06,0C7D),
&lt;br&gt;+	bn_pack4(ECFB,8504,58DB,EF0A),
&lt;br&gt;+	bn_pack4(A855,21AB,DF1C,BA64),
&lt;br&gt;+	bn_pack4(AD33,170D,0450,7A33),
&lt;br&gt;+	bn_pack4(1572,8E5A,8AAA,C42D),
&lt;br&gt;+	bn_pack4(15D2,2618,98FA,0510),
&lt;br&gt;+	bn_pack4(3995,497C,EA95,6AE5),
&lt;br&gt;+	bn_pack4(DE2B,CBF6,9558,1718),
&lt;br&gt;+	bn_pack4(B5C5,5DF0,6F4C,52C9),
&lt;br&gt;+	bn_pack4(9B27,83A2,EC07,A28F),
&lt;br&gt;+	bn_pack4(E39E,772C,180E,8603),
&lt;br&gt;+	bn_pack4(3290,5E46,2E36,CE3B),
&lt;br&gt;+	bn_pack4(F174,6C08,CA18,217C),
&lt;br&gt;+	bn_pack4(670C,354E,4ABC,9804),
&lt;br&gt;+	bn_pack4(9ED5,2907,7096,966D),
&lt;br&gt;+	bn_pack4(1C62,F356,2085,52BB),
&lt;br&gt;+	bn_pack4(8365,5D23,DCA3,AD96),
&lt;br&gt;+	bn_pack4(6916,3FA8,FD24,CF5F),
&lt;br&gt;+	bn_pack4(98DA,4836,1C55,D39A),
&lt;br&gt;+	bn_pack4(C200,7CB8,A163,BF05),
&lt;br&gt;+	bn_pack4(4928,6651,ECE4,5B3D),
&lt;br&gt;+	bn_pack4(AE9F,2411,7C4B,1FE6),
&lt;br&gt;+	bn_pack4(EE38,6BFB,5A89,9FA5),
&lt;br&gt;+	bn_pack4(0BFF,5CB6,F406,B7ED),
&lt;br&gt;+	bn_pack4(F44C,42E9,A637,ED6B),
&lt;br&gt;+	bn_pack4(E485,B576,625E,7EC6),
&lt;br&gt;+	bn_pack4(4FE1,356D,6D51,C245),
&lt;br&gt;+	bn_pack4(302B,0A6D,F25F,1437),
&lt;br&gt;+	bn_pack4(EF95,19B3,CD3A,431B),
&lt;br&gt;+	bn_pack4(514A,0879,8E34,04DD),
&lt;br&gt;+	bn_pack4(020B,BEA6,3B13,9B22),
&lt;br&gt;+	bn_pack4(2902,4E08,8A67,CC74),
&lt;br&gt;+	bn_pack4(C4C6,628B,80DC,1CD1),
&lt;br&gt;+	bn_pack4(C90F,DAA2,2168,C234),
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_6144 = {
&lt;br&gt;+	bn_group_6144_value,
&lt;br&gt;+	(sizeof bn_group_6144_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_6144_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_group_8192_value[] = {
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF),
&lt;br&gt;+	bn_pack4(60C9,80DD,98ED,D3DF),
&lt;br&gt;+	bn_pack4(C81F,56E8,80B9,6E71),
&lt;br&gt;+	bn_pack4(9E30,50E2,7656,94DF),
&lt;br&gt;+	bn_pack4(9558,E447,5677,E9AA),
&lt;br&gt;+	bn_pack4(C919,0DA6,FC02,6E47),
&lt;br&gt;+	bn_pack4(889A,002E,D5EE,382B),
&lt;br&gt;+	bn_pack4(4009,438B,481C,6CD7),
&lt;br&gt;+	bn_pack4(3590,46F4,EB87,9F92),
&lt;br&gt;+	bn_pack4(FAF3,6BC3,1ECF,A268),
&lt;br&gt;+	bn_pack4(B1D5,10BD,7EE7,4D73),
&lt;br&gt;+	bn_pack4(F9AB,4819,5DED,7EA1),
&lt;br&gt;+	bn_pack4(64F3,1CC5,0846,851D),
&lt;br&gt;+	bn_pack4(4597,E899,A025,5DC1),
&lt;br&gt;+	bn_pack4(DF31,0EE0,74AB,6A36),
&lt;br&gt;+	bn_pack4(6D2A,13F8,3F44,F82D),
&lt;br&gt;+	bn_pack4(062B,3CF5,B3A2,78A6),
&lt;br&gt;+	bn_pack4(7968,3303,ED5B,DD3A),
&lt;br&gt;+	bn_pack4(FA9D,4B7F,A2C0,87E8),
&lt;br&gt;+	bn_pack4(4BCB,C886,2F83,85DD),
&lt;br&gt;+	bn_pack4(3473,FC64,6CEA,306B),
&lt;br&gt;+	bn_pack4(13EB,57A8,1A23,F0C7),
&lt;br&gt;+	bn_pack4(2222,2E04,A403,7C07),
&lt;br&gt;+	bn_pack4(E3FD,B8BE,FC84,8AD9),
&lt;br&gt;+	bn_pack4(238F,16CB,E39D,652D),
&lt;br&gt;+	bn_pack4(3423,B474,2BF1,C978),
&lt;br&gt;+	bn_pack4(3AAB,639C,5AE4,F568),
&lt;br&gt;+	bn_pack4(2576,F693,6BA4,2466),
&lt;br&gt;+	bn_pack4(741F,A7BF,8AFC,47ED),
&lt;br&gt;+	bn_pack4(3BC8,32B6,8D9D,D300),
&lt;br&gt;+	bn_pack4(D8BE,C4D0,73B9,31BA),
&lt;br&gt;+	bn_pack4(3877,7CB6,A932,DF8C),
&lt;br&gt;+	bn_pack4(74A3,926F,12FE,E5E4),
&lt;br&gt;+	bn_pack4(E694,F91E,6DBE,1159),
&lt;br&gt;+	bn_pack4(12BF,2D5B,0B74,74D6),
&lt;br&gt;+	bn_pack4(043E,8F66,3F48,60EE),
&lt;br&gt;+	bn_pack4(387F,E8D7,6E3C,0468),
&lt;br&gt;+	bn_pack4(DA56,C9EC,2EF2,9632),
&lt;br&gt;+	bn_pack4(EB19,CCB1,A313,D55C),
&lt;br&gt;+	bn_pack4(F550,AA3D,8A1F,BFF0),
&lt;br&gt;+	bn_pack4(06A1,D58B,B7C5,DA76),
&lt;br&gt;+	bn_pack4(A797,15EE,F29B,E328),
&lt;br&gt;+	bn_pack4(14CC,5ED2,0F80,37E0),
&lt;br&gt;+	bn_pack4(CC8F,6D7E,BF48,E1D8),
&lt;br&gt;+	bn_pack4(4BD4,07B2,2B41,54AA),
&lt;br&gt;+	bn_pack4(0F1D,45B7,FF58,5AC5),
&lt;br&gt;+	bn_pack4(23A9,7A7E,36CC,88BE),
&lt;br&gt;+	bn_pack4(59E7,C97F,BEC7,E8F3),
&lt;br&gt;+	bn_pack4(B5A8,4031,900B,1C9E),
&lt;br&gt;+	bn_pack4(D55E,702F,4698,0C82),
&lt;br&gt;+	bn_pack4(F482,D7CE,6E74,FEF6),
&lt;br&gt;+	bn_pack4(F032,EA15,D172,1D03),
&lt;br&gt;+	bn_pack4(5983,CA01,C64B,92EC),
&lt;br&gt;+	bn_pack4(6FB8,F401,378C,D2BF),
&lt;br&gt;+	bn_pack4(3320,5151,2BD7,AF42),
&lt;br&gt;+	bn_pack4(DB7F,1447,E6CC,254B),
&lt;br&gt;+	bn_pack4(44CE,6CBA,CED4,BB1B),
&lt;br&gt;+	bn_pack4(DA3E,DBEB,CF9B,14ED),
&lt;br&gt;+	bn_pack4(1797,27B0,865A,8918),
&lt;br&gt;+	bn_pack4(B06A,53ED,9027,D831),
&lt;br&gt;+	bn_pack4(E5DB,382F,4130,01AE),
&lt;br&gt;+	bn_pack4(F8FF,9406,AD9E,530E),
&lt;br&gt;+	bn_pack4(C975,1E76,3DBA,37BD),
&lt;br&gt;+	bn_pack4(C1D4,DCB2,6026,46DE),
&lt;br&gt;+	bn_pack4(36C3,FAB4,D27C,7026),
&lt;br&gt;+	bn_pack4(4DF4,35C9,3402,8492),
&lt;br&gt;+	bn_pack4(86FF,B7DC,90A6,C08F),
&lt;br&gt;+	bn_pack4(93B4,EA98,8D8F,DDC1),
&lt;br&gt;+	bn_pack4(D006,9127,D5B0,5AA9),
&lt;br&gt;+	bn_pack4(B81B,DD76,2170,481C),
&lt;br&gt;+	bn_pack4(1F61,2970,CEE2,D7AF),
&lt;br&gt;+	bn_pack4(233B,A186,515B,E7ED),
&lt;br&gt;+	bn_pack4(99B2,964F,A090,C3A2),
&lt;br&gt;+	bn_pack4(287C,5947,4E6B,C05D),
&lt;br&gt;+	bn_pack4(2E8E,FC14,1FBE,CAA6),
&lt;br&gt;+	bn_pack4(DBBB,C2DB,04DE,8EF9),
&lt;br&gt;+	bn_pack4(2583,E9CA,2AD4,4CE8),
&lt;br&gt;+	bn_pack4(1A94,6834,B615,0BDA),
&lt;br&gt;+	bn_pack4(99C3,2718,6AF4,E23C),
&lt;br&gt;+	bn_pack4(8871,9A10,BDBA,5B26),
&lt;br&gt;+	bn_pack4(1A72,3C12,A787,E6D7),
&lt;br&gt;+	bn_pack4(4B82,D120,A921,0801),
&lt;br&gt;+	bn_pack4(43DB,5BFC,E0FD,108E),
&lt;br&gt;+	bn_pack4(08E2,4FA0,74E5,AB31),
&lt;br&gt;+	bn_pack4(7709,88C0,BAD9,46E2),
&lt;br&gt;+	bn_pack4(BBE1,1757,7A61,5D6C),
&lt;br&gt;+	bn_pack4(521F,2B18,177B,200C),
&lt;br&gt;+	bn_pack4(D876,0273,3EC8,6A64),
&lt;br&gt;+	bn_pack4(F12F,FA06,D98A,0864),
&lt;br&gt;+	bn_pack4(CEE3,D226,1AD2,EE6B),
&lt;br&gt;+	bn_pack4(1E8C,94E0,4A25,619D),
&lt;br&gt;+	bn_pack4(ABF5,AE8C,DB09,33D7),
&lt;br&gt;+	bn_pack4(B397,0F85,A6E1,E4C7),
&lt;br&gt;+	bn_pack4(8AEA,7157,5D06,0C7D),
&lt;br&gt;+	bn_pack4(ECFB,8504,58DB,EF0A),
&lt;br&gt;+	bn_pack4(A855,21AB,DF1C,BA64),
&lt;br&gt;+	bn_pack4(AD33,170D,0450,7A33),
&lt;br&gt;+	bn_pack4(1572,8E5A,8AAA,C42D),
&lt;br&gt;+	bn_pack4(15D2,2618,98FA,0510),
&lt;br&gt;+	bn_pack4(3995,497C,EA95,6AE5),
&lt;br&gt;+	bn_pack4(DE2B,CBF6,9558,1718),
&lt;br&gt;+	bn_pack4(B5C5,5DF0,6F4C,52C9),
&lt;br&gt;+	bn_pack4(9B27,83A2,EC07,A28F),
&lt;br&gt;+	bn_pack4(E39E,772C,180E,8603),
&lt;br&gt;+	bn_pack4(3290,5E46,2E36,CE3B),
&lt;br&gt;+	bn_pack4(F174,6C08,CA18,217C),
&lt;br&gt;+	bn_pack4(670C,354E,4ABC,9804),
&lt;br&gt;+	bn_pack4(9ED5,2907,7096,966D),
&lt;br&gt;+	bn_pack4(1C62,F356,2085,52BB),
&lt;br&gt;+	bn_pack4(8365,5D23,DCA3,AD96),
&lt;br&gt;+	bn_pack4(6916,3FA8,FD24,CF5F),
&lt;br&gt;+	bn_pack4(98DA,4836,1C55,D39A),
&lt;br&gt;+	bn_pack4(C200,7CB8,A163,BF05),
&lt;br&gt;+	bn_pack4(4928,6651,ECE4,5B3D),
&lt;br&gt;+	bn_pack4(AE9F,2411,7C4B,1FE6),
&lt;br&gt;+	bn_pack4(EE38,6BFB,5A89,9FA5),
&lt;br&gt;+	bn_pack4(0BFF,5CB6,F406,B7ED),
&lt;br&gt;+	bn_pack4(F44C,42E9,A637,ED6B),
&lt;br&gt;+	bn_pack4(E485,B576,625E,7EC6),
&lt;br&gt;+	bn_pack4(4FE1,356D,6D51,C245),
&lt;br&gt;+	bn_pack4(302B,0A6D,F25F,1437),
&lt;br&gt;+	bn_pack4(EF95,19B3,CD3A,431B),
&lt;br&gt;+	bn_pack4(514A,0879,8E34,04DD),
&lt;br&gt;+	bn_pack4(020B,BEA6,3B13,9B22),
&lt;br&gt;+	bn_pack4(2902,4E08,8A67,CC74),
&lt;br&gt;+	bn_pack4(C4C6,628B,80DC,1CD1),
&lt;br&gt;+	bn_pack4(C90F,DAA2,2168,C234),
&lt;br&gt;+	bn_pack4(FFFF,FFFF,FFFF,FFFF)
&lt;br&gt;+};
&lt;br&gt;+static BIGNUM bn_group_8192 = {
&lt;br&gt;+	bn_group_8192_value,
&lt;br&gt;+	(sizeof bn_group_8192_value)/sizeof(BN_ULONG),
&lt;br&gt;+	(sizeof bn_group_8192_value)/sizeof(BN_ULONG),
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static BN_ULONG bn_generator_19_value[] = {19} ;
&lt;br&gt;+static BIGNUM bn_generator_19 = {
&lt;br&gt;+	bn_generator_19_value,
&lt;br&gt;+	1,
&lt;br&gt;+	1,
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+static BN_ULONG bn_generator_5_value[] = {5} ;
&lt;br&gt;+static BIGNUM bn_generator_5 = {
&lt;br&gt;+	bn_generator_5_value,
&lt;br&gt;+	1,
&lt;br&gt;+	1,
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+static BN_ULONG bn_generator_2_value[] = {2} ;
&lt;br&gt;+static BIGNUM bn_generator_2 = {
&lt;br&gt;+	bn_generator_2_value,
&lt;br&gt;+	1,
&lt;br&gt;+	1,
&lt;br&gt;+	0,
&lt;br&gt;+	BN_FLG_STATIC_DATA
&lt;br&gt;+};
&lt;br&gt;+
&lt;br&gt;+static SRP_gN knowngN[] = {
&lt;br&gt;+	{&amp;quot;8192&amp;quot;,&amp;bn_generator_19 , &amp;bn_group_8192},
&lt;br&gt;+	{&amp;quot;6144&amp;quot;,&amp;bn_generator_5 , &amp;bn_group_6144},
&lt;br&gt;+	{&amp;quot;4096&amp;quot;,&amp;bn_generator_5 , &amp;bn_group_4096},
&lt;br&gt;+	{&amp;quot;3072&amp;quot;,&amp;bn_generator_5 , &amp;bn_group_3072},
&lt;br&gt;+	{&amp;quot;2048&amp;quot;,&amp;bn_generator_2 , &amp;bn_group_2048},
&lt;br&gt;+	{&amp;quot;1536&amp;quot;,&amp;bn_generator_2 , &amp;bn_group_1536},
&lt;br&gt;+	{&amp;quot;1024&amp;quot;,&amp;bn_generator_2 , &amp;bn_group_1024},
&lt;br&gt;+};
&lt;br&gt;+#define KNOWN_GN_NUMBER sizeof(knowngN) / sizeof(SRP_gN)
&lt;br&gt;+
&lt;br&gt;+/* end of generated data */
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srp.h openssl-SNAP-20091218-srp/crypto/srp/srp.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srp.h	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srp.h	2009-12-18 20:33:29.000000000 +0000
&lt;br&gt;@@ -0,0 +1,171 @@
&lt;br&gt;+/* crypto/srp/srp.h */
&lt;br&gt;+/* Written by Christophe Renou (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;christophe.renou@...&lt;/a&gt;) with 
&lt;br&gt;+ * the precious help of Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) 
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#ifndef __SRP_H__
&lt;br&gt;+#define __SRP_H__
&lt;br&gt;+
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;stdio.h&amp;gt;
&lt;br&gt;+#include &amp;lt;string.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#ifdef &amp;nbsp;__cplusplus
&lt;br&gt;+extern &amp;quot;C&amp;quot; {
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;openssl/safestack.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/bn.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/crypto.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+typedef struct SRP_gN_cache_st
&lt;br&gt;+	{
&lt;br&gt;+	char *b64_bn;
&lt;br&gt;+	BIGNUM *bn;
&lt;br&gt;+	} SRP_gN_cache;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+DECLARE_STACK_OF(SRP_gN_cache);
&lt;br&gt;+
&lt;br&gt;+typedef struct SRP_user_pwd_st
&lt;br&gt;+	{
&lt;br&gt;+	char *id;
&lt;br&gt;+	BIGNUM *s;
&lt;br&gt;+	BIGNUM *v;
&lt;br&gt;+	BIGNUM *g;
&lt;br&gt;+	BIGNUM *N;
&lt;br&gt;+	char *info;
&lt;br&gt;+	} SRP_user_pwd;
&lt;br&gt;+
&lt;br&gt;+DECLARE_STACK_OF(SRP_user_pwd);
&lt;br&gt;+
&lt;br&gt;+typedef struct SRP_VBASE_st
&lt;br&gt;+	{
&lt;br&gt;+	STACK_OF(SRP_user_pwd) *users_pwd;
&lt;br&gt;+	STACK_OF(SRP_gN_cache) *gN_cache;
&lt;br&gt;+/* to simulate a user */
&lt;br&gt;+	char *seed_key;
&lt;br&gt;+	BIGNUM *default_g;
&lt;br&gt;+	BIGNUM *default_N;
&lt;br&gt;+	} SRP_VBASE;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/*Structure interne pour retenir les couples N et g*/
&lt;br&gt;+typedef struct SRP_gN_st
&lt;br&gt;+	{
&lt;br&gt;+	char *id;
&lt;br&gt;+	BIGNUM *g;
&lt;br&gt;+	BIGNUM *N;
&lt;br&gt;+	} SRP_gN;
&lt;br&gt;+
&lt;br&gt;+DECLARE_STACK_OF(SRP_gN);
&lt;br&gt;+
&lt;br&gt;+SRP_VBASE *SRP_VBASE_new(char *seed_key);
&lt;br&gt;+int SRP_VBASE_free(SRP_VBASE *vb);
&lt;br&gt;+int SRP_VBASE_init(SRP_VBASE *vb, char * verifier_file);
&lt;br&gt;+SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username);
&lt;br&gt;+char * SRP_create_verifier(const char *user, const char *pass, char **salt, char **verifier, char *N, char *g);
&lt;br&gt;+int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g);
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#define SRP_NO_ERROR 0
&lt;br&gt;+#define SRP_ERR_VBASE_INCOMPLETE_FILE 1
&lt;br&gt;+#define SRP_ERR_VBASE_BN_LIB 2
&lt;br&gt;+#define SRP_ERR_OPEN_FILE 3
&lt;br&gt;+#define SRP_ERR_MEMORY 4
&lt;br&gt;+
&lt;br&gt;+#define DB_srptype	0
&lt;br&gt;+#define DB_srpverifier	1
&lt;br&gt;+#define DB_srpsalt 	2
&lt;br&gt;+#define DB_srpid	3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+#define DB_srpgN	4 &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;+#define DB_srpinfo	5 
&lt;br&gt;+#undef &amp;nbsp;DB_NUMBER &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+#define DB_NUMBER &amp;nbsp; &amp;nbsp; &amp;nbsp; 6
&lt;br&gt;+
&lt;br&gt;+#define DB_SRP_INDEX	'I'
&lt;br&gt;+#define DB_SRP_VALID	'V'
&lt;br&gt;+#define DB_SRP_REVOKED	'R'
&lt;br&gt;+#define DB_SRP_MODIF	'v'
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/* see srp.c */
&lt;br&gt;+char * SRP_check_known_gN_param(BIGNUM* g, BIGNUM* N); 
&lt;br&gt;+SRP_gN *SRP_get_default_gN(const char * id) ;
&lt;br&gt;+
&lt;br&gt;+/* server side .... */
&lt;br&gt;+BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N);
&lt;br&gt;+BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v);
&lt;br&gt;+int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N);
&lt;br&gt;+BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N) ;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/* client side .... */
&lt;br&gt;+BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass);
&lt;br&gt;+BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g);
&lt;br&gt;+BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u);
&lt;br&gt;+int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N);
&lt;br&gt;+
&lt;br&gt;+#define SRP_MINIMAL_N 1024
&lt;br&gt;+
&lt;br&gt;+#ifdef &amp;nbsp;__cplusplus
&lt;br&gt;+}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srp_lcl.h openssl-SNAP-20091218-srp/crypto/srp/srp_lcl.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srp_lcl.h	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srp_lcl.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -0,0 +1,83 @@
&lt;br&gt;+/* crypto/srp/srp_lcl.h */
&lt;br&gt;+/* Written by Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) &amp;nbsp;
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#ifndef HEADER_SRP_LCL_H
&lt;br&gt;+#define HEADER_SRP_LCL_H
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/sha.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#if 0
&lt;br&gt;+#define srp_bn_print(a) {fprintf(stderr, #a &amp;quot;=&amp;quot;); BN_print_fp(stderr,a); \
&lt;br&gt;+ &amp;nbsp; fprintf(stderr,&amp;quot;\n&amp;quot;);}
&lt;br&gt;+#else
&lt;br&gt;+#define &amp;nbsp; srp_bn_print(a)
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#ifdef &amp;nbsp;__cplusplus
&lt;br&gt;+extern &amp;quot;C&amp;quot; {
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#ifdef &amp;nbsp;__cplusplus
&lt;br&gt;+}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srp_lib.c openssl-SNAP-20091218-srp/crypto/srp/srp_lib.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srp_lib.c	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srp_lib.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -0,0 +1,357 @@
&lt;br&gt;+/* crypto/srp/srp_lib.c */
&lt;br&gt;+/* Written by Christophe Renou (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=13&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;christophe.renou@...&lt;/a&gt;) with 
&lt;br&gt;+ * the precious help of Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=14&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) 
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=15&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=16&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=17&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;quot;cryptlib.h&amp;quot;
&lt;br&gt;+#include &amp;quot;srp_lcl.h&amp;quot;
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/evp.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#if (BN_BYTES == 8)
&lt;br&gt;+#define bn_pack4(a1,a2,a3,a4) 0x##a1##a2##a3##a4##ul
&lt;br&gt;+#endif
&lt;br&gt;+#if (BN_BYTES == 4)
&lt;br&gt;+#define bn_pack4(a1,a2,a3,a4) &amp;nbsp;0x##a3##a4##ul, 0x##a1##a2##ul
&lt;br&gt;+#endif
&lt;br&gt;+#if (BN_BYTES == 2)
&lt;br&gt;+#define bn_pack4(a1,a2,a3,a4) 0x##a4##u,0x##a3##u,0x##a2##u,0x##a1##u
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#include &amp;quot;srp_grps.h&amp;quot;
&lt;br&gt;+
&lt;br&gt;+static BIGNUM *srp_Calc_k(BIGNUM *N, BIGNUM *g)
&lt;br&gt;+	{
&lt;br&gt;+	/* k = SHA1(N | PAD(g)) -- tls-srp draft 8 */
&lt;br&gt;+
&lt;br&gt;+	unsigned char digest[SHA_DIGEST_LENGTH];
&lt;br&gt;+	unsigned char *tmp;
&lt;br&gt;+	EVP_MD_CTX ctxt;
&lt;br&gt;+	int longg ;
&lt;br&gt;+	int longN = BN_num_bytes(N);
&lt;br&gt;+
&lt;br&gt;+	if ((tmp = OPENSSL_malloc(longN)) == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+	BN_bn2bin(N,tmp) ;
&lt;br&gt;+
&lt;br&gt;+	EVP_MD_CTX_init(&amp;ctxt);
&lt;br&gt;+	EVP_DigestInit_ex(&amp;ctxt, EVP_sha1(), NULL);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, tmp, longN);
&lt;br&gt;+
&lt;br&gt;+	memset(tmp, 0, longN);
&lt;br&gt;+	longg = BN_bn2bin(g,tmp) ;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* use the zeros behind to pad on left */
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, tmp + longg, longN-longg);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, tmp, longg);
&lt;br&gt;+	OPENSSL_free(tmp);
&lt;br&gt;+
&lt;br&gt;+	EVP_DigestFinal_ex(&amp;ctxt, digest, NULL);
&lt;br&gt;+	EVP_MD_CTX_cleanup(&amp;ctxt);
&lt;br&gt;+	return BN_bin2bn(digest, sizeof(digest), NULL);	
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_u(BIGNUM *A, BIGNUM *B, BIGNUM *N)
&lt;br&gt;+	{
&lt;br&gt;+	/* k = SHA1(PAD(A) || PAD(B) ) -- tls-srp draft 8 */
&lt;br&gt;+
&lt;br&gt;+	BIGNUM *u;	
&lt;br&gt;+	unsigned char cu[SHA_DIGEST_LENGTH];
&lt;br&gt;+	unsigned char *cAB;
&lt;br&gt;+	EVP_MD_CTX ctxt;
&lt;br&gt;+	int longN; &amp;nbsp;
&lt;br&gt;+	if ((A == NULL) ||(B == NULL) || (N == NULL))
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	longN= BN_num_bytes(N);
&lt;br&gt;+
&lt;br&gt;+	if ((cAB = OPENSSL_malloc(2*longN)) == NULL) 
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	memset(cAB, 0, longN);
&lt;br&gt;+
&lt;br&gt;+	EVP_MD_CTX_init(&amp;ctxt);
&lt;br&gt;+	EVP_DigestInit_ex(&amp;ctxt, EVP_sha1(), NULL);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, cAB + BN_bn2bin(A,cAB+longN), longN);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, cAB + BN_bn2bin(B,cAB+longN), longN);
&lt;br&gt;+	OPENSSL_free(cAB);
&lt;br&gt;+	EVP_DigestFinal_ex(&amp;ctxt, cu, NULL);
&lt;br&gt;+	EVP_MD_CTX_cleanup(&amp;ctxt);
&lt;br&gt;+
&lt;br&gt;+	if (!(u = BN_bin2bn(cu, sizeof(cu), NULL)))
&lt;br&gt;+		return NULL;
&lt;br&gt;+	if (!BN_is_zero(u))
&lt;br&gt;+		return u;
&lt;br&gt;+	BN_free(u);
&lt;br&gt;+	return NULL;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_server_key(BIGNUM *A, BIGNUM *v, BIGNUM *u, BIGNUM *b, BIGNUM *N)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM *tmp = NULL, *S = NULL;
&lt;br&gt;+	BN_CTX *bn_ctx; 
&lt;br&gt;+	
&lt;br&gt;+	if (u == NULL || A == NULL || v == NULL || b == NULL || N == NULL)
&lt;br&gt;+		return NULL; 
&lt;br&gt;+
&lt;br&gt;+	if ((bn_ctx = BN_CTX_new()) == NULL ||
&lt;br&gt;+		(tmp = BN_new()) == NULL ||
&lt;br&gt;+		(S = BN_new()) == NULL )
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	/* S = (A*v**u) ** b */ 
&lt;br&gt;+
&lt;br&gt;+	if (!BN_mod_exp(tmp,v,u,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_mul(tmp,A,tmp,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_exp(S,tmp,b,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+err:
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	BN_clear_free(tmp);
&lt;br&gt;+	return S;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_B(BIGNUM *b, BIGNUM *N, BIGNUM *g, BIGNUM *v)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM &amp;nbsp;*kv = NULL, *gb = NULL;
&lt;br&gt;+	BIGNUM *B = NULL, *k = NULL;
&lt;br&gt;+	BN_CTX *bn_ctx;
&lt;br&gt;+
&lt;br&gt;+	if (b == NULL || N == NULL || g == NULL || v == NULL ||
&lt;br&gt;+		(bn_ctx = BN_CTX_new()) == NULL)
&lt;br&gt;+		return NULL; 
&lt;br&gt;+
&lt;br&gt;+	if ( (kv = BN_new()) == NULL ||
&lt;br&gt;+		(gb = BN_new()) == NULL ||
&lt;br&gt;+		(B = BN_new())== NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	/* B = g**b + k*v */
&lt;br&gt;+
&lt;br&gt;+	if (!BN_mod_exp(gb,g,b,N,bn_ctx) ||
&lt;br&gt;+	 &amp;nbsp; !(k = srp_Calc_k(N,g)) ||
&lt;br&gt;+	 &amp;nbsp; !BN_mod_mul(kv,v,k,N,bn_ctx) || 
&lt;br&gt;+	 &amp;nbsp; !BN_mod_add(B,gb,kv,N,bn_ctx))
&lt;br&gt;+		{
&lt;br&gt;+		BN_free(B);
&lt;br&gt;+		B = NULL;
&lt;br&gt;+		}
&lt;br&gt;+err:
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	BN_clear_free(kv);
&lt;br&gt;+	BN_clear_free(gb);
&lt;br&gt;+	BN_free(k); 
&lt;br&gt;+	return B;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_x(BIGNUM *s, const char *user, const char *pass)
&lt;br&gt;+	{
&lt;br&gt;+	unsigned char dig[SHA_DIGEST_LENGTH];
&lt;br&gt;+	EVP_MD_CTX ctxt;
&lt;br&gt;+	unsigned char *cs;
&lt;br&gt;+
&lt;br&gt;+	if ((s == NULL) ||
&lt;br&gt;+		(user == NULL) ||
&lt;br&gt;+		(pass == NULL))
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	if ((cs = OPENSSL_malloc(BN_num_bytes(s))) == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	EVP_MD_CTX_init(&amp;ctxt);
&lt;br&gt;+	EVP_DigestInit_ex(&amp;ctxt, EVP_sha1(), NULL);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, user, strlen(user));
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, &amp;quot;:&amp;quot;, 1);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, pass, strlen(pass));
&lt;br&gt;+	EVP_DigestFinal_ex(&amp;ctxt, dig, NULL);
&lt;br&gt;+
&lt;br&gt;+	EVP_DigestInit_ex(&amp;ctxt, EVP_sha1(), NULL);
&lt;br&gt;+	BN_bn2bin(s,cs);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, cs, BN_num_bytes(s));
&lt;br&gt;+	OPENSSL_free(cs);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, dig, sizeof(dig));
&lt;br&gt;+	EVP_DigestFinal_ex(&amp;ctxt, dig, NULL);
&lt;br&gt;+	EVP_MD_CTX_cleanup(&amp;ctxt);
&lt;br&gt;+
&lt;br&gt;+	return BN_bin2bn(dig, sizeof(dig), NULL);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_A(BIGNUM *a, BIGNUM *N, BIGNUM *g)
&lt;br&gt;+	{
&lt;br&gt;+	BN_CTX *bn_ctx; 
&lt;br&gt;+	BIGNUM * A = NULL;
&lt;br&gt;+
&lt;br&gt;+	if (a == NULL || N == NULL || g == NULL ||
&lt;br&gt;+		(bn_ctx = BN_CTX_new()) == NULL) 
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	if ((A = BN_new()) != NULL &amp;&amp;
&lt;br&gt;+	 &amp;nbsp; !BN_mod_exp(A,g,a,N,bn_ctx))
&lt;br&gt;+		{
&lt;br&gt;+		BN_free(A);
&lt;br&gt;+		A = NULL;
&lt;br&gt;+		}
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	return A;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_Calc_client_key(BIGNUM *N, BIGNUM *B, BIGNUM *g, BIGNUM *x, BIGNUM *a, BIGNUM *u)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM *tmp = NULL, *tmp2 = NULL, *tmp3 = NULL , *k = NULL, *K = NULL;
&lt;br&gt;+	BN_CTX *bn_ctx;
&lt;br&gt;+
&lt;br&gt;+	if (u == NULL || B == NULL || N == NULL || g == NULL || x == NULL || a == NULL ||
&lt;br&gt;+		(bn_ctx = BN_CTX_new()) == NULL)
&lt;br&gt;+		return NULL; 
&lt;br&gt;+
&lt;br&gt;+	if ((tmp = BN_new()) == NULL ||
&lt;br&gt;+		(tmp2 = BN_new())== NULL ||
&lt;br&gt;+		(tmp3 = BN_new())== NULL ||
&lt;br&gt;+		(K = BN_new()) == NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+	
&lt;br&gt;+	if (!BN_mod_exp(tmp,g,x,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!(k = srp_Calc_k(N,g)))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_mul(tmp2,tmp,k,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_sub(tmp,B,tmp2,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	if (!BN_mod_mul(tmp3,u,x,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_add(tmp2,a,tmp3,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!BN_mod_exp(K,tmp,tmp2,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+err :
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	BN_clear_free(tmp);
&lt;br&gt;+	BN_clear_free(tmp2);
&lt;br&gt;+	BN_clear_free(tmp3);
&lt;br&gt;+	BN_free(k);
&lt;br&gt;+	return K;	
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_Verify_B_mod_N(BIGNUM *B, BIGNUM *N)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM *r;
&lt;br&gt;+	BN_CTX *bn_ctx; 
&lt;br&gt;+	int ret = 0;
&lt;br&gt;+
&lt;br&gt;+	if (B == NULL || N == NULL ||
&lt;br&gt;+		(bn_ctx = BN_CTX_new()) == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+
&lt;br&gt;+	if ((r = BN_new()) == NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+	/* Checks if B % N == 0 */
&lt;br&gt;+	if (!BN_nnmod(r,B,N,bn_ctx))
&lt;br&gt;+		goto err;
&lt;br&gt;+	ret = !BN_is_zero(r);
&lt;br&gt;+err:
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	BN_free(r);
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_Verify_A_mod_N(BIGNUM *A, BIGNUM *N)
&lt;br&gt;+	{
&lt;br&gt;+	/* Checks if A % N == 0 */
&lt;br&gt;+	return SRP_Verify_B_mod_N(A,N) ;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/* Check if G and N are kwown parameters. 
&lt;br&gt;+ &amp;nbsp; The values have been generated from the ietf-tls-srp draft version 8
&lt;br&gt;+*/
&lt;br&gt;+char * &amp;nbsp;SRP_check_known_gN_param(BIGNUM* g, BIGNUM* N)
&lt;br&gt;+	{
&lt;br&gt;+	int i;
&lt;br&gt;+	if ((g == NULL) || (N == NULL))
&lt;br&gt;+		return 0;
&lt;br&gt;+
&lt;br&gt;+	srp_bn_print(g);
&lt;br&gt;+	srp_bn_print(N);
&lt;br&gt;+
&lt;br&gt;+	for(i = 0; i &amp;lt; KNOWN_GN_NUMBER; i++)
&lt;br&gt;+		{
&lt;br&gt;+		if (BN_cmp(knowngN[i].g,g) == 0 &amp;&amp; BN_cmp(knowngN[i].N,N) == 0) 
&lt;br&gt;+			return knowngN[i].id;
&lt;br&gt;+		}
&lt;br&gt;+	return NULL;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+SRP_gN *SRP_get_default_gN(const char * id)
&lt;br&gt;+	{
&lt;br&gt;+	int i; 
&lt;br&gt;+
&lt;br&gt;+	if (id == NULL) 
&lt;br&gt;+		return knowngN;
&lt;br&gt;+	for(i = 0; i &amp;lt; KNOWN_GN_NUMBER; i++)
&lt;br&gt;+		{
&lt;br&gt;+		if (strcmp(knowngN[i].id,id)==0)
&lt;br&gt;+			return knowngN+i;
&lt;br&gt;+		}
&lt;br&gt;+	return NULL;
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srptest.c openssl-SNAP-20091218-srp/crypto/srp/srptest.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srptest.c	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srptest.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -0,0 +1,161 @@
&lt;br&gt;+#include &amp;lt;openssl/opensslconf.h&amp;gt;
&lt;br&gt;+#ifdef OPENSSL_NO_SRP
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;stdio.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+int main(int argc, char *argv[])
&lt;br&gt;+	{
&lt;br&gt;+	printf(&amp;quot;No SRP support\n&amp;quot;);
&lt;br&gt;+	return(0);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#else
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/rand.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/err.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+static void showbn(const char *name, const BIGNUM *bn)
&lt;br&gt;+	{
&lt;br&gt;+	fputs(name, stdout);
&lt;br&gt;+	fputs(&amp;quot; = &amp;quot;, stdout);
&lt;br&gt;+	BN_print_fp(stdout, bn);
&lt;br&gt;+	putc('\n', stdout);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#define RANDOM_SIZE 32	/* use 256 bits on each side */
&lt;br&gt;+
&lt;br&gt;+static int run_srp(const char *username, const char *client_pass, const char *server_pass)
&lt;br&gt;+	{
&lt;br&gt;+	int ret=-1;
&lt;br&gt;+	BIGNUM *s = NULL;
&lt;br&gt;+	BIGNUM *v = NULL;
&lt;br&gt;+	BIGNUM *a = NULL;
&lt;br&gt;+	BIGNUM *b = NULL;
&lt;br&gt;+	BIGNUM *u = NULL;
&lt;br&gt;+	BIGNUM *x = NULL;
&lt;br&gt;+	BIGNUM *Apub = NULL;
&lt;br&gt;+	BIGNUM *Bpub = NULL;
&lt;br&gt;+	BIGNUM *Kclient = NULL;
&lt;br&gt;+	BIGNUM *Kserver = NULL;
&lt;br&gt;+	unsigned char rand_tmp[RANDOM_SIZE];
&lt;br&gt;+	SRP_gN *GN = SRP_get_default_gN(&amp;quot;1024&amp;quot;); // use builtin 1024-bit params
&lt;br&gt;+
&lt;br&gt;+	if(GN == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Failed to get SRP parameters\n&amp;quot;);
&lt;br&gt;+		return -1;
&lt;br&gt;+		}
&lt;br&gt;+	/* Set up server's password entry */
&lt;br&gt;+	if(!SRP_create_verifier_BN(username, server_pass, &amp;s, &amp;v, GN-&amp;gt;N, GN-&amp;gt;g))
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Failed to create SRP verifier\n&amp;quot;);
&lt;br&gt;+		return -1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	showbn(&amp;quot;N&amp;quot;, GN-&amp;gt;N);
&lt;br&gt;+	showbn(&amp;quot;g&amp;quot;, GN-&amp;gt;g);
&lt;br&gt;+	showbn(&amp;quot;Salt&amp;quot;, s);
&lt;br&gt;+	showbn(&amp;quot;Verifier&amp;quot;, v);
&lt;br&gt;+
&lt;br&gt;+	/* Server random */
&lt;br&gt;+	RAND_pseudo_bytes(rand_tmp, sizeof(rand_tmp));
&lt;br&gt;+	b = BN_bin2bn(rand_tmp, sizeof(rand_tmp), NULL);
&lt;br&gt;+	/* TODO - check b != 0 */
&lt;br&gt;+	showbn(&amp;quot;b&amp;quot;, b);
&lt;br&gt;+
&lt;br&gt;+	/* Server's first message */
&lt;br&gt;+	Bpub = SRP_Calc_B(b, GN-&amp;gt;N, GN-&amp;gt;g, v);
&lt;br&gt;+	showbn(&amp;quot;B&amp;quot;, Bpub);
&lt;br&gt;+
&lt;br&gt;+	if(!SRP_Verify_B_mod_N(Bpub, GN-&amp;gt;N))
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Invalid B\n&amp;quot;);
&lt;br&gt;+		return -1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	/* Client random */
&lt;br&gt;+	RAND_pseudo_bytes(rand_tmp, sizeof(rand_tmp));
&lt;br&gt;+	a = BN_bin2bn(rand_tmp, sizeof(rand_tmp), NULL);
&lt;br&gt;+	/* TODO - check a != 0 */
&lt;br&gt;+	showbn(&amp;quot;a&amp;quot;, a);
&lt;br&gt;+
&lt;br&gt;+	/* Client's response */
&lt;br&gt;+	Apub = SRP_Calc_A(a, GN-&amp;gt;N, GN-&amp;gt;g);
&lt;br&gt;+	showbn(&amp;quot;A&amp;quot;, Apub);
&lt;br&gt;+
&lt;br&gt;+	if(!SRP_Verify_A_mod_N(Apub, GN-&amp;gt;N))
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Invalid A\n&amp;quot;);
&lt;br&gt;+		return -1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	/* Both sides calculate u */
&lt;br&gt;+	u = SRP_Calc_u(Apub, Bpub, GN-&amp;gt;N);
&lt;br&gt;+
&lt;br&gt;+	/* Client's key */
&lt;br&gt;+	x = SRP_Calc_x(s, username, client_pass);
&lt;br&gt;+	Kclient = SRP_Calc_client_key(GN-&amp;gt;N, Bpub, GN-&amp;gt;g, x, a, u);
&lt;br&gt;+	showbn(&amp;quot;Client's key&amp;quot;, Kclient);
&lt;br&gt;+
&lt;br&gt;+	/* Server's key */
&lt;br&gt;+	Kserver = SRP_Calc_server_key(Apub, v, u, b, GN-&amp;gt;N);
&lt;br&gt;+	showbn(&amp;quot;Server's key&amp;quot;, Kserver);
&lt;br&gt;+
&lt;br&gt;+	if(BN_cmp(Kclient, Kserver) == 0)
&lt;br&gt;+		{
&lt;br&gt;+		ret = 0;
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Keys mismatch\n&amp;quot;);
&lt;br&gt;+		ret = 1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	BN_clear_free(Kclient);
&lt;br&gt;+	BN_clear_free(Kserver);
&lt;br&gt;+	BN_clear_free(x);
&lt;br&gt;+	BN_free(u);
&lt;br&gt;+	BN_free(Apub);
&lt;br&gt;+	BN_clear_free(a);
&lt;br&gt;+	BN_free(Bpub);
&lt;br&gt;+	BN_clear_free(b);
&lt;br&gt;+	BN_free(s);
&lt;br&gt;+	BN_clear_free(v);
&lt;br&gt;+
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int main(int argc, char **argv)
&lt;br&gt;+	{
&lt;br&gt;+	BIO *bio_err;
&lt;br&gt;+	bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
&lt;br&gt;+
&lt;br&gt;+	CRYPTO_malloc_debug_init();
&lt;br&gt;+	CRYPTO_dbg_set_options(V_CRYPTO_MDEBUG_ALL);
&lt;br&gt;+	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
&lt;br&gt;+
&lt;br&gt;+	ERR_load_crypto_strings();
&lt;br&gt;+
&lt;br&gt;+	/* &amp;quot;Negative&amp;quot; test, expect a mismatch */
&lt;br&gt;+	if(run_srp(&amp;quot;alice&amp;quot;, &amp;quot;password1&amp;quot;, &amp;quot;password2&amp;quot;) == 0)
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Mismatched SRP run failed\n&amp;quot;);
&lt;br&gt;+		return 1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	/* &amp;quot;Positive&amp;quot; test, should pass */
&lt;br&gt;+	if(run_srp(&amp;quot;alice&amp;quot;, &amp;quot;password&amp;quot;, &amp;quot;password&amp;quot;) != 0)
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;Plain SRP run failed\n&amp;quot;);
&lt;br&gt;+		return 1;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	CRYPTO_cleanup_all_ex_data();
&lt;br&gt;+	ERR_remove_thread_state(NULL);
&lt;br&gt;+	ERR_free_strings();
&lt;br&gt;+	CRYPTO_mem_leaks(bio_err);
&lt;br&gt;+
&lt;br&gt;+	return 0;
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/srp/srp_vfy.c openssl-SNAP-20091218-srp/crypto/srp/srp_vfy.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/srp/srp_vfy.c	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/srp/srp_vfy.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -0,0 +1,650 @@
&lt;br&gt;+/* crypto/srp/srp_vfy.c */
&lt;br&gt;+/* Written by Christophe Renou (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=18&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;christophe.renou@...&lt;/a&gt;) with 
&lt;br&gt;+ * the precious help of Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=19&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) 
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=20&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=21&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=22&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;quot;cryptlib.h&amp;quot;
&lt;br&gt;+#include &amp;quot;srp_lcl.h&amp;quot;
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/evp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/buffer.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/rand.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/txt_db.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#define SRP_RANDOM_SALT_LEN 20
&lt;br&gt;+#define MAX_LEN 2500
&lt;br&gt;+
&lt;br&gt;+static char b64table[] =
&lt;br&gt;+ &amp;nbsp;&amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./&amp;quot;;
&lt;br&gt;+
&lt;br&gt;+/* the following two conversion routines have been inspired by code from Stanford */ 
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Convert a base64 string into raw byte array representation.
&lt;br&gt;+ */
&lt;br&gt;+static int t_fromb64(char * a, const char * src)
&lt;br&gt;+	{
&lt;br&gt;+	char *loc;
&lt;br&gt;+	int i, j;
&lt;br&gt;+	int size;
&lt;br&gt;+
&lt;br&gt;+	while(*src &amp;&amp; (*src == ' ' || *src == '\t' || *src == '\n'))
&lt;br&gt;+		++src;
&lt;br&gt;+	size = strlen(src);
&lt;br&gt;+	i = 0;
&lt;br&gt;+	while(i &amp;lt; size)
&lt;br&gt;+		{
&lt;br&gt;+		loc = strchr(b64table, src[i]);
&lt;br&gt;+		if(loc == (char *) 0) break;
&lt;br&gt;+		else a[i] = loc - b64table;
&lt;br&gt;+		++i;
&lt;br&gt;+		}
&lt;br&gt;+	size = i;
&lt;br&gt;+	i = size - 1;
&lt;br&gt;+	j = size;
&lt;br&gt;+	while(1)
&lt;br&gt;+		{
&lt;br&gt;+		a[j] = a[i];
&lt;br&gt;+		if(--i &amp;lt; 0) break;
&lt;br&gt;+		a[j] |= (a[i] &amp; 3) &amp;lt;&amp;lt; 6;
&lt;br&gt;+		--j;
&lt;br&gt;+		a[j] = (unsigned char) ((a[i] &amp; 0x3c) &amp;gt;&amp;gt; 2);
&lt;br&gt;+		if(--i &amp;lt; 0) break;
&lt;br&gt;+		a[j] |= (a[i] &amp; 0xf) &amp;lt;&amp;lt; 4;
&lt;br&gt;+		--j;
&lt;br&gt;+		a[j] = (unsigned char) ((a[i] &amp; 0x30) &amp;gt;&amp;gt; 4);
&lt;br&gt;+		if(--i &amp;lt; 0) break;
&lt;br&gt;+		a[j] |= (a[i] &amp;lt;&amp;lt; 2);
&lt;br&gt;+
&lt;br&gt;+		a[--j] = 0;
&lt;br&gt;+		if(--i &amp;lt; 0) break;
&lt;br&gt;+		}
&lt;br&gt;+	while(a[j] == 0 &amp;&amp; j &amp;lt;= size) ++j;
&lt;br&gt;+	i = 0;
&lt;br&gt;+	while (j &amp;lt;= size) a[i++] = a[j++];
&lt;br&gt;+	return i;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * Convert a raw byte string into a null-terminated base64 ASCII string.
&lt;br&gt;+ */
&lt;br&gt;+static char *t_tob64(char * dst, const char * src, int size)
&lt;br&gt;+	{
&lt;br&gt;+	int c, pos = size % 3;
&lt;br&gt;+	unsigned char b0 = 0, b1 = 0, b2 = 0, notleading = 0;
&lt;br&gt;+	char *olddst = dst;
&lt;br&gt;+
&lt;br&gt;+	switch(pos)
&lt;br&gt;+		{
&lt;br&gt;+	case 1:
&lt;br&gt;+		b2 = src[0];
&lt;br&gt;+		break;
&lt;br&gt;+	case 2:
&lt;br&gt;+		b1 = src[0];
&lt;br&gt;+		b2 = src[1];
&lt;br&gt;+		break;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	while(1)
&lt;br&gt;+		{
&lt;br&gt;+		c = (b0 &amp; 0xfc) &amp;gt;&amp;gt; 2;
&lt;br&gt;+		if(notleading || c != 0)
&lt;br&gt;+			{
&lt;br&gt;+			*dst++ = b64table[c];
&lt;br&gt;+			notleading = 1;
&lt;br&gt;+			}
&lt;br&gt;+		c = ((b0 &amp; 3) &amp;lt;&amp;lt; 4) | ((b1 &amp; 0xf0) &amp;gt;&amp;gt; 4);
&lt;br&gt;+		if(notleading || c != 0)
&lt;br&gt;+			{
&lt;br&gt;+			*dst++ = b64table[c];
&lt;br&gt;+			notleading = 1;
&lt;br&gt;+			}
&lt;br&gt;+		c = ((b1 &amp; 0xf) &amp;lt;&amp;lt; 2) | ((b2 &amp; 0xc0) &amp;gt;&amp;gt; 6);
&lt;br&gt;+		if(notleading || c != 0)
&lt;br&gt;+			{
&lt;br&gt;+			*dst++ = b64table[c];
&lt;br&gt;+			notleading = 1;
&lt;br&gt;+			}
&lt;br&gt;+		c = b2 &amp; 0x3f;
&lt;br&gt;+		if(notleading || c != 0)
&lt;br&gt;+			{
&lt;br&gt;+			*dst++ = b64table[c];
&lt;br&gt;+			notleading = 1;
&lt;br&gt;+			}
&lt;br&gt;+		if(pos &amp;gt;= size) break;
&lt;br&gt;+		else
&lt;br&gt;+			{
&lt;br&gt;+			b0 = src[pos++];
&lt;br&gt;+			b1 = src[pos++];
&lt;br&gt;+			b2 = src[pos++];
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	*dst++ = '\0';
&lt;br&gt;+	return olddst;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+void SRP_user_pwd_free(SRP_user_pwd *user_pwd)
&lt;br&gt;+	{
&lt;br&gt;+	if (user_pwd == NULL) 
&lt;br&gt;+		return;
&lt;br&gt;+	BN_free(user_pwd-&amp;gt;s);
&lt;br&gt;+	BN_clear_free(user_pwd-&amp;gt;v);
&lt;br&gt;+	OPENSSL_free(user_pwd-&amp;gt;id);
&lt;br&gt;+	OPENSSL_free(user_pwd-&amp;gt;info);
&lt;br&gt;+	OPENSSL_free(user_pwd);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+SRP_user_pwd * SRP_user_pwd_new()
&lt;br&gt;+	{
&lt;br&gt;+	SRP_user_pwd * ret = OPENSSL_malloc(sizeof(SRP_user_pwd));
&lt;br&gt;+	if (ret == NULL)
&lt;br&gt;+		return NULL;								
&lt;br&gt;+	ret-&amp;gt;N = NULL;
&lt;br&gt;+	ret-&amp;gt;g = NULL;	
&lt;br&gt;+	ret-&amp;gt;s = NULL;
&lt;br&gt;+	ret-&amp;gt;v = NULL;
&lt;br&gt;+	ret-&amp;gt;id = NULL ;
&lt;br&gt;+	ret-&amp;gt;info = NULL;
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+void SRP_user_pwd_set_gN(SRP_user_pwd * vinfo, BIGNUM * g, BIGNUM * N)
&lt;br&gt;+	{
&lt;br&gt;+	vinfo-&amp;gt;N = N;
&lt;br&gt;+	vinfo-&amp;gt;g = g;	
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_user_pwd_set_ids(SRP_user_pwd * vinfo, char * id, char * info)
&lt;br&gt;+	{
&lt;br&gt;+	if (id != NULL &amp;&amp; NULL == (vinfo-&amp;gt;id = BUF_strdup(id)))
&lt;br&gt;+		return 0;
&lt;br&gt;+	return (info == NULL || NULL != (vinfo-&amp;gt;info = BUF_strdup(info))) ;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_user_pwd_set_sv(SRP_user_pwd * vinfo, char * s, char * v)
&lt;br&gt;+	{
&lt;br&gt;+	char tmp[MAX_LEN]; 
&lt;br&gt;+	int len ;
&lt;br&gt;+	if (strlen(s) &amp;gt; MAX_LEN || strlen(v) &amp;gt; MAX_LEN) 
&lt;br&gt;+		return 0; 
&lt;br&gt;+	len = t_fromb64(tmp,v);
&lt;br&gt;+	if (NULL == (vinfo-&amp;gt;v = BN_bin2bn(tmp,len,NULL)) )
&lt;br&gt;+		return 0;
&lt;br&gt;+	len = t_fromb64(tmp,s);
&lt;br&gt;+	return ((vinfo-&amp;gt;s = BN_bin2bn(tmp,len,NULL)) != NULL) ;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_user_pwd_set_sv_BN(SRP_user_pwd * vinfo, BIGNUM * s, BIGNUM * v)
&lt;br&gt;+	{
&lt;br&gt;+	vinfo-&amp;gt;v = v;
&lt;br&gt;+	vinfo-&amp;gt;s = s;
&lt;br&gt;+	return (vinfo-&amp;gt;s != NULL &amp;&amp; vinfo-&amp;gt;v != NULL) ;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+SRP_VBASE *SRP_VBASE_new(char *seed_key)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_VBASE *vb = (SRP_VBASE *) OPENSSL_malloc(sizeof(SRP_VBASE));
&lt;br&gt;+
&lt;br&gt;+	if (vb == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+	if (!(vb-&amp;gt;users_pwd = sk_SRP_user_pwd_new_null()) ||
&lt;br&gt;+		!(vb-&amp;gt;gN_cache = sk_SRP_gN_cache_new_null()))
&lt;br&gt;+		{
&lt;br&gt;+		OPENSSL_free(vb);
&lt;br&gt;+		return NULL;
&lt;br&gt;+		}
&lt;br&gt;+	vb-&amp;gt;default_g = NULL;
&lt;br&gt;+	vb-&amp;gt;default_N = NULL;
&lt;br&gt;+	vb-&amp;gt;seed_key = NULL;
&lt;br&gt;+	if ((seed_key != NULL) &amp;&amp; 
&lt;br&gt;+		(vb-&amp;gt;seed_key = BUF_strdup(seed_key)) == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		sk_SRP_user_pwd_free(vb-&amp;gt;users_pwd);
&lt;br&gt;+		sk_SRP_gN_cache_free(vb-&amp;gt;gN_cache);
&lt;br&gt;+		OPENSSL_free(vb);
&lt;br&gt;+		return NULL;
&lt;br&gt;+		}
&lt;br&gt;+	return vb;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+int SRP_VBASE_free(SRP_VBASE *vb)
&lt;br&gt;+	{
&lt;br&gt;+	sk_SRP_user_pwd_pop_free(vb-&amp;gt;users_pwd,SRP_user_pwd_free);
&lt;br&gt;+	sk_SRP_gN_cache_free(vb-&amp;gt;gN_cache);
&lt;br&gt;+	OPENSSL_free(vb-&amp;gt;seed_key);
&lt;br&gt;+	OPENSSL_free(vb);
&lt;br&gt;+	return 0;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+SRP_gN_cache *SRP_gN_new_init(char *ch)
&lt;br&gt;+	{
&lt;br&gt;+	char tmp[MAX_LEN];
&lt;br&gt;+	int len;
&lt;br&gt;+
&lt;br&gt;+	SRP_gN_cache *newgN = (SRP_gN_cache *)OPENSSL_malloc(sizeof(SRP_gN_cache));
&lt;br&gt;+	if (newgN == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	if ((newgN-&amp;gt;b64_bn = BUF_strdup(ch)) == NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	len = t_fromb64(tmp,ch);
&lt;br&gt;+	if ((newgN-&amp;gt;bn = BN_bin2bn(tmp,len,NULL)))
&lt;br&gt;+		return newgN;
&lt;br&gt;+
&lt;br&gt;+	OPENSSL_free(newgN-&amp;gt;b64_bn);
&lt;br&gt;+err:
&lt;br&gt;+	OPENSSL_free(newgN);
&lt;br&gt;+	return NULL;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+void SRP_gN_free(SRP_gN_cache *gN_cache)
&lt;br&gt;+	{
&lt;br&gt;+	if (gN_cache == NULL)
&lt;br&gt;+		return;
&lt;br&gt;+	OPENSSL_free(gN_cache-&amp;gt;b64_bn);
&lt;br&gt;+	BN_free(gN_cache-&amp;gt;bn);
&lt;br&gt;+	OPENSSL_free(gN_cache);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+SRP_gN *SRP_get_gN_by_id(char *id, STACK_OF(SRP_gN) *gN_tab)
&lt;br&gt;+	{
&lt;br&gt;+	int i;
&lt;br&gt;+
&lt;br&gt;+	SRP_gN *gN;
&lt;br&gt;+	if (gN_tab != NULL) 
&lt;br&gt;+	for(i = 0; i &amp;lt; sk_SRP_gN_num(gN_tab); i++)
&lt;br&gt;+		{
&lt;br&gt;+		gN = sk_SRP_gN_value(gN_tab, i);
&lt;br&gt;+		if (gN &amp;&amp; (id == NULL || strcmp(gN-&amp;gt;id,id)==0))
&lt;br&gt;+			return gN;
&lt;br&gt;+		}
&lt;br&gt;+	
&lt;br&gt;+	return SRP_get_default_gN(id);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SRP_gN_place_bn(STACK_OF(SRP_gN_cache) *gN_cache, char *ch)
&lt;br&gt;+	{
&lt;br&gt;+	int i;
&lt;br&gt;+	if (gN_cache == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	/* search if we have already one... */
&lt;br&gt;+	for(i = 0; i &amp;lt; sk_SRP_gN_cache_num(gN_cache); i++)
&lt;br&gt;+		{
&lt;br&gt;+		SRP_gN_cache *cache = sk_SRP_gN_cache_value(gN_cache, i);
&lt;br&gt;+		if (strcmp(cache-&amp;gt;b64_bn,ch)==0)
&lt;br&gt;+			return cache-&amp;gt;bn;
&lt;br&gt;+		}
&lt;br&gt;+		{		/* it is the first time that we find it */
&lt;br&gt;+		SRP_gN_cache *newgN = SRP_gN_new_init(ch);
&lt;br&gt;+		if (newgN)
&lt;br&gt;+			{
&lt;br&gt;+			if (sk_SRP_gN_cache_insert(gN_cache,newgN,0)&amp;gt;0)
&lt;br&gt;+				return newgN-&amp;gt;bn;
&lt;br&gt;+			SRP_gN_free(newgN);
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	return NULL;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/* this function parses verifier file. Format is:
&lt;br&gt;+ * string(index):base64(N):base64(g):0
&lt;br&gt;+ * string(username):base64(v):base64(salt):int(index)
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+int SRP_VBASE_init(SRP_VBASE *vb, char * verifier_file)
&lt;br&gt;+	{
&lt;br&gt;+	int error_code ;
&lt;br&gt;+	STACK_OF(SRP_gN) *SRP_gN_tab = sk_SRP_gN_new_null();
&lt;br&gt;+	char * last_index = NULL;
&lt;br&gt;+	int i;
&lt;br&gt;+	char ** pp;
&lt;br&gt;+
&lt;br&gt;+	SRP_gN *gN = NULL;
&lt;br&gt;+	SRP_user_pwd *user_pwd = NULL ;
&lt;br&gt;+
&lt;br&gt;+	TXT_DB *tmpdb = NULL;
&lt;br&gt;+	BIO *in = BIO_new(BIO_s_file());
&lt;br&gt;+
&lt;br&gt;+	error_code = SRP_ERR_OPEN_FILE;
&lt;br&gt;+
&lt;br&gt;+	if (in == NULL || BIO_read_filename(in,verifier_file) &amp;lt;= 0)
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	error_code = SRP_ERR_VBASE_INCOMPLETE_FILE;
&lt;br&gt;+
&lt;br&gt;+	if ((tmpdb =TXT_DB_read(in,DB_NUMBER)) == NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	error_code = SRP_ERR_MEMORY;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+	if (vb-&amp;gt;seed_key)
&lt;br&gt;+		{
&lt;br&gt;+		last_index = SRP_get_default_gN(NULL)-&amp;gt;id;
&lt;br&gt;+		}
&lt;br&gt;+	for (i=0; i&amp;lt;sk_num(tmpdb-&amp;gt;data); i++)
&lt;br&gt;+		{
&lt;br&gt;+		pp=(char **)sk_value(tmpdb-&amp;gt;data,i);
&lt;br&gt;+		if (pp[DB_srptype][0] == DB_SRP_INDEX)
&lt;br&gt;+			{
&lt;br&gt;+			/*we add this couple in the internal Stack */
&lt;br&gt;+
&lt;br&gt;+			if ((gN = (SRP_gN *)OPENSSL_malloc(sizeof(SRP_gN))) == NULL) 
&lt;br&gt;+ 				goto err;
&lt;br&gt;+
&lt;br&gt;+			if &amp;nbsp;(!(gN-&amp;gt;id = BUF_strdup(pp[DB_srpid]))
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|| &amp;nbsp;!(gN-&amp;gt;N = SRP_gN_place_bn(vb-&amp;gt;gN_cache,pp[DB_srpverifier]))
&lt;br&gt;+			|| &amp;nbsp;!(gN-&amp;gt;g = SRP_gN_place_bn(vb-&amp;gt;gN_cache,pp[DB_srpsalt]))
&lt;br&gt;+			|| &amp;nbsp;sk_SRP_gN_insert(SRP_gN_tab,gN,0) == 0)
&lt;br&gt;+				goto err;
&lt;br&gt;+
&lt;br&gt;+			gN = NULL;
&lt;br&gt;+
&lt;br&gt;+			if (vb-&amp;gt;seed_key != NULL)
&lt;br&gt;+				{
&lt;br&gt;+				last_index = pp[DB_srpid];
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else if (pp[DB_srptype][0] == DB_SRP_VALID)
&lt;br&gt;+			{
&lt;br&gt;+			/* it is a user .... */
&lt;br&gt;+			SRP_gN *gN;
&lt;br&gt;+			if ((gN = SRP_get_gN_by_id(pp[DB_srpgN],SRP_gN_tab))!=NULL)
&lt;br&gt;+				{
&lt;br&gt;+				error_code = SRP_ERR_MEMORY;
&lt;br&gt;+				if ((user_pwd = SRP_user_pwd_new()) == NULL) 
&lt;br&gt;+					goto err;
&lt;br&gt;+				
&lt;br&gt;+				SRP_user_pwd_set_gN(user_pwd,gN-&amp;gt;g,gN-&amp;gt;N);
&lt;br&gt;+				if (!SRP_user_pwd_set_ids(user_pwd,pp[DB_srpid],pp[DB_srpinfo]))
&lt;br&gt;+					goto err;
&lt;br&gt;+				
&lt;br&gt;+				error_code = SRP_ERR_VBASE_BN_LIB;
&lt;br&gt;+				if (!SRP_user_pwd_set_sv(user_pwd,pp[DB_srpsalt],pp[DB_srpverifier]))
&lt;br&gt;+					goto err;
&lt;br&gt;+
&lt;br&gt;+				if (sk_SRP_gN_insert(vb-&amp;gt;users_pwd,user_pwd,0) == 0)
&lt;br&gt;+					goto err;
&lt;br&gt;+				user_pwd = NULL; /* abandon responsability */
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	
&lt;br&gt;+	if (last_index != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		/* this means that we want to simulate a default user */
&lt;br&gt;+
&lt;br&gt;+		if (((gN = SRP_get_gN_by_id(last_index,SRP_gN_tab))==NULL))
&lt;br&gt;+			{
&lt;br&gt;+			error_code = SRP_ERR_VBASE_BN_LIB;
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		vb-&amp;gt;default_g = gN-&amp;gt;g ;
&lt;br&gt;+		vb-&amp;gt;default_N = gN-&amp;gt;N ;
&lt;br&gt;+		gN = NULL ;
&lt;br&gt;+		}
&lt;br&gt;+	error_code = SRP_NO_ERROR;
&lt;br&gt;+
&lt;br&gt;+ err:
&lt;br&gt;+	/* there may be still some leaks to fix, if this fails, the application terminates most likely */
&lt;br&gt;+
&lt;br&gt;+	if (gN != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		OPENSSL_free(gN-&amp;gt;id);
&lt;br&gt;+		OPENSSL_free(gN);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	SRP_user_pwd_free(user_pwd);
&lt;br&gt;+
&lt;br&gt;+	if (tmpdb) TXT_DB_free(tmpdb);
&lt;br&gt;+	if (in) BIO_free_all(in);
&lt;br&gt;+
&lt;br&gt;+	sk_SRP_gN_free(SRP_gN_tab);
&lt;br&gt;+
&lt;br&gt;+	return error_code;
&lt;br&gt;+
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username)
&lt;br&gt;+	{
&lt;br&gt;+	int i;
&lt;br&gt;+	SRP_user_pwd *user;
&lt;br&gt;+	unsigned char digv[SHA_DIGEST_LENGTH];
&lt;br&gt;+	unsigned char digs[SHA_DIGEST_LENGTH];
&lt;br&gt;+	EVP_MD_CTX ctxt;
&lt;br&gt;+
&lt;br&gt;+	if (vb == NULL)
&lt;br&gt;+		return NULL;
&lt;br&gt;+	for(i = 0; i &amp;lt; sk_SRP_user_pwd_num(vb-&amp;gt;users_pwd); i++)
&lt;br&gt;+		{
&lt;br&gt;+		user = sk_SRP_user_pwd_value(vb-&amp;gt;users_pwd, i);
&lt;br&gt;+		if (strcmp(user-&amp;gt;id,username)==0)
&lt;br&gt;+			return user;
&lt;br&gt;+		}
&lt;br&gt;+	if ((vb-&amp;gt;seed_key == NULL) ||
&lt;br&gt;+		(vb-&amp;gt;default_g == NULL) ||
&lt;br&gt;+		(vb-&amp;gt;default_N == NULL))
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+/* if the user is unknown we set parameters as well if we have a seed_key */
&lt;br&gt;+
&lt;br&gt;+	if ((user = SRP_user_pwd_new()) == NULL) 
&lt;br&gt;+		return NULL;
&lt;br&gt;+
&lt;br&gt;+	SRP_user_pwd_set_gN(user,vb-&amp;gt;default_g,vb-&amp;gt;default_N);
&lt;br&gt;+				
&lt;br&gt;+	if (!SRP_user_pwd_set_ids(user,username,NULL))
&lt;br&gt;+		goto err;
&lt;br&gt;+		
&lt;br&gt;+	RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH);
&lt;br&gt;+	EVP_MD_CTX_init(&amp;ctxt);
&lt;br&gt;+	EVP_DigestInit_ex(&amp;ctxt, EVP_sha1(), NULL);
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, vb-&amp;gt;seed_key, strlen(vb-&amp;gt;seed_key));
&lt;br&gt;+	EVP_DigestUpdate(&amp;ctxt, username, strlen(username));
&lt;br&gt;+	EVP_DigestFinal_ex(&amp;ctxt, digs, NULL);
&lt;br&gt;+	EVP_MD_CTX_cleanup(&amp;ctxt);
&lt;br&gt;+	if (SRP_user_pwd_set_sv_BN(user, BN_bin2bn(digs,SHA_DIGEST_LENGTH,NULL), BN_bin2bn(digv,SHA_DIGEST_LENGTH, NULL))) 
&lt;br&gt;+		return user;
&lt;br&gt;+
&lt;br&gt;+err: &amp;nbsp; &amp;nbsp;SRP_user_pwd_free(user);
&lt;br&gt;+	return NULL;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ &amp;nbsp; create a verifier (*salt,*verifier,g and N are in base64)
&lt;br&gt;+*/
&lt;br&gt;+char * SRP_create_verifier(const char *user, const char *pass, char **salt, char **verifier, char *N, char *g)
&lt;br&gt;+	{
&lt;br&gt;+	int len;
&lt;br&gt;+	char * result=NULL;
&lt;br&gt;+	char *vf;
&lt;br&gt;+	BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL;
&lt;br&gt;+	char tmp[MAX_LEN];
&lt;br&gt;+	char tmp2[MAX_LEN];
&lt;br&gt;+	char * defgNid = NULL;
&lt;br&gt;+
&lt;br&gt;+	if ((user == NULL)||
&lt;br&gt;+		(pass == NULL)||
&lt;br&gt;+		(salt == NULL)||
&lt;br&gt;+		(verifier == NULL))
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	if (N)
&lt;br&gt;+		{
&lt;br&gt;+		if (!(len = t_fromb64(tmp,N))) goto err;
&lt;br&gt;+		N_bn = BN_bin2bn(tmp,len,NULL);
&lt;br&gt;+		if (!(len = t_fromb64(tmp,g))) goto err;
&lt;br&gt;+		g_bn = BN_bin2bn(tmp,len,NULL);
&lt;br&gt;+		defgNid = &amp;quot;*&amp;quot;;
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+		{ 
&lt;br&gt;+		SRP_gN * gN = SRP_get_gN_by_id(g, NULL) ;
&lt;br&gt;+		if (gN == NULL)
&lt;br&gt;+			goto err;
&lt;br&gt;+		N_bn = gN-&amp;gt;N;
&lt;br&gt;+		g_bn = gN-&amp;gt;g;
&lt;br&gt;+		defgNid = gN-&amp;gt;id;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	if (*salt == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN);
&lt;br&gt;+
&lt;br&gt;+		s = BN_bin2bn(tmp2,SRP_RANDOM_SALT_LEN,NULL);
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+		{
&lt;br&gt;+		if (!(len = t_fromb64(tmp2,*salt)))
&lt;br&gt;+			goto err;
&lt;br&gt;+		s = BN_bin2bn(tmp2,len,NULL);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+	if(!SRP_create_verifier_BN(user, pass, &amp;s, &amp;v, N_bn, g_bn)) goto err;
&lt;br&gt;+
&lt;br&gt;+	BN_bn2bin(v,tmp);
&lt;br&gt;+	if (((vf = OPENSSL_malloc(BN_num_bytes(v)*2)) == NULL))
&lt;br&gt;+		goto err;
&lt;br&gt;+	t_tob64(vf,tmp,BN_num_bytes(v));
&lt;br&gt;+
&lt;br&gt;+	*verifier = vf;
&lt;br&gt;+	if (*salt == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		if ((*salt = (char *)OPENSSL_malloc(SRP_RANDOM_SALT_LEN*2)) == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			OPENSSL_free(vf);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		t_tob64(*salt,tmp2,SRP_RANDOM_SALT_LEN);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	result=defgNid;
&lt;br&gt;+
&lt;br&gt;+err:
&lt;br&gt;+	if(N)
&lt;br&gt;+		{
&lt;br&gt;+		BN_free(N_bn);
&lt;br&gt;+		BN_free(g_bn);
&lt;br&gt;+		}
&lt;br&gt;+	return result;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ &amp;nbsp; create a verifier (*salt,*verifier,g and N are BIGNUMs)
&lt;br&gt;+*/
&lt;br&gt;+int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt, BIGNUM **verifier, BIGNUM *N, BIGNUM *g)
&lt;br&gt;+	{
&lt;br&gt;+	int result=0;
&lt;br&gt;+	BIGNUM *x = NULL;
&lt;br&gt;+	BN_CTX *bn_ctx = BN_CTX_new();
&lt;br&gt;+	char tmp2[MAX_LEN];
&lt;br&gt;+
&lt;br&gt;+	if ((user == NULL)||
&lt;br&gt;+		(pass == NULL)||
&lt;br&gt;+		(salt == NULL)||
&lt;br&gt;+		(verifier == NULL)||
&lt;br&gt;+		(N == NULL)||
&lt;br&gt;+		(g == NULL)||
&lt;br&gt;+		(bn_ctx == NULL))
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	srp_bn_print(N);
&lt;br&gt;+	srp_bn_print(g);
&lt;br&gt;+
&lt;br&gt;+	if (*salt == NULL)
&lt;br&gt;+		{
&lt;br&gt;+		RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN);
&lt;br&gt;+
&lt;br&gt;+		*salt = BN_bin2bn(tmp2,SRP_RANDOM_SALT_LEN,NULL);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	x = SRP_Calc_x(*salt,user,pass);
&lt;br&gt;+
&lt;br&gt;+	*verifier = BN_new();
&lt;br&gt;+	if(*verifier == NULL) goto err;
&lt;br&gt;+
&lt;br&gt;+	if (!BN_mod_exp(*verifier,g,x,N,bn_ctx))
&lt;br&gt;+		{
&lt;br&gt;+		BN_clear_free(*verifier);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	srp_bn_print(*verifier);
&lt;br&gt;+
&lt;br&gt;+	result=1;
&lt;br&gt;+
&lt;br&gt;+err:
&lt;br&gt;+
&lt;br&gt;+	BN_clear_free(x);
&lt;br&gt;+	BN_CTX_free(bn_ctx);
&lt;br&gt;+	return result;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/crypto/stack/safestack.h openssl-SNAP-20091218-srp/crypto/stack/safestack.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/crypto/stack/safestack.h	2009-07-27 22:00:50.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/crypto/stack/safestack.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -1458,6 +1458,66 @@
&lt;br&gt;&amp;nbsp;#define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st))
&lt;br&gt;&amp;nbsp;#define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st))
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#define sk_SRP_gN_new(st) SKM_sk_new(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_new_null() SKM_sk_new_null(SRP_gN)
&lt;br&gt;+#define sk_SRP_gN_free(st) SKM_sk_free(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_num(st) SKM_sk_num(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_value(st, i) SKM_sk_value(SRP_gN, (st), (i))
&lt;br&gt;+#define sk_SRP_gN_set(st, i, val) SKM_sk_set(SRP_gN, (st), (i), (val))
&lt;br&gt;+#define sk_SRP_gN_zero(st) SKM_sk_zero(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_push(st, val) SKM_sk_push(SRP_gN, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_unshift(st, val) SKM_sk_unshift(SRP_gN, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_find(st, val) SKM_sk_find(SRP_gN, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_delete(st, i) SKM_sk_delete(SRP_gN, (st), (i))
&lt;br&gt;+#define sk_SRP_gN_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN, (st), (ptr))
&lt;br&gt;+#define sk_SRP_gN_insert(st, val, i) SKM_sk_insert(SRP_gN, (st), (val), (i))
&lt;br&gt;+#define sk_SRP_gN_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN, (st), (cmp))
&lt;br&gt;+#define sk_SRP_gN_dup(st) SKM_sk_dup(SRP_gN, st)
&lt;br&gt;+#define sk_SRP_gN_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN, (st), (free_func))
&lt;br&gt;+#define sk_SRP_gN_shift(st) SKM_sk_shift(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_pop(st) SKM_sk_pop(SRP_gN, (st))
&lt;br&gt;+#define sk_SRP_gN_sort(st) SKM_sk_sort(SRP_gN, (st))
&lt;br&gt;+
&lt;br&gt;+#define sk_SRP_gN_cache_new(st) SKM_sk_new(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_new_null() SKM_sk_new_null(SRP_gN_cache)
&lt;br&gt;+#define sk_SRP_gN_cache_free(st) SKM_sk_free(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_num(st) SKM_sk_num(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_value(st, i) SKM_sk_value(SRP_gN_cache, (st), (i))
&lt;br&gt;+#define sk_SRP_gN_cache_set(st, i, val) SKM_sk_set(SRP_gN_cache, (st), (i), (val))
&lt;br&gt;+#define sk_SRP_gN_cache_zero(st) SKM_sk_zero(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_push(st, val) SKM_sk_push(SRP_gN_cache, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_cache_unshift(st, val) SKM_sk_unshift(SRP_gN_cache, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_cache_find(st, val) SKM_sk_find(SRP_gN_cache, (st), (val))
&lt;br&gt;+#define sk_SRP_gN_cache_delete(st, i) SKM_sk_delete(SRP_gN_cache, (st), (i))
&lt;br&gt;+#define sk_SRP_gN_cache_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_gN_cache, (st), (ptr))
&lt;br&gt;+#define sk_SRP_gN_cache_insert(st, val, i) SKM_sk_insert(SRP_gN_cache, (st), (val), (i))
&lt;br&gt;+#define sk_SRP_gN_cache_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_gN_cache, (st), (cmp))
&lt;br&gt;+#define sk_SRP_gN_cache_dup(st) SKM_sk_dup(SRP_gN_cache, st)
&lt;br&gt;+#define sk_SRP_gN_cache_pop_free(st, free_func) SKM_sk_pop_free(SRP_gN_cache, (st), (free_func))
&lt;br&gt;+#define sk_SRP_gN_cache_shift(st) SKM_sk_shift(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_pop(st) SKM_sk_pop(SRP_gN_cache, (st))
&lt;br&gt;+#define sk_SRP_gN_cache_sort(st) SKM_sk_sort(SRP_gN_cache, (st))
&lt;br&gt;+
&lt;br&gt;+#define sk_SRP_user_pwd_new(st) SKM_sk_new(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_new_null() SKM_sk_new_null(SRP_user_pwd)
&lt;br&gt;+#define sk_SRP_user_pwd_free(st) SKM_sk_free(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_num(st) SKM_sk_num(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_value(st, i) SKM_sk_value(SRP_user_pwd, (st), (i))
&lt;br&gt;+#define sk_SRP_user_pwd_set(st, i, val) SKM_sk_set(SRP_user_pwd, (st), (i), (val))
&lt;br&gt;+#define sk_SRP_user_pwd_zero(st) SKM_sk_zero(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_push(st, val) SKM_sk_push(SRP_user_pwd, (st), (val))
&lt;br&gt;+#define sk_SRP_user_pwd_unshift(st, val) SKM_sk_unshift(SRP_user_pwd, (st), (val))
&lt;br&gt;+#define sk_SRP_user_pwd_find(st, val) SKM_sk_find(SRP_user_pwd, (st), (val))
&lt;br&gt;+#define sk_SRP_user_pwd_delete(st, i) SKM_sk_delete(SRP_user_pwd, (st), (i))
&lt;br&gt;+#define sk_SRP_user_pwd_delete_ptr(st, ptr) SKM_sk_delete_ptr(SRP_user_pwd, (st), (ptr))
&lt;br&gt;+#define sk_SRP_user_pwd_insert(st, val, i) SKM_sk_insert(SRP_user_pwd, (st), (val), (i))
&lt;br&gt;+#define sk_SRP_user_pwd_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SRP_user_pwd, (st), (cmp))
&lt;br&gt;+#define sk_SRP_user_pwd_dup(st) SKM_sk_dup(SRP_user_pwd, st)
&lt;br&gt;+#define sk_SRP_user_pwd_pop_free(st, free_func) SKM_sk_pop_free(SRP_user_pwd, (st), (free_func))
&lt;br&gt;+#define sk_SRP_user_pwd_shift(st) SKM_sk_shift(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_pop(st) SKM_sk_pop(SRP_user_pwd, (st))
&lt;br&gt;+#define sk_SRP_user_pwd_sort(st) SKM_sk_sort(SRP_user_pwd, (st))
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#define sk_SSL_CIPHER_new(cmp) SKM_sk_new(SSL_CIPHER, (cmp))
&lt;br&gt;&amp;nbsp;#define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER)
&lt;br&gt;&amp;nbsp;#define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st))
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/Makefile.org openssl-SNAP-20091218-srp/Makefile.org
&lt;br&gt;--- openssl-SNAP-20091218-orig/Makefile.org	2009-10-16 00:00:17.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/Makefile.org	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -121,7 +121,7 @@
&lt;br&gt;&amp;nbsp;	bn ec rsa dsa ecdsa dh ecdh dso engine \
&lt;br&gt;&amp;nbsp;	buffer bio stack lhash rand err \
&lt;br&gt;&amp;nbsp;	evp asn1 pem x509 x509v3 conf txt_db pkcs7 pkcs12 comp ocsp ui krb5 \
&lt;br&gt;-	cms pqueue ts jpake store
&lt;br&gt;+	cms pqueue ts jpake srp store
&lt;br&gt;&amp;nbsp;# keep in mind that the above list is adjusted by ./Configure
&lt;br&gt;&amp;nbsp;# according to no-xxx arguments...
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/Makefile openssl-SNAP-20091218-srp/ssl/Makefile
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/Makefile	2009-11-09 20:01:01.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/Makefile	2009-12-18 20:34:18.000000000 +0000
&lt;br&gt;@@ -30,7 +30,7 @@
&lt;br&gt;&amp;nbsp;	ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \
&lt;br&gt;&amp;nbsp;	ssl_ciph.c ssl_stat.c ssl_rsa.c \
&lt;br&gt;&amp;nbsp;	ssl_asn1.c ssl_txt.c ssl_algs.c \
&lt;br&gt;-	bio_ssl.c ssl_err.c kssl.c t1_reneg.c
&lt;br&gt;+	bio_ssl.c ssl_err.c kssl.c t1_reneg.c tls_srp.c
&lt;br&gt;&amp;nbsp;LIBOBJ= \
&lt;br&gt;&amp;nbsp;	s2_meth.o &amp;nbsp;s2_srvr.o &amp;nbsp;s2_clnt.o &amp;nbsp;s2_lib.o &amp;nbsp;s2_enc.o s2_pkt.o \
&lt;br&gt;&amp;nbsp;	s3_meth.o &amp;nbsp;s3_srvr.o &amp;nbsp;s3_clnt.o &amp;nbsp;s3_lib.o &amp;nbsp;s3_enc.o s3_pkt.o s3_both.o \
&lt;br&gt;@@ -41,7 +41,7 @@
&lt;br&gt;&amp;nbsp;	ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o \
&lt;br&gt;&amp;nbsp;	ssl_ciph.o ssl_stat.o ssl_rsa.o \
&lt;br&gt;&amp;nbsp;	ssl_asn1.o ssl_txt.o ssl_algs.o \
&lt;br&gt;-	bio_ssl.o ssl_err.o kssl.o t1_reneg.o
&lt;br&gt;+	bio_ssl.o ssl_err.o kssl.o t1_reneg.o tls_srp.o
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;SRC= $(LIBSRC)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/s3_clnt.c openssl-SNAP-20091218-srp/ssl/s3_clnt.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/s3_clnt.c	2009-12-08 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/s3_clnt.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -278,6 +278,20 @@
&lt;br&gt;&amp;nbsp;		case SSL3_ST_CR_SRVR_HELLO_A:
&lt;br&gt;&amp;nbsp;		case SSL3_ST_CR_SRVR_HELLO_B:
&lt;br&gt;&amp;nbsp;			ret=ssl3_get_server_hello(s);
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			if ((ret == 0) &amp;&amp; (s-&amp;gt;s3-&amp;gt;warn_alert == SSL_AD_MISSING_SRP_USERNAME))
&lt;br&gt;+				{
&lt;br&gt;+				if (!SRP_have_to_put_srp_username(s))
&lt;br&gt;+					{
&lt;br&gt;+					SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_MISSING_SRP_USERNAME);
&lt;br&gt;+					ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_USER_CANCELLED);
&lt;br&gt;+					goto end;
&lt;br&gt;+					}
&lt;br&gt;+				s-&amp;gt;state=SSL3_ST_CW_CLNT_HELLO_A;
&lt;br&gt;+				if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
&lt;br&gt;+				break;
&lt;br&gt;+				}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			if (ret &amp;lt;= 0) goto end;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;			if (s-&amp;gt;hit)
&lt;br&gt;@@ -359,6 +373,17 @@
&lt;br&gt;&amp;nbsp;		case SSL3_ST_CR_SRVR_DONE_B:
&lt;br&gt;&amp;nbsp;			ret=ssl3_get_server_done(s);
&lt;br&gt;&amp;nbsp;			if (ret &amp;lt;= 0) goto end;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			if (s-&amp;gt;s3-&amp;gt;tmp.new_cipher-&amp;gt;algorithm_mkey &amp; SSL_kSRP)
&lt;br&gt;+				{
&lt;br&gt;+				if ((ret = SRP_Calc_A_param(s))&amp;lt;=0)
&lt;br&gt;+					{
&lt;br&gt;+					SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_SRP_A_CALC);
&lt;br&gt;+					ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_INTERNAL_ERROR);
&lt;br&gt;+					goto end;
&lt;br&gt;+					}
&lt;br&gt;+				}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			if (s-&amp;gt;s3-&amp;gt;tmp.cert_req)
&lt;br&gt;&amp;nbsp;				s-&amp;gt;state=SSL3_ST_CW_CERT_A;
&lt;br&gt;&amp;nbsp;			else
&lt;br&gt;@@ -1260,6 +1285,86 @@
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;	else
&lt;br&gt;&amp;nbsp;#endif /* !OPENSSL_NO_PSK */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (alg_k &amp; SSL_kSRP)
&lt;br&gt;+		{
&lt;br&gt;+		n2s(p,i);
&lt;br&gt;+		param_len=i+2;
&lt;br&gt;+		if (param_len &amp;gt; n)
&lt;br&gt;+			{
&lt;br&gt;+			al=SSL_AD_DECODE_ERROR;
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_N_LENGTH);
&lt;br&gt;+			goto f_err;
&lt;br&gt;+			}
&lt;br&gt;+		if (!(s-&amp;gt;srp_ctx.N=BN_bin2bn(p,i,NULL)))
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		p+=i;
&lt;br&gt;+
&lt;br&gt;+		n2s(p,i);
&lt;br&gt;+		param_len+=i+2;
&lt;br&gt;+		if (param_len &amp;gt; n)
&lt;br&gt;+			{
&lt;br&gt;+			al=SSL_AD_DECODE_ERROR;
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_G_LENGTH);
&lt;br&gt;+			goto f_err;
&lt;br&gt;+			}
&lt;br&gt;+		if (!(s-&amp;gt;srp_ctx.g=BN_bin2bn(p,i,NULL)))
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		p+=i;
&lt;br&gt;+
&lt;br&gt;+		i = (unsigned int)(p[0]);
&lt;br&gt;+		p++;
&lt;br&gt;+		param_len+=i+1;
&lt;br&gt;+		if (param_len &amp;gt; n)
&lt;br&gt;+			{
&lt;br&gt;+			al=SSL_AD_DECODE_ERROR;
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_S_LENGTH);
&lt;br&gt;+			goto f_err;
&lt;br&gt;+			}
&lt;br&gt;+		if (!(s-&amp;gt;srp_ctx.s=BN_bin2bn(p,i,NULL)))
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		p+=i;
&lt;br&gt;+
&lt;br&gt;+		n2s(p,i);
&lt;br&gt;+		param_len+=i+2;
&lt;br&gt;+		if (param_len &amp;gt; n)
&lt;br&gt;+			{
&lt;br&gt;+			al=SSL_AD_DECODE_ERROR;
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_B_LENGTH);
&lt;br&gt;+			goto f_err;
&lt;br&gt;+			}
&lt;br&gt;+		if (!(s-&amp;gt;srp_ctx.B=BN_bin2bn(p,i,NULL)))
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
&lt;br&gt;+			goto err;
&lt;br&gt;+			}
&lt;br&gt;+		p+=i;
&lt;br&gt;+		n-=param_len;
&lt;br&gt;+
&lt;br&gt;+/* We must check if there is a certificate */
&lt;br&gt;+#ifndef OPENSSL_NO_RSA
&lt;br&gt;+		if (alg_a &amp; SSL_aRSA)
&lt;br&gt;+			pkey=X509_get_pubkey(s-&amp;gt;session-&amp;gt;sess_cert-&amp;gt;peer_pkeys[SSL_PKEY_RSA_ENC].x509);
&lt;br&gt;+#else
&lt;br&gt;+		if (0)
&lt;br&gt;+			;
&lt;br&gt;+#endif
&lt;br&gt;+#ifndef OPENSSL_NO_DSA
&lt;br&gt;+		else if (alg_a &amp; SSL_aDSS)
&lt;br&gt;+			pkey=X509_get_pubkey(s-&amp;gt;session-&amp;gt;sess_cert-&amp;gt;peer_pkeys[SSL_PKEY_DSA_SIGN].x509);
&lt;br&gt;+#endif
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+#endif /* !OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_RSA
&lt;br&gt;&amp;nbsp;	if (alg_k &amp; SSL_kRSA)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;@@ -2528,6 +2633,39 @@
&lt;br&gt;&amp;nbsp;			EVP_PKEY_free(pub_key);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		else if (alg_k &amp; SSL_kSRP)
&lt;br&gt;+			{
&lt;br&gt;+			if (s-&amp;gt;srp_ctx.A != NULL)
&lt;br&gt;+				{
&lt;br&gt;+				/* send off the data */
&lt;br&gt;+				n=BN_num_bytes(s-&amp;gt;srp_ctx.A);
&lt;br&gt;+				s2n(n,p);
&lt;br&gt;+				BN_bn2bin(s-&amp;gt;srp_ctx.A,p);
&lt;br&gt;+				n+=2;
&lt;br&gt;+				}
&lt;br&gt;+			else
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+			if (s-&amp;gt;session-&amp;gt;srp_username != NULL)
&lt;br&gt;+				OPENSSL_free(s-&amp;gt;session-&amp;gt;srp_username);
&lt;br&gt;+			s-&amp;gt;session-&amp;gt;srp_username = BUF_strdup(s-&amp;gt;srp_ctx.login);
&lt;br&gt;+			if (s-&amp;gt;session-&amp;gt;srp_username == NULL)
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
&lt;br&gt;+					ERR_R_MALLOC_FAILURE);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+
&lt;br&gt;+			if ((s-&amp;gt;session-&amp;gt;master_key_length = SRP_generate_client_master_secret(s,s-&amp;gt;session-&amp;gt;master_key))&amp;lt;0)
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_PSK
&lt;br&gt;&amp;nbsp;		else if (alg_k &amp; SSL_kPSK)
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/s3_lib.c openssl-SNAP-20091218-srp/ssl/s3_lib.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/s3_lib.c	2009-10-16 16:01:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/s3_lib.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -2012,6 +2012,152 @@
&lt;br&gt;&amp;nbsp;	},
&lt;br&gt;&amp;nbsp;#endif	/* OPENSSL_NO_ECDH */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	/* Cipher C01A */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aNULL,
&lt;br&gt;+	SSL_3DES,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	168,
&lt;br&gt;+	168,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C01B */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aRSA,
&lt;br&gt;+	SSL_3DES,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	168,
&lt;br&gt;+	168,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C01C */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aDSS,
&lt;br&gt;+	SSL_3DES,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	168,
&lt;br&gt;+	168,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C01D */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aNULL,
&lt;br&gt;+	SSL_AES128,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	128,
&lt;br&gt;+	128,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C01E */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aRSA,
&lt;br&gt;+	SSL_AES128,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	128,
&lt;br&gt;+	128,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C01F */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aDSS,
&lt;br&gt;+	SSL_AES128,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	128,
&lt;br&gt;+	128,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C020 */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aNULL,
&lt;br&gt;+	SSL_AES256,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	256,
&lt;br&gt;+	256,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C021 */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aRSA,
&lt;br&gt;+	SSL_AES256,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	256,
&lt;br&gt;+	256,
&lt;br&gt;+	},
&lt;br&gt;+
&lt;br&gt;+	/* Cipher C022 */
&lt;br&gt;+	{
&lt;br&gt;+	1,
&lt;br&gt;+	TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,
&lt;br&gt;+	SSL_kSRP,
&lt;br&gt;+	SSL_aDSS,
&lt;br&gt;+	SSL_AES256,
&lt;br&gt;+	SSL_SHA1,
&lt;br&gt;+	SSL_TLSV1,
&lt;br&gt;+	SSL_NOT_EXP|SSL_HIGH,
&lt;br&gt;+	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
&lt;br&gt;+	256,
&lt;br&gt;+	256,
&lt;br&gt;+	},
&lt;br&gt;+#endif &amp;nbsp;/* OPENSSL_NO_SRP */
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#ifdef TEMP_GOST_TLS
&lt;br&gt;&amp;nbsp;/* Cipher FF00 */
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;@@ -2128,6 +2274,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	s-&amp;gt;s3=s3;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SSL_SRP_CTX_init(s);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	s-&amp;gt;method-&amp;gt;ssl_clear(s);
&lt;br&gt;&amp;nbsp;	return(1);
&lt;br&gt;&amp;nbsp;err:
&lt;br&gt;@@ -2168,6 +2317,9 @@
&lt;br&gt;&amp;nbsp;		BIO_free(s-&amp;gt;s3-&amp;gt;handshake_buffer);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;	if (s-&amp;gt;s3-&amp;gt;handshake_dgst) ssl3_free_digest_list(s);
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SSL_SRP_CTX_free(s);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	OPENSSL_cleanse(s-&amp;gt;s3,sizeof *s-&amp;gt;s3);
&lt;br&gt;&amp;nbsp;	OPENSSL_free(s-&amp;gt;s3);
&lt;br&gt;&amp;nbsp;	s-&amp;gt;s3=NULL;
&lt;br&gt;@@ -2232,6 +2384,13 @@
&lt;br&gt;&amp;nbsp;	s-&amp;gt;version=SSL3_VERSION;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+static char * MS_CALLBACK srp_password_from_info_cb(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	return BUF_strdup(s-&amp;gt;srp_ctx.info) ;
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;	int ret=0;
&lt;br&gt;@@ -2709,6 +2868,38 @@
&lt;br&gt;&amp;nbsp;		return 1;
&lt;br&gt;&amp;nbsp;		break;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		if (ctx-&amp;gt;srp_ctx.login != NULL)
&lt;br&gt;+			OPENSSL_free(ctx-&amp;gt;srp_ctx.login);
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.login = NULL;
&lt;br&gt;+		if (parg == NULL)
&lt;br&gt;+			break;
&lt;br&gt;+		if (strlen((char *)parg) &amp;gt; 254)
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_SRP_USERNAME);
&lt;br&gt;+			return 0;
&lt;br&gt;+			} 
&lt;br&gt;+		if ((ctx-&amp;gt;srp_ctx.login = BUF_strdup((char *)parg)) == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_INTERNAL_ERROR);
&lt;br&gt;+			return 0;
&lt;br&gt;+			}
&lt;br&gt;+		break;
&lt;br&gt;+	case SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback=srp_password_from_info_cb;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.info=parg;
&lt;br&gt;+		break;
&lt;br&gt;+	case SSL_CTRL_SET_SRP_ARG:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.SRP_cb_arg=parg;
&lt;br&gt;+		break;
&lt;br&gt;+
&lt;br&gt;+	case SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.strength=larg;
&lt;br&gt;+		break;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif /* !OPENSSL_NO_TLSEXT */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* A Thawte special :-) */
&lt;br&gt;@@ -2778,6 +2969,24 @@
&lt;br&gt;&amp;nbsp;						HMAC_CTX *, int))fp;
&lt;br&gt;&amp;nbsp;		break;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	case SSL_CTRL_SET_SRP_VERIFY_PARAM_CB:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.SRP_verify_param_callback=(int (*)(SSL *,void *))fp;
&lt;br&gt;+		break;
&lt;br&gt;+	case SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.TLS_ext_srp_username_callback=(int (*)(SSL *,int *,void *))fp;
&lt;br&gt;+		break;
&lt;br&gt;+	case SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback=(char *(*)(SSL *,void *))fp;
&lt;br&gt;+		break;
&lt;br&gt;+	case SSL_CTRL_SET_TLS_EXT_SRP_MISSING_CLIENT_USERNAME_CB:
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+		ctx-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback=(char *(*)(SSL *,void *))fp;
&lt;br&gt;+		break;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;	default:
&lt;br&gt;&amp;nbsp;		return(0);
&lt;br&gt;@@ -2878,6 +3087,10 @@
&lt;br&gt;&amp;nbsp;		mask_a = cert-&amp;gt;mask_a;
&lt;br&gt;&amp;nbsp;		emask_k = cert-&amp;gt;export_mask_k;
&lt;br&gt;&amp;nbsp;		emask_a = cert-&amp;gt;export_mask_a;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		mask_k=cert-&amp;gt;mask_k | s-&amp;gt;srp_ctx.srp_Mask;
&lt;br&gt;+		emask_k=cert-&amp;gt;export_mask_k | s-&amp;gt;srp_ctx.srp_Mask;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			
&lt;br&gt;&amp;nbsp;#ifdef KSSL_DEBUG
&lt;br&gt;&amp;nbsp;/*		printf(&amp;quot;ssl3_choose_cipher %d alg= %lx\n&amp;quot;, i,c-&amp;gt;algorithms);*/
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/s3_pkt.c openssl-SNAP-20091218-srp/ssl/s3_pkt.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/s3_pkt.c	2009-12-09 16:01:31.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/s3_pkt.c	2009-12-18 20:51:22.000000000 +0000
&lt;br&gt;@@ -1202,6 +1202,10 @@
&lt;br&gt;&amp;nbsp;				SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_NO_RENEGOTIATION);
&lt;br&gt;&amp;nbsp;				goto f_err;
&lt;br&gt;&amp;nbsp;				}
&lt;br&gt;+#ifdef SSL_AD_MISSING_SRP_USERNAME
&lt;br&gt;+			else if (alert_descr == SSL_AD_MISSING_SRP_USERNAME)
&lt;br&gt;+				return(0);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;		else if (alert_level == 2) /* fatal */
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/s3_srvr.c openssl-SNAP-20091218-srp/ssl/s3_srvr.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/s3_srvr.c	2009-12-08 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/s3_srvr.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -179,6 +179,31 @@
&lt;br&gt;&amp;nbsp;		return(NULL);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+int SSL_check_srp_ext_ClientHello(SSL *s,int *ad)
&lt;br&gt;+	{
&lt;br&gt;+	int ret = SSL_ERROR_NONE;
&lt;br&gt;+
&lt;br&gt;+	*ad = SSL_AD_UNRECOGNIZED_NAME;
&lt;br&gt;+
&lt;br&gt;+	if ((s-&amp;gt;s3-&amp;gt;tmp.new_cipher-&amp;gt;algorithm_mkey &amp; SSL_kSRP) &amp;&amp;
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;(s-&amp;gt;srp_ctx.TLS_ext_srp_username_callback != NULL))
&lt;br&gt;+		{
&lt;br&gt;+		if(s-&amp;gt;srp_ctx.login == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			/* There isn't any srp login extension !!! */
&lt;br&gt;+			ret = SSL3_AL_WARNING;
&lt;br&gt;+			*ad = SSL_AD_MISSING_SRP_USERNAME;
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			{
&lt;br&gt;+			ret = SSL_srp_server_param_with_username(s,ad);
&lt;br&gt;+			}
&lt;br&gt;+		}
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;IMPLEMENT_ssl3_meth_func(SSLv3_server_method,
&lt;br&gt;&amp;nbsp;			ssl3_accept,
&lt;br&gt;&amp;nbsp;			ssl_undefined_function,
&lt;br&gt;@@ -192,6 +217,9 @@
&lt;br&gt;&amp;nbsp;	long num1;
&lt;br&gt;&amp;nbsp;	int ret= -1;
&lt;br&gt;&amp;nbsp;	int new_state,state,skip=0;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	int srp_no_username =0;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	RAND_add(&amp;Time,sizeof(Time),0);
&lt;br&gt;&amp;nbsp;	ERR_clear_error();
&lt;br&gt;@@ -300,10 +328,35 @@
&lt;br&gt;&amp;nbsp;		case SSL3_ST_SR_CLNT_HELLO_A:
&lt;br&gt;&amp;nbsp;		case SSL3_ST_SR_CLNT_HELLO_B:
&lt;br&gt;&amp;nbsp;		case SSL3_ST_SR_CLNT_HELLO_C:
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		case SSL3_ST_SR_CLNT_HELLO_SRP_USERNAME:
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;			s-&amp;gt;shutdown=0;
&lt;br&gt;&amp;nbsp;			ret=ssl3_get_client_hello(s);
&lt;br&gt;&amp;nbsp;			if (ret &amp;lt;= 0) goto end;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			int extension_error = 0,al;
&lt;br&gt;+
&lt;br&gt;+			if ((al = SSL_check_srp_ext_ClientHello(s,&amp;extension_error)) != SSL_ERROR_NONE)
&lt;br&gt;+				{
&lt;br&gt;+				ssl3_send_alert(s,al,extension_error);
&lt;br&gt;+				if (extension_error == SSL_AD_MISSING_SRP_USERNAME)
&lt;br&gt;+					{
&lt;br&gt;+					if (srp_no_username) goto end;
&lt;br&gt;+					ERR_clear_error();
&lt;br&gt;+					srp_no_username = 1;
&lt;br&gt;+					s-&amp;gt;state=SSL3_ST_SR_CLNT_HELLO_SRP_USERNAME;
&lt;br&gt;+					if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
&lt;br&gt;+					if ((ret=BIO_flush(s-&amp;gt;wbio)) &amp;lt;= 0) goto end;
&lt;br&gt;+					s-&amp;gt;init_num=0;
&lt;br&gt;+					break;
&lt;br&gt;+					}
&lt;br&gt;+				ret = -1;
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT);
&lt;br&gt;+				goto end;
&lt;br&gt;+				}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			
&lt;br&gt;&amp;nbsp;			s-&amp;gt;new_session = 2;
&lt;br&gt;&amp;nbsp;			s-&amp;gt;state=SSL3_ST_SW_SRVR_HELLO_A;
&lt;br&gt;@@ -334,7 +387,7 @@
&lt;br&gt;&amp;nbsp;		case SSL3_ST_SW_CERT_A:
&lt;br&gt;&amp;nbsp;		case SSL3_ST_SW_CERT_B:
&lt;br&gt;&amp;nbsp;			/* Check if it is anon DH or anon ECDH, */
&lt;br&gt;-			/* normal PSK or KRB5 */
&lt;br&gt;+			/* normal PSK or KRB5 or SRP */
&lt;br&gt;&amp;nbsp;			if (!(s-&amp;gt;s3-&amp;gt;tmp.new_cipher-&amp;gt;algorithm_auth &amp; SSL_aNULL)
&lt;br&gt;&amp;nbsp;				&amp;&amp; !(s-&amp;gt;s3-&amp;gt;tmp.new_cipher-&amp;gt;algorithm_mkey &amp; SSL_kPSK)
&lt;br&gt;&amp;nbsp;				&amp;&amp; !(s-&amp;gt;s3-&amp;gt;tmp.new_cipher-&amp;gt;algorithm_auth &amp; SSL_aKRB5))
&lt;br&gt;@@ -399,6 +452,10 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_PSK
&lt;br&gt;&amp;nbsp;			 &amp;nbsp; &amp;nbsp;|| ((alg_k &amp; SSL_kPSK) &amp;&amp; s-&amp;gt;ctx-&amp;gt;psk_identity_hint)
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			 &amp;nbsp; &amp;nbsp;/* SRP: send ServerKeyExchange */
&lt;br&gt;+			 &amp;nbsp; &amp;nbsp;|| (alg_k &amp; SSL_kSRP)
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			 &amp;nbsp; &amp;nbsp;|| (alg_k &amp; (SSL_kDHr|SSL_kDHd|SSL_kEDH))
&lt;br&gt;&amp;nbsp;			 &amp;nbsp; &amp;nbsp;|| (alg_k &amp; SSL_kEECDH)
&lt;br&gt;&amp;nbsp;			 &amp;nbsp; &amp;nbsp;|| ((alg_k &amp; SSL_kRSA)
&lt;br&gt;@@ -782,7 +839,11 @@
&lt;br&gt;&amp;nbsp;	 * If we are SSLv3, we will respond with SSLv3, even if prompted with
&lt;br&gt;&amp;nbsp;	 * TLSv1.
&lt;br&gt;&amp;nbsp;	 */
&lt;br&gt;-	if (s-&amp;gt;state == SSL3_ST_SR_CLNT_HELLO_A)
&lt;br&gt;+	if (s-&amp;gt;state == SSL3_ST_SR_CLNT_HELLO_A
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		|| (s-&amp;gt;state == SSL3_ST_SR_CLNT_HELLO_SRP_USERNAME)
&lt;br&gt;+#endif
&lt;br&gt;+		)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;&amp;nbsp;		s-&amp;gt;state=SSL3_ST_SR_CLNT_HELLO_B;
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;@@ -1589,14 +1650,37 @@
&lt;br&gt;&amp;nbsp;				}
&lt;br&gt;&amp;nbsp;			else
&lt;br&gt;&amp;nbsp;#endif /* !OPENSSL_NO_PSK */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		if (type &amp; SSL_kSRP)
&lt;br&gt;+			{
&lt;br&gt;+			if ((s-&amp;gt;srp_ctx.N == NULL) ||
&lt;br&gt;+				(s-&amp;gt;srp_ctx.g == NULL) ||
&lt;br&gt;+				(s-&amp;gt;srp_ctx.s == NULL) ||
&lt;br&gt;+				(s-&amp;gt;srp_ctx.B == NULL))
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_SRP_PARAM);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+			r[0]=s-&amp;gt;srp_ctx.N;
&lt;br&gt;+			r[1]=s-&amp;gt;srp_ctx.g;
&lt;br&gt;+			r[2]=s-&amp;gt;srp_ctx.s;
&lt;br&gt;+			r[3]=s-&amp;gt;srp_ctx.B;
&lt;br&gt;+			}
&lt;br&gt;+		else 
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;&amp;nbsp;			al=SSL_AD_HANDSHAKE_FAILURE;
&lt;br&gt;&amp;nbsp;			SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);
&lt;br&gt;&amp;nbsp;			goto f_err;
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;-		for (i=0; r[i] != NULL; i++)
&lt;br&gt;+		for (i=0; r[i] != NULL &amp;&amp; i&amp;lt;4; i++)
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;&amp;nbsp;			nr[i]=BN_num_bytes(r[i]);
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			if ((i == 2) &amp;&amp; (type &amp; SSL_kSRP))
&lt;br&gt;+				n+=1+nr[i];
&lt;br&gt;+			else
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			n+=2+nr[i];
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -1625,8 +1709,16 @@
&lt;br&gt;&amp;nbsp;		d=(unsigned char *)s-&amp;gt;init_buf-&amp;gt;data;
&lt;br&gt;&amp;nbsp;		p= &amp;(d[4]);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-		for (i=0; r[i] != NULL; i++)
&lt;br&gt;+		for (i=0; r[i] != NULL &amp;&amp; i&amp;lt;4; i++)
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+			if ((i == 2) &amp;&amp; (type &amp; SSL_kSRP))
&lt;br&gt;+				{
&lt;br&gt;+				*p = nr[i];
&lt;br&gt;+				p++;
&lt;br&gt;+				}
&lt;br&gt;+			else
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;			s2n(nr[i],p);
&lt;br&gt;&amp;nbsp;			BN_bn2bin(r[i],p);
&lt;br&gt;&amp;nbsp;			p+=nr[i];
&lt;br&gt;@@ -2503,6 +2595,44 @@
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;		else
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		if (alg_k &amp; SSL_kSRP)
&lt;br&gt;+			{
&lt;br&gt;+			int param_len;
&lt;br&gt;+
&lt;br&gt;+			n2s(p,i);
&lt;br&gt;+			param_len=i+2;
&lt;br&gt;+			if (param_len &amp;gt; n)
&lt;br&gt;+				{
&lt;br&gt;+				al=SSL_AD_DECODE_ERROR;
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SRP_A_LENGTH);
&lt;br&gt;+				goto f_err;
&lt;br&gt;+				}
&lt;br&gt;+			if (!(s-&amp;gt;srp_ctx.A=BN_bin2bn(p,i,NULL)))
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+			if (s-&amp;gt;session-&amp;gt;srp_username != NULL)
&lt;br&gt;+				OPENSSL_free(s-&amp;gt;session-&amp;gt;srp_username);
&lt;br&gt;+			s-&amp;gt;session-&amp;gt;srp_username = BUF_strdup(s-&amp;gt;srp_ctx.login);
&lt;br&gt;+			if (s-&amp;gt;session-&amp;gt;srp_username == NULL)
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE,
&lt;br&gt;+					ERR_R_MALLOC_FAILURE);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+
&lt;br&gt;+			if ((s-&amp;gt;session-&amp;gt;master_key_length = SRP_generate_server_master_secret(s,s-&amp;gt;session-&amp;gt;master_key))&amp;lt;0)
&lt;br&gt;+				{
&lt;br&gt;+				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
&lt;br&gt;+				goto err;
&lt;br&gt;+				}
&lt;br&gt;+
&lt;br&gt;+			p+=i;
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+#endif	/* OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;		if (alg_k &amp; SSL_kGOST) 
&lt;br&gt;&amp;nbsp;			{
&lt;br&gt;&amp;nbsp;			int ret = 0;
&lt;br&gt;@@ -2579,7 +2709,7 @@
&lt;br&gt;&amp;nbsp;	return(1);
&lt;br&gt;&amp;nbsp;f_err:
&lt;br&gt;&amp;nbsp;	ssl3_send_alert(s,SSL3_AL_FATAL,al);
&lt;br&gt;-#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_ECDH)
&lt;br&gt;+#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_ECDH) || #defined(OPENSSL_NO_SRP)
&lt;br&gt;&amp;nbsp;err:
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_ECDH
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl3.h openssl-SNAP-20091218-srp/ssl/ssl3.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl3.h	2009-12-16 21:01:04.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl3.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -568,6 +568,8 @@
&lt;br&gt;&amp;nbsp;#define SSL3_ST_SR_CLNT_HELLO_A		(0x110|SSL_ST_ACCEPT)
&lt;br&gt;&amp;nbsp;#define SSL3_ST_SR_CLNT_HELLO_B		(0x111|SSL_ST_ACCEPT)
&lt;br&gt;&amp;nbsp;#define SSL3_ST_SR_CLNT_HELLO_C		(0x112|SSL_ST_ACCEPT)
&lt;br&gt;+/* a new state to remember that we have already receive a ClientHello without srp username extension */
&lt;br&gt;+#define SSL3_ST_SR_CLNT_HELLO_SRP_USERNAME (0x1E2|SSL_ST_ACCEPT)
&lt;br&gt;&amp;nbsp;/* write to client */
&lt;br&gt;&amp;nbsp;#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT)
&lt;br&gt;&amp;nbsp;#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT)
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_asn1.c openssl-SNAP-20091218-srp/ssl/ssl_asn1.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_asn1.c	2009-10-30 15:00:41.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_asn1.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -114,6 +114,9 @@
&lt;br&gt;&amp;nbsp;	ASN1_OCTET_STRING psk_identity_hint;
&lt;br&gt;&amp;nbsp;	ASN1_OCTET_STRING psk_identity;
&lt;br&gt;&amp;nbsp;#endif /* OPENSSL_NO_PSK */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	ASN1_OCTET_STRING srp_username;
&lt;br&gt;+#endif /* OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;	} SSL_SESSION_ASN1;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
&lt;br&gt;@@ -130,6 +133,9 @@
&lt;br&gt;&amp;nbsp;	unsigned char cbuf;
&lt;br&gt;&amp;nbsp;	int v11=0;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	int v12=0;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	long l;
&lt;br&gt;&amp;nbsp;	SSL_SESSION_ASN1 a;
&lt;br&gt;&amp;nbsp;	M_ASN1_I2D_vars(in);
&lt;br&gt;@@ -267,6 +273,14 @@
&lt;br&gt;&amp;nbsp;		a.psk_identity.data=(unsigned char *)(in-&amp;gt;psk_identity);
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;#endif /* OPENSSL_NO_PSK */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (in-&amp;gt;srp_username)
&lt;br&gt;+		{
&lt;br&gt;+		a.srp_username.length=strlen(in-&amp;gt;srp_username);
&lt;br&gt;+		a.srp_username.type=V_ASN1_OCTET_STRING;
&lt;br&gt;+		a.srp_username.data=(unsigned char *)(in-&amp;gt;srp_username);
&lt;br&gt;+		}
&lt;br&gt;+#endif /* OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	M_ASN1_I2D_len(&amp;(a.version),		i2d_ASN1_INTEGER);
&lt;br&gt;&amp;nbsp;	M_ASN1_I2D_len(&amp;(a.ssl_version),	i2d_ASN1_INTEGER);
&lt;br&gt;@@ -307,6 +321,10 @@
&lt;br&gt;&amp;nbsp;	if (in-&amp;gt;psk_identity)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	M_ASN1_I2D_len_EXP_opt(&amp;(a.psk_identity), i2d_ASN1_OCTET_STRING,8,v8);
&lt;br&gt;&amp;nbsp;#endif /* OPENSSL_NO_PSK */
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (in-&amp;gt;srp_username)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	M_ASN1_I2D_len_EXP_opt(&amp;(a.srp_username), i2d_ASN1_OCTET_STRING,12,v12);
&lt;br&gt;+#endif /* OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	M_ASN1_I2D_seq_total();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -351,6 +369,10 @@
&lt;br&gt;&amp;nbsp;	if (in-&amp;gt;compress_meth)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;	M_ASN1_I2D_put_EXP_opt(&amp;(a.comp_id), i2d_ASN1_OCTET_STRING,11,v11);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (in-&amp;gt;srp_username)
&lt;br&gt;+		M_ASN1_I2D_put_EXP_opt(&amp;(a.srp_username), i2d_ASN1_OCTET_STRING,12,v12);
&lt;br&gt;+#endif /* OPENSSL_NO_SRP */
&lt;br&gt;&amp;nbsp;	M_ASN1_I2D_finish();
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -589,5 +611,20 @@
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	os.length=0;
&lt;br&gt;+	os.data=NULL;
&lt;br&gt;+	M_ASN1_D2I_get_EXP_opt(osp,d2i_ASN1_OCTET_STRING,11);
&lt;br&gt;+	if (os.data)
&lt;br&gt;+		{
&lt;br&gt;+		ret-&amp;gt;srp_username = BUF_strndup((char *)os.data, os.length);
&lt;br&gt;+		OPENSSL_free(os.data);
&lt;br&gt;+		os.data = NULL;
&lt;br&gt;+		os.length = 0;
&lt;br&gt;+		}
&lt;br&gt;+	else
&lt;br&gt;+		ret-&amp;gt;srp_username=NULL;
&lt;br&gt;+#endif /* OPENSSL_NO_SRP */
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	M_ASN1_D2I_Finish(a,SSL_SESSION_free,SSL_F_D2I_SSL_SESSION);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_ciph.c openssl-SNAP-20091218-srp/ssl/ssl_ciph.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_ciph.c	2009-09-13 00:00:20.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_ciph.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -247,6 +247,7 @@
&lt;br&gt;&amp;nbsp;	{0,SSL_TXT_ECDH,0, &amp;nbsp; &amp;nbsp;SSL_kECDHr|SSL_kECDHe|SSL_kEECDH,0,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{0,SSL_TXT_kPSK,0, &amp;nbsp; &amp;nbsp;SSL_kPSK, &amp;nbsp;0,0,0,0,0,0,0,0},
&lt;br&gt;+	{0,SSL_TXT_kSRP,0, &amp;nbsp; &amp;nbsp;SSL_kSRP, &amp;nbsp;0,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp;	{0,SSL_TXT_kGOST,0, SSL_kGOST,0,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* server authentication aliases */
&lt;br&gt;@@ -273,6 +274,7 @@
&lt;br&gt;&amp;nbsp;	{0,SSL_TXT_ADH,0, &amp;nbsp; &amp;nbsp; SSL_kEDH,SSL_aNULL,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp;	{0,SSL_TXT_AECDH,0, &amp;nbsp; SSL_kEECDH,SSL_aNULL,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{0,SSL_TXT_PSK,0, &amp;nbsp; &amp;nbsp; SSL_kPSK,SSL_aPSK,0,0,0,0,0,0,0},
&lt;br&gt;+	{0,SSL_TXT_SRP,0, &amp;nbsp; &amp;nbsp; SSL_kSRP,0,0,0,0,0,0,0,0},
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* symmetric encryption aliases */
&lt;br&gt;@@ -661,6 +663,9 @@
&lt;br&gt;&amp;nbsp;	*mkey |= SSL_kPSK;
&lt;br&gt;&amp;nbsp;	*auth |= SSL_aPSK;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifdef OPENSSL_NO_SRP
&lt;br&gt;+	*mkey |= SSL_kSRP;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	/* Check for presence of GOST 34.10 algorithms, and if they
&lt;br&gt;&amp;nbsp;	 * do not present, disable &amp;nbsp;appropriate auth and key exchange */
&lt;br&gt;&amp;nbsp;	if (!get_optional_pkey_id(&amp;quot;gost94&amp;quot;)) {
&lt;br&gt;@@ -1513,6 +1518,9 @@
&lt;br&gt;&amp;nbsp;	case SSL_kPSK:
&lt;br&gt;&amp;nbsp;		kx=&amp;quot;PSK&amp;quot;;
&lt;br&gt;&amp;nbsp;		break;
&lt;br&gt;+	case SSL_kSRP:
&lt;br&gt;+		kx=&amp;quot;SRP&amp;quot;;
&lt;br&gt;+		break;
&lt;br&gt;&amp;nbsp;	default:
&lt;br&gt;&amp;nbsp;		kx=&amp;quot;unknown&amp;quot;;
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_err.c openssl-SNAP-20091218-srp/ssl/ssl_err.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_err.c	2009-12-09 16:01:31.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_err.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -250,6 +250,7 @@
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_SET_TRUST),	&amp;quot;SSL_set_trust&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_SET_WFD),	&amp;quot;SSL_set_wfd&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_SHUTDOWN),	&amp;quot;SSL_shutdown&amp;quot;},
&lt;br&gt;+{ERR_FUNC(SSL_F_SSL_SRP_CTX_INIT),	&amp;quot;SSL_SRP_CTX_INIT&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_UNDEFINED_CONST_FUNCTION),	&amp;quot;SSL_UNDEFINED_CONST_FUNCTION&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_UNDEFINED_FUNCTION),	&amp;quot;SSL_UNDEFINED_FUNCTION&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_FUNC(SSL_F_SSL_UNDEFINED_VOID_FUNCTION),	&amp;quot;SSL_UNDEFINED_VOID_FUNCTION&amp;quot;},
&lt;br&gt;@@ -311,6 +312,11 @@
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_RSA_MODULUS_LENGTH),&amp;quot;bad rsa modulus length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_RSA_SIGNATURE) &amp;nbsp; &amp;nbsp; ,&amp;quot;bad rsa signature&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_SIGNATURE) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&amp;quot;bad signature&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_BAD_SRP_A_LENGTH) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad srp a length&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_BAD_SRP_B_LENGTH) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad srp b length&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_BAD_SRP_G_LENGTH) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad srp g length&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_BAD_SRP_N_LENGTH) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad srp n length&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_BAD_SRP_S_LENGTH) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad srp s length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_SSL_FILETYPE) &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;bad ssl filetype&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_SSL_SESSION_ID_LENGTH),&amp;quot;bad ssl session id length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_BAD_STATE) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&amp;quot;bad state&amp;quot;},
&lt;br&gt;@@ -327,6 +333,7 @@
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_CIPHER_CODE_WRONG_LENGTH),&amp;quot;cipher code wrong length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_CIPHER_OR_HASH_UNAVAILABLE),&amp;quot;cipher or hash unavailable&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_CIPHER_TABLE_SRC_ERROR),&amp;quot;cipher table src error&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_CLIENTHELLO_SRP_TLS_EXT),&amp;quot;error with the SRP username&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_CLIENTHELLO_TLSEXT) &amp;nbsp; &amp;nbsp;,&amp;quot;clienthello tlsext&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_COMPRESSED_LENGTH_TOO_LONG),&amp;quot;compressed length too long&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_COMPRESSION_FAILURE) &amp;nbsp; ,&amp;quot;compression failure&amp;quot;},
&lt;br&gt;@@ -360,6 +367,7 @@
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_CHALLENGE_LENGTH),&amp;quot;invalid challenge length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_COMMAND) &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&amp;quot;invalid command&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_PURPOSE) &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&amp;quot;invalid purpose&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_INVALID_SRP_USERNAME) &amp;nbsp;,&amp;quot;invalid srp username&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_STATUS_RESPONSE),&amp;quot;invalid status response&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_TICKET_KEYS_LENGTH),&amp;quot;invalid ticket keys length&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_INVALID_TRUST) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&amp;quot;invalid trust&amp;quot;},
&lt;br&gt;@@ -389,6 +397,8 @@
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_RSA_CERTIFICATE),&amp;quot;missing rsa certificate&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_RSA_ENCRYPTING_CERT),&amp;quot;missing rsa encrypting cert&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_RSA_SIGNING_CERT),&amp;quot;missing rsa signing cert&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_MISSING_SRP_PARAM) &amp;nbsp; &amp;nbsp; ,&amp;quot;can't find SRP server param&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_MISSING_SRP_USERNAME) &amp;nbsp;,&amp;quot;missing srp username&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_TMP_DH_KEY) &amp;nbsp; &amp;nbsp;,&amp;quot;missing tmp dh key&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_TMP_ECDH_KEY) &amp;nbsp;,&amp;quot;missing tmp ecdh key&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_MISSING_TMP_RSA_KEY) &amp;nbsp; ,&amp;quot;missing tmp rsa key&amp;quot;},
&lt;br&gt;@@ -458,6 +468,7 @@
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED),&amp;quot;session id context uninitialized&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SHORT_READ) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;short read&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE),&amp;quot;signature for non signing certificate&amp;quot;},
&lt;br&gt;+{ERR_REASON(SSL_R_SRP_A_CALC) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;,&amp;quot;error with the srp params&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SSL23_DOING_SESSION_ID_REUSE),&amp;quot;ssl23 doing session id reuse&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SSL2_CONNECTION_ID_TOO_LONG),&amp;quot;ssl2 connection id too long&amp;quot;},
&lt;br&gt;&amp;nbsp;{ERR_REASON(SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT),&amp;quot;ssl3 ext invalid ecpointformat&amp;quot;},
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl.h openssl-SNAP-20091218-srp/ssl/ssl.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl.h	2009-12-16 21:01:04.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -252,6 +252,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_TXT_kEECDH		&amp;quot;kEECDH&amp;quot;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_kPSK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;kPSK&amp;quot;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_kGOST		&amp;quot;kGOST&amp;quot;
&lt;br&gt;+#define SSL_TXT_kSRP		&amp;quot;kSRP&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define	SSL_TXT_aRSA		&amp;quot;aRSA&amp;quot;
&lt;br&gt;&amp;nbsp;#define	SSL_TXT_aDSS		&amp;quot;aDSS&amp;quot;
&lt;br&gt;@@ -275,6 +276,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_TXT_ECDSA		&amp;quot;ECDSA&amp;quot;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_KRB5 &amp;nbsp; &amp;nbsp; &amp;nbsp;	&amp;quot;KRB5&amp;quot;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_PSK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;PSK&amp;quot;
&lt;br&gt;+#define SSL_TXT_SRP		&amp;quot;SRP&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_DES		&amp;quot;DES&amp;quot;
&lt;br&gt;&amp;nbsp;#define SSL_TXT_3DES		&amp;quot;3DES&amp;quot;
&lt;br&gt;@@ -437,6 +439,7 @@
&lt;br&gt;&amp;nbsp; *	ECPointFormatList [ 7 ] OCTET STRING, &amp;nbsp; &amp;nbsp; -- optional EC point format list from TLS extension
&lt;br&gt;&amp;nbsp; *	PSK_identity_hint [ 8 ] EXPLICIT OCTET STRING, -- optional PSK identity hint
&lt;br&gt;&amp;nbsp; *	PSK_identity [ 9 ] EXPLICIT OCTET STRING -- optional PSK identity
&lt;br&gt;+ *	SRP_username [ 11 ] EXPLICIT OCTET STRING -- optional SRP username
&lt;br&gt;&amp;nbsp; *	}
&lt;br&gt;&amp;nbsp; * Look in ssl/ssl_asn1.c for more details
&lt;br&gt;&amp;nbsp; * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-).
&lt;br&gt;@@ -468,6 +471,9 @@
&lt;br&gt;&amp;nbsp;	char *psk_identity_hint;
&lt;br&gt;&amp;nbsp;	char *psk_identity;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	char *srp_username;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	int not_resumable;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	/* The cert is the certificate used to establish this connection */
&lt;br&gt;@@ -644,7 +650,42 @@
&lt;br&gt;&amp;nbsp;#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
&lt;br&gt;&amp;nbsp;#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+
&lt;br&gt;+typedef struct srp_ctx_st
&lt;br&gt;+	{
&lt;br&gt;+	/* param for all the callbacks */
&lt;br&gt;+	void *SRP_cb_arg;
&lt;br&gt;+	/* set client Hello login callback */
&lt;br&gt;+	int (*TLS_ext_srp_username_callback)(SSL *, int *, void *);
&lt;br&gt;+	/* set SRP N/g param callback for verification */
&lt;br&gt;+	int (*SRP_verify_param_callback)(SSL *, void *);
&lt;br&gt;+	/* set SRP client passwd callback */
&lt;br&gt;+	char *(*SRP_give_srp_client_pwd_callback)(SSL *, void *);
&lt;br&gt;+	/* set SRP client username callback */
&lt;br&gt;+	char *(*SRP_TLS_ext_missing_srp_client_username_callback)(SSL *, void *);
&lt;br&gt;+
&lt;br&gt;+	char *login;
&lt;br&gt;+	BIGNUM *N,*g,*s,*B,*A;
&lt;br&gt;+	BIGNUM *a,*b,*v;
&lt;br&gt;+	char *info;
&lt;br&gt;+	int strength;
&lt;br&gt;+
&lt;br&gt;+	unsigned long srp_Mask;
&lt;br&gt;+	} SRP_CTX;
&lt;br&gt;+
&lt;br&gt;+/* see tls_srp.c */
&lt;br&gt;+int SSL_SRP_CTX_init(SSL *s);
&lt;br&gt;+int SSL_CTX_SRP_CTX_init(SSL_CTX *ctx);
&lt;br&gt;+int SSL_SRP_CTX_free(SSL *ctx);
&lt;br&gt;+int SSL_CTX_SRP_CTX_free(SSL_CTX *ctx);
&lt;br&gt;+int SSL_srp_server_param_with_username(SSL *s, int *ad);
&lt;br&gt;+int SRP_generate_server_master_secret(SSL *s,unsigned char *master_key);
&lt;br&gt;+int SRP_Calc_A_param(SSL *s);
&lt;br&gt;+int SRP_generate_client_master_secret(SSL *s,unsigned char *master_key);
&lt;br&gt;+int SRP_have_to_put_srp_username(SSL *s);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#if defined(OPENSSL_SYS_MSDOS) &amp;&amp; !defined(OPENSSL_SYS_WIN32)
&lt;br&gt;&amp;nbsp;#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */
&lt;br&gt;@@ -863,6 +904,10 @@
&lt;br&gt;&amp;nbsp;		unsigned char *psk, unsigned int max_psk_len);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SRP_CTX srp_ctx; /* ctx for SRP authentication */
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_BUF_FREELISTS
&lt;br&gt;&amp;nbsp;#define SSL_MAX_BUF_FREELIST_LEN_DEFAULT 32
&lt;br&gt;&amp;nbsp;	unsigned int freelist_max_len;
&lt;br&gt;@@ -1110,6 +1155,10 @@
&lt;br&gt;&amp;nbsp;		unsigned char *psk, unsigned int max_psk_len);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SRP_CTX srp_ctx; /* ctx for SRP authentication */
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	SSL_CTX *ctx;
&lt;br&gt;&amp;nbsp;	/* set this flag to 1 and a sleep(1) is put into all SSL_read()
&lt;br&gt;&amp;nbsp;	 * and SSL_write() calls, good for nbio debuging :-) */
&lt;br&gt;@@ -1327,6 +1376,8 @@
&lt;br&gt;&amp;nbsp;#define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE
&lt;br&gt;&amp;nbsp;#define SSL_AD_BAD_CERTIFICATE_HASH_VALUE TLS1_AD_BAD_CERTIFICATE_HASH_VALUE
&lt;br&gt;&amp;nbsp;#define SSL_AD_UNKNOWN_PSK_IDENTITY &amp;nbsp; &amp;nbsp; TLS1_AD_UNKNOWN_PSK_IDENTITY /* fatal */
&lt;br&gt;+#define SSL_AD_UNKNOWN_SRP_USERNAME	TLS1_AD_UNKNOWN_SRP_USERNAME
&lt;br&gt;+#define SSL_AD_MISSING_SRP_USERNAME	TLS1_AD_MISSING_SRP_USERNAME
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define SSL_ERROR_NONE			0
&lt;br&gt;&amp;nbsp;#define SSL_ERROR_SSL			1
&lt;br&gt;@@ -1410,6 +1461,15 @@
&lt;br&gt;&amp;nbsp;#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP	71
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB	72
&lt;br&gt;+
&lt;br&gt;+#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB	75
&lt;br&gt;+#define SSL_CTRL_SET_SRP_VERIFY_PARAM_CB		76
&lt;br&gt;+#define SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB		77
&lt;br&gt;+#define SSL_CTRL_SET_TLS_EXT_SRP_MISSING_CLIENT_USERNAME_CB		78
&lt;br&gt;+#define SSL_CTRL_SET_SRP_ARG		79
&lt;br&gt;+#define SSL_CTRL_SET_TLS_EXT_SRP_USERNAME		80
&lt;br&gt;+#define SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH		81
&lt;br&gt;+#define SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD		82
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define DTLS_CTRL_GET_TIMEOUT		73
&lt;br&gt;@@ -1614,6 +1674,26 @@
&lt;br&gt;&amp;nbsp;int SSL_CTX_set1_param(SSL_CTX *ctx, X509_VERIFY_PARAM *vpm);
&lt;br&gt;&amp;nbsp;int SSL_set1_param(SSL *ssl, X509_VERIFY_PARAM *vpm);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+int SSL_CTX_set_srp_username(SSL_CTX *ctx,char *name);
&lt;br&gt;+int SSL_CTX_set_srp_password(SSL_CTX *ctx,char *password);
&lt;br&gt;+int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength);
&lt;br&gt;+int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, char *(*cb)(SSL *,void *));
&lt;br&gt;+int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, int (*cb)(SSL *,void *));
&lt;br&gt;+int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, int (*cb)(SSL *,int *,void *));
&lt;br&gt;+int SSL_CTX_set_srp_missing_srp_username_callback(SSL_CTX *ctx, char *(*cb)(SSL *,void *));
&lt;br&gt;+int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg);
&lt;br&gt;+
&lt;br&gt;+int SSL_set_srp_server_param(SSL *s,BIGNUM *N,BIGNUM *g,BIGNUM *sa,BIGNUM *v,char *info);
&lt;br&gt;+int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, const char *grp);
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SSL_get_srp_g(SSL *s);
&lt;br&gt;+BIGNUM *SSL_get_srp_N(SSL *s);
&lt;br&gt;+
&lt;br&gt;+char *SSL_get_srp_username(SSL *s);
&lt;br&gt;+char *SSL_get_srp_userinfo(SSL *s);
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void	SSL_free(SSL *ssl);
&lt;br&gt;&amp;nbsp;int 	SSL_accept(SSL *ssl);
&lt;br&gt;&amp;nbsp;int 	SSL_connect(SSL *ssl);
&lt;br&gt;@@ -2001,6 +2081,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_SET_TRUST				 228
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_SET_WFD				 196
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_SHUTDOWN				 224
&lt;br&gt;+#define SSL_F_SSL_SRP_CTX_INIT				 293
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_UNDEFINED_CONST_FUNCTION		 243
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_UNDEFINED_FUNCTION			 197
&lt;br&gt;&amp;nbsp;#define SSL_F_SSL_UNDEFINED_VOID_FUNCTION		 244
&lt;br&gt;@@ -2059,6 +2140,11 @@
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_RSA_MODULUS_LENGTH			 121
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_RSA_SIGNATURE				 122
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_SIGNATURE				 123
&lt;br&gt;+#define SSL_R_BAD_SRP_A_LENGTH				 2096
&lt;br&gt;+#define SSL_R_BAD_SRP_B_LENGTH				 2097
&lt;br&gt;+#define SSL_R_BAD_SRP_G_LENGTH				 2098
&lt;br&gt;+#define SSL_R_BAD_SRP_N_LENGTH				 2099
&lt;br&gt;+#define SSL_R_BAD_SRP_S_LENGTH				 2100
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_SSL_FILETYPE				 124
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_SSL_SESSION_ID_LENGTH			 125
&lt;br&gt;&amp;nbsp;#define SSL_R_BAD_STATE					 126
&lt;br&gt;@@ -2075,6 +2161,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_R_CIPHER_CODE_WRONG_LENGTH			 137
&lt;br&gt;&amp;nbsp;#define SSL_R_CIPHER_OR_HASH_UNAVAILABLE		 138
&lt;br&gt;&amp;nbsp;#define SSL_R_CIPHER_TABLE_SRC_ERROR			 139
&lt;br&gt;+#define SSL_R_CLIENTHELLO_SRP_TLS_EXT			 2101
&lt;br&gt;&amp;nbsp;#define SSL_R_CLIENTHELLO_TLSEXT			 226
&lt;br&gt;&amp;nbsp;#define SSL_R_COMPRESSED_LENGTH_TOO_LONG		 140
&lt;br&gt;&amp;nbsp;#define SSL_R_COMPRESSION_FAILURE			 141
&lt;br&gt;@@ -2108,6 +2195,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_CHALLENGE_LENGTH			 158
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_COMMAND				 280
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_PURPOSE				 278
&lt;br&gt;+#define SSL_R_INVALID_SRP_USERNAME			 2107
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_STATUS_RESPONSE			 328
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_TICKET_KEYS_LENGTH		 325
&lt;br&gt;&amp;nbsp;#define SSL_R_INVALID_TRUST				 279
&lt;br&gt;@@ -2137,6 +2225,8 @@
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_RSA_CERTIFICATE			 168
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_RSA_ENCRYPTING_CERT		 169
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_RSA_SIGNING_CERT			 170
&lt;br&gt;+#define SSL_R_MISSING_SRP_PARAM				 2103
&lt;br&gt;+#define SSL_R_MISSING_SRP_USERNAME			 2104
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_TMP_DH_KEY			 171
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_TMP_ECDH_KEY			 311
&lt;br&gt;&amp;nbsp;#define SSL_R_MISSING_TMP_RSA_KEY			 172
&lt;br&gt;@@ -2206,6 +2296,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED		 277
&lt;br&gt;&amp;nbsp;#define SSL_R_SHORT_READ				 219
&lt;br&gt;&amp;nbsp;#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE	 220
&lt;br&gt;+#define SSL_R_SRP_A_CALC				 2105
&lt;br&gt;&amp;nbsp;#define SSL_R_SSL23_DOING_SESSION_ID_REUSE		 221
&lt;br&gt;&amp;nbsp;#define SSL_R_SSL2_CONNECTION_ID_TOO_LONG		 299
&lt;br&gt;&amp;nbsp;#define SSL_R_SSL3_EXT_INVALID_ECPOINTFORMAT		 321
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_lib.c openssl-SNAP-20091218-srp/ssl/ssl_lib.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_lib.c	2009-12-16 21:01:04.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_lib.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -1639,6 +1639,9 @@
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;psk_client_callback=NULL;
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;psk_server_callback=NULL;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SSL_CTX_SRP_CTX_init(ret);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_BUF_FREELISTS
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;freelist_max_len = SSL_MAX_BUF_FREELIST_LEN_DEFAULT;
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;rbuf_freelist = OPENSSL_malloc(sizeof(SSL3_BUF_FREELIST));
&lt;br&gt;@@ -1771,6 +1774,9 @@
&lt;br&gt;&amp;nbsp;	if (a-&amp;gt;psk_identity_hint)
&lt;br&gt;&amp;nbsp;		OPENSSL_free(a-&amp;gt;psk_identity_hint);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	SSL_CTX_SRP_CTX_free(a);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;&amp;nbsp;	if (a-&amp;gt;client_cert_engine)
&lt;br&gt;&amp;nbsp;		ENGINE_finish(a-&amp;gt;client_cert_engine);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_locl.h openssl-SNAP-20091218-srp/ssl/ssl_locl.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_locl.h	2009-12-08 12:01:08.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_locl.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -289,6 +289,7 @@
&lt;br&gt;&amp;nbsp;#define SSL_kEECDH		0x00000080L /* ephemeral ECDH */
&lt;br&gt;&amp;nbsp;#define SSL_kPSK		0x00000100L /* PSK */
&lt;br&gt;&amp;nbsp;#define SSL_kGOST &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x00000200L /* GOST key exchange */
&lt;br&gt;+#define SSL_kSRP &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x00000400L /* SRP */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* Bits for algorithm_auth (server authentication) */
&lt;br&gt;&amp;nbsp;#define SSL_aRSA		0x00000001L /* RSA auth */
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_sess.c openssl-SNAP-20091218-srp/ssl/ssl_sess.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_sess.c	2009-12-07 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_sess.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -218,6 +218,9 @@
&lt;br&gt;&amp;nbsp;	ss-&amp;gt;psk_identity_hint=NULL;
&lt;br&gt;&amp;nbsp;	ss-&amp;gt;psk_identity=NULL;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	ss-&amp;gt;srp_username=NULL;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	return(ss);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -734,6 +737,10 @@
&lt;br&gt;&amp;nbsp;	if (ss-&amp;gt;psk_identity != NULL)
&lt;br&gt;&amp;nbsp;		OPENSSL_free(ss-&amp;gt;psk_identity);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (ss-&amp;gt;srp_username != NULL)
&lt;br&gt;+		OPENSSL_free(ss-&amp;gt;srp_username);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	OPENSSL_cleanse(ss,sizeof(*ss));
&lt;br&gt;&amp;nbsp;	OPENSSL_free(ss);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_stat.c openssl-SNAP-20091218-srp/ssl/ssl_stat.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_stat.c	2008-04-29 17:00:22.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_stat.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -210,6 +210,9 @@
&lt;br&gt;&amp;nbsp;case SSL3_ST_SR_KEY_EXCH_B:	str=&amp;quot;SSLv3 read client key exchange B&amp;quot;; break;
&lt;br&gt;&amp;nbsp;case SSL3_ST_SR_CERT_VRFY_A:	str=&amp;quot;SSLv3 read certificate verify A&amp;quot;; break;
&lt;br&gt;&amp;nbsp;case SSL3_ST_SR_CERT_VRFY_B:	str=&amp;quot;SSLv3 read certificate verify B&amp;quot;; break;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+case SSL3_ST_SR_CLNT_HELLO_SRP_USERNAME:	str=&amp;quot;SSLv3 waiting for a SRP username&amp;quot;; break;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#if !defined(OPENSSL_NO_SSL2) &amp;&amp; !defined(OPENSSL_NO_SSL3)
&lt;br&gt;@@ -536,6 +539,11 @@
&lt;br&gt;&amp;nbsp;	case TLS1_AD_UNKNOWN_PSK_IDENTITY:
&lt;br&gt;&amp;nbsp;		str=&amp;quot;unknown PSK identity&amp;quot;;
&lt;br&gt;&amp;nbsp;		break;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	case TLS1_AD_MISSING_SRP_USERNAME:
&lt;br&gt;+		str=&amp;quot;no srp username&amp;quot;;
&lt;br&gt;+		break;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	default: str=&amp;quot;unknown&amp;quot;; break;
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;	return(str);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssltest.c openssl-SNAP-20091218-srp/ssl/ssltest.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssltest.c	2009-01-08 00:01:07.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssltest.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -178,6 +178,9 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_DH
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/dh.h&amp;gt;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/bn.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#define _XOPEN_SOURCE_EXTENDED	1 /* Or gethostname won't be declared properly
&lt;br&gt;@@ -243,6 +246,55 @@
&lt;br&gt;&amp;nbsp;	unsigned int max_psk_len);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+/* SRP client */
&lt;br&gt;+/* This is a context that we pass to all callbacks */
&lt;br&gt;+typedef struct srp_client_arg_st
&lt;br&gt;+	{
&lt;br&gt;+	char *srppassin;
&lt;br&gt;+	char *srplogin;
&lt;br&gt;+	} SRP_CLIENT_ARG;
&lt;br&gt;+
&lt;br&gt;+#define PWD_STRLEN 1024
&lt;br&gt;+
&lt;br&gt;+static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
&lt;br&gt;+	return BUF_strdup((char *)srp_client_arg-&amp;gt;srppassin);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+static char * MS_CALLBACK missing_srp_username_callback(SSL *s, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_CLIENT_ARG *srp_client_arg = (SRP_CLIENT_ARG *)arg;
&lt;br&gt;+	return BUF_strdup(srp_client_arg-&amp;gt;srplogin);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/* SRP server */
&lt;br&gt;+/* This is a context that we pass to SRP server callbacks */
&lt;br&gt;+typedef struct srp_server_arg_st
&lt;br&gt;+	{
&lt;br&gt;+	char *expected_user;
&lt;br&gt;+	char *pass;
&lt;br&gt;+	} SRP_SERVER_ARG;
&lt;br&gt;+
&lt;br&gt;+static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_SERVER_ARG * p = (SRP_SERVER_ARG *) arg;
&lt;br&gt;+
&lt;br&gt;+	if (strcmp(p-&amp;gt;expected_user, SSL_get_srp_username(s)) != 0)
&lt;br&gt;+		{
&lt;br&gt;+		fprintf(stderr, &amp;quot;User %s doesn't exist\n&amp;quot;, SSL_get_srp_username(s));
&lt;br&gt;+		return SSL3_AL_FATAL;
&lt;br&gt;+		}
&lt;br&gt;+	if (SSL_set_srp_server_param_pw(s,p-&amp;gt;expected_user,p-&amp;gt;pass,&amp;quot;1024&amp;quot;)&amp;lt;0)
&lt;br&gt;+		{
&lt;br&gt;+		*ad = SSL_AD_INTERNAL_ERROR;
&lt;br&gt;+		return SSL3_AL_FATAL;
&lt;br&gt;+		}
&lt;br&gt;+	return SSL_ERROR_NONE;
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static BIO *bio_err=NULL;
&lt;br&gt;&amp;nbsp;static BIO *bio_stdout=NULL;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -286,6 +338,10 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_PSK
&lt;br&gt;&amp;nbsp;	fprintf(stderr,&amp;quot; -psk arg &amp;nbsp; &amp;nbsp; &amp;nbsp;- PSK in hex (without 0x)\n&amp;quot;);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	fprintf(stderr,&amp;quot; -srpuser user &amp;nbsp;- SRP username to use\n&amp;quot;);
&lt;br&gt;+	fprintf(stderr,&amp;quot; -srppass arg &amp;nbsp; - password for 'user'\n&amp;quot;);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_SSL2
&lt;br&gt;&amp;nbsp;	fprintf(stderr,&amp;quot; -ssl2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - use SSLv2\n&amp;quot;);
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;@@ -473,6 +529,13 @@
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_ECDH
&lt;br&gt;&amp;nbsp;	EC_KEY *ecdh = NULL;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	/* client */
&lt;br&gt;+	int srp_lateuser = 0;
&lt;br&gt;+	SRP_CLIENT_ARG srp_client_arg = {NULL,NULL};
&lt;br&gt;+	/* server */
&lt;br&gt;+	SRP_SERVER_ARG srp_server_arg = {NULL,NULL};
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;	int no_dhe = 0;
&lt;br&gt;&amp;nbsp;	int no_ecdhe = 0;
&lt;br&gt;&amp;nbsp;	int no_psk = 0;
&lt;br&gt;@@ -569,6 +632,20 @@
&lt;br&gt;&amp;nbsp;			no_psk=1;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srpuser&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srp_server_arg.expected_user = srp_client_arg.srplogin= *(++argv);
&lt;br&gt;+			tls1=1;
&lt;br&gt;+			}
&lt;br&gt;+		else if (strcmp(*argv,&amp;quot;-srppass&amp;quot;) == 0)
&lt;br&gt;+			{
&lt;br&gt;+			if (--argc &amp;lt; 1) goto bad;
&lt;br&gt;+			srp_server_arg.pass = srp_client_arg.srppassin= *(++argv);
&lt;br&gt;+			tls1=1;
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;		else if	(strcmp(*argv,&amp;quot;-ssl2&amp;quot;) == 0)
&lt;br&gt;&amp;nbsp;			ssl2=1;
&lt;br&gt;&amp;nbsp;		else if	(strcmp(*argv,&amp;quot;-tls1&amp;quot;) == 0)
&lt;br&gt;@@ -937,6 +1014,28 @@
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (srp_client_arg.srplogin)
&lt;br&gt;+		{
&lt;br&gt;+		if (srp_lateuser) 
&lt;br&gt;+			SSL_CTX_set_srp_missing_srp_username_callback(c_ctx,missing_srp_username_callback);
&lt;br&gt;+		else if (!SSL_CTX_set_srp_username(c_ctx, srp_client_arg.srplogin))
&lt;br&gt;+			{
&lt;br&gt;+			BIO_printf(bio_err,&amp;quot;Unable to set SRP username\n&amp;quot;);
&lt;br&gt;+			goto end;
&lt;br&gt;+			}
&lt;br&gt;+		SSL_CTX_set_srp_cb_arg(c_ctx,&amp;srp_client_arg);
&lt;br&gt;+		SSL_CTX_set_srp_client_pwd_callback(c_ctx, ssl_give_srp_client_pwd_cb);
&lt;br&gt;+		/*SSL_CTX_set_srp_strength(c_ctx, srp_client_arg.strength);*/
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;+	if (srp_server_arg.expected_user != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		SSL_CTX_set_verify(s_ctx,SSL_VERIFY_NONE,verify_callback);
&lt;br&gt;+		SSL_CTX_set_srp_cb_arg(s_ctx, &amp;srp_server_arg);
&lt;br&gt;+		SSL_CTX_set_srp_username_callback(s_ctx, ssl_srp_server_param_cb);
&lt;br&gt;+		}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	c_ssl=SSL_new(c_ctx);
&lt;br&gt;&amp;nbsp;	s_ssl=SSL_new(s_ctx);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/ssl_txt.c openssl-SNAP-20091218-srp/ssl/ssl_txt.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/ssl_txt.c	2009-12-07 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/ssl_txt.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -189,6 +189,10 @@
&lt;br&gt;&amp;nbsp;	if (BIO_puts(bp,&amp;quot;\n &amp;nbsp; &amp;nbsp;PSK identity hint: &amp;quot;) &amp;lt;= 0) goto err;
&lt;br&gt;&amp;nbsp;	if (BIO_printf(bp, &amp;quot;%s&amp;quot;, x-&amp;gt;psk_identity_hint ? x-&amp;gt;psk_identity_hint : &amp;quot;None&amp;quot;) &amp;lt;= 0) goto err;
&lt;br&gt;&amp;nbsp;#endif
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	if (BIO_puts(bp,&amp;quot;\n &amp;nbsp; &amp;nbsp;SRP username: &amp;quot;) &amp;lt;= 0) goto err;
&lt;br&gt;+	if (BIO_printf(bp, &amp;quot;%s&amp;quot;, x-&amp;gt;srp_username ? x-&amp;gt;srp_username : &amp;quot;None&amp;quot;) &amp;lt;= 0) goto err;
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_TLSEXT
&lt;br&gt;&amp;nbsp;	if (x-&amp;gt;tlsext_tick_lifetime_hint)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/t1_enc.c openssl-SNAP-20091218-srp/ssl/t1_enc.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/t1_enc.c	2009-12-07 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/t1_enc.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -1025,6 +1025,9 @@
&lt;br&gt;&amp;nbsp;	case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
&lt;br&gt;&amp;nbsp;	case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
&lt;br&gt;&amp;nbsp;	case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+	case SSL_AD_MISSING_SRP_USERNAME:return(TLS1_AD_MISSING_SRP_USERNAME);
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;#if 0 /* not appropriate for TLS, not used for DTLS */
&lt;br&gt;&amp;nbsp;	case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
&lt;br&gt;&amp;nbsp;					 &amp;nbsp;(DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/t1_lib.c openssl-SNAP-20091218-srp/ssl/t1_lib.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/t1_lib.c	2009-12-17 16:00:58.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/t1_lib.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -340,6 +340,30 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret += el;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+#define MIN(x,y) (((x)&amp;lt;(y))?(x):(y))
&lt;br&gt;+	/* we add SRP username the first time only if we have one! */
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.login != NULL)
&lt;br&gt;+		{/* Add TLS extension SRP username to the Client Hello message */
&lt;br&gt;+		int login_len = MIN(strlen(s-&amp;gt;srp_ctx.login) + 1, 255);
&lt;br&gt;+		long lenmax; 
&lt;br&gt;+
&lt;br&gt;+		if ((lenmax = limit - ret - 5) &amp;lt; 0) return NULL; 
&lt;br&gt;+		if (login_len &amp;gt; lenmax) return NULL;
&lt;br&gt;+		if (login_len &amp;gt; 255)
&lt;br&gt;+			{
&lt;br&gt;+			SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT, ERR_R_INTERNAL_ERROR);
&lt;br&gt;+			return NULL;
&lt;br&gt;+			}
&lt;br&gt;+		s2n(TLSEXT_TYPE_srp,ret);
&lt;br&gt;+		s2n(login_len+1,ret);
&lt;br&gt;+
&lt;br&gt;+		(*ret++) = (unsigned char) MIN(strlen(s-&amp;gt;srp_ctx.login), 254);
&lt;br&gt;+		memcpy(ret, s-&amp;gt;srp_ctx.login, MIN(strlen(s-&amp;gt;srp_ctx.login), 254));
&lt;br&gt;+		ret+=login_len;
&lt;br&gt;+		}
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_EC
&lt;br&gt;&amp;nbsp;	if (s-&amp;gt;tlsext_ecpointformatlist != NULL &amp;&amp;
&lt;br&gt;&amp;nbsp;	 &amp;nbsp; &amp;nbsp;s-&amp;gt;version != DTLS1_VERSION)
&lt;br&gt;@@ -751,6 +775,19 @@
&lt;br&gt;&amp;nbsp;				}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;			}
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+		else if (type == TLSEXT_TYPE_srp)
&lt;br&gt;+			{
&lt;br&gt;+			if (size &amp;gt; 0)
&lt;br&gt;+				{
&lt;br&gt;+				len = data[0];
&lt;br&gt;+				if ((s-&amp;gt;srp_ctx.login = OPENSSL_malloc(len+1)) == NULL)
&lt;br&gt;+					return -1;
&lt;br&gt;+				memcpy(s-&amp;gt;srp_ctx.login, &amp;data[1], len);
&lt;br&gt;+				s-&amp;gt;srp_ctx.login[len]='\0'; &amp;nbsp;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+#endif
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_EC
&lt;br&gt;&amp;nbsp;		else if (type == TLSEXT_TYPE_ec_point_formats &amp;&amp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/tls1.h openssl-SNAP-20091218-srp/ssl/tls1.h
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/tls1.h	2009-12-07 14:00:27.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/tls1.h	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -186,6 +186,8 @@
&lt;br&gt;&amp;nbsp;#define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113
&lt;br&gt;&amp;nbsp;#define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114
&lt;br&gt;&amp;nbsp;#define TLS1_AD_UNKNOWN_PSK_IDENTITY	115	/* fatal */
&lt;br&gt;+#define TLS1_AD_UNKNOWN_SRP_USERNAME 120 /* fatal */
&lt;br&gt;+#define TLS1_AD_MISSING_SRP_USERNAME 121
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* ExtensionType values from RFC3546 / RFC4366 */
&lt;br&gt;&amp;nbsp;#define TLSEXT_TYPE_server_name			0
&lt;br&gt;@@ -197,6 +199,8 @@
&lt;br&gt;&amp;nbsp;/* ExtensionType values from RFC4492 */
&lt;br&gt;&amp;nbsp;#define TLSEXT_TYPE_elliptic_curves		10
&lt;br&gt;&amp;nbsp;#define TLSEXT_TYPE_ec_point_formats		11
&lt;br&gt;+/* ExtensionType value from RFC5054 */
&lt;br&gt;+#define TLSEXT_TYPE_srp				12
&lt;br&gt;&amp;nbsp;#define TLSEXT_TYPE_session_ticket		35
&lt;br&gt;&amp;nbsp;/* ExtensionType value from draft-rescorla-tls-opaque-prf-input-00.txt */
&lt;br&gt;&amp;nbsp;#if 0 /* will have to be provided externally for now ,
&lt;br&gt;@@ -380,6 +384,17 @@
&lt;br&gt;&amp;nbsp;#define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0300C018
&lt;br&gt;&amp;nbsp;#define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0300C019
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* SRP ciphersuites from RFC 5054 */
&lt;br&gt;+#define TLS1_CK_SRP_SHA_WITH_3DES_EDE_CBC_SHA		0x0300C01A
&lt;br&gt;+#define TLS1_CK_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA	0x0300C01B
&lt;br&gt;+#define TLS1_CK_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA	0x0300C01C
&lt;br&gt;+#define TLS1_CK_SRP_SHA_WITH_AES_128_CBC_SHA		0x0300C01D
&lt;br&gt;+#define TLS1_CK_SRP_SHA_RSA_WITH_AES_128_CBC_SHA	0x0300C01E
&lt;br&gt;+#define TLS1_CK_SRP_SHA_DSS_WITH_AES_128_CBC_SHA	0x0300C01F
&lt;br&gt;+#define TLS1_CK_SRP_SHA_WITH_AES_256_CBC_SHA		0x0300C020
&lt;br&gt;+#define TLS1_CK_SRP_SHA_RSA_WITH_AES_256_CBC_SHA	0x0300C021
&lt;br&gt;+#define TLS1_CK_SRP_SHA_DSS_WITH_AES_256_CBC_SHA	0x0300C022
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/* XXX
&lt;br&gt;&amp;nbsp; * Inconsistency alert:
&lt;br&gt;&amp;nbsp; * The OpenSSL names of ciphers with ephemeral DH here include the string
&lt;br&gt;@@ -447,6 +462,17 @@
&lt;br&gt;&amp;nbsp;#define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA		&amp;quot;PSK-AES128-CBC-SHA&amp;quot;
&lt;br&gt;&amp;nbsp;#define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA		&amp;quot;PSK-AES256-CBC-SHA&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+/* SRP ciphersuite from RFC 5054 */
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_WITH_3DES_EDE_CBC_SHA		&amp;quot;SRP-3DES-EDE-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA	&amp;quot;SRP-RSA-3DES-EDE-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA	&amp;quot;SRP-DSS-3DES-EDE-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_WITH_AES_128_CBC_SHA		&amp;quot;SRP-AES-128-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_128_CBC_SHA	&amp;quot;SRP-RSA-AES-128-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_128_CBC_SHA	&amp;quot;SRP-DSS-AES-128-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_WITH_AES_256_CBC_SHA		&amp;quot;SRP-AES-256-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_RSA_WITH_AES_256_CBC_SHA	&amp;quot;SRP-RSA-AES-256-CBC-SHA&amp;quot;
&lt;br&gt;+#define TLS1_TXT_SRP_SHA_DSS_WITH_AES_256_CBC_SHA	&amp;quot;SRP-DSS-AES-256-CBC-SHA&amp;quot;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/* Camellia ciphersuites from RFC4132 */
&lt;br&gt;&amp;nbsp;#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA		&amp;quot;CAMELLIA128-SHA&amp;quot;
&lt;br&gt;&amp;nbsp;#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA	&amp;quot;DH-DSS-CAMELLIA128-SHA&amp;quot;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/ssl/tls_srp.c openssl-SNAP-20091218-srp/ssl/tls_srp.c
&lt;br&gt;--- openssl-SNAP-20091218-orig/ssl/tls_srp.c	1970-01-01 00:00:00.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/ssl/tls_srp.c	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -0,0 +1,518 @@
&lt;br&gt;+/* ssl/tls_srp.c */
&lt;br&gt;+/* Written by Christophe Renou (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=23&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;christophe.renou@...&lt;/a&gt;) with 
&lt;br&gt;+ * the precious help of Peter Sylvester (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=24&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;peter.sylvester@...&lt;/a&gt;) 
&lt;br&gt;+ * for the EdelKey project and contributed to the OpenSSL project 2004.
&lt;br&gt;+ */
&lt;br&gt;+/* ====================================================================
&lt;br&gt;+ * Copyright (c) 2004 The OpenSSL Project. &amp;nbsp;All rights reserved.
&lt;br&gt;+ *
&lt;br&gt;+ * Redistribution and use in source and binary forms, with or without
&lt;br&gt;+ * modification, are permitted provided that the following conditions
&lt;br&gt;+ * are met:
&lt;br&gt;+ *
&lt;br&gt;+ * 1. Redistributions of source code must retain the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer. 
&lt;br&gt;+ *
&lt;br&gt;+ * 2. Redistributions in binary form must reproduce the above copyright
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;notice, this list of conditions and the following disclaimer in
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;the documentation and/or other materials provided with the
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;distribution.
&lt;br&gt;+ *
&lt;br&gt;+ * 3. All advertising materials mentioning features or use of this
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;software must display the following acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit. (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * 4. The names &amp;quot;OpenSSL Toolkit&amp;quot; and &amp;quot;OpenSSL Project&amp;quot; must not be used to
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;endorse or promote products derived from this software without
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;prior written permission. For written permission, please contact
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=25&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;licensing@...&lt;/a&gt;.
&lt;br&gt;+ *
&lt;br&gt;+ * 5. Products derived from this software may not be called &amp;quot;OpenSSL&amp;quot;
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;nor may &amp;quot;OpenSSL&amp;quot; appear in their names without prior written
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;permission of the OpenSSL Project.
&lt;br&gt;+ *
&lt;br&gt;+ * 6. Redistributions of any form whatsoever must retain the following
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;acknowledgment:
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&amp;quot;This product includes software developed by the OpenSSL Project
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;for use in the OpenSSL Toolkit (&lt;a href=&quot;http://www.OpenSSL.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.OpenSSL.org/&lt;/a&gt;)&amp;quot;
&lt;br&gt;+ *
&lt;br&gt;+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
&lt;br&gt;+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
&lt;br&gt;+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
&lt;br&gt;+ * PURPOSE ARE DISCLAIMED. &amp;nbsp;IN NO EVENT SHALL THE OpenSSL PROJECT OR
&lt;br&gt;+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
&lt;br&gt;+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
&lt;br&gt;+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&lt;br&gt;+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
&lt;br&gt;+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
&lt;br&gt;+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
&lt;br&gt;+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
&lt;br&gt;+ * OF THE POSSIBILITY OF SUCH DAMAGE.
&lt;br&gt;+ * ====================================================================
&lt;br&gt;+ *
&lt;br&gt;+ * This product includes cryptographic software written by Eric Young
&lt;br&gt;+ * (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=26&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;eay@...&lt;/a&gt;). &amp;nbsp;This product includes software written by Tim
&lt;br&gt;+ * Hudson (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26849767&amp;i=27&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tjh@...&lt;/a&gt;).
&lt;br&gt;+ *
&lt;br&gt;+ */
&lt;br&gt;+#include &amp;quot;ssl_locl.h&amp;quot;
&lt;br&gt;+#ifndef OPENSSL_NO_SRP
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;openssl/rand.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/srp.h&amp;gt;
&lt;br&gt;+#include &amp;lt;openssl/err.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_SRP_CTX_free(struct ssl_ctx_st *ctx)
&lt;br&gt;+	{
&lt;br&gt;+	if (ctx == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+	OPENSSL_free(ctx-&amp;gt;srp_ctx.login);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.N);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.g);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.s);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.B);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.A);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.a);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.b);
&lt;br&gt;+	BN_free(ctx-&amp;gt;srp_ctx.v);
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.TLS_ext_srp_username_callback = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_cb_arg = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_verify_param_callback = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.N = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.g = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.B = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.A = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.a = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.b = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.login = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.info = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.strength = SRP_MINIMAL_N;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.srp_Mask = 0;
&lt;br&gt;+	return (1);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_SRP_CTX_free(struct ssl_st *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+	OPENSSL_free(s-&amp;gt;srp_ctx.login);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.N);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.g);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.s);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.B);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.A);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.a);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.b);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.v);
&lt;br&gt;+	s-&amp;gt;srp_ctx.TLS_ext_srp_username_callback = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_cb_arg = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_verify_param_callback = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.N = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.g = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.B = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.A = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.a = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.b = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.login = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.info = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.strength = SRP_MINIMAL_N;
&lt;br&gt;+	s-&amp;gt;srp_ctx.srp_Mask = 0;
&lt;br&gt;+	return (1);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_SRP_CTX_init(struct ssl_st *s)
&lt;br&gt;+	{
&lt;br&gt;+	SSL_CTX *ctx;
&lt;br&gt;+
&lt;br&gt;+	if ((s == NULL) || ((ctx = s-&amp;gt;ctx) == NULL))
&lt;br&gt;+		return 0;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_cb_arg = ctx-&amp;gt;srp_ctx.SRP_cb_arg;
&lt;br&gt;+	/* set client Hello login callback */
&lt;br&gt;+	s-&amp;gt;srp_ctx.TLS_ext_srp_username_callback = ctx-&amp;gt;srp_ctx.TLS_ext_srp_username_callback;
&lt;br&gt;+	/* set SRP N/g param callback for verification */
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_verify_param_callback = ctx-&amp;gt;srp_ctx.SRP_verify_param_callback;
&lt;br&gt;+	/* set SRP client passwd callback */
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback = ctx-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback;
&lt;br&gt;+	s-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback = ctx-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback;
&lt;br&gt;+
&lt;br&gt;+	s-&amp;gt;srp_ctx.N = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.g = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.B = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.A = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.a = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.b = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.login = NULL;
&lt;br&gt;+	s-&amp;gt;srp_ctx.info = ctx-&amp;gt;srp_ctx.info;
&lt;br&gt;+	s-&amp;gt;srp_ctx.strength = ctx-&amp;gt;srp_ctx.strength;
&lt;br&gt;+
&lt;br&gt;+	if (((ctx-&amp;gt;srp_ctx.N != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.N = BN_dup(ctx-&amp;gt;srp_ctx.N)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.g != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.g = BN_dup(ctx-&amp;gt;srp_ctx.g)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.s != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.s = BN_dup(ctx-&amp;gt;srp_ctx.s)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.B != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.B = BN_dup(ctx-&amp;gt;srp_ctx.B)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.A != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.A = BN_dup(ctx-&amp;gt;srp_ctx.A)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.a != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.a = BN_dup(ctx-&amp;gt;srp_ctx.a)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.v != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.v = BN_dup(ctx-&amp;gt;srp_ctx.v)) == NULL)) ||
&lt;br&gt;+		((ctx-&amp;gt;srp_ctx.b != NULL) &amp;&amp;
&lt;br&gt;+		 ((s-&amp;gt;srp_ctx.b = BN_dup(ctx-&amp;gt;srp_ctx.b)) == NULL)))
&lt;br&gt;+		{
&lt;br&gt;+		SSLerr(SSL_F_SSL_SRP_CTX_INIT,ERR_R_BN_LIB);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+	if ((ctx-&amp;gt;srp_ctx.login != NULL) &amp;&amp; 
&lt;br&gt;+		((s-&amp;gt;srp_ctx.login = BUF_strdup(ctx-&amp;gt;srp_ctx.login)) == NULL))
&lt;br&gt;+		{
&lt;br&gt;+		SSLerr(SSL_F_SSL_SRP_CTX_INIT,ERR_R_INTERNAL_ERROR);
&lt;br&gt;+		goto err;
&lt;br&gt;+		}
&lt;br&gt;+	s-&amp;gt;srp_ctx.srp_Mask = ctx-&amp;gt;srp_ctx.srp_Mask;
&lt;br&gt;+
&lt;br&gt;+	return (1);
&lt;br&gt;+err:
&lt;br&gt;+	OPENSSL_free(s-&amp;gt;srp_ctx.login);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.N);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.g);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.s);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.B);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.A);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.a);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.b);
&lt;br&gt;+	BN_free(s-&amp;gt;srp_ctx.v);
&lt;br&gt;+	return (0);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_SRP_CTX_init(struct ssl_ctx_st *ctx)
&lt;br&gt;+	{
&lt;br&gt;+	if (ctx == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_cb_arg = NULL;
&lt;br&gt;+	/* set client Hello login callback */
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.TLS_ext_srp_username_callback = NULL;
&lt;br&gt;+	/* set SRP N/g param callback for verification */
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_verify_param_callback = NULL;
&lt;br&gt;+	/* set SRP client passwd callback */
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback = NULL;
&lt;br&gt;+
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.N = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.g = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.B = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.A = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.a = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.b = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.login = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.srp_Mask = 0;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.info = NULL;
&lt;br&gt;+	ctx-&amp;gt;srp_ctx.strength = SRP_MINIMAL_N;
&lt;br&gt;+
&lt;br&gt;+	return (1);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/* server side */
&lt;br&gt;+int SSL_srp_server_param_with_username(SSL *s, int *ad)
&lt;br&gt;+	{
&lt;br&gt;+	unsigned char b[SSL_MAX_MASTER_KEY_LENGTH];
&lt;br&gt;+	int al;
&lt;br&gt;+
&lt;br&gt;+	*ad = SSL_AD_UNKNOWN_SRP_USERNAME;
&lt;br&gt;+	if ((s-&amp;gt;srp_ctx.TLS_ext_srp_username_callback !=NULL) &amp;&amp;
&lt;br&gt;+		((al = s-&amp;gt;srp_ctx.TLS_ext_srp_username_callback(s, ad, s-&amp;gt;srp_ctx.SRP_cb_arg))!=SSL_ERROR_NONE))
&lt;br&gt;+			return al;
&lt;br&gt;+
&lt;br&gt;+	*ad = SSL_AD_INTERNAL_ERROR;
&lt;br&gt;+	if ((s-&amp;gt;srp_ctx.N == NULL) ||
&lt;br&gt;+		(s-&amp;gt;srp_ctx.g == NULL) ||
&lt;br&gt;+		(s-&amp;gt;srp_ctx.s == NULL) ||
&lt;br&gt;+		(s-&amp;gt;srp_ctx.v == NULL))
&lt;br&gt;+		return SSL3_AL_FATAL;
&lt;br&gt;+
&lt;br&gt;+	RAND_bytes(b, sizeof(b));
&lt;br&gt;+	s-&amp;gt;srp_ctx.b = BN_bin2bn(b,sizeof(b),NULL);
&lt;br&gt;+	OPENSSL_cleanse(b,sizeof(b));
&lt;br&gt;+
&lt;br&gt;+	/* Calculate: &amp;nbsp;B = (kv + g^b) % N &amp;nbsp;*/
&lt;br&gt;+
&lt;br&gt;+	return ((s-&amp;gt;srp_ctx.B = SRP_Calc_B(s-&amp;gt;srp_ctx.b, s-&amp;gt;srp_ctx.N, s-&amp;gt;srp_ctx.g, s-&amp;gt;srp_ctx.v)) != NULL)?
&lt;br&gt;+			SSL_ERROR_NONE:SSL3_AL_FATAL;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/* If the server just has the raw password, make up a verifier entry on the fly */
&lt;br&gt;+int SSL_set_srp_server_param_pw(SSL *s, const char *user, const char *pass, const char *grp)
&lt;br&gt;+	{
&lt;br&gt;+	SRP_gN *GN = SRP_get_default_gN(grp);
&lt;br&gt;+	if(GN == NULL) return -1;
&lt;br&gt;+	s-&amp;gt;srp_ctx.N = BN_dup(GN-&amp;gt;N);
&lt;br&gt;+	s-&amp;gt;srp_ctx.g = BN_dup(GN-&amp;gt;g);
&lt;br&gt;+	if(s-&amp;gt;srp_ctx.v != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		BN_clear_free(s-&amp;gt;srp_ctx.v);
&lt;br&gt;+		s-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+		}
&lt;br&gt;+	if(s-&amp;gt;srp_ctx.s != NULL)
&lt;br&gt;+		{
&lt;br&gt;+		BN_clear_free(s-&amp;gt;srp_ctx.s);
&lt;br&gt;+		s-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+		}
&lt;br&gt;+	if(!SRP_create_verifier_BN(user, pass, &amp;s-&amp;gt;srp_ctx.s, &amp;s-&amp;gt;srp_ctx.v, GN-&amp;gt;N, GN-&amp;gt;g)) return -1;
&lt;br&gt;+
&lt;br&gt;+	return 1;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_set_srp_server_param(SSL *s,BIGNUM *N,BIGNUM *g,BIGNUM *sa,BIGNUM *v,char *info)
&lt;br&gt;+	{
&lt;br&gt;+	if (N!= NULL)
&lt;br&gt;+		{
&lt;br&gt;+		if (s-&amp;gt;srp_ctx.N != NULL)
&lt;br&gt;+			{
&lt;br&gt;+			if (!BN_copy(s-&amp;gt;srp_ctx.N,N))
&lt;br&gt;+				{
&lt;br&gt;+				BN_free(s-&amp;gt;srp_ctx.N);
&lt;br&gt;+				s-&amp;gt;srp_ctx.N = NULL;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			s-&amp;gt;srp_ctx.N = BN_dup(N);
&lt;br&gt;+		}
&lt;br&gt;+	if (g!= NULL)
&lt;br&gt;+		{
&lt;br&gt;+		if (s-&amp;gt;srp_ctx.g != NULL)
&lt;br&gt;+			{
&lt;br&gt;+			if (!BN_copy(s-&amp;gt;srp_ctx.g,g))
&lt;br&gt;+				{
&lt;br&gt;+				BN_free(s-&amp;gt;srp_ctx.g);
&lt;br&gt;+				s-&amp;gt;srp_ctx.g = NULL;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			s-&amp;gt;srp_ctx.g = BN_dup(g);
&lt;br&gt;+		}
&lt;br&gt;+	if (sa!= NULL)
&lt;br&gt;+		{
&lt;br&gt;+		if (s-&amp;gt;srp_ctx.s != NULL)
&lt;br&gt;+			{
&lt;br&gt;+			if (!BN_copy(s-&amp;gt;srp_ctx.s,sa))
&lt;br&gt;+				{
&lt;br&gt;+				BN_free(s-&amp;gt;srp_ctx.s);
&lt;br&gt;+				s-&amp;gt;srp_ctx.s = NULL;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			s-&amp;gt;srp_ctx.s = BN_dup(sa);
&lt;br&gt;+		}
&lt;br&gt;+	if (v!= NULL)
&lt;br&gt;+		{
&lt;br&gt;+		if (s-&amp;gt;srp_ctx.v != NULL)
&lt;br&gt;+			{
&lt;br&gt;+			if (!BN_copy(s-&amp;gt;srp_ctx.v,v))
&lt;br&gt;+				{
&lt;br&gt;+				BN_free(s-&amp;gt;srp_ctx.v);
&lt;br&gt;+				s-&amp;gt;srp_ctx.v = NULL;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;+		else
&lt;br&gt;+			s-&amp;gt;srp_ctx.v = BN_dup(v);
&lt;br&gt;+		}
&lt;br&gt;+	s-&amp;gt;srp_ctx.info = info;
&lt;br&gt;+
&lt;br&gt;+	if (!(s-&amp;gt;srp_ctx.N) ||
&lt;br&gt;+		!(s-&amp;gt;srp_ctx.g) ||
&lt;br&gt;+		!(s-&amp;gt;srp_ctx.s) ||
&lt;br&gt;+		!(s-&amp;gt;srp_ctx.v))
&lt;br&gt;+		return -1;
&lt;br&gt;+
&lt;br&gt;+	return 1;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_generate_server_master_secret(SSL *s,unsigned char *master_key)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM *K = NULL, *u = NULL;
&lt;br&gt;+	int ret = -1, tmp_len;
&lt;br&gt;+	unsigned char *tmp = NULL;
&lt;br&gt;+
&lt;br&gt;+	if (!SRP_Verify_A_mod_N(s-&amp;gt;srp_ctx.A,s-&amp;gt;srp_ctx.N))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!(u = SRP_Calc_u(s-&amp;gt;srp_ctx.A,s-&amp;gt;srp_ctx.B,s-&amp;gt;srp_ctx.N)))
&lt;br&gt;+		goto err;
&lt;br&gt;+	if (!(K = SRP_Calc_server_key(s-&amp;gt;srp_ctx.A, s-&amp;gt;srp_ctx.v, u, s-&amp;gt;srp_ctx.b, s-&amp;gt;srp_ctx.N)))
&lt;br&gt;+		goto err;
&lt;br&gt;+
&lt;br&gt;+	tmp_len = BN_num_bytes(K);
&lt;br&gt;+	if ((tmp = OPENSSL_malloc(tmp_len)) == NULL)
&lt;br&gt;+		goto err;
&lt;br&gt;+	BN_bn2bin(K, tmp);
&lt;br&gt;+	ret = s-&amp;gt;method-&amp;gt;ssl3_enc-&amp;gt;generate_master_secret(s,master_key,tmp,tmp_len);
&lt;br&gt;+err:
&lt;br&gt;+	if (tmp)
&lt;br&gt;+		{
&lt;br&gt;+		OPENSSL_cleanse(tmp,tmp_len) ;
&lt;br&gt;+		OPENSSL_free(tmp);
&lt;br&gt;+		}
&lt;br&gt;+	BN_clear_free(K);
&lt;br&gt;+	BN_clear_free(u);
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+/* client side */
&lt;br&gt;+int SRP_generate_client_master_secret(SSL *s,unsigned char *master_key)
&lt;br&gt;+	{
&lt;br&gt;+	BIGNUM *x = NULL, *u = NULL, *K = NULL;
&lt;br&gt;+	int ret = -1, tmp_len;
&lt;br&gt;+	char *passwd = NULL;
&lt;br&gt;+	unsigned char *tmp = NULL;
&lt;br&gt;+
&lt;br&gt;+	/* Checks if b % n == 0
&lt;br&gt;+	 */
&lt;br&gt;+	if (SRP_Verify_B_mod_N(s-&amp;gt;srp_ctx.B,s-&amp;gt;srp_ctx.N)==0) goto err;
&lt;br&gt;+	if (!(u = SRP_Calc_u(s-&amp;gt;srp_ctx.A,s-&amp;gt;srp_ctx.B,s-&amp;gt;srp_ctx.N))) goto err;
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback == NULL) goto err;
&lt;br&gt;+	if (!(passwd = s-&amp;gt;srp_ctx.SRP_give_srp_client_pwd_callback(s, s-&amp;gt;srp_ctx.SRP_cb_arg))) goto err;
&lt;br&gt;+	if (!(x = SRP_Calc_x(s-&amp;gt;srp_ctx.s,s-&amp;gt;srp_ctx.login,passwd))) goto err;
&lt;br&gt;+	if (!(K = SRP_Calc_client_key(s-&amp;gt;srp_ctx.N, s-&amp;gt;srp_ctx.B, s-&amp;gt;srp_ctx.g, x, s-&amp;gt;srp_ctx.a, u))) goto err;
&lt;br&gt;+
&lt;br&gt;+	tmp_len = BN_num_bytes(K);
&lt;br&gt;+	if ((tmp = OPENSSL_malloc(tmp_len)) == NULL) goto err;
&lt;br&gt;+	BN_bn2bin(K, tmp);
&lt;br&gt;+	ret = s-&amp;gt;method-&amp;gt;ssl3_enc-&amp;gt;generate_master_secret(s,master_key,tmp,tmp_len);
&lt;br&gt;+err:
&lt;br&gt;+	if (tmp)
&lt;br&gt;+		{
&lt;br&gt;+		OPENSSL_cleanse(tmp,tmp_len) ;
&lt;br&gt;+		OPENSSL_free(tmp);
&lt;br&gt;+		}
&lt;br&gt;+	BN_clear_free(K);
&lt;br&gt;+	BN_clear_free(x);
&lt;br&gt;+	if (passwd)
&lt;br&gt;+		{
&lt;br&gt;+		OPENSSL_cleanse(passwd,strlen(passwd)) ;
&lt;br&gt;+		OPENSSL_free(passwd);
&lt;br&gt;+		}
&lt;br&gt;+	BN_clear_free(u);
&lt;br&gt;+	return ret;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_Calc_A_param(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	unsigned char rand[SSL_MAX_MASTER_KEY_LENGTH];
&lt;br&gt;+
&lt;br&gt;+	if (BN_num_bits(s-&amp;gt;srp_ctx.N) &amp;lt; s-&amp;gt;srp_ctx.strength)
&lt;br&gt;+		return -1;
&lt;br&gt;+
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.SRP_verify_param_callback ==NULL &amp;&amp; 
&lt;br&gt;+		!SRP_check_known_gN_param(s-&amp;gt;srp_ctx.g,s-&amp;gt;srp_ctx.N))
&lt;br&gt;+		return -1 ;
&lt;br&gt;+
&lt;br&gt;+	RAND_bytes(rand, sizeof(rand));
&lt;br&gt;+	s-&amp;gt;srp_ctx.a = BN_bin2bn(rand,sizeof(rand), s-&amp;gt;srp_ctx.a);
&lt;br&gt;+	OPENSSL_cleanse(rand,sizeof(rand));
&lt;br&gt;+
&lt;br&gt;+	if (!(s-&amp;gt;srp_ctx.A = SRP_Calc_A(s-&amp;gt;srp_ctx.a,s-&amp;gt;srp_ctx.N,s-&amp;gt;srp_ctx.g)))
&lt;br&gt;+		return -1;
&lt;br&gt;+
&lt;br&gt;+	/* We can have a callback to verify SRP param!! */
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.SRP_verify_param_callback !=NULL) 
&lt;br&gt;+		return s-&amp;gt;srp_ctx.SRP_verify_param_callback(s,s-&amp;gt;srp_ctx.SRP_cb_arg);
&lt;br&gt;+
&lt;br&gt;+	return 1;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SRP_have_to_put_srp_username(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+	if ((s-&amp;gt;srp_ctx.login = s-&amp;gt;srp_ctx.SRP_TLS_ext_missing_srp_client_username_callback(s,s-&amp;gt;srp_ctx.SRP_cb_arg)) == NULL)
&lt;br&gt;+		return 0;
&lt;br&gt;+	s-&amp;gt;srp_ctx.srp_Mask|=SSL_kSRP;
&lt;br&gt;+	return 1;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SSL_get_srp_g(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.g != NULL)
&lt;br&gt;+		return s-&amp;gt;srp_ctx.g;
&lt;br&gt;+	return s-&amp;gt;ctx-&amp;gt;srp_ctx.g;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+BIGNUM *SSL_get_srp_N(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.N != NULL)
&lt;br&gt;+		return s-&amp;gt;srp_ctx.N;
&lt;br&gt;+	return s-&amp;gt;ctx-&amp;gt;srp_ctx.N;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+char *SSL_get_srp_username(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.login != NULL)
&lt;br&gt;+		return s-&amp;gt;srp_ctx.login;
&lt;br&gt;+	return s-&amp;gt;ctx-&amp;gt;srp_ctx.login;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+char *SSL_get_srp_userinfo(SSL *s)
&lt;br&gt;+	{
&lt;br&gt;+	if (s-&amp;gt;srp_ctx.info != NULL)
&lt;br&gt;+		return s-&amp;gt;srp_ctx.info;
&lt;br&gt;+	return s-&amp;gt;ctx-&amp;gt;srp_ctx.info;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+#define tls1_ctx_ctrl ssl3_ctx_ctrl
&lt;br&gt;+#define tls1_ctx_callback_ctrl ssl3_ctx_callback_ctrl
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_username(SSL_CTX *ctx,char *name)
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_ctrl(ctx,SSL_CTRL_SET_TLS_EXT_SRP_USERNAME,0,name);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_password(SSL_CTX *ctx,char *password)
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_ctrl(ctx,SSL_CTRL_SET_TLS_EXT_SRP_PASSWORD,0,password);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_strength(SSL_CTX *ctx, int strength)
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_ctrl(ctx,SSL_CTRL_SET_TLS_EXT_SRP_STRENGTH,strength,NULL);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_verify_param_callback(SSL_CTX *ctx, int (*cb)(SSL *,void *))
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_callback_ctrl(ctx,SSL_CTRL_SET_SRP_VERIFY_PARAM_CB,(void (*)())cb);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_cb_arg(SSL_CTX *ctx, void *arg)
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_ctrl(ctx,SSL_CTRL_SET_SRP_ARG,0,arg);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_username_callback(SSL_CTX *ctx, int (*cb)(SSL *,int *,void *))
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_callback_ctrl(ctx,SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB,(void (*)())cb);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_client_pwd_callback(SSL_CTX *ctx, char *(*cb)(SSL *,void *))
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_callback_ctrl(ctx,SSL_CTRL_SET_SRP_GIVE_CLIENT_PWD_CB,(void (*)())cb);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+int SSL_CTX_set_srp_missing_srp_username_callback(SSL_CTX *ctx, char *(*cb)(SSL *,void *))
&lt;br&gt;+	{
&lt;br&gt;+	return tls1_ctx_callback_ctrl(ctx,SSL_CTRL_SET_TLS_EXT_SRP_MISSING_CLIENT_USERNAME_CB,(void (*)())cb);
&lt;br&gt;+	}
&lt;br&gt;+#endif
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/test/Makefile openssl-SNAP-20091218-srp/test/Makefile
&lt;br&gt;--- openssl-SNAP-20091218-orig/test/Makefile	2009-10-18 15:00:36.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/test/Makefile	2009-12-18 20:33:30.000000000 +0000
&lt;br&gt;@@ -61,6 +61,7 @@
&lt;br&gt;&amp;nbsp;EVPTEST=	evp_test
&lt;br&gt;&amp;nbsp;IGETEST=	igetest
&lt;br&gt;&amp;nbsp;JPAKETEST=	jpaketest
&lt;br&gt;+SRPTEST=	srptest
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;TESTS=		alltests
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -71,7 +72,7 @@
&lt;br&gt;&amp;nbsp;	$(MDC2TEST)$(EXE_EXT) $(RMDTEST)$(EXE_EXT) \
&lt;br&gt;&amp;nbsp;	$(RANDTEST)$(EXE_EXT) $(DHTEST)$(EXE_EXT) $(ENGINETEST)$(EXE_EXT) \
&lt;br&gt;&amp;nbsp;	$(BFTEST)$(EXE_EXT) $(CASTTEST)$(EXE_EXT) $(SSLTEST)$(EXE_EXT) $(EXPTEST)$(EXE_EXT) $(DSATEST)$(EXE_EXT) $(RSATEST)$(EXE_EXT) \
&lt;br&gt;-	$(EVPTEST)$(EXE_EXT) $(IGETEST)$(EXE_EXT) $(JPAKETEST)$(EXE_EXT)
&lt;br&gt;+	$(EVPTEST)$(EXE_EXT) $(IGETEST)$(EXE_EXT) $(JPAKETEST)$(EXE_EXT) $(SRPTEST)$(EXE_EXT)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;# $(METHTEST)$(EXE_EXT)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -91,7 +92,7 @@
&lt;br&gt;&amp;nbsp;	$(DESTEST).c $(SHATEST).c $(SHA1TEST).c $(MDC2TEST).c $(RMDTEST).c \
&lt;br&gt;&amp;nbsp;	$(RANDTEST).c $(DHTEST).c $(ENGINETEST).c $(CASTTEST).c \
&lt;br&gt;&amp;nbsp;	$(BFTEST).c &amp;nbsp;$(SSLTEST).c $(DSATEST).c &amp;nbsp; $(EXPTEST).c $(RSATEST).c \
&lt;br&gt;-	$(EVPTEST).c $(IGETEST).c $(JPAKETEST).c
&lt;br&gt;+	$(EVPTEST).c $(IGETEST).c $(JPAKETEST).c $(SRPTEST).c
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;EXHEADER= 
&lt;br&gt;&amp;nbsp;HEADER=	$(EXHEADER)
&lt;br&gt;@@ -134,7 +135,7 @@
&lt;br&gt;&amp;nbsp;	test_enc test_x509 test_rsa test_crl test_sid \
&lt;br&gt;&amp;nbsp;	test_gen test_req test_pkcs7 test_verify test_dh test_dsa \
&lt;br&gt;&amp;nbsp;	test_ss test_ca test_engine test_evp test_ssl test_tsa test_ige \
&lt;br&gt;-	test_jpake test_cms
&lt;br&gt;+	test_jpake test_srp test_cms
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;test_evp:
&lt;br&gt;&amp;nbsp;	../util/shlib_wrap.sh ./$(EVPTEST) evptests.txt
&lt;br&gt;@@ -308,6 +309,10 @@
&lt;br&gt;&amp;nbsp;	@echo &amp;quot;CMS consistency test&amp;quot;
&lt;br&gt;&amp;nbsp;	$(PERL) cms-test.pl
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+test_srp: $(SRPTEST)$(EXE_EXT)
&lt;br&gt;+	@echo &amp;quot;Test SRP&amp;quot;
&lt;br&gt;+	../util/shlib_wrap.sh ./srptest
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;lint:
&lt;br&gt;&amp;nbsp;	lint -DLINT $(INCLUDES) $(SRC)&amp;gt;fluff
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -441,6 +446,9 @@
&lt;br&gt;&amp;nbsp;$(JPAKETEST)$(EXE_EXT): $(JPAKETEST).o $(DLIBCRYPTO)
&lt;br&gt;&amp;nbsp;	@target=$(JPAKETEST); $(BUILD_CMD)
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+$(SRPTEST)$(EXE_EXT): $(SRPTEST).o $(DLIBCRYPTO)
&lt;br&gt;+	@target=$(SRPTEST); $(BUILD_CMD)
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#$(AESTEST).o: $(AESTEST).c
&lt;br&gt;&amp;nbsp;#	$(CC) -c $(CFLAGS) -DINTERMEDIATE_VALUE_KAT -DTRACE_KAT_MCT $(AESTEST).c
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/test/testssl openssl-SNAP-20091218-srp/test/testssl
&lt;br&gt;--- openssl-SNAP-20091218-orig/test/testssl	2006-03-11 00:00:52.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/test/testssl	2009-12-18 20:33:31.000000000 +0000
&lt;br&gt;@@ -148,4 +148,14 @@
&lt;br&gt;&amp;nbsp;echo test tls1 with PSK via BIO pair
&lt;br&gt;&amp;nbsp;$ssltest -bio_pair -tls1 -cipher PSK -psk abc123 $extra || exit 1
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+if ../util/shlib_wrap.sh ../apps/openssl no-srp; then
&lt;br&gt;+ &amp;nbsp;echo skipping SRP tests
&lt;br&gt;+else
&lt;br&gt;+ &amp;nbsp;echo test tls1 with SRP
&lt;br&gt;+ &amp;nbsp;$ssltest -tls1 -cipher SRP -srpuser test -srppass abc123
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp;echo test tls1 with SRP via BIO pair
&lt;br&gt;+ &amp;nbsp;$ssltest -bio_pair -tls1 -cipher SRP -srpuser test -srppass abc123
&lt;br&gt;+fi
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;exit 0
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/util/libeay.num openssl-SNAP-20091218-srp/util/libeay.num
&lt;br&gt;--- openssl-SNAP-20091218-orig/util/libeay.num	2009-11-09 15:00:29.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/util/libeay.num	2009-12-18 20:35:24.000000000 +0000
&lt;br&gt;@@ -4170,3 +4170,19 @@
&lt;br&gt;&amp;nbsp;X509_STORE_CTX_get0_current_crl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4545	EXIST::FUNCTION:
&lt;br&gt;&amp;nbsp;X509_STORE_CTX_get0_parent_ctx &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4546	EXIST::FUNCTION:
&lt;br&gt;&amp;nbsp;X509_STORE_CTX_get0_current_issuer &amp;nbsp; &amp;nbsp; &amp;nbsp;4547	EXIST::FUNCTION:
&lt;br&gt;+SRP_VBASE_get_by_user &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4548	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_server_key &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4549	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_create_verifier &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4550	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_create_verifier_BN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4551	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_u &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4552	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_VBASE_free &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4553	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_client_key &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4554	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_get_default_gN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4555	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_x &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4556	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_B &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4557	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_VBASE_new &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4558	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_check_known_gN_param &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4559	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Calc_A &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4560	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Verify_A_mod_N &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4561	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_VBASE_init &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4562	EXIST::FUNCTION:SRP
&lt;br&gt;+SRP_Verify_B_mod_N &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4563	EXIST::FUNCTION:SRP
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/util/mk1mf.pl openssl-SNAP-20091218-srp/util/mk1mf.pl
&lt;br&gt;--- openssl-SNAP-20091218-orig/util/mk1mf.pl	2009-09-20 13:00:24.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/util/mk1mf.pl	2009-12-18 20:33:31.000000000 +0000
&lt;br&gt;@@ -103,6 +103,7 @@
&lt;br&gt;&amp;nbsp;	just-ssl				- remove all non-ssl keys/digest
&lt;br&gt;&amp;nbsp;	no-asm 					- No x86 asm
&lt;br&gt;&amp;nbsp;	no-krb5					- No KRB5
&lt;br&gt;+	no-srp					- No SRP
&lt;br&gt;&amp;nbsp;	no-ec					- No EC
&lt;br&gt;&amp;nbsp;	no-ecdsa				- No ECDSA
&lt;br&gt;&amp;nbsp;	no-ecdh					- No ECDH
&lt;br&gt;@@ -260,6 +261,7 @@
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_SSL2&amp;quot; if $no_ssl2;
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_SSL3&amp;quot; if $no_ssl3;
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_TLSEXT&amp;quot; if $no_tlsext;
&lt;br&gt;+$cflags.=&amp;quot; -DOPENSSL_NO_SRP&amp;quot; if $no_srp;
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_CMS&amp;quot; if $no_cms;
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_ERR&amp;quot; &amp;nbsp;if $no_err;
&lt;br&gt;&amp;nbsp;$cflags.=&amp;quot; -DOPENSSL_NO_KRB5&amp;quot; if $no_krb5;
&lt;br&gt;@@ -764,6 +766,8 @@
&lt;br&gt;&amp;nbsp;	@a=grep(!/(^sha1)|(_sha1$)|(m_dss1$)/,@a) if $no_sha1;
&lt;br&gt;&amp;nbsp;	@a=grep(!/_mdc2$/,@a) if $no_mdc2;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	@a=grep(!/(srp)/,@a) if $no_srp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	@a=grep(!/^engine$/,@a) if $no_engine;
&lt;br&gt;&amp;nbsp;	@a=grep(!/^hw$/,@a) if $no_hw;
&lt;br&gt;&amp;nbsp;	@a=grep(!/(^rsa$)|(^genrsa$)/,@a) if $no_rsa;
&lt;br&gt;@@ -1039,6 +1043,7 @@
&lt;br&gt;&amp;nbsp;		&amp;quot;no-ssl2&amp;quot; =&amp;gt; \$no_ssl2,
&lt;br&gt;&amp;nbsp;		&amp;quot;no-ssl3&amp;quot; =&amp;gt; \$no_ssl3,
&lt;br&gt;&amp;nbsp;		&amp;quot;no-tlsext&amp;quot; =&amp;gt; \$no_tlsext,
&lt;br&gt;+		&amp;quot;no-srp&amp;quot; =&amp;gt; \$no_srp,
&lt;br&gt;&amp;nbsp;		&amp;quot;no-cms&amp;quot; =&amp;gt; \$no_cms,
&lt;br&gt;&amp;nbsp;		&amp;quot;no-jpake&amp;quot; =&amp;gt; \$no_jpake,
&lt;br&gt;&amp;nbsp;		&amp;quot;no-err&amp;quot; =&amp;gt; \$no_err,
&lt;br&gt;@@ -1053,7 +1058,7 @@
&lt;br&gt;&amp;nbsp;			[\$no_rc2, \$no_idea, \$no_des, \$no_bf, \$no_cast,
&lt;br&gt;&amp;nbsp;			 &amp;nbsp;\$no_md2, \$no_sha, \$no_mdc2, \$no_dsa, \$no_dh,
&lt;br&gt;&amp;nbsp;			 &amp;nbsp;\$no_ssl2, \$no_err, \$no_ripemd, \$no_rc5,
&lt;br&gt;-			 &amp;nbsp;\$no_aes, \$no_camellia, \$no_seed],
&lt;br&gt;+			 &amp;nbsp;\$no_aes, \$no_camellia, \$no_seed, \$no_srp],
&lt;br&gt;&amp;nbsp;		&amp;quot;rsaref&amp;quot; =&amp;gt; 0,
&lt;br&gt;&amp;nbsp;		&amp;quot;gcc&amp;quot; =&amp;gt; \$gcc,
&lt;br&gt;&amp;nbsp;		&amp;quot;debug&amp;quot; =&amp;gt; \$debug,
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/util/mkdef.pl openssl-SNAP-20091218-srp/util/mkdef.pl
&lt;br&gt;--- openssl-SNAP-20091218-orig/util/mkdef.pl	2009-05-15 17:00:46.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/util/mkdef.pl	2009-12-18 20:33:31.000000000 +0000
&lt;br&gt;@@ -98,7 +98,7 @@
&lt;br&gt;&amp;nbsp;			 # RFC3779
&lt;br&gt;&amp;nbsp;			 &amp;quot;RFC3779&amp;quot;,
&lt;br&gt;&amp;nbsp;			 # TLS
&lt;br&gt;-			 &amp;quot;TLSEXT&amp;quot;, &amp;quot;PSK&amp;quot;,
&lt;br&gt;+			 &amp;quot;TLSEXT&amp;quot;, &amp;quot;PSK&amp;quot;, &amp;quot;SRP&amp;quot;,
&lt;br&gt;&amp;nbsp;			 # CMS
&lt;br&gt;&amp;nbsp;			 &amp;quot;CMS&amp;quot;,
&lt;br&gt;&amp;nbsp;			 # CryptoAPI Engine
&lt;br&gt;@@ -127,7 +127,7 @@
&lt;br&gt;&amp;nbsp;my $no_ec; my $no_ecdsa; my $no_ecdh; my $no_engine; my $no_hw;
&lt;br&gt;&amp;nbsp;my $no_fp_api; my $no_static_engine=1; my $no_gmp; my $no_deprecated;
&lt;br&gt;&amp;nbsp;my $no_rfc3779; my $no_psk; my $no_tlsext; my $no_cms; my $no_capieng;
&lt;br&gt;-my $no_jpake; my $no_ssl2;
&lt;br&gt;+my $no_jpake; my $no_srp; my $no_ssl2;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;my $zlib;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -218,6 +218,7 @@
&lt;br&gt;&amp;nbsp;	elsif (/^no-ssl2$/)	{ $no_ssl2=1; }
&lt;br&gt;&amp;nbsp;	elsif (/^no-capieng$/)	{ $no_capieng=1; }
&lt;br&gt;&amp;nbsp;	elsif (/^no-jpake$/)	{ $no_jpake=1; }
&lt;br&gt;+	elsif (/^no-srp$/)	{ $no_srp=1; }
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -316,6 +317,7 @@
&lt;br&gt;&amp;nbsp;$crypto.=&amp;quot; crypto/pqueue/pqueue.h&amp;quot;;
&lt;br&gt;&amp;nbsp;$crypto.=&amp;quot; crypto/cms/cms.h&amp;quot;;
&lt;br&gt;&amp;nbsp;$crypto.=&amp;quot; crypto/jpake/jpake.h&amp;quot;;
&lt;br&gt;+$crypto.=&amp;quot; crypto/srp/srp.h&amp;quot;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;my $symhacks=&amp;quot;crypto/symhacks.h&amp;quot;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -1166,6 +1168,7 @@
&lt;br&gt;&amp;nbsp;			if ($keyword eq &amp;quot;SSL2&amp;quot; &amp;&amp; $no_ssl2) { return 0; }
&lt;br&gt;&amp;nbsp;			if ($keyword eq &amp;quot;CAPIENG&amp;quot; &amp;&amp; $no_capieng) { return 0; }
&lt;br&gt;&amp;nbsp;			if ($keyword eq &amp;quot;JPAKE&amp;quot; &amp;&amp; $no_jpake) { return 0; }
&lt;br&gt;+			if ($keyword eq &amp;quot;SRP&amp;quot; &amp;&amp; $no_srp) { return 0; }
&lt;br&gt;&amp;nbsp;			if ($keyword eq &amp;quot;DEPRECATED&amp;quot; &amp;&amp; $no_deprecated) { return 0; }
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;			# Nothing recognise as true
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/util/mkfiles.pl openssl-SNAP-20091218-srp/util/mkfiles.pl
&lt;br&gt;--- openssl-SNAP-20091218-orig/util/mkfiles.pl	2008-12-23 16:00:22.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/util/mkfiles.pl	2009-12-18 20:33:31.000000000 +0000
&lt;br&gt;@@ -62,6 +62,7 @@
&lt;br&gt;&amp;nbsp;&amp;quot;crypto/pqueue&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;crypto/whrlpool&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;crypto/ts&amp;quot;,
&lt;br&gt;+&amp;quot;crypto/srp&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;ssl&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;apps&amp;quot;,
&lt;br&gt;&amp;nbsp;&amp;quot;engines&amp;quot;,
&lt;br&gt;diff -ruN openssl-SNAP-20091218-orig/util/ssleay.num openssl-SNAP-20091218-srp/util/ssleay.num
&lt;br&gt;--- openssl-SNAP-20091218-orig/util/ssleay.num	2009-07-08 10:00:24.000000000 +0000
&lt;br&gt;+++ openssl-SNAP-20091218-srp/util/ssleay.num	2009-12-18 20:33:31.000000000 +0000
&lt;br&gt;@@ -259,3 +259,17 @@
&lt;br&gt;&amp;nbsp;SSL_set_session_ticket_ext_cb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 308	EXIST::FUNCTION:
&lt;br&gt;&amp;nbsp;SSL_set1_param &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;309	EXIST::FUNCTION:
&lt;br&gt;&amp;nbsp;SSL_CTX_set1_param &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;310	EXIST::FUNCTION:
&lt;br&gt;+SSL_CTX_set_srp_client_pwd_callback &amp;nbsp; &amp;nbsp; 311	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_get_srp_g &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 312	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_username_callback &amp;nbsp; &amp;nbsp; &amp;nbsp; 313	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_get_srp_userinfo &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;314	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_set_srp_server_param &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;315	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_set_srp_server_param_pw &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 316	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_get_srp_N &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 317	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_get_srp_username &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;318	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_password &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;319	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_strength &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;320	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_verify_param_callback &amp;nbsp; 321	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_missing_srp_username_callback 322	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_cb_arg &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;323	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;+SSL_CTX_set_srp_username &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;324	EXIST::FUNCTION:SRP,TLSEXT
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--1794---PATCH--SRP-ciphersuites-in-1.0.1-and-1.1.0-%28updated%29-tp26849767p26849767.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26842603</id>
	<title>[openssl.org #2129] bug: OpenSSL 1.0.0-beta4 multiple declarations of SMIME_crlf_copy() and SMIME_text(), (asn1.h and pkcs7.h)</title>
	<published>2009-12-18T04:17:51Z</published>
	<updated>2009-12-18T04:17:51Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">In OpenSSL 1.0.0-beta4, SMIME_crlf_copy() and SMIME_text() are declared in two places: asn1.h and pkcs7.h.
&lt;br&gt;&lt;br&gt;The declarations in pkcs7.h appear to be redundant, (and can cause warnings/errors depending on compiler config), because that header file already includes asn1.h.
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;John Fitzgibbon
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26842603&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26842603&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2129--bug%3A-OpenSSL-1.0.0-beta4-multiple-declarations-of-SMIME_crlf_copy%28%29-and-SMIME_text%28%29%2C-%28asn1.h-and-pkcs7.h%29-tp26842603p26842603.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26839820</id>
	<title>openssl-1.0.0-stable-SNAP-20091218</title>
	<published>2009-12-17T22:42:43Z</published>
	<updated>2009-12-17T22:42:43Z</updated>
	<author>
		<name>The Doctor</name>
	</author>
	<content type="html">This is flaky and inconsistent.
&lt;br&gt;&lt;br&gt;openssl-1.0.0-stable-SNAP-20091217 works better.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Member - Liberal International	This is &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26839820&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;doctor@...&lt;/a&gt; Ici &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26839820&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;doctor@...&lt;/a&gt;
&lt;br&gt;God, Queen and country! Never Satan President Republic! Beware AntiChrist rising! 
&lt;br&gt;&lt;a href=&quot;http://twitter.com/rootnl2k&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://twitter.com/rootnl2k&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.myspace.com/502748630&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.myspace.com/502748630&lt;/a&gt;&amp;nbsp;
&lt;br&gt;Merry Christmas 2009 and Happy New Year 2010
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26839820&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26839820&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/openssl-1.0.0-stable-SNAP-20091218-tp26839820p26839820.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26831109</id>
	<title>Re: FIPS capable with cryptodev/padlock bug or feature?</title>
	<published>2009-12-17T08:42:09Z</published>
	<updated>2009-12-17T08:42:09Z</updated>
	<author>
		<name>Dr. Stephen Henson</name>
	</author>
	<content type="html">On Wed, Dec 16, 2009, Peter Fry wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; I recently discovered that openssl doesn't use cryptodev or padlock
&lt;br&gt;&amp;gt; when compiled with the fips option (even though the engine was set..
&lt;br&gt;&amp;gt; i.e.: oepnssl speed -evp aes-128-cbc -engine padlock). It seems to me
&lt;br&gt;&amp;gt; that the engines should be used unless FIPS mode has been set. What's
&lt;br&gt;&amp;gt; the intended behavior here?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Ooops, there's a bug in the initialisation code. FIPS builds use different
&lt;br&gt;code to avoid having to drag in large dependencies in the validated module.
&lt;br&gt;&lt;br&gt;This should fix it:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://cvs.openssl.org/chngview?cn=18992&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://cvs.openssl.org/chngview?cn=18992&lt;/a&gt;&lt;br&gt;&lt;br&gt;This change is outside the validated module so it is usable with the 1.2
&lt;br&gt;validation.
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;--
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26831109&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26831109&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/FIPS-capable-with-cryptodev-padlock-bug-or-feature--tp26812829p26831109.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26829867</id>
	<title>[openssl.org #2127] Missing checks for unavailable algorithms in EVP_PBE_CipherInit</title>
	<published>2009-12-17T07:30:47Z</published>
	<updated>2009-12-17T07:30:47Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">Fix applied, thanks for the report.
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;-- 
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26829867&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26829867&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2127--Missing-checks-for-unavailable-algorithms-in-EVP_PBE_CipherInit-tp26829867p26829867.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26816298</id>
	<title>Re: FIPS capable with cryptodev/padlock bug or feature?</title>
	<published>2009-12-16T10:35:26Z</published>
	<updated>2009-12-16T10:35:26Z</updated>
	<author>
		<name>William A. Rowe Jr.</name>
	</author>
	<content type="html">Peter Fry wrote:
&lt;br&gt;&amp;gt; I recently discovered that openssl doesn't use cryptodev or padlock
&lt;br&gt;&amp;gt; when compiled with the fips option (even though the engine was set..
&lt;br&gt;&amp;gt; i.e.: oepnssl speed -evp aes-128-cbc -engine padlock). It seems to me
&lt;br&gt;&amp;gt; that the engines should be used unless FIPS mode has been set. What's
&lt;br&gt;&amp;gt; the intended behavior here?
&lt;br&gt;&lt;br&gt;This was answered (indirectly) in the past few months; the fips build
&lt;br&gt;is growing to include non-fips features (optimized/assembly code, etc)
&lt;br&gt;but at this time you are looking at an artifact of bygone days when the
&lt;br&gt;fips build was fips-only.
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26816298&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26816298&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/FIPS-capable-with-cryptodev-padlock-bug-or-feature--tp26812829p26816298.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26810658</id>
	<title>Re: [openssl.org #2128] PKCS12_PBE_add is a noop but maybe it should add the algorithms?</title>
	<published>2009-12-16T04:52:40Z</published>
	<updated>2009-12-16T04:52:40Z</updated>
	<author>
		<name>Dr. Stephen Henson</name>
	</author>
	<content type="html">On Wed, Dec 16, 2009, tushar ganguli wrote:
&lt;br&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; I wanted to know where in the openssl source code is the subject key
&lt;br&gt;&amp;gt; identifier being generated.
&lt;br&gt;&amp;gt; Is it only the SHA1 hash (160) as mentioned in RFC3280 (4.2.1.2)?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Don't post off-topic user queries to openssl-dev.
&lt;br&gt;&lt;br&gt;It does use SHA1 and the code is in crypto/x509v3/v3_skey.c
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;--
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26810658&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26810658&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2128--PKCS12_PBE_add-is-a-noop-but-maybe-it-should-add-the-algorithms--tp26791334p26810658.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26809700</id>
	<title>Re: [openssl.org #2128] PKCS12_PBE_add is a noop but maybe it should  add the algorithms?</title>
	<published>2009-12-16T03:15:20Z</published>
	<updated>2009-12-16T03:15:20Z</updated>
	<author>
		<name>tushar ganguli</name>
	</author>
	<content type="html">Hi,&lt;br&gt;I wanted to know where in the openssl source code is the subject key identifier being generated.&lt;br&gt;Is it only the SHA1 hash (160) as mentioned in RFC3280 (4.2.1.2)?&lt;br&gt;&lt;br&gt;Regards,&lt;br&gt;Tushar&lt;br&gt;&lt;br&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2128--PKCS12_PBE_add-is-a-noop-but-maybe-it-should-add-the-algorithms--tp26791334p26809700.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26812829</id>
	<title>FIPS capable with cryptodev/padlock bug or feature?</title>
	<published>2009-12-15T22:35:46Z</published>
	<updated>2009-12-15T22:35:46Z</updated>
	<author>
		<name>Peter Fry-2</name>
	</author>
	<content type="html">I recently discovered that openssl doesn't use cryptodev or padlock
&lt;br&gt;when compiled with the fips option (even though the engine was set..
&lt;br&gt;i.e.: oepnssl speed -evp aes-128-cbc -engine padlock). It seems to me
&lt;br&gt;that the engines should be used unless FIPS mode has been set. What's
&lt;br&gt;the intended behavior here?
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Peter
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26812829&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26812829&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/FIPS-capable-with-cryptodev-padlock-bug-or-feature--tp26812829p26812829.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26791334</id>
	<title>[openssl.org #2128] PKCS12_PBE_add is a noop but maybe it should add the algorithms?</title>
	<published>2009-12-15T00:18:37Z</published>
	<updated>2009-12-15T00:18:37Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">If you call just SSL_library_init() and PKCS12_PBE_add some pkcs12 files
&lt;br&gt;will not be loadable and moreover the openssl will crash due to missing
&lt;br&gt;checks for ciphers not found. I've reported the crash in a separate
&lt;br&gt;report. Perhaps the PKCS12_PBE_add should add the algorithms which are
&lt;br&gt;not added in the SSL_library_init() call but which are used in the
&lt;br&gt;static PBE algorithms table?
&lt;br&gt;-- 
&lt;br&gt;Tomas Mraz
&lt;br&gt;No matter how far down the wrong road you've gone, turn back.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Turkish proverb
&lt;br&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26791334&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26791334&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2128--PKCS12_PBE_add-is-a-noop-but-maybe-it-should-add-the-algorithms--tp26791334p26791334.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26791299</id>
	<title>[openssl.org #2127] Missing checks for unavailable algorithms in EVP_PBE_CipherInit</title>
	<published>2009-12-15T00:18:18Z</published>
	<updated>2009-12-15T00:18:18Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">In the function EVP_PBE_CipherInit there are missing checks for
&lt;br&gt;unavailable algorithms (such as when they are not compiled in or when
&lt;br&gt;OpenSSL_add_all_algorithms() is not called).
&lt;br&gt;&lt;br&gt;The attached patch adds the checks although probably new error codes
&lt;br&gt;should be added for these failures.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Tomas Mraz
&lt;br&gt;No matter how far down the wrong road you've gone, turn back.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Turkish proverb
&lt;br&gt;&lt;br&gt;&lt;br /&gt;diff -up openssl-1.0.0-beta4/crypto/evp/evp_pbe.c.no-cipher openssl-1.0.0-beta4/crypto/evp/evp_pbe.c
&lt;br&gt;--- openssl-1.0.0-beta4/crypto/evp/evp_pbe.c.no-cipher	2008-11-05 19:38:57.000000000 +0100
&lt;br&gt;+++ openssl-1.0.0-beta4/crypto/evp/evp_pbe.c	2009-12-14 22:54:27.000000000 +0100
&lt;br&gt;@@ -174,12 +174,20 @@ int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_
&lt;br&gt;&amp;nbsp;	if (cipher_nid == -1)
&lt;br&gt;&amp;nbsp;		cipher = NULL;
&lt;br&gt;&amp;nbsp;	else
&lt;br&gt;-		cipher = EVP_get_cipherbynid(cipher_nid);
&lt;br&gt;+		if ((cipher = EVP_get_cipherbynid(cipher_nid)) == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE);
&lt;br&gt;+			return 0;
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (md_nid == -1)
&lt;br&gt;&amp;nbsp;		md = NULL;
&lt;br&gt;&amp;nbsp;	else
&lt;br&gt;-		md = EVP_get_digestbynid(md_nid);
&lt;br&gt;+		if ((md = EVP_get_digestbynid(md_nid)) == NULL)
&lt;br&gt;+			{
&lt;br&gt;+			EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE);
&lt;br&gt;+			return 0;
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (!keygen(ctx, pass, passlen, param, cipher, md, en_de))
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2127--Missing-checks-for-unavailable-algorithms-in-EVP_PBE_CipherInit-tp26791299p26791299.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26787331</id>
	<title>RE: strange error, i cannot find any documentation: raw RSA</title>
	<published>2009-12-14T16:03:12Z</published>
	<updated>2009-12-14T16:03:12Z</updated>
	<author>
		<name>Dave Thompson-4</name>
	</author>
	<content type="html">&amp;gt; From: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26787331&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-openssl-dev@...&lt;/a&gt; On Behalf Of Luca Costantino
&lt;br&gt;&amp;gt; Sent: Saturday, 12 December, 2009 17:14
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; i'm having some troubles with this (simple) code...
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; #include
&lt;br&gt;&amp;gt; 
&lt;/div&gt;I assume those are actually #include &amp;lt;header&amp;gt; and just got 
&lt;br&gt;stripped by some HTML or pseudo-HTML (or XML) mailing process. 
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; #define PUB_KEY &amp;quot;../chiave/pubkey.pem&amp;quot;
&lt;br&gt;&amp;gt; #define PRIV_KEY &amp;quot;../chiave/keynopwd.pem&amp;quot;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; int cifra_messaggio(char* messaggio_in_chiaro, char* 
&lt;br&gt;&amp;gt; messaggio_cifrato) {
&lt;br&gt;&amp;gt; 	FILE* fdpub = fopen(PUB_KEY, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;gt; 	RSA* chiave_pubblica = RSA_new();
&lt;br&gt;&amp;gt; 	PEM_read_RSA_PUBKEY(fdpub, &amp;chiave_pubblica, NULL, NULL);
&lt;br&gt;&amp;gt; 	messaggio_cifrato = malloc(RSA_size(chiave_pubblica));
&lt;br&gt;&amp;gt; 
&lt;/div&gt;This sets the pointer *in cifra_ only* see below. 
&lt;br&gt;&amp;nbsp;
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tPubkey successfully loaded\n&amp;quot;);
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tMessage length is %d byte\n&amp;quot;, 
&lt;br&gt;&amp;gt; strlen(messaggio_in_chiaro));
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	int n_byte_cifrati = 
&lt;br&gt;&amp;gt; RSA_public_encrypt(strlen(messaggio_in_chiaro) +
&lt;br&gt;&amp;gt; 1, messaggio_in_chiaro, messaggio_cifrato, chiave_pubblica,
&lt;br&gt;&amp;gt; RSA_PKCS1_OAEP_PADDING);
&lt;br&gt;&amp;gt; 	if(n_byte_cifrati == 0 || n_byte_cifrati == -1) {
&lt;br&gt;&amp;gt; 		printf(&amp;quot;Err :\tUnable to encrypt\n&amp;quot;);
&lt;/div&gt;&lt;br&gt;Here you ought to display the error(stack) in the same way 
&lt;br&gt;you do below in decifra_ . 
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 		errore_non_recuperabile();
&lt;br&gt;&amp;gt; 		exit(-1);
&lt;br&gt;&amp;gt; 	}
&lt;br&gt;&amp;gt; 	
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tText successfully encrypted\n&amp;quot;);
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\t%d byte encrypted\n&amp;quot;, n_byte_cifrati);
&lt;br&gt;&amp;gt; 	RSA_free(chiave_pubblica);
&lt;br&gt;&amp;gt; 	fclose(fdpub);
&lt;br&gt;&amp;gt; 	
&lt;br&gt;&amp;gt; 	return n_byte_cifrati;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; int decifra_messaggio(char* messaggio_cifrato, char* 
&lt;br&gt;&amp;gt; messaggio_decifrato) {
&lt;br&gt;&amp;gt; 	FILE* fdpriv = fopen(PRIV_KEY, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;gt; 	RSA* chiave_privata;
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	chiave_privata = PEM_read_RSAPrivateKey(fdpriv, NULL, 
&lt;br&gt;&amp;gt; NULL, NULL);
&lt;/div&gt;&lt;br&gt;In cifra_ you preallocated pubkey and used the second argument; 
&lt;br&gt;here you let OpenSSL allocate and use the return value.
&lt;br&gt;Both are legal, but it's confusing to be inconsistent.
&lt;br&gt;&lt;br&gt;&amp;gt; 	messaggio_decifrato = malloc(RSA_size(chiave_privata));
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;This sets the pointer *in decifra_ only* see below.
&lt;br&gt;&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tPrivkey successfully loaded\n&amp;quot;);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	int n_byte_decifrati = RSA_private_decrypt(512, 
&lt;br&gt;&amp;gt; messaggio_cifrato,
&lt;br&gt;&amp;gt; messaggio_decifrato, chiave_privata, RSA_PKCS1_OAEP_PADDING);
&lt;br&gt;&lt;br&gt;Even if _cifrato were valid (see below), 512 is the correct length 
&lt;br&gt;only for a 4Kbit key. Which is possible but rare. cifra_ should 
&lt;br&gt;return both the pointer and count, the caller (main) should save 
&lt;br&gt;both and pass both in to decifra_ which should use them.
&lt;br&gt;&lt;br&gt;&amp;gt; 	if(n_byte_decifrati == 0 || n_byte_decifrati == -1) {
&lt;br&gt;&amp;gt; 		printf(&amp;quot;Err :\tUnable to decrypt\n&amp;quot;);
&lt;br&gt;&amp;gt; 		
&lt;br&gt;&amp;gt; 		char* errore = malloc(1024);
&lt;br&gt;&amp;gt; 		bzero(errore, 1024);
&lt;br&gt;&amp;gt; 		printf(&amp;quot;%s\n&amp;quot;, 
&lt;br&gt;&amp;gt; ERR_error_string(ERR_get_error(), errore));
&lt;br&gt;&amp;gt; 		
&lt;br&gt;&lt;br&gt;Minor points: no need to use malloc() here, much less bzero();
&lt;br&gt;just declare a local array. &amp;nbsp;There can be more than one item 
&lt;br&gt;in the error stack; best to loop until ERR_get_error() returns 
&lt;br&gt;zero, which requires you put it (temporarily) in a variable. &amp;nbsp;
&lt;br&gt;If you just want output to a file, as here (stdout), 
&lt;br&gt;ERR_print_errors_fp is easier to use. &amp;nbsp;See below about strings.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 		errore_non_recuperabile();
&lt;br&gt;&amp;gt; 		exit(-1);
&lt;br&gt;&amp;gt; 		
&lt;br&gt;&amp;gt; 	}
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tText successfully decripted\n&amp;quot;);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	RSA_free(chiave_privata);
&lt;br&gt;&amp;gt; 	fclose(fdpriv);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	return n_byte_decifrati;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; int main(int argc, char* argv[]) {
&lt;br&gt;&amp;gt; 	char* messaggio = &amp;quot;Questo è un messaggio di prova lungo qualche
&lt;br&gt;&amp;gt; decina di caratteri...&amp;quot;;
&lt;br&gt;&amp;gt; 	char* cifrato;
&lt;br&gt;&amp;gt; 	char* decifrato;
&lt;br&gt;&amp;gt; 
&lt;/div&gt;Only the first pointer is initialized here; the others are garbage 
&lt;br&gt;(and are NOT set by the calls below).
&lt;br&gt;&lt;br&gt;&amp;gt; 	cifra_messaggio(messaggio, cifrato);
&lt;br&gt;&lt;br&gt;This does the encryption, but throws away (leaks) the pointer 
&lt;br&gt;to malloc'ed storage, and also the length.
&lt;br&gt;&lt;br&gt;&amp;gt; 	decifra_messaggio(cifrato, decifrato);
&lt;br&gt;&amp;gt; 
&lt;br&gt;This attempts to decrypt some random memory, and in the very 
&lt;br&gt;unlikely case it succeeds, throws away (leaks) the result.
&lt;br&gt;&lt;br&gt;&amp;gt; 	printf(&amp;quot;Plaintext\t%s\n&amp;quot;, messaggio);
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Cyphertext\t%s\n&amp;quot;, decifrato);
&lt;br&gt;&amp;gt; 	
&lt;br&gt;Once the other bugs are fixed that label is misleading: the 
&lt;br&gt;result of deciphering is plaintext again, not ciphertext.
&lt;br&gt;(And if you do want to display 'cifrato', printf %s won't 
&lt;br&gt;come even close; it's not printable nor null-terminated.)
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 	if(strncmp(messaggio, decifrato, 512) != 0) {
&lt;br&gt;&amp;gt; 		printf(&amp;quot;Info:\tMessages are different\n&amp;quot;);
&lt;br&gt;&amp;gt; 		errore_non_recuperabile();
&lt;br&gt;&amp;gt; 		exit(-1);
&lt;br&gt;&amp;gt; 	}
&lt;br&gt;&amp;gt; 	
&lt;br&gt;&amp;gt; 	printf(&amp;quot;Info:\tMessages are equal\n&amp;quot;);
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 	return 1;
&lt;br&gt;&amp;gt; }
&lt;br&gt;&amp;gt; 
&lt;/div&gt;Aside: Unix programs conventionally exit with 0 for success, 
&lt;br&gt;and a value &amp;gt;0 (not negative) for error.
&lt;br&gt;&lt;br&gt;&amp;gt; i got this error
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; error:0407A079:lib(4):func(122):reason(121)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; and i'm not able to understand why...
&lt;br&gt;&amp;gt; 
&lt;br&gt;1) You got the error because of the bugs above.
&lt;br&gt;&lt;br&gt;2) You got an unhelpful *display* of the error because you 
&lt;br&gt;didn't load errorstrings before using ERR_error_string .
&lt;br&gt;Easiest is to call ERR_load_crypto_strings() at startup. 
&lt;br&gt;There are other possibilities for very constrained systems.
&lt;br&gt;&lt;br&gt;3) Having gotten the unhelpful display, you can decode it 
&lt;br&gt;with the commandline utility 'errstr'; in this case:
&lt;br&gt;&amp;gt;openssl errstr 0407A079
&lt;br&gt;error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error
&lt;br&gt;&lt;br&gt;4) 2 and 3 are FAQs: &lt;a href=&quot;http://www.openssl.org/support/faq.html#PROG7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org/support/faq.html#PROG7&lt;/a&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Also, in general you should always check the return values 
&lt;br&gt;from fopen(), malloc(), *_new and other allocating routines 
&lt;br&gt;e.g. PEM_read*(,NULL...) for null before using them.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26787331&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26787331&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/strange-error%2C-i-cannot-find-any-documentation-tp26769728p26787331.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26791211</id>
	<title>Version 2 Key Signature on 0.9.8l</title>
	<published>2009-12-14T08:33:04Z</published>
	<updated>2009-12-14T08:33:04Z</updated>
	<author>
		<name>Adam Chasen-2</name>
	</author>
	<content type="html">It appears there is a version 2 pgp key which signs the latest openssl archive. 
&lt;br&gt;&lt;br&gt;Version 2 isn't mentioned in the OpenPGP message format RFC. &lt;a href=&quot;http://tools.ietf.org/html/rfc4880&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://tools.ietf.org/html/rfc4880&lt;/a&gt;&amp;nbsp;section 5.5.2
&lt;br&gt;&lt;br&gt;This problem is unique to Ben Laurie's key as others are V3 or later.
&lt;br&gt;&lt;br&gt;Ancillary information: I ran into this issue when using Conary's key verification:
&lt;br&gt;&lt;a href=&quot;https://issues.rpath.com/browse/CNY-3308&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://issues.rpath.com/browse/CNY-3308&lt;/a&gt;&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;Adam
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26791211&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26791211&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Version-2-Key-Signature-on-0.9.8l-tp26791211p26791211.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26770846</id>
	<title>[openssl.org #2126] Bug: Can't Connect via TLS through PHP v5.3.0/OpenSSL v0.9.8l</title>
	<published>2009-12-13T15:14:16Z</published>
	<updated>2009-12-13T15:14:16Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&amp;gt; [&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26770846&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;pablo.livardo@...&lt;/a&gt; - Wed Dec 09 20:12:24 2009]:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; However, I found that if I entered this command into OpenSSL:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;nbsp; openssl s_client -starttls smtp -connect server.domain.com:587 -tls1
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; It worked and returned a collection of certificate information. I get the
&lt;br&gt;&amp;gt; impression that TLS can start unencrypted and then switch it up but is
&lt;br&gt;this
&lt;br&gt;&amp;gt; the real source of my problem, a lack of support in PHP for this
&lt;br&gt;&amp;gt; functionality? (See this post that gave me a clue --
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://forums.devnetwork.net/viewtopic.php?f=52&amp;t=96525#p531211&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://forums.devnetwork.net/viewtopic.php?f=52&amp;t=96525#p531211&lt;/a&gt;)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I'm no TLS/SSL expert so apologies if my terminology is wrong, I'm simply
&lt;br&gt;&amp;gt; trying to understand why my script isn't working.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;No it's more that SMTP (and several other protocols) can start
&lt;br&gt;unencrypted and then become encrypted over TLS. 
&lt;br&gt;&lt;br&gt;You typically have to send an appropriate command or commands to the
&lt;br&gt;server and after receiving an appropriate response switch over to TLS.
&lt;br&gt;For SMTP it is the STARTTLS command.
&lt;br&gt;&lt;br&gt;The initial commands, response checking and switch over have to be part
&lt;br&gt;of the application itself. I'm not familiar with PHP and the OpenSSL
&lt;br&gt;language bindings so not sure how you'd do that.
&lt;br&gt;&lt;br&gt;In any case this isn't a bug and shouldn't be sent to the bug tracker.
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;-- 
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26770846&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26770846&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2126--Bug%3A-Can%27t-Connect-via-TLS-through-PHP-v5.3.0-OpenSSL-v0.9.8l-tp26770846p26770846.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26769728</id>
	<title>strange error, i cannot find any documentation</title>
	<published>2009-12-12T14:14:22Z</published>
	<updated>2009-12-12T14:14:22Z</updated>
	<author>
		<name>Luca Costantino</name>
	</author>
	<content type="html">-----BEGIN PGP SIGNED MESSAGE-----
&lt;br&gt;Hash: SHA1
&lt;br&gt;&lt;br&gt;hi there
&lt;br&gt;&lt;br&gt;that's my first message, welcome to me :)
&lt;br&gt;&lt;br&gt;i'm having some troubles with this (simple) code...
&lt;br&gt;&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;#include
&lt;br&gt;&lt;br&gt;#define PUB_KEY &amp;quot;../chiave/pubkey.pem&amp;quot;
&lt;br&gt;#define PRIV_KEY &amp;quot;../chiave/keynopwd.pem&amp;quot;
&lt;br&gt;&lt;br&gt;int cifra_messaggio(char* messaggio_in_chiaro, char* messaggio_cifrato) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILE* fdpub = fopen(PUB_KEY, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RSA* chiave_pubblica = RSA_new();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; PEM_read_RSA_PUBKEY(fdpub, &amp;chiave_pubblica, NULL, NULL);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; messaggio_cifrato = malloc(RSA_size(chiave_pubblica));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tPubkey successfully loaded\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tMessage length is %d byte\n&amp;quot;, strlen(messaggio_in_chiaro));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int n_byte_cifrati = RSA_public_encrypt(strlen(messaggio_in_chiaro) +
&lt;br&gt;1, messaggio_in_chiaro, messaggio_cifrato, chiave_pubblica,
&lt;br&gt;RSA_PKCS1_OAEP_PADDING);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(n_byte_cifrati == 0 || n_byte_cifrati == -1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Err :\tUnable to encrypt\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; errore_non_recuperabile();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tText successfully encrypted\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\t%d byte encrypted\n&amp;quot;, n_byte_cifrati);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RSA_free(chiave_pubblica);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fclose(fdpub);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return n_byte_cifrati;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int decifra_messaggio(char* messaggio_cifrato, char* messaggio_decifrato) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FILE* fdpriv = fopen(PRIV_KEY, &amp;quot;r&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RSA* chiave_privata;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chiave_privata = PEM_read_RSAPrivateKey(fdpriv, NULL, NULL, NULL);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; messaggio_decifrato = malloc(RSA_size(chiave_privata));
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tPrivkey successfully loaded\n&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int n_byte_decifrati = RSA_private_decrypt(512, messaggio_cifrato,
&lt;br&gt;messaggio_decifrato, chiave_privata, RSA_PKCS1_OAEP_PADDING);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(n_byte_decifrati == 0 || n_byte_decifrati == -1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Err :\tUnable to decrypt\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* errore = malloc(1024);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(errore, 1024);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;%s\n&amp;quot;, ERR_error_string(ERR_get_error(), errore));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; errore_non_recuperabile();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tText successfully decripted\n&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; RSA_free(chiave_privata);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fclose(fdpriv);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return n_byte_decifrati;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;int main(int argc, char* argv[]) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* messaggio = &amp;quot;Questo è un messaggio di prova lungo qualche
&lt;br&gt;decina di caratteri...&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* cifrato;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char* decifrato;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cifra_messaggio(messaggio, cifrato);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; decifra_messaggio(cifrato, decifrato);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Plaintext\t%s\n&amp;quot;, messaggio);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Cyphertext\t%s\n&amp;quot;, decifrato);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(strncmp(messaggio, decifrato, 512) != 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tMessages are different\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; errore_non_recuperabile();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(-1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&amp;quot;Info:\tMessages are equal\n&amp;quot;);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 1;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;i got this error
&lt;br&gt;&lt;br&gt;error:0407A079:lib(4):func(122):reason(121)
&lt;br&gt;&lt;br&gt;and i'm not able to understand why...
&lt;br&gt;&lt;br&gt;someone can help?
&lt;br&gt;&lt;br&gt;regards
&lt;br&gt;luca
&lt;br&gt;- --
&lt;br&gt;Chiave pubblica &lt;a href=&quot;http://luca.costantino.googlepages.com/luca.costantino.asc&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://luca.costantino.googlepages.com/luca.costantino.asc&lt;/a&gt;&lt;br&gt;&lt;br&gt;Prima di tutto vennero a prendere gli zingari e fui contento, perché
&lt;br&gt;rubacchiavano.
&lt;br&gt;Poi vennero a prendere gli ebrei e stetti zitto, perché mi stavano antipatici.
&lt;br&gt;Poi vennero a prendere gli omosessuali, e fui sollevato, perché mi
&lt;br&gt;erano fastidiosi.
&lt;br&gt;Poi vennero a prendere i comunisti, e io non dissi niente, perché non
&lt;br&gt;ero comunista.
&lt;br&gt;Un giorno vennero a prendere me, e non c’era rimasto nessuno a protestare.
&lt;br&gt;(Bertolt Brecht)
&lt;br&gt;&lt;br&gt;&lt;br&gt;-----BEGIN PGP SIGNATURE-----
&lt;br&gt;Version: GnuPG v1.4.10 (GNU/Linux)
&lt;br&gt;Comment: Use GnuPG with Firefox : &lt;a href=&quot;http://getfiregpg.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://getfiregpg.org&lt;/a&gt;&amp;nbsp;(Version: 0.7.10)
&lt;br&gt;&lt;br&gt;iQEcBAEBAgAGBQJLJBW8AAoJEFl9TsCPYHUhs64H/0u+f1cdT+sw/5YS+mxYdxaR
&lt;br&gt;kqy34ULTeN5H5eC2UJmNX9nb2b9lKGbDfzb7xHB8iiMt79t3JvqVZQN4hOjGstcq
&lt;br&gt;q6Na6ie8jj5MstaoRhM/kIaLye24ZTzN2CGPW0C3aN89aSGMeA7pkuaa1kiYBqus
&lt;br&gt;xJurV/eNSr5qNyIQ985DRFTRWQyddi+j0MzoSECOqxwn12psTs26QPvrtoBgWghS
&lt;br&gt;I6oSYFN2BMw/cCy33eEl9kWi7J5gGAmO/6SqEanpNRLAJMJn530RqKQypSjiM5OY
&lt;br&gt;2Kt2UldYcgC6lYA7P1xFFtQPrq+O2Lnk6XBECL1dYxH+dFzDwRA8Do6CoW2IVYs=
&lt;br&gt;=tnCI
&lt;br&gt;-----END PGP SIGNATURE-----
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26769728&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26769728&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/strange-error%2C-i-cannot-find-any-documentation-tp26769728p26769728.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26749117</id>
	<title>Null pointer dereference in crypto/dsa/dsa_asn1.c</title>
	<published>2009-12-11T09:45:15Z</published>
	<updated>2009-12-11T09:45:15Z</updated>
	<author>
		<name>Michael Cook-7</name>
	</author>
	<content type="html">In this code (dsa_asn1.c):
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; 71 &amp;nbsp;static int sig_cb(int operation, ASN1_VALUE **pval, const 
&lt;br&gt;ASN1_ITEM *it)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;72 &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;73 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(operation == ASN1_OP_NEW_PRE) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;74 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DSA_SIG *sig;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;75 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sig = OPENSSL_malloc(sizeof(DSA_SIG));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;76 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sig-&amp;gt;r = NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;77 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sig-&amp;gt;s = NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;78 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*pval = (ASN1_VALUE *)sig;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;79 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(sig) return 2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;80 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DSAerr(DSA_F_SIG_CB, ERR_R_MALLOC_FAILURE);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;81 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;82 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;83 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;84 &amp;nbsp;}
&lt;br&gt;&lt;br&gt;At line 79, we check if sig is null (which means we believe it's 
&lt;br&gt;plausibly null), but a few lines back, we dereferenced that pointer.
&lt;br&gt;&lt;br&gt;(FTR, this defect was found by Coverity Prevent.)
&lt;br&gt;&lt;br&gt;Michael
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26749117&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26749117&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Null-pointer-dereference-in-crypto-dsa-dsa_asn1.c-tp26749117p26749117.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26745275</id>
	<title>Re: [openssl.org #2105] Please reconsider the client side of the CVE-2009-3555 fix in 1.0.0</title>
	<published>2009-12-11T06:27:05Z</published>
	<updated>2009-12-11T06:27:05Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">On Fri, 2009-12-11 at 14:14 +0100, Stephen Henson via RT wrote: 
&lt;br&gt;&amp;gt; The problem of adding fields to SSL_CTX and SSL has been mentioned by a
&lt;br&gt;&amp;gt; number of people before. How bad is that in practice? SSL_CTX and SSL
&lt;br&gt;&amp;gt; structures are both allocated dynamically so the size change wont
&lt;br&gt;&amp;gt; matter. The only remaining case is applications that access the fields
&lt;br&gt;&amp;gt; directly instead of using APIs.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; We should and will make the SSL and SSL_CTX structures opaque at some
&lt;br&gt;&amp;gt; point but not during a beta release cycle ;-)
&lt;br&gt;&lt;br&gt;As for the ABI breakage I think it would be minimal if the additional
&lt;br&gt;fields were added to the end of the struct. I do not expect that offsets
&lt;br&gt;of the other fields would change on any reasonable C ABIs. As the
&lt;br&gt;structures should never be allocated directly by the application I think
&lt;br&gt;this breakage could be tolerated in beta.
&lt;br&gt;-- 
&lt;br&gt;Tomas Mraz
&lt;br&gt;No matter how far down the wrong road you've gone, turn back.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Turkish proverb
&lt;br&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26745275&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26745275&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2105--Please-reconsider-the-client-side-of-the-CVE-2009-3555-fix-in-1.0.0-tp26744114p26745275.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26744114</id>
	<title>[openssl.org #2105] Please reconsider the client side of the CVE-2009-3555 fix in 1.0.0</title>
	<published>2009-12-11T05:14:16Z</published>
	<updated>2009-12-11T05:14:16Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&lt;div class='shrinkable-quote'&gt;&amp;gt; [&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26744114&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tmraz@...&lt;/a&gt; - Wed Nov 18 09:58:08 2009]:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; The TLS client in openssl-1.0.0 branch aborts the connection if
&lt;br&gt;&amp;gt; SSL_OP_ALLOW_UNSAFE_RENEGOTIATION (or SSL_OP_ALL) flag is not set by the
&lt;br&gt;&amp;gt; calling application and the connected server does not return the
&lt;br&gt;&amp;gt; extension in the server hello message. Unfortunately too many
&lt;br&gt;&amp;gt; applications do not set SSL_OP_ALL which makes them incompatible with
&lt;br&gt;&amp;gt; currently virtually every server as the renegotiation extension
&lt;br&gt;&amp;gt; supporting servers are not deployed yet. I propose adding a new flag for
&lt;br&gt;&amp;gt; the client which would explicitely disable connection to unsafe servers
&lt;br&gt;&amp;gt; and to allow this connection by default. For now in Fedora I am forced
&lt;br&gt;&amp;gt; to just disable the client side check.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; See also: &lt;a href=&quot;https://bugzilla.redhat.com/show_bug.cgi?id=537962&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://bugzilla.redhat.com/show_bug.cgi?id=537962&lt;/a&gt;&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;Yes we should definitely allow connections (at least in the immediate
&lt;br&gt;future) to unpatched servers. 
&lt;br&gt;&lt;br&gt;We'd need two options for this: one for just clients connections and one
&lt;br&gt;to permit legacy renegotiation in general.
&lt;br&gt;&lt;br&gt;That does however hit a snag in that OpenSSL 1.0.0 is pretty much out of
&lt;br&gt;options fields, and we'll need more in future to support TLS v1.1 for
&lt;br&gt;example. 
&lt;br&gt;&lt;br&gt;We should ideally update the options field so it is split up into
&lt;br&gt;several pieces but that might cause binary compatibility problems, not
&lt;br&gt;an ideal thing to do during a beta release :-(
&lt;br&gt;&lt;br&gt;The problem of adding fields to SSL_CTX and SSL has been mentioned by a
&lt;br&gt;number of people before. How bad is that in practice? SSL_CTX and SSL
&lt;br&gt;structures are both allocated dynamically so the size change wont
&lt;br&gt;matter. The only remaining case is applications that access the fields
&lt;br&gt;directly instead of using APIs.
&lt;br&gt;&lt;br&gt;We should and will make the SSL and SSL_CTX structures opaque at some
&lt;br&gt;point but not during a beta release cycle ;-)
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;-- 
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26744114&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26744114&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2105--Please-reconsider-the-client-side-of-the-CVE-2009-3555-fix-in-1.0.0-tp26744114p26744114.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26742205</id>
	<title>cryptoki (Cryptographic Token Interface) patch for OpenSSL 0.9.8k</title>
	<published>2009-12-11T02:51:28Z</published>
	<updated>2009-12-11T02:51:28Z</updated>
	<author>
		<name>Samuel123smith</name>
	</author>
	<content type="html">Hi ALL,
&lt;br&gt;&lt;br&gt;I am new to OpenSSL. I am trying to support cryptoki support for OpenSSL. I have gone through the 
&lt;br&gt;Source code of OpenSSL 0.9.8k and have found that it does not have pkcs11 support .
&lt;br&gt;&lt;br&gt;Any one can please direct me to the pkcs11 patch for openssl 0.9.8k?
&lt;br&gt;&lt;br&gt;Thanks in advance 
&lt;br&gt;Samuel
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/cryptoki-%28Cryptographic-Token-Interface%29-patch-for-OpenSSL-0.9.8k-tp26742205p26742205.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26742062</id>
	<title>Re: [CVS] OpenSSL: openssl/doc/ssl/ SSL_CTX_set_options.pod</title>
	<published>2009-12-11T02:27:32Z</published>
	<updated>2009-12-11T02:27:32Z</updated>
	<author>
		<name>Rainer Jung-3</name>
	</author>
	<content type="html">On 09.12.2009 19:16, Dr. Stephen Henson wrote:
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;OpenSSL CVS Repository
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://cvs.openssl.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://cvs.openssl.org/&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;____________________________________________________________________________
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Server: cvs.openssl.org &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name: &amp;nbsp; Dr. Stephen Henson
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Root: &amp;nbsp; /v/openssl/cvs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Email: &amp;nbsp;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26742062&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;steve@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Module: openssl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Date: &amp;nbsp; 09-Dec-2009 19:16:50
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Branch: HEAD &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Handle: 2009120918165000
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Modified files:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;openssl/doc/ssl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SSL_CTX_set_options.pod
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Log:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;clarify docs
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Summary:
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;Revision &amp;nbsp; &amp;nbsp;Changes &amp;nbsp; &amp;nbsp; Path
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;1.17 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+10 -9 &amp;nbsp; &amp;nbsp; &amp;nbsp;openssl/doc/ssl/SSL_CTX_set_options.pod
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;____________________________________________________________________________
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;patch -p0&amp;lt;&amp;lt;'@@ .'
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Index: openssl/doc/ssl/SSL_CTX_set_options.pod
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;============================================================================
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;$ cvs diff -u -r1.16 -r1.17 SSL_CTX_set_options.pod
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;--- openssl/doc/ssl/SSL_CTX_set_options.pod	9 Dec 2009 17:59:29 -0000	1.16
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;+++ openssl/doc/ssl/SSL_CTX_set_options.pod	9 Dec 2009 18:16:50 -0000	1.17
&lt;/div&gt;...
&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;@@ -254,13 +254,14 @@
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; whether an attack is taking place.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp; If the option B&amp;lt;SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION&amp;gt; &amp;nbsp;is set then the
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-renegotiation between unpatched clients and patched servers is permitted as
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-well as initial connections and renegotiation between patched clients and
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-unpatched servers. This option should be used with caution because it leaves
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-both clients and servers vulnerable. However unpatched servers and clients are
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-likely to be around for some time and simply refusing to connect to unpatched
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-servers may well be considered unacceptable. So applications may be forced to
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;-use this option for the immediate future.
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;+above restrictions are relaxed. Renegotiation is permissible and initial
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;+initial connections to unpatched servers will succeed.
&lt;/div&gt;&lt;br&gt;&amp;quot;permissible and initial initial connections&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ^^^^^^^^^^^^^^^
&lt;br&gt;&lt;br&gt;See also revision 1.15.2.2 in 1_0_0 and 1.13.2.5 in 0_9_8.
&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;&lt;br&gt;Rainer
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26742062&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26742062&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--CVS--OpenSSL%3A-openssl-doc-ssl--SSL_CTX_set_options.pod-tp26742062p26742062.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26735912</id>
	<title>26C3</title>
	<published>2009-12-10T14:09:23Z</published>
	<updated>2009-12-10T14:09:23Z</updated>
	<author>
		<name>lists-139</name>
	</author>
	<content type="html">Dear all,
&lt;br&gt;&lt;br&gt;are there any people from the OpenSSL project coming to the 26C3
&lt;br&gt;conference in Berlin at the end of December?
&lt;br&gt;( &lt;a href=&quot;http://events.ccc.de/congress/2009/wiki/Welcome&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://events.ccc.de/congress/2009/wiki/Welcome&lt;/a&gt;&amp;nbsp;)
&lt;br&gt;&lt;br&gt;If so, I'd be interested in meeting up with you and have a chat about
&lt;br&gt;how to get more involved in the project (until now, all I've done is
&lt;br&gt;sending trivial patches for NULL checks ;-)
&lt;br&gt;&lt;br&gt;Best regards,
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp;Martin
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26735912&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26735912&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/26C3-tp26735912p26735912.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26715948</id>
	<title>[openssl.org #2126] Bug: Can't Connect via TLS through PHP v5.3.0/OpenSSL v0.9.8l</title>
	<published>2009-12-09T11:12:25Z</published>
	<updated>2009-12-09T11:12:25Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I've been trying to get a PHP script to connect via TLS to an email server
&lt;br&gt;but I'm getting an error. In the end I thought I'd try it natively in
&lt;br&gt;OpenSSL and I get the same error. If I use the following command:
&lt;br&gt;&lt;br&gt;&amp;nbsp; openssl s_client -connect server.domain.com:587 -tls1
&lt;br&gt;&lt;br&gt;I get the following error:
&lt;br&gt;&lt;br&gt;&amp;nbsp; CONNECTED(00000774)
&lt;br&gt;&amp;nbsp; 1904:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version
&lt;br&gt;number:.\ssl\s3_pkt.c:284:
&lt;br&gt;&lt;br&gt;I'm using OpenSSL v0.9.8l, compiled for Windows. The PHP v5.3.0 build I have
&lt;br&gt;gives me the same error, is it trying to use SSLv3 instead of TLS?
&lt;br&gt;&lt;br&gt;However, I found that if I entered this command into OpenSSL:
&lt;br&gt;&lt;br&gt;&amp;nbsp; openssl s_client -starttls smtp -connect server.domain.com:587 -tls1
&lt;br&gt;&lt;br&gt;It worked and returned a collection of certificate information. I get the
&lt;br&gt;impression that TLS can start unencrypted and then switch it up but is this
&lt;br&gt;the real source of my problem, a lack of support in PHP for this
&lt;br&gt;functionality? (See this post that gave me a clue --
&lt;br&gt;&lt;a href=&quot;http://forums.devnetwork.net/viewtopic.php?f=52&amp;t=96525#p531211&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://forums.devnetwork.net/viewtopic.php?f=52&amp;t=96525#p531211&lt;/a&gt;)
&lt;br&gt;&lt;br&gt;I'm no TLS/SSL expert so apologies if my terminology is wrong, I'm simply
&lt;br&gt;trying to understand why my script isn't working.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;Pablo
&lt;br&gt;&lt;br&gt;&lt;br /&gt;Hi,&lt;br&gt;&lt;br&gt;I&amp;#39;ve been trying to get a PHP script to connect via TLS to an email server but I&amp;#39;m getting an error. In the end I thought I&amp;#39;d try it natively in OpenSSL and I get the same error. If I use the following command:&lt;br&gt;
&lt;br&gt;&lt;span style=&quot;font-family: courier new,monospace;&quot;&gt;  openssl s_client -connect &lt;a href=&quot;http://server.domain.com:587&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;server.domain.com:587&lt;/a&gt; -tls1&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;br&gt;I get the following error:&lt;br&gt;
&lt;br&gt;&lt;span style=&quot;font-family: courier new,monospace;&quot;&gt;  CONNECTED(00000774)&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace;&quot;&gt;&lt;span style=&quot;font-family: courier new,monospace;&quot;&gt;  1904:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:284:&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace;&quot;&gt;
&lt;br&gt;I&amp;#39;m using OpenSSL v0.9.8l, compiled for Windows. The PHP v5.3.0 build I have gives me the same error, is it trying to use SSLv3 instead of TLS?&lt;br&gt;&lt;br&gt;However, I found that if I entered this command into OpenSSL:&lt;br&gt;
&lt;br&gt;&lt;span style=&quot;font-family: courier new,monospace;&quot;&gt;  openssl s_client -starttls smtp -connect &lt;a href=&quot;http://server.domain.com:587&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;server.domain.com:587&lt;/a&gt; -tls1&lt;/span&gt;&lt;br style=&quot;font-family: courier new,monospace;&quot;&gt;
&lt;br&gt;It worked and returned a collection of certificate information. I get the impression that TLS can start unencrypted and then switch it up but is this the real source of my problem, a lack of support in PHP for this functionality? (See this post that gave me a clue -- &lt;a href=&quot;http://forums.devnetwork.net/viewtopic.php?f=52&amp;amp;t=96525#p531211&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://forums.devnetwork.net/viewtopic.php?f=52&amp;amp;t=96525#p531211&lt;/a&gt;)&lt;br&gt;
&lt;br&gt;I&amp;#39;m no TLS/SSL expert so apologies if my terminology is wrong, I&amp;#39;m simply trying to understand why my script isn&amp;#39;t working.&lt;br&gt;&lt;br&gt;Thanks,&lt;br&gt;&lt;br&gt;Pablo&lt;br&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2126--Bug%3A-Can%27t-Connect-via-TLS-through-PHP-v5.3.0-OpenSSL-v0.9.8l-tp26715948p26715948.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26710466</id>
	<title>Error in 20091209 snaps</title>
	<published>2009-12-09T05:28:34Z</published>
	<updated>2009-12-09T05:28:34Z</updated>
	<author>
		<name>The Doctor</name>
	</author>
	<content type="html">&lt;br&gt;:
&lt;br&gt;eval 'exec perl -S $0 ${1+&amp;quot;$@&amp;quot;}'
&lt;br&gt;&amp;nbsp; &amp;nbsp; if $running_under_some_shell;
&lt;br&gt;##
&lt;br&gt;## &amp;nbsp;Configure -- OpenSSL source tree configuration script
&lt;br&gt;##
&lt;br&gt;&lt;br&gt;require 5.000;
&lt;br&gt;use strict;
&lt;br&gt;&lt;br&gt;# see INSTALL for instructions.
&lt;br&gt;&lt;br&gt;my $usage=&amp;quot;Usage: Configure [no-&amp;lt;cipher&amp;gt; ...] [enable-&amp;lt;cipher&amp;gt; ...] [experimental-&amp;lt;cipher&amp;gt; ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-dso] [no-krb5] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--test-sanity] os/compiler[:flags]\n&amp;quot;;
&lt;br&gt;&lt;br&gt;# Options:
&lt;br&gt;#
&lt;br&gt;# --openssldir &amp;nbsp;install OpenSSL in OPENSSLDIR (Default: DIR/ssl if the
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; --prefix option is given; /usr/local/ssl otherwise)
&lt;br&gt;# --prefix &amp;nbsp; &amp;nbsp; &amp;nbsp;prefix for the OpenSSL include, lib and bin directories
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (Default: the OPENSSLDIR directory)
&lt;br&gt;#
&lt;br&gt;# --install_prefix &amp;nbsp;Additional prefix for package builders (empty by
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; default). &amp;nbsp;This needn't be set in advance, you can
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; just as well use &amp;quot;make INSTALL_PREFIX=/whatever install&amp;quot;.
&lt;br&gt;#
&lt;br&gt;# --with-krb5-dir &amp;nbsp;Declare where Kerberos 5 lives. &amp;nbsp;The libraries are expected
&lt;br&gt;#		to live in the subdirectory lib/ and the header files in
&lt;br&gt;#		include/. &amp;nbsp;A value is required.
&lt;br&gt;# --with-krb5-lib &amp;nbsp;Declare where the Kerberos 5 libraries live. &amp;nbsp;A value is
&lt;br&gt;#		required.
&lt;br&gt;#		(Default: KRB5_DIR/lib)
&lt;br&gt;# --with-krb5-include &amp;nbsp;Declare where the Kerberos 5 header files live. &amp;nbsp;A
&lt;br&gt;#		value is required.
&lt;br&gt;#		(Default: KRB5_DIR/include)
&lt;br&gt;# --with-krb5-flavor &amp;nbsp;Declare what flavor of Kerberos 5 is used. &amp;nbsp;Currently
&lt;br&gt;#		supported values are &amp;quot;MIT&amp;quot; and &amp;quot;Heimdal&amp;quot;. &amp;nbsp;A value is required.
&lt;br&gt;#
&lt;br&gt;# --test-sanity Make a number of sanity checks on the data in this file.
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; This is a debugging tool for OpenSSL developers.
&lt;br&gt;#
&lt;br&gt;# --cross-compile-prefix Add specified prefix to binutils components.
&lt;br&gt;#
&lt;br&gt;# no-hw-xxx &amp;nbsp; &amp;nbsp; do not compile support for specific crypto hardware.
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Generic OpenSSL-style methods relating to this support
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; are always compiled but return NULL if the hardware
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; support isn't compiled.
&lt;br&gt;# no-hw &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; do not compile support for any crypto hardware.
&lt;br&gt;# [no-]threads &amp;nbsp;[don't] try to create a library that is suitable for
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; multithreaded applications (default is &amp;quot;threads&amp;quot; if we
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; know how to do it)
&lt;br&gt;# [no-]shared	[don't] try to create shared libraries when supported.
&lt;br&gt;# no-asm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do not use assembler
&lt;br&gt;# no-dso &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do not compile in any native shared-library methods. This
&lt;br&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; will ensure that all methods just return NULL.
&lt;br&gt;# no-krb5 &amp;nbsp; &amp;nbsp; &amp;nbsp; do not compile in any KRB5 library or code.
&lt;br&gt;# [no-]zlib &amp;nbsp; &amp;nbsp; [don't] compile support for zlib compression.
&lt;br&gt;# zlib-dynamic	Like &amp;quot;zlib&amp;quot;, but the zlib library is expected to be a shared
&lt;br&gt;#		library and will be loaded in run-time by the OpenSSL library.
&lt;br&gt;# 386 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; generate 80386 code
&lt;br&gt;# no-sse2	disables IA-32 SSE2 code, above option implies no-sse2
&lt;br&gt;# no-&amp;lt;cipher&amp;gt; &amp;nbsp; build without specified algorithm (rsa, idea, rc5, ...)
&lt;br&gt;# -&amp;lt;xxx&amp;gt; +&amp;lt;xxx&amp;gt; compiler options are passed through 
&lt;br&gt;#
&lt;br&gt;# DEBUG_SAFESTACK use type-safe stacks to enforce type-safety on stack items
&lt;br&gt;#		provided to stack calls. Generates unique stack functions for
&lt;br&gt;#		each possible stack type.
&lt;br&gt;# DES_PTR	use pointer lookup vs arrays in the DES in crypto/des/des_locl.h
&lt;br&gt;# DES_RISC1	use different DES_ENCRYPT macro that helps reduce register
&lt;br&gt;#		dependancies but needs to more registers, good for RISC CPU's
&lt;br&gt;# DES_RISC2	A different RISC variant.
&lt;br&gt;# DES_UNROLL	unroll the inner DES loop, sometimes helps, somtimes hinders.
&lt;br&gt;# DES_INT	use 'int' instead of 'long' for DES_LONG in crypto/des/des.h
&lt;br&gt;#		This is used on the DEC Alpha where long is 8 bytes
&lt;br&gt;#		and int is 4
&lt;br&gt;# BN_LLONG	use the type 'long long' in crypto/bn/bn.h
&lt;br&gt;# MD2_CHAR	use 'char' instead of 'int' for MD2_INT in crypto/md2/md2.h
&lt;br&gt;# MD2_LONG	use 'long' instead of 'int' for MD2_INT in crypto/md2/md2.h
&lt;br&gt;# IDEA_SHORT	use 'short' instead of 'int' for IDEA_INT in crypto/idea/idea.h
&lt;br&gt;# IDEA_LONG	use 'long' instead of 'int' for IDEA_INT in crypto/idea/idea.h
&lt;br&gt;# RC2_SHORT	use 'short' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
&lt;br&gt;# RC2_LONG	use 'long' instead of 'int' for RC2_INT in crypto/rc2/rc2.h
&lt;br&gt;# RC4_CHAR	use 'char' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
&lt;br&gt;# RC4_LONG	use 'long' instead of 'int' for RC4_INT in crypto/rc4/rc4.h
&lt;br&gt;# RC4_INDEX	define RC4_INDEX in crypto/rc4/rc4_locl.h. &amp;nbsp;This turns on
&lt;br&gt;#		array lookups instead of pointer use.
&lt;br&gt;# RC4_CHUNK	enables code that handles data aligned at long (natural CPU
&lt;br&gt;#		word) boundary.
&lt;br&gt;# RC4_CHUNK_LL	enables code that handles data aligned at long long boundary
&lt;br&gt;#		(intended for 64-bit CPUs running 32-bit OS).
&lt;br&gt;# BF_PTR	use 'pointer arithmatic' for Blowfish (unsafe on Alpha).
&lt;br&gt;# BF_PTR2	intel specific version (generic version is more efficient).
&lt;br&gt;#
&lt;br&gt;# Following are set automatically by this script
&lt;br&gt;#
&lt;br&gt;# MD5_ASM	use some extra md5 assember,
&lt;br&gt;# SHA1_ASM	use some extra sha1 assember, must define L_ENDIAN for x86
&lt;br&gt;# RMD160_ASM	use some extra ripemd160 assember,
&lt;br&gt;# SHA256_ASM	sha256_block is implemented in assembler
&lt;br&gt;# SHA512_ASM	sha512_block is implemented in assembler
&lt;br&gt;# AES_ASM	ASE_[en|de]crypt is implemented in assembler
&lt;br&gt;&lt;br&gt;# Minimum warning options... any contributions to OpenSSL should at least get
&lt;br&gt;# past these. 
&lt;br&gt;&lt;br&gt;my $gcc_devteam_warn = &amp;quot;-Wall -pedantic -DPEDANTIC -Wno-long-long -Wsign-compare -Wmissing-prototypes -Wshadow -Wformat -Werror -DCRYPTO_MDEBUG_ALL -DCRYPTO_MDEBUG_ABORT -DREF_CHECK -DOPENSSL_NO_DEPRECATED&amp;quot;;
&lt;br&gt;&lt;br&gt;my $strict_warnings = 0;
&lt;br&gt;&lt;br&gt;my $x86_gcc_des=&amp;quot;DES_PTR DES_RISC1 DES_UNROLL&amp;quot;;
&lt;br&gt;&lt;br&gt;# MD2_CHAR slags pentium pros
&lt;br&gt;my $x86_gcc_opts=&amp;quot;RC4_INDEX MD2_INT&amp;quot;;
&lt;br&gt;&lt;br&gt;# MODIFY THESE PARAMETERS IF YOU ARE GOING TO USE THE 'util/speed.sh SCRIPT
&lt;br&gt;# Don't worry about these normally
&lt;br&gt;&lt;br&gt;my $tcc=&amp;quot;cc&amp;quot;;
&lt;br&gt;my $tflags=&amp;quot;-fast -Xa&amp;quot;;
&lt;br&gt;my $tbn_mul=&amp;quot;&amp;quot;;
&lt;br&gt;my $tlib=&amp;quot;-lnsl -lsocket&amp;quot;;
&lt;br&gt;#$bits1=&amp;quot;SIXTEEN_BIT &amp;quot;;
&lt;br&gt;#$bits2=&amp;quot;THIRTY_TWO_BIT &amp;quot;;
&lt;br&gt;my $bits1=&amp;quot;THIRTY_TWO_BIT &amp;quot;;
&lt;br&gt;my $bits2=&amp;quot;SIXTY_FOUR_BIT &amp;quot;;
&lt;br&gt;&lt;br&gt;my $x86_asm=&amp;quot;x86cpuid.o:bn-586.o co-586.o x86-mont.o:des-586.o crypt586.o:aes-586.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o:cmll-x86.o&amp;quot;;
&lt;br&gt;&lt;br&gt;my $x86_elf_asm=&amp;quot;$x86_asm:elf&amp;quot;;
&lt;br&gt;&lt;br&gt;my $x86_64_asm=&amp;quot;x86_64cpuid.o:x86_64-gcc.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o&amp;quot;;
&lt;br&gt;my $ia64_asm=&amp;quot;ia64cpuid.o:bn-ia64.o::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o::rc4-ia64.o rc4_skey.o:::::void&amp;quot;;
&lt;br&gt;my $sparcv9_asm=&amp;quot;sparcv9cap.o sparccpuid.o:bn-sparcv9.o sparcv9-mont.o sparcv9a-mont.o:des_enc-sparc.o fcrypt_b.o:aes_core.o aes_cbc.o aes-sparcv9.o:::sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o:::::::void&amp;quot;;
&lt;br&gt;my $sparcv8_asm=&amp;quot;:sparcv8.o:des_enc-sparc.o fcrypt_b.o:::::::::::void&amp;quot;;
&lt;br&gt;my $alpha_asm=&amp;quot;alphacpuid.o:bn_asm.o alpha-mont.o::::::::::::void&amp;quot;;
&lt;br&gt;my $mips3_asm=&amp;quot;:bn-mips3.o::::::::::::void&amp;quot;;
&lt;br&gt;my $s390x_asm=&amp;quot;s390xcpuid.o:bn-s390x.o s390x-mont.o::aes-s390x.o:::sha1-s390x.o sha256-s390x.o sha512-s390x.o::rc4-s390x.o:::::void&amp;quot;;
&lt;br&gt;my $armv4_asm=&amp;quot;:bn_asm.o armv4-mont.o::aes_cbc.o aes-armv4.o:::sha1-armv4-large.o sha256-armv4.o sha512-armv4.o:::::::void&amp;quot;;
&lt;br&gt;my $ppc32_asm=&amp;quot;ppccpuid.o:bn-ppc.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o::::::&amp;quot;;
&lt;br&gt;my $ppc64_asm=&amp;quot;ppccpuid.o:bn-ppc.o ppc-mont.o::aes_core.o aes_cbc.o aes-ppc.o:::sha1-ppc.o sha256-ppc.o sha512-ppc.o::::::&amp;quot;;
&lt;br&gt;my $no_asm=&amp;quot;:::::::::::::void&amp;quot;;
&lt;br&gt;&lt;br&gt;# As for $BSDthreads. Idea is to maintain &amp;quot;collective&amp;quot; set of flags,
&lt;br&gt;# which would cover all BSD flavors. -pthread applies to them all, 
&lt;br&gt;# but is treated differently. OpenBSD expands is as -D_POSIX_THREAD
&lt;br&gt;# -lc_r, which is sufficient. FreeBSD 4.x expands it as -lc_r,
&lt;br&gt;# which has to be accompanied by explicit -D_THREAD_SAFE and
&lt;br&gt;# sometimes -D_REENTRANT. FreeBSD 5.x expands it as -lc_r, which
&lt;br&gt;# seems to be sufficient?
&lt;br&gt;my $BSDthreads=&amp;quot;-pthread -D_THREAD_SAFE -D_REENTRANT&amp;quot;;
&lt;br&gt;&lt;br&gt;#config-string	$cc : $cflags : $unistd : $thread_cflag : $sys_id : $lflags : $bn_ops : $cpuid_obj : $bn_obj : $des_obj : $aes_obj : $bf_obj : $md5_obj : $sha1_obj : $cast_obj : $rc4_obj : $rmd160_obj : $rc5_obj : $wp_obj : $cmll_obj : $dso_scheme : $shared_target : $shared_cflag : $shared_ldflag : $shared_extension : $ranlib : $arflags : $multilib
&lt;br&gt;&lt;br&gt;my %table=(
&lt;br&gt;# File 'TABLE' (created by 'make TABLE') contains the data from this list,
&lt;br&gt;# formatted for better readability.
&lt;br&gt;&lt;br&gt;&lt;br&gt;#&amp;quot;b&amp;quot;,		&amp;quot;${tcc}:${tflags}::${tlib}:${bits1}:${tbn_mul}::&amp;quot;,
&lt;br&gt;#&amp;quot;bl-4c-2c&amp;quot;,	&amp;quot;${tcc}:${tflags}::${tlib}:${bits1}BN_LLONG RC4_CHAR MD2_CHAR:${tbn_mul}::&amp;quot;,
&lt;br&gt;#&amp;quot;bl-4c-ri&amp;quot;,	&amp;quot;${tcc}:${tflags}::${tlib}:${bits1}BN_LLONG RC4_CHAR RC4_INDEX:${tbn_mul}::&amp;quot;,
&lt;br&gt;#&amp;quot;b2-is-ri-dp&amp;quot;,	&amp;quot;${tcc}:${tflags}::${tlib}:${bits2}IDEA_SHORT RC4_INDEX DES_PTR:${tbn_mul}::&amp;quot;,
&lt;br&gt;&lt;br&gt;# Our development configs
&lt;br&gt;&amp;quot;purify&amp;quot;,	&amp;quot;purify gcc:-g -DPURIFY -Wall::(unknown)::-lsocket -lnsl::::&amp;quot;,
&lt;br&gt;&amp;quot;debug&amp;quot;,	&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -ggdb -g2 -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror::(unknown)::-lefence::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben&amp;quot;,	&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown):::::bn86-elf.o co86-elf.o&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben-openbsd&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben-openbsd-debug&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DOPENSSL_OPENBSD_DEV_CRYPTO -DOPENSSL_NO_ASM -g3 -O2 -pedantic -Wall -Wshadow -Werror -pipe::(unknown)::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben-debug&amp;quot;,	&amp;quot;gcc:$gcc_devteam_warn -DBN_DEBUG -DCONF_DEBUG -DDEBUG_SAFESTACK -g3 -O2 -pipe::(unknown)::::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben-no-opt&amp;quot;,	&amp;quot;gcc: -Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -DDEBUG_SAFESTACK -DCRYPTO_MDEBUG -Werror -DL_ENDIAN -DTERMIOS -Wall -g3::(unknown)::::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-ben-strict&amp;quot;,	&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DCONST_STRICT -O2 -Wall -Wshadow -Werror -Wpointer-arith -Wcast-qual -Wwrite-strings -pipe::(unknown)::::::&amp;quot;,
&lt;br&gt;&amp;quot;debug-rse&amp;quot;,&amp;quot;cc:-DTERMIOS -DL_ENDIAN -pipe -O -g -ggdb3 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}&amp;quot;,
&lt;br&gt;&amp;quot;debug-bodo&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBIO_PAIR_DEBUG -DPEDANTIC -g -march=i486 -pedantic -Wshadow -Wall -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion::-D_REENTRANT:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}&amp;quot;,
&lt;br&gt;&amp;quot;debug-ulf&amp;quot;, &amp;quot;gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DBN_DEBUG_RAND -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations:::CYGWIN32:::${no_asm}:win32:cygwin-shared:::.dll&amp;quot;,
&lt;br&gt;&amp;quot;debug-steve64&amp;quot;, &amp;quot;gcc:$gcc_devteam_warn -m64 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-steve32&amp;quot;, &amp;quot;gcc:$gcc_devteam_warn -m32 -DL_ENDIAN -DCONF_DEBUG -DDEBUG_SAFESTACK -g -pipe::-D_REENTRANT::-rdynamic -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-steve-opt&amp;quot;, &amp;quot;gcc:$gcc_devteam_warn -m64 -O3 -DL_ENDIAN -DTERMIO -DCONF_DEBUG -DDEBUG_SAFESTACK -g -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-levitte-linux-elf&amp;quot;,&amp;quot;gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-levitte-linux-noasm&amp;quot;,&amp;quot;gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-levitte-linux-elf-extreme&amp;quot;,&amp;quot;gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-levitte-linux-noasm-extreme&amp;quot;,&amp;quot;gcc:-DLEVITTE_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_DEBUG -DBN_DEBUG_RAND -DCRYPTO_MDEBUG -DENGINE_CONF_DEBUG -DOPENSSL_NO_ASM -DL_ENDIAN -DTERMIO -D_POSIX_SOURCE -DPEDANTIC -ggdb -g3 -mcpu=i486 -pedantic -ansi -Wall -W -Wundef -Wshadow -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wno-long-long -Wundef -Wconversion -pipe::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-geoff32&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -DMD32_REG_T=int -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:BN_LLONG:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-geoff64&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DBN_DEBUG_RAND -DBN_STRICT -DPURIFY -DOPENSSL_NO_DEPRECATED -DOPENSSL_NO_ASM -DOPENSSL_NO_INLINE_ASM -DL_ENDIAN -DTERMIO -DPEDANTIC -DMD32_REG_T=int -O1 -ggdb2 -Wall -Werror -Wundef -pedantic -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Wmissing-prototypes -Wmissing-declarations -Wno-long-long::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-pentium&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -mcpu=pentium -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-ppro&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -mcpu=pentiumpro -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-elf&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -march=i486 -Wall::-D_REENTRANT::-lefence -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-elf-noefence&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DL_ENDIAN -DTERMIO -g -march=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-ia32-aes&amp;quot;, &amp;quot;gcc:-DAES_EXPERIMENTAL -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:x86cpuid.o:bn-586.o co-586.o x86-mont.o:des-586.o crypt586.o:aes_x86core.o aes_cbc.o:bf-586.o:md5-586.o:sha1-586.o sha256-586.o sha512-586.o:cast-586.o:rc4-586.o:rmd-586.o:rc5-586.o:wp_block.o wp-mmx.o::elf:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-generic32&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DTERMIO -g -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-generic64&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DTERMIO -g -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-linux-x86_64&amp;quot;,	&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -m64 -DL_ENDIAN -DTERMIO -g -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;&amp;quot;dist&amp;quot;,		&amp;quot;cc:-O::(unknown)::::::&amp;quot;,
&lt;br&gt;&lt;br&gt;# Basic configs that should work on any (32 and less bit) box
&lt;br&gt;&amp;quot;gcc&amp;quot;,		&amp;quot;gcc:-O3::(unknown):::BN_LLONG:::&amp;quot;,
&lt;br&gt;&amp;quot;cc&amp;quot;,		&amp;quot;cc:-O::(unknown)::::::&amp;quot;,
&lt;br&gt;&lt;br&gt;####VOS Configurations
&lt;br&gt;&amp;quot;vos-gcc&amp;quot;,&amp;quot;gcc:-O3 -Wall -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:&amp;quot;,
&lt;br&gt;&amp;quot;debug-vos-gcc&amp;quot;,&amp;quot;gcc:-O0 -g -Wall -D_POSIX_C_SOURCE=200112L -D_BSD -D_VOS_EXTENDED_NAMES -DB_ENDIAN -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG::(unknown):VOS:-Wl,-map:BN_LLONG:${no_asm}:::::.so:&amp;quot;,
&lt;br&gt;&lt;br&gt;#### Solaris x86 with GNU C setups
&lt;br&gt;# -DOPENSSL_NO_INLINE_ASM switches off inline assembler. We have to do it
&lt;br&gt;# here because whenever GNU C instantiates an assembler template it
&lt;br&gt;# surrounds it with #APP #NO_APP comment pair which (at least Solaris
&lt;br&gt;# 7_x86) /usr/ccs/bin/as fails to assemble with &amp;quot;Illegal mnemonic&amp;quot;
&lt;br&gt;# error message.
&lt;br&gt;&amp;quot;solaris-x86-gcc&amp;quot;,&amp;quot;gcc:-O3 -fomit-frame-pointer -march=pentium -Wall -DL_ENDIAN -DOPENSSL_NO_INLINE_ASM::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# -shared -static-libgcc might appear controversial, but modules taken
&lt;br&gt;# from static libgcc do not have relocations and linking them into our
&lt;br&gt;# shared objects doesn't have any negative side-effects. On the contrary,
&lt;br&gt;# doing so makes it possible to use gcc shared build with Sun C. Given
&lt;br&gt;# that gcc generates faster code [thanks to inline assembler], I would
&lt;br&gt;# actually recommend to consider using gcc shared build even with vendor
&lt;br&gt;# compiler:-)
&lt;br&gt;#						&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;appro@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;quot;solaris64-x86_64-gcc&amp;quot;,&amp;quot;gcc:-m64 -O3 -Wall -DL_ENDIAN -DMD32_REG_T=int::-D_REENTRANT::-lsocket -lnsl -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:solaris-shared:-fPIC:-m64 -shared -static-libgcc:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64&amp;quot;,
&lt;br&gt;&amp;nbsp;
&lt;br&gt;#### Solaris x86 with Sun C setups
&lt;br&gt;&amp;quot;solaris-x86-cc&amp;quot;,&amp;quot;cc:-fast -O -Xa::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL BF_PTR:${no_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris64-x86_64-cc&amp;quot;,&amp;quot;cc:-fast -xarch=amd64 -xstrconst -Xa -DL_ENDIAN::-D_REENTRANT::-lsocket -lnsl -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:solaris-shared:-KPIC:-xarch=amd64 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64&amp;quot;,
&lt;br&gt;&lt;br&gt;#### SPARC Solaris with GNU C setups
&lt;br&gt;&amp;quot;solaris-sparcv7-gcc&amp;quot;,&amp;quot;gcc:-O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris-sparcv8-gcc&amp;quot;,&amp;quot;gcc:-mv8 -O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# -m32 should be safe to add as long as driver recognizes -mcpu=ultrasparc
&lt;br&gt;&amp;quot;solaris-sparcv9-gcc&amp;quot;,&amp;quot;gcc:-m32 -mcpu=ultrasparc -O3 -fomit-frame-pointer -Wall -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris64-sparcv9-gcc&amp;quot;,&amp;quot;gcc:-m64 -mcpu=ultrasparc -O3 -Wall -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-fPIC:-m64 -shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/64&amp;quot;,
&lt;br&gt;####
&lt;br&gt;&amp;quot;debug-solaris-sparcv8-gcc&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -O -g -mv8 -Wall -DB_ENDIAN::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-solaris-sparcv9-gcc&amp;quot;,&amp;quot;gcc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -DPEDANTIC -O -g -mcpu=ultrasparc -pedantic -ansi -Wall -Wshadow -Wno-long-long -D__EXTENSIONS__ -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;#### SPARC Solaris with Sun C setups
&lt;br&gt;# SC4.0 doesn't pass 'make test', upgrade to SC5.0 or SC4.2.
&lt;br&gt;# SC4.2 is ok, better than gcc even on bn as long as you tell it -xarch=v8
&lt;br&gt;# SC5.0 note: Compiler common patch 107357-01 or later is required!
&lt;br&gt;&amp;quot;solaris-sparcv7-cc&amp;quot;,&amp;quot;cc:-xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${no_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris-sparcv8-cc&amp;quot;,&amp;quot;cc:-xarch=v8 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris-sparcv9-cc&amp;quot;,&amp;quot;cc:-xtarget=ultra -xarch=v8plus -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;solaris64-sparcv9-cc&amp;quot;,&amp;quot;cc:-xtarget=ultra -xarch=v9 -xO5 -xstrconst -xdepend -Xa -DB_ENDIAN::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-xarch=v9 -G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):/usr/ccs/bin/ar rs::/64&amp;quot;,
&lt;br&gt;####
&lt;br&gt;&amp;quot;debug-solaris-sparcv8-cc&amp;quot;,&amp;quot;cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xarch=v8 -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-solaris-sparcv9-cc&amp;quot;,&amp;quot;cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG_ALL -xtarget=ultra -xarch=v8plus -g -O -xstrconst -Xa -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-lsocket -lnsl -ldl:BN_LLONG RC4_CHAR RC4_CHUNK_LL DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:solaris-shared:-KPIC:-G -dy -z text:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;, 
&lt;br&gt;&lt;br&gt;#### SunOS configs, assuming sparc for the gcc one.
&lt;br&gt;#&amp;quot;sunos-cc&amp;quot;, &amp;quot;cc:-O4 -DNOPROTO -DNOCONST::(unknown):SUNOS::DES_UNROLL:${no_asm}::&amp;quot;,
&lt;br&gt;&amp;quot;sunos-gcc&amp;quot;,&amp;quot;gcc:-O3 -mv8 -Dssize_t=int::(unknown):SUNOS::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL DES_PTR DES_RISC1:${no_asm}::&amp;quot;,
&lt;br&gt;&lt;br&gt;#### IRIX 5.x configs
&lt;br&gt;# -mips2 flag is added by ./config when appropriate.
&lt;br&gt;&amp;quot;irix-gcc&amp;quot;,&amp;quot;gcc:-O3 -DTERMIOS -DB_ENDIAN::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR RC4_CHUNK DES_UNROLL DES_RISC2 DES_PTR BF_PTR:${no_asm}:dlfcn:irix-shared:::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;irix-cc&amp;quot;, &amp;quot;cc:-O2 -use_readonly_const -DTERMIOS -DB_ENDIAN::(unknown):::BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC2 DES_UNROLL BF_PTR:${no_asm}:dlfcn:irix-shared:::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;#### IRIX 6.x configs
&lt;br&gt;# Only N32 and N64 ABIs are supported. If you need O32 ABI build, invoke
&lt;br&gt;# './Configure irix-cc -o32' manually.
&lt;br&gt;&amp;quot;irix-mips3-gcc&amp;quot;,&amp;quot;gcc:-mabi=n32 -O3 -DTERMIOS -DB_ENDIAN -DBN_DIV3W::-D_SGI_MP_SOURCE:::MD2_CHAR RC4_INDEX RC4_CHAR RC4_CHUNK_LL DES_UNROLL DES_RISC2 DES_PTR BF_PTR SIXTY_FOUR_BIT:${mips3_asm}:dlfcn:irix-shared::-mabi=n32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::32&amp;quot;,
&lt;br&gt;&amp;quot;irix-mips3-cc&amp;quot;, &amp;quot;cc:-n32 -mips3 -O2 -use_readonly_const -G0 -rdata_shared -DTERMIOS -DB_ENDIAN -DBN_DIV3W::-D_SGI_MP_SOURCE:::DES_PTR RC4_CHAR RC4_CHUNK_LL DES_RISC2 DES_UNROLL BF_PTR SIXTY_FOUR_BIT:${mips3_asm}:dlfcn:irix-shared::-n32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::32&amp;quot;,
&lt;br&gt;# N64 ABI builds.
&lt;br&gt;&amp;quot;irix64-mips4-gcc&amp;quot;,&amp;quot;gcc:-mabi=64 -mips4 -O3 -DTERMIOS -DB_ENDIAN -DBN_DIV3W::-D_SGI_MP_SOURCE:::RC4_CHAR RC4_CHUNK DES_RISC2 DES_UNROLL SIXTY_FOUR_BIT_LONG:${mips3_asm}:dlfcn:irix-shared::-mabi=64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;&amp;quot;irix64-mips4-cc&amp;quot;, &amp;quot;cc:-64 -mips4 -O2 -use_readonly_const -G0 -rdata_shared -DTERMIOS -DB_ENDIAN -DBN_DIV3W::-D_SGI_MP_SOURCE:::RC4_CHAR RC4_CHUNK DES_RISC2 DES_UNROLL SIXTY_FOUR_BIT_LONG:${mips3_asm}:dlfcn:irix-shared::-64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;&lt;br&gt;#### Unified HP-UX ANSI C configs.
&lt;br&gt;# Special notes:
&lt;br&gt;# - Originally we were optimizing at +O4 level. It should be noted
&lt;br&gt;# &amp;nbsp; that the only difference between +O3 and +O4 is global inter-
&lt;br&gt;# &amp;nbsp; procedural analysis. As it has to be performed during the link
&lt;br&gt;# &amp;nbsp; stage the compiler leaves behind certain pseudo-code in lib*.a
&lt;br&gt;# &amp;nbsp; which might be release or even patch level specific. Generating
&lt;br&gt;# &amp;nbsp; the machine code for and analyzing the *whole* program appears
&lt;br&gt;# &amp;nbsp; to be *extremely* memory demanding while the performance gain is
&lt;br&gt;# &amp;nbsp; actually questionable. The situation is intensified by the default
&lt;br&gt;# &amp;nbsp; HP-UX data set size limit (infamous 'maxdsiz' tunable) of 64MB
&lt;br&gt;# &amp;nbsp; which is way too low for +O4. In other words, doesn't +O3 make
&lt;br&gt;# &amp;nbsp; more sense?
&lt;br&gt;# - Keep in mind that the HP compiler by default generates code
&lt;br&gt;# &amp;nbsp; suitable for execution on the host you're currently compiling at.
&lt;br&gt;# &amp;nbsp; If the toolkit is ment to be used on various PA-RISC processors
&lt;br&gt;# &amp;nbsp; consider './config +DAportable'.
&lt;br&gt;# - +DD64 is chosen in favour of +DA2.0W because it's meant to be
&lt;br&gt;# &amp;nbsp; compatible with *future* releases.
&lt;br&gt;# - If you run ./Configure hpux-parisc-[g]cc manually don't forget to
&lt;br&gt;# &amp;nbsp; pass -D_REENTRANT on HP-UX 10 and later.
&lt;br&gt;# - -DMD32_XARRAY triggers workaround for compiler bug we ran into in
&lt;br&gt;# &amp;nbsp; 32-bit message digests. (For the moment of this writing) HP C
&lt;br&gt;# &amp;nbsp; doesn't seem to &amp;quot;digest&amp;quot; too many local variables (they make &amp;quot;him&amp;quot;
&lt;br&gt;# &amp;nbsp; chew forever:-). For more details look-up MD32_XARRAY comment in
&lt;br&gt;# &amp;nbsp; crypto/sha/sha_lcl.h.
&lt;br&gt;#					&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;appro@...&lt;/a&gt;&amp;gt;
&lt;br&gt;#
&lt;br&gt;# Since there is mention of this in shlib/hpux10-cc.sh
&lt;br&gt;&amp;quot;hpux-parisc-cc-o4&amp;quot;,&amp;quot;cc:-Ae +O4 +ESlit -z -DB_ENDIAN -DBN_DIV2W -DMD32_XARRAY::-D_REENTRANT::-ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux-parisc-gcc&amp;quot;,&amp;quot;gcc:-O3 -DB_ENDIAN -DBN_DIV2W::-D_REENTRANT::-Wl,+s -ldld:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux-parisc2-gcc&amp;quot;,&amp;quot;gcc:-march=2.0 -O3 -DB_ENDIAN -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT RC4_CHAR RC4_CHUNK DES_PTR DES_UNROLL DES_RISC1::pa-risc2.o::::::::::::void:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux64-parisc2-gcc&amp;quot;,&amp;quot;gcc:-O3 -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT::pa-risc2W.o::::::::::::void:dlfcn:hpux-shared:-fpic:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_64&amp;quot;,
&lt;br&gt;&lt;br&gt;# More attempts at unified 10.X and 11.X targets for HP C compiler.
&lt;br&gt;#
&lt;br&gt;# Chris Ruemmler &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ruemmler@...&lt;/a&gt;&amp;gt;
&lt;br&gt;# Kevin Steves &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ks@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;quot;hpux-parisc-cc&amp;quot;,&amp;quot;cc:+O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DBN_DIV2W -DMD32_XARRAY::-D_REENTRANT::-Wl,+s -ldld:MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux-parisc1_0-cc&amp;quot;,&amp;quot;cc:+DAportable +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY::-D_REENTRANT::-Wl,+s -ldld:MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux-parisc2-cc&amp;quot;,&amp;quot;cc:+DA2.0 +DS2.0 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY -D_REENTRANT::::-Wl,+s -ldld:SIXTY_FOUR_BIT MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT::pa-risc2.o::::::::::::void:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux64-parisc2-cc&amp;quot;,&amp;quot;cc:+DD64 +O3 +Optrs_strongly_typed -Ae +ESlit -DB_ENDIAN -DMD32_XARRAY -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC1 DES_INT::pa-risc2W.o::::::::::::void:dlfcn:hpux-shared:+Z:+DD64 -b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/pa20_64&amp;quot;,
&lt;br&gt;&lt;br&gt;# HP/UX IA-64 targets
&lt;br&gt;&amp;quot;hpux-ia64-cc&amp;quot;,&amp;quot;cc:-Ae +DD32 +O2 +Olit=all -z -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT MD2_CHAR RC4_INDEX DES_UNROLL DES_RISC1 DES_INT:${ia64_asm}:dlfcn:hpux-shared:+Z:+DD32 -b:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/hpux32&amp;quot;,
&lt;br&gt;# Frank Geurts &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;frank.geurts@...&lt;/a&gt;&amp;gt; has patiently assisted with
&lt;br&gt;# with debugging of the following config.
&lt;br&gt;&amp;quot;hpux64-ia64-cc&amp;quot;,&amp;quot;cc:-Ae +DD64 +O3 +Olit=all -z -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX DES_UNROLL DES_RISC1 DES_INT:${ia64_asm}:dlfcn:hpux-shared:+Z:+DD64 -b:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/hpux64&amp;quot;,
&lt;br&gt;# GCC builds...
&lt;br&gt;&amp;quot;hpux-ia64-gcc&amp;quot;,&amp;quot;gcc:-O3 -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT MD2_CHAR RC4_INDEX DES_UNROLL DES_RISC1 DES_INT:${ia64_asm}:dlfcn:hpux-shared:-fpic:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/hpux32&amp;quot;,
&lt;br&gt;&amp;quot;hpux64-ia64-gcc&amp;quot;,&amp;quot;gcc:-mlp64 -O3 -DB_ENDIAN -D_REENTRANT::::-ldl:SIXTY_FOUR_BIT_LONG MD2_CHAR RC4_INDEX DES_UNROLL DES_RISC1 DES_INT:${ia64_asm}:dlfcn:hpux-shared:-fpic:-mlp64 -shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::/hpux64&amp;quot;, 
&lt;br&gt;&lt;br&gt;# Legacy HPUX 9.X configs...
&lt;br&gt;&amp;quot;hpux-cc&amp;quot;,	&amp;quot;cc:-DB_ENDIAN -DBN_DIV2W -DMD32_XARRAY -Ae +ESlit +O2 -z::(unknown)::-Wl,+s -ldld:DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:+Z:-b:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;hpux-gcc&amp;quot;,	&amp;quot;gcc:-DB_ENDIAN -DBN_DIV2W -O3::(unknown)::-Wl,+s -ldld:DES_PTR DES_UNROLL DES_RISC1:${no_asm}:dl:hpux-shared:-fPIC:-shared:.sl.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;#### HP MPE/iX &lt;a href=&quot;http://jazz.external.hp.com/src/openssl/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://jazz.external.hp.com/src/openssl/&lt;/a&gt;&lt;br&gt;&amp;quot;MPE/iX-gcc&amp;quot;,	&amp;quot;gcc:-D_ENDIAN -DBN_DIV2W -O3 -D_POSIX_SOURCE -D_SOCKET_SOURCE -I/SYSLOG/PUB::(unknown):MPE:-L/SYSLOG/PUB -lsyslog -lsocket -lcurses:BN_LLONG DES_PTR DES_UNROLL DES_RISC1:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# DEC Alpha OSF/1/Tru64 targets.
&lt;br&gt;#
&lt;br&gt;#	&amp;quot;What's in a name? That which we call a rose
&lt;br&gt;#	 By any other word would smell as sweet.&amp;quot;
&lt;br&gt;#
&lt;br&gt;# - William Shakespeare, &amp;quot;Romeo &amp; Juliet&amp;quot;, Act II, scene II.
&lt;br&gt;#
&lt;br&gt;# For gcc, the following gave a %50 speedup on a 164 over the 'DES_INT' version
&lt;br&gt;#
&lt;br&gt;&amp;quot;osf1-alpha-gcc&amp;quot;, &amp;quot;gcc:-O3::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_RISC1:${alpha_asm}:dlfcn:alpha-osf1-shared:::.so&amp;quot;,
&lt;br&gt;&amp;quot;osf1-alpha-cc&amp;quot;, &amp;nbsp;&amp;quot;cc:-std1 -tune host -O4 -readonly_strings::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${alpha_asm}:dlfcn:alpha-osf1-shared:::.so&amp;quot;,
&lt;br&gt;&amp;quot;tru64-alpha-cc&amp;quot;, &amp;quot;cc:-std1 -tune host -fast -readonly_strings::-pthread:::SIXTY_FOUR_BIT_LONG RC4_CHUNK:${alpha_asm}:dlfcn:alpha-osf1-shared::-msym:.so&amp;quot;,
&lt;br&gt;&lt;br&gt;####
&lt;br&gt;#### Variety of LINUX:-)
&lt;br&gt;####
&lt;br&gt;# *-generic* is endian-neutral target, but ./config is free to
&lt;br&gt;# throw in -D[BL]_ENDIAN, whichever appropriate...
&lt;br&gt;&amp;quot;linux-generic32&amp;quot;,&amp;quot;gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-ppc&amp;quot;,	&amp;quot;gcc:-DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:${ppc32_asm}:linux32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# It's believed that majority of ARM toolchains predefine appropriate -march.
&lt;br&gt;# If you compiler does not, do complement config command line with one!
&lt;br&gt;&amp;quot;linux-armv4&amp;quot;,	&amp;quot;gcc:-DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;#### IA-32 targets...
&lt;br&gt;&amp;quot;linux-ia32-icc&amp;quot;,	&amp;quot;icc:-DL_ENDIAN -DTERMIO -O2 -no_cpprt::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-KPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-elf&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-aout&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -march=i486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out&amp;quot;,
&lt;br&gt;####
&lt;br&gt;&amp;quot;linux-generic64&amp;quot;,&amp;quot;gcc:-DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-ppc64&amp;quot;,	&amp;quot;gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:${ppc64_asm}:linux64:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;&amp;quot;linux-ia64&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-ia64-ecc&amp;quot;,&amp;quot;ecc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-ia64-icc&amp;quot;,&amp;quot;icc:-DL_ENDIAN -DTERMIO -O2 -Wall -no_cpprt::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_INT:${ia64_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-x86_64&amp;quot;,	&amp;quot;gcc:-m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DMD32_REG_T=int::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;&amp;quot;linux-s390x&amp;quot;,	&amp;quot;gcc:-m64 -DB_ENDIAN -DTERMIO -O3 -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${s390x_asm}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;#### SPARC Linux setups
&lt;br&gt;# Ray Miller &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ray.miller@...&lt;/a&gt;&amp;gt; has patiently
&lt;br&gt;# assisted with debugging of following two configs.
&lt;br&gt;&amp;quot;linux-sparcv8&amp;quot;,&amp;quot;gcc:-mv8 -DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv8_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# it's a real mess with -mcpu=ultrasparc option under Linux, but
&lt;br&gt;# -Wa,-Av8plus should do the trick no matter what.
&lt;br&gt;&amp;quot;linux-sparcv9&amp;quot;,&amp;quot;gcc:-m32 -mcpu=ultrasparc -DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -Wa,-Av8plus -DBN_DIV2W::-D_REENTRANT:ULTRASPARC:-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:linux-shared:-fPIC:-m32:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# GCC 3.1 is a requirement
&lt;br&gt;&amp;quot;linux64-sparcv9&amp;quot;,&amp;quot;gcc:-m64 -mcpu=ultrasparc -DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT:ULTRASPARC:-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL BF_PTR:${sparcv9_asm}:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64&amp;quot;,
&lt;br&gt;#### Alpha Linux with GNU C and Compaq C setups
&lt;br&gt;# Special notes:
&lt;br&gt;# - linux-alpha+bwx-gcc is ment to be used from ./config only. If you
&lt;br&gt;# &amp;nbsp; ought to run './Configure linux-alpha+bwx-gcc' manually, do
&lt;br&gt;# &amp;nbsp; complement the command line with -mcpu=ev56, -mcpu=ev6 or whatever
&lt;br&gt;# &amp;nbsp; which is appropriate.
&lt;br&gt;# - If you use ccc keep in mind that -fast implies -arch host and the
&lt;br&gt;# &amp;nbsp; compiler is free to issue instructions which gonna make elder CPU
&lt;br&gt;# &amp;nbsp; choke. If you wish to build &amp;quot;blended&amp;quot; toolkit, add -arch generic
&lt;br&gt;# &amp;nbsp; *after* -fast and invoke './Configure linux-alpha-ccc' manually.
&lt;br&gt;#
&lt;br&gt;#					&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;appro@...&lt;/a&gt;&amp;gt;
&lt;br&gt;#
&lt;br&gt;&amp;quot;linux-alpha-gcc&amp;quot;,&amp;quot;gcc:-O3 -DL_ENDIAN -DTERMIO::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-alpha+bwx-gcc&amp;quot;,&amp;quot;gcc:-O3 -DL_ENDIAN -DTERMIO::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;linux-alpha-ccc&amp;quot;,&amp;quot;ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}&amp;quot;,
&lt;br&gt;&amp;quot;linux-alpha+bwx-ccc&amp;quot;,&amp;quot;ccc:-fast -readonly_strings -DL_ENDIAN -DTERMIO::-D_REENTRANT:::SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC1 DES_UNROLL:${alpha_asm}&amp;quot;,
&lt;br&gt;&lt;br&gt;#### *BSD [do see comment about ${BSDthreads} above!]
&lt;br&gt;&amp;quot;BSD-generic32&amp;quot;,&amp;quot;gcc:-DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;BSD-x86&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;BSD-x86-elf&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;debug-BSD-x86-elf&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -Wall -g::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;BSD-sparcv8&amp;quot;,	&amp;quot;gcc:-DB_ENDIAN -DTERMIOS -O3 -mv8 -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${sparcv8_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;&amp;quot;BSD-generic64&amp;quot;,&amp;quot;gcc:-DTERMIOS -O3 -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# -DMD32_REG_T=int doesn't actually belong in sparc64 target, it
&lt;br&gt;# simply *happens* to work around a compiler bug in gcc 3.3.3,
&lt;br&gt;# triggered by RIPEMD160 code.
&lt;br&gt;&amp;quot;BSD-sparc64&amp;quot;,	&amp;quot;gcc:-DB_ENDIAN -DTERMIOS -O3 -DMD32_REG_T=int -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC2 BF_PTR:${sparcv9_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;BSD-ia64&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_INT:${ia64_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;BSD-x86_64&amp;quot;,	&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -DMD32_REG_T=int -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;&amp;quot;bsdi-elf-gcc&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;quot;gcc:-DPERL5 -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall::(unknown)::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;&amp;quot;debug-bsdi-x86-elf&amp;quot;,	&amp;quot;gcc:-DPERL5 -DL_ENDIAN -DTERMIOS -fomit-frame-pointer -O2 -Wall -g::${BSDthreads}::-ldl -lm -lc:THIRY_TWO_BIT_LONG RC4_CHUNK BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;&amp;quot;nextstep&amp;quot;,	&amp;quot;cc:-O -Wall:&amp;lt;libc.h&amp;gt;:(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:::&amp;quot;,
&lt;br&gt;&amp;quot;nextstep3.3&amp;quot;,	&amp;quot;cc:-O3 -Wall:&amp;lt;libc.h&amp;gt;:(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# NCR MP-RAS UNIX ver 02.03.01
&lt;br&gt;&amp;quot;ncr-scde&amp;quot;,&amp;quot;cc:-O6 -Xa -Hoff=BEHAVED -686 -Hwide -Hiw::(unknown)::-lsocket -lnsl -lc89:${x86_gcc_des} ${x86_gcc_opts}:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# QNX
&lt;br&gt;&amp;quot;qnx4&amp;quot;,	&amp;quot;cc:-DL_ENDIAN -DTERMIO::(unknown):::${x86_gcc_des} ${x86_gcc_opts}:&amp;quot;,
&lt;br&gt;&amp;quot;QNX6&amp;quot;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;gcc:-DTERMIOS::::-lsocket::${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;QNX6-i386&amp;quot;, &amp;nbsp;&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O2 -Wall::::-lsocket:${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;# BeOS
&lt;br&gt;&amp;quot;beos-x86-r5&amp;quot;, &amp;nbsp; &amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -mcpu=pentium -Wall::-D_REENTRANT:BEOS:-lbe -lnet:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:beos:beos-shared:-fPIC -DPIC:-shared:.so&amp;quot;,
&lt;br&gt;&amp;quot;beos-x86-bone&amp;quot;, &amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -mcpu=pentium -Wall::-D_REENTRANT:BEOS:-lbe -lbind -lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:beos:beos-shared:-fPIC:-shared:.so&amp;quot;,
&lt;br&gt;&lt;br&gt;#### SCO/Caldera targets.
&lt;br&gt;#
&lt;br&gt;# Originally we had like unixware-*, unixware-*-pentium, unixware-*-p6, etc.
&lt;br&gt;# Now we only have blended unixware-* as it's the only one used by ./config.
&lt;br&gt;# If you want to optimize for particular microarchitecture, bypass ./config
&lt;br&gt;# and './Configure unixware-7 -Kpentium_pro' or whatever appropriate.
&lt;br&gt;# Note that not all targets include assembler support. Mostly because of
&lt;br&gt;# lack of motivation to support out-of-date platforms with out-of-date
&lt;br&gt;# compiler drivers and assemblers. Tim Rice &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;tim@...&lt;/a&gt;&amp;gt; has
&lt;br&gt;# patiently assisted to debug most of it.
&lt;br&gt;#
&lt;br&gt;# UnixWare 2.0x fails destest with -O.
&lt;br&gt;&amp;quot;unixware-2.0&amp;quot;,&amp;quot;cc:-DFILIO_H -DNO_STRINGS_H::-Kthread::-lsocket -lnsl -lresolv -lx:${x86_gcc_des} ${x86_gcc_opts}:::&amp;quot;,
&lt;br&gt;&amp;quot;unixware-2.1&amp;quot;,&amp;quot;cc:-O -DFILIO_H::-Kthread::-lsocket -lnsl -lresolv -lx:${x86_gcc_des} ${x86_gcc_opts}:::&amp;quot;,
&lt;br&gt;&amp;quot;unixware-7&amp;quot;,&amp;quot;cc:-O -DFILIO_H -Kalloca::-Kthread::-lsocket -lnsl:BN_LLONG MD2_CHAR RC4_INDEX ${x86_gcc_des}:${x86_elf_asm}:dlfcn:svr5-shared:-Kpic::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;unixware-7-gcc&amp;quot;,&amp;quot;gcc:-DL_ENDIAN -DFILIO_H -O3 -fomit-frame-pointer -march=pentium -Wall::-D_REENTRANT::-lsocket -lnsl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:gnu-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;# SCO 5 - Ben Laurie &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;ben@...&lt;/a&gt;&amp;gt; says the -O breaks the SCO cc.
&lt;br&gt;&amp;quot;sco5-cc&amp;quot;, &amp;nbsp;&amp;quot;cc:-belf::(unknown)::-lsocket -lnsl:${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:svr3-shared:-Kpic::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;sco5-gcc&amp;quot;, &amp;nbsp;&amp;quot;gcc:-O3 -fomit-frame-pointer::(unknown)::-lsocket -lnsl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:svr3-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&lt;br&gt;#### IBM's AIX.
&lt;br&gt;&amp;quot;aix3-cc&amp;quot;, &amp;nbsp;&amp;quot;cc:-O -DB_ENDIAN -qmaxmem=16384::(unknown):AIX::BN_LLONG RC4_CHAR:::&amp;quot;,
&lt;br&gt;&amp;quot;aix-gcc&amp;quot;, &amp;nbsp;&amp;quot;gcc:-O -DB_ENDIAN::-pthread:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-shared -Wl,-G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X32&amp;quot;,
&lt;br&gt;&amp;quot;aix64-gcc&amp;quot;,&amp;quot;gcc:-maix64 -O -DB_ENDIAN::-pthread:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-maix64 -shared -Wl,-G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X64&amp;quot;,
&lt;br&gt;# Below targets assume AIX 5. Idea is to effectively disregard $OBJECT_MODE
&lt;br&gt;# at build time. $OBJECT_MODE is respected at ./config stage!
&lt;br&gt;&amp;quot;aix-cc&amp;quot;, &amp;nbsp; &amp;quot;cc:-q32 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::BN_LLONG RC4_CHAR:${ppc32_asm}:aix32:dlfcn:aix-shared::-q32 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 32&amp;quot;,
&lt;br&gt;&amp;quot;aix64-cc&amp;quot;, &amp;quot;cc:-q64 -O -DB_ENDIAN -qmaxmem=16384 -qro -qroconst::-qthreaded:AIX::SIXTY_FOUR_BIT_LONG RC4_CHAR:${ppc64_asm}:aix64:dlfcn:aix-shared::-q64 -G:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)::-X 64&amp;quot;,
&lt;br&gt;&lt;br&gt;#
&lt;br&gt;# Cray T90 and similar (SDSC)
&lt;br&gt;# It's Big-endian, but the algorithms work properly when B_ENDIAN is NOT
&lt;br&gt;# defined. &amp;nbsp;The T90 ints and longs are 8 bytes long, and apparently the
&lt;br&gt;# B_ENDIAN code assumes 4 byte ints. &amp;nbsp;Fortunately, the non-B_ENDIAN and
&lt;br&gt;# non L_ENDIAN code aligns the bytes in each word correctly.
&lt;br&gt;#
&lt;br&gt;# The BIT_FIELD_LIMITS define is to avoid two fatal compiler errors:
&lt;br&gt;#'Taking the address of a bit field is not allowed. '
&lt;br&gt;#'An expression with bit field exists as the operand of &amp;quot;sizeof&amp;quot; '
&lt;br&gt;# (written by Wayne Schroeder &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;schroede@...&lt;/a&gt;&amp;gt;)
&lt;br&gt;#
&lt;br&gt;# j90 is considered the base machine type for unicos machines,
&lt;br&gt;# so this configuration is now called &amp;quot;cray-j90&amp;quot; ...
&lt;br&gt;&amp;quot;cray-j90&amp;quot;, &amp;quot;cc: -DBIT_FIELD_LIMITS -DTERMIOS::(unknown):CRAY::SIXTY_FOUR_BIT_LONG DES_INT:::&amp;quot;,
&lt;br&gt;&lt;br&gt;#
&lt;br&gt;# Cray T3E (Research Center Juelich, &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;beckman@...&lt;/a&gt;)
&lt;br&gt;#
&lt;br&gt;# The BIT_FIELD_LIMITS define was written for the C90 (it seems). &amp;nbsp;I added
&lt;br&gt;# another use. &amp;nbsp;Basically, the problem is that the T3E uses some bit fields
&lt;br&gt;# for some st_addr stuff, and then sizeof and address-of fails
&lt;br&gt;# I could not use the ams/alpha.o option because the Cray assembler, 'cam'
&lt;br&gt;# did not like it.
&lt;br&gt;&amp;quot;cray-t3e&amp;quot;, &amp;quot;cc: -DBIT_FIELD_LIMITS -DTERMIOS::(unknown):CRAY::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# DGUX, 88100.
&lt;br&gt;&amp;quot;dgux-R3-gcc&amp;quot;,	&amp;quot;gcc:-O3 -fomit-frame-pointer::(unknown):::RC4_INDEX DES_UNROLL:::&amp;quot;,
&lt;br&gt;&amp;quot;dgux-R4-gcc&amp;quot;,	&amp;quot;gcc:-O3 -fomit-frame-pointer::(unknown)::-lnsl -lsocket:RC4_INDEX DES_UNROLL:::&amp;quot;,
&lt;br&gt;&amp;quot;dgux-R4-x86-gcc&amp;quot;,	&amp;quot;gcc:-O3 -fomit-frame-pointer -DL_ENDIAN::(unknown)::-lnsl -lsocket:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}&amp;quot;,
&lt;br&gt;&lt;br&gt;# Sinix/ReliantUNIX RM400
&lt;br&gt;# NOTE: The CDS++ Compiler up to V2.0Bsomething has the IRIX_CC_BUG optimizer problem. Better use -g &amp;nbsp;*/
&lt;br&gt;&amp;quot;ReliantUNIX&amp;quot;,&amp;quot;cc:-KPIC -g -DTERMIOS -DB_ENDIAN::-Kthread:SNI:-lsocket -lnsl -lc -L/usr/ucblib -lucb:BN_LLONG DES_PTR DES_RISC2 DES_UNROLL BF_PTR:${no_asm}:dlfcn:reliantunix-shared:::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)&amp;quot;,
&lt;br&gt;&amp;quot;SINIX&amp;quot;,&amp;quot;cc:-O::(unknown):SNI:-lsocket -lnsl -lc -L/usr/ucblib -lucb:RC4_INDEX RC4_CHAR:::&amp;quot;,
&lt;br&gt;&amp;quot;SINIX-N&amp;quot;,&amp;quot;/usr/ucb/cc:-O2 -misaligned::(unknown)::-lucb:RC4_INDEX RC4_CHAR:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# SIEMENS BS2000/OSD: an EBCDIC-based mainframe
&lt;br&gt;&amp;quot;BS2000-OSD&amp;quot;,&amp;quot;c89:-O -XLLML -XLLMK -XL -DB_ENDIAN -DTERMIOS -DCHARSET_EBCDIC::(unknown)::-lsocket -lnsl:THIRTY_TWO_BIT DES_PTR DES_UNROLL MD2_CHAR RC4_INDEX RC4_CHAR BF_PTR:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# OS/390 Unix an EBCDIC-based Unix system on IBM mainframe
&lt;br&gt;# You need to compile using the c89.sh wrapper in the tools directory, because the
&lt;br&gt;# IBM compiler does not like the -L switch after any object modules.
&lt;br&gt;#
&lt;br&gt;&amp;quot;OS390-Unix&amp;quot;,&amp;quot;c89.sh:-O -DB_ENDIAN -DCHARSET_EBCDIC -DNO_SYS_PARAM_H &amp;nbsp;-D_ALL_SOURCE::(unknown):::THIRTY_TWO_BIT DES_PTR DES_UNROLL MD2_CHAR RC4_INDEX RC4_CHAR BF_PTR:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# Visual C targets
&lt;br&gt;#
&lt;br&gt;# Win64 targets, WIN64I denotes IA-64 and WIN64A - AMD64
&lt;br&gt;&amp;quot;VC-WIN64I&amp;quot;,&amp;quot;cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:ia64cpuid.o:ia64.o::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o:::::::ias:win32&amp;quot;,
&lt;br&gt;&amp;quot;VC-WIN64A&amp;quot;,&amp;quot;cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:x86_64cpuid.o:bn_asm.o x86_64-mont.o::aes-x86_64.o::md5-x86_64.o:sha1-x86_64.o sha256-x86_64.o sha512-x86_64.o::rc4-x86_64.o:::wp-x86_64.o:cmll-x86_64.o cmll_misc.o:auto:win32&amp;quot;,
&lt;br&gt;# x86 Win32 target defaults to ANSI API, if you want UNICODE, complement
&lt;br&gt;# 'perl Configure VC-WIN32' with '-DUNICODE -D_UNICODE'
&lt;br&gt;&amp;quot;VC-WIN32&amp;quot;,&amp;quot;cl:-W3 -WX -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE:::WIN32::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${x86_asm}:win32n:win32&amp;quot;,
&lt;br&gt;# Unified CE target
&lt;br&gt;&amp;quot;debug-VC-WIN32&amp;quot;,&amp;quot;cl:-W3 -WX -Gs0 -GF -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE:::WIN32::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${x86_asm}:win32n:win32&amp;quot;,
&lt;br&gt;&amp;quot;VC-CE&amp;quot;,&amp;quot;cl::::WINCE::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${no_asm}:win32&amp;quot;,
&lt;br&gt;&lt;br&gt;# Borland C++ 4.5
&lt;br&gt;&amp;quot;BC-32&amp;quot;,&amp;quot;bcc32::::WIN32::BN_LLONG DES_PTR RC4_INDEX EXPORT_VAR_AS_FN:${no_asm}:win32&amp;quot;,
&lt;br&gt;&lt;br&gt;# MinGW
&lt;br&gt;&amp;quot;mingw&amp;quot;, &amp;quot;gcc:-mno-cygwin -DL_ENDIAN -DOPENSSL_NO_CAPIENG -fomit-frame-pointer -O3 -march=i486 -Wall:::MINGW32:-lws2_32 -lgdi32:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts} EXPORT_VAR_AS_FN:${x86_asm}:coff:win32:cygwin-shared:-D_WINDLL -DOPENSSL_USE_APPLINK:-mno-cygwin:.dll.a&amp;quot;,
&lt;br&gt;# As for OPENSSL_USE_APPLINK. Applink makes it possible to use .dll
&lt;br&gt;# compiled with one compiler with application compiled with another
&lt;br&gt;# compiler. It's possible to engage Applink support in mingw64 build,
&lt;br&gt;# but it's not done, because till mingw64 supports structured exception
&lt;br&gt;# handling, one can't seriously consider its binaries for using with
&lt;br&gt;# non-mingw64 run-time environment. And as mingw64 is always consistent
&lt;br&gt;# with itself, Applink is never engaged and can as well be omitted.
&lt;br&gt;&amp;quot;mingw64&amp;quot;, &amp;quot;gcc:-mno-cygwin -DL_ENDIAN -O3 -Wall -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE:::MINGW64:-lws2_32 -lgdi32 -lcrypt32:SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${x86_64_asm}:mingw64:win32:cygwin-shared:-D_WINDLL:-mno-cygwin:.dll.a&amp;quot;,
&lt;br&gt;&lt;br&gt;# UWIN 
&lt;br&gt;&amp;quot;UWIN&amp;quot;, &amp;quot;cc:-DTERMIOS -DL_ENDIAN -O -Wall:::UWIN::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:win32&amp;quot;,
&lt;br&gt;&lt;br&gt;# Cygwin
&lt;br&gt;&amp;quot;Cygwin-pre1.3&amp;quot;, &amp;quot;gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::(unknown):CYGWIN32::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${no_asm}:win32&amp;quot;,
&lt;br&gt;&amp;quot;Cygwin&amp;quot;, &amp;quot;gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall:::CYGWIN32::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:coff:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a&amp;quot;,
&lt;br&gt;&amp;quot;debug-Cygwin&amp;quot;, &amp;quot;gcc:-DTERMIOS -DL_ENDIAN -march=i486 -Wall -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DOPENSSL_NO_ASM -g -Wformat -Wshadow -Wmissing-prototypes -Wmissing-declarations -Werror:::CYGWIN32:::${no_asm}:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a&amp;quot;,
&lt;br&gt;&lt;br&gt;# NetWare from David Ward (&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dsward@...&lt;/a&gt;)
&lt;br&gt;# requires either MetroWerks NLM development tools, or gcc / nlmconv
&lt;br&gt;# NetWare defaults socket bio to WinSock sockets. However,
&lt;br&gt;# the builds can be configured to use BSD sockets instead.
&lt;br&gt;# netware-clib =&amp;gt; legacy CLib c-runtime support
&lt;br&gt;&amp;quot;netware-clib&amp;quot;, &amp;quot;mwccnlm::::::${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-clib-bsdsock&amp;quot;, &amp;quot;mwccnlm::::::${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-clib-gcc&amp;quot;, &amp;quot;i586-netware-gcc:-nostdinc -I/ndk/nwsdk/include/nlm -I/ndk/ws295sdk/include -DL_ENDIAN -DNETWARE_CLIB -DOPENSSL_SYSNAME_NETWARE -O2 -Wall:::::${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-clib-bsdsock-gcc&amp;quot;, &amp;quot;i586-netware-gcc:-nostdinc -I/ndk/nwsdk/include/nlm -DNETWARE_BSDSOCK -DNETDB_USE_INTERNET -DL_ENDIAN -DNETWARE_CLIB -DOPENSSL_SYSNAME_NETWARE -O2 -Wall:::::${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;# netware-libc =&amp;gt; LibC/NKS support
&lt;br&gt;&amp;quot;netware-libc&amp;quot;, &amp;quot;mwccnlm::::::BN_LLONG ${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-libc-bsdsock&amp;quot;, &amp;quot;mwccnlm::::::BN_LLONG ${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-libc-gcc&amp;quot;, &amp;quot;i586-netware-gcc:-nostdinc -I/ndk/libc/include -I/ndk/libc/include/winsock -DL_ENDIAN -DNETWARE_LIBC -DOPENSSL_SYSNAME_NETWARE -DTERMIO -O2 -Wall:::::BN_LLONG ${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&amp;quot;netware-libc-bsdsock-gcc&amp;quot;, &amp;quot;i586-netware-gcc:-nostdinc -I/ndk/libc/include -DNETWARE_BSDSOCK -DL_ENDIAN -DNETWARE_LIBC -DOPENSSL_SYSNAME_NETWARE -DTERMIO -O2 -Wall:::::BN_LLONG ${x86_gcc_opts}::&amp;quot;,
&lt;br&gt;&lt;br&gt;# DJGPP
&lt;br&gt;&amp;quot;DJGPP&amp;quot;, &amp;quot;gcc:-I/dev/env/WATT_ROOT/inc -DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O2 -Wall:::MSDOS:-L/dev/env/WATT_ROOT/lib -lwatt:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out:&amp;quot;,
&lt;br&gt;&lt;br&gt;# Ultrix from Bernhard Simon &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;simon@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;quot;ultrix-cc&amp;quot;,&amp;quot;cc:-std1 -O -Olimit 2500 -DL_ENDIAN::(unknown):::::::&amp;quot;,
&lt;br&gt;&amp;quot;ultrix-gcc&amp;quot;,&amp;quot;gcc:-O3 -DL_ENDIAN::(unknown):::BN_LLONG::::&amp;quot;,
&lt;br&gt;# K&amp;R C is no longer supported; you need gcc on old Ultrix installations
&lt;br&gt;##&amp;quot;ultrix&amp;quot;,&amp;quot;cc:-O2 -DNOPROTO -DNOCONST -DL_ENDIAN::(unknown):::::::&amp;quot;,
&lt;br&gt;&lt;br&gt;##### MacOS X (a.k.a. Rhapsody or Darwin) setup
&lt;br&gt;&amp;quot;rhapsody-ppc-cc&amp;quot;,&amp;quot;cc:-O3 -DB_ENDIAN::(unknown):MACOSX_RHAPSODY::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${no_asm}::&amp;quot;,
&lt;br&gt;&amp;quot;darwin-ppc-cc&amp;quot;,&amp;quot;cc:-arch ppc -O3 -DB_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC -fno-common:-arch ppc -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&amp;quot;darwin64-ppc-cc&amp;quot;,&amp;quot;cc:-arch ppc64 -O3 -DB_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc64_asm}:osx64:dlfcn:darwin-shared:-fPIC -fno-common:-arch ppc64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&amp;quot;darwin-i386-cc&amp;quot;,&amp;quot;cc:-arch i386 -O3 -fomit-frame-pointer -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:${x86_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&amp;quot;debug-darwin-i386-cc&amp;quot;,&amp;quot;cc:-arch i386 -g3 -DL_ENDIAN::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:BN_LLONG RC4_INT RC4_CHUNK DES_UNROLL BF_PTR:${x86_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch i386 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&amp;quot;darwin64-x86_64-cc&amp;quot;,&amp;quot;cc:-arch x86_64 -O3 -DL_ENDIAN -DMD32_REG_T=int -Wall::-D_REENTRANT:MACOSX:-Wl,-search_paths_first%:SIXTY_FOUR_BIT_LONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:macosx:dlfcn:darwin-shared:-fPIC -fno-common:-arch x86_64 -dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&amp;quot;debug-darwin-ppc-cc&amp;quot;,&amp;quot;cc:-DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DCRYPTO_MDEBUG -DB_ENDIAN -g -Wall -O::-D_REENTRANT:MACOSX::BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:${ppc32_asm}:osx32:dlfcn:darwin-shared:-fPIC:-dynamiclib:.\$(SHLIB_MAJOR).\$(SHLIB_MINOR).dylib&amp;quot;,
&lt;br&gt;&lt;br&gt;##### A/UX
&lt;br&gt;&amp;quot;aux3-gcc&amp;quot;,&amp;quot;gcc:-O2 -DTERMIO::(unknown):AUX:-lbsd:RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:::&amp;quot;,
&lt;br&gt;&lt;br&gt;##### Sony NEWS-OS 4.x
&lt;br&gt;&amp;quot;newsos4-gcc&amp;quot;,&amp;quot;gcc:-O -DB_ENDIAN::(unknown):NEWS4:-lmld -liberty:BN_LLONG RC4_CHAR RC4_CHUNK DES_PTR DES_RISC1 DES_UNROLL BF_PTR::::&amp;quot;,
&lt;br&gt;&lt;br&gt;##### GNU Hurd
&lt;br&gt;&amp;quot;hurd-x86&amp;quot;, &amp;nbsp;&amp;quot;gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -march=i486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC&amp;quot;,
&lt;br&gt;&lt;br&gt;##### OS/2 EMX
&lt;br&gt;&amp;quot;OS2-EMX&amp;quot;, &amp;quot;gcc::::::::&amp;quot;,
&lt;br&gt;&lt;br&gt;##### VxWorks for various targets
&lt;br&gt;&amp;quot;vxworks-ppc405&amp;quot;,&amp;quot;ccppc:-g -msoft-float -mlongcall -DCPU=PPC405 -I\$(WIND_BASE)/target/h:::VXWORKS:-r:::::&amp;quot;,
&lt;br&gt;&amp;quot;vxworks-ppc750&amp;quot;,&amp;quot;ccppc:-ansi -nostdinc -DPPC750 -D_REENTRANT -fvolatile -fno-builtin -fno-for-scope -fsigned-char -Wall -msoft-float -mlongcall -DCPU=PPC604 -I\$(WIND_BASE)/target/h \$(DEBUG_FLAG):::VXWORKS:-r:::::&amp;quot;,
&lt;br&gt;&amp;quot;vxworks-ppc750-debug&amp;quot;,&amp;quot;ccppc:-ansi -nostdinc -DPPC750 -D_REENTRANT -fvolatile -fno-builtin -fno-for-scope -fsigned-char -Wall -msoft-float -mlongcall -DCPU=PPC604 -I\$(WIND_BASE)/target/h -DBN_DEBUG -DREF_CHECK -DCONF_DEBUG -DBN_CTX_DEBUG -DCRYPTO_MDEBUG -DPEDANTIC -DDEBUG_SAFESTACK -DDEBUG -g:::VXWORKS:-r:::::&amp;quot;,
&lt;br&gt;&amp;quot;vxworks-ppc860&amp;quot;,&amp;quot;ccppc:-nostdinc -msoft-float -DCPU=PPC860 -DNO_STRINGS_H -I\$(WIND_BASE)/target/h:::VXWORKS:-r:::::&amp;quot;,
&lt;br&gt;&amp;quot;vxworks-mipsle&amp;quot;,&amp;quot;ccmips:-B\$(WIND_BASE)/host/\$(WIND_HOST_TYPE)/lib/gcc-lib/ -DL_ENDIAN -EL -Wl,-EL -mips2 -mno-branch-likely -G 0 -fno-builtin -msoft-float -DCPU=MIPS32 -DMIPSEL -DNO_STRINGS_H -I\$(WIND_BASE)/target/h:::VXWORKS:-r::${no_asm}::::::ranlibmips:&amp;quot;,
&lt;br&gt;&lt;br&gt;##### Compaq Non-Stop Kernel (Tandem)
&lt;br&gt;&amp;quot;tandem-c89&amp;quot;,&amp;quot;c89:-Ww -D__TANDEM -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1 -D_TANDEM_SOURCE -DB_ENDIAN::(unknown):::THIRTY_TWO_BIT:::&amp;quot;,
&lt;br&gt;&lt;br&gt;# uClinux
&lt;br&gt;&amp;quot;uClinux-dist&amp;quot;,&amp;quot;$ENV{'CC'}:\$(CFLAGS)::-D_REENTRANT::\$(LDFLAGS) \$(LDLIBS):BN_LLONG:::::::::::::::$ENV{'LIBSSL_dlfcn'}:linux-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):$ENV{'RANLIB'}::&amp;quot;,
&lt;br&gt;&amp;quot;uClinux-dist64&amp;quot;,&amp;quot;$ENV{'CC'}:\$(CFLAGS)::-D_REENTRANT::\$(LDFLAGS) \$(LDLIBS):SIXTY_FOUR_BIT_LONG:::::::::::::::$ENV{'LIBSSL_dlfcn'}:linux-shared:-fPIC:-shared:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):$ENV{'RANLIB'}::&amp;quot;,
&lt;br&gt;&lt;br&gt;);
&lt;br&gt;&lt;br&gt;my @MK1MF_Builds=qw(VC-WIN64I VC-WIN64A
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VC-NT VC-CE VC-WIN32 debug-VC-WIN32
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BC-32 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; netware-clib netware-clib-bsdsock
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; netware-libc netware-libc-bsdsock);
&lt;br&gt;&lt;br&gt;my $idx = 0;
&lt;br&gt;my $idx_cc = $idx++;
&lt;br&gt;my $idx_cflags = $idx++;
&lt;br&gt;my $idx_unistd = $idx++;
&lt;br&gt;my $idx_thread_cflag = $idx++;
&lt;br&gt;my $idx_sys_id = $idx++;
&lt;br&gt;my $idx_lflags = $idx++;
&lt;br&gt;my $idx_bn_ops = $idx++;
&lt;br&gt;my $idx_cpuid_obj = $idx++;
&lt;br&gt;my $idx_bn_obj = $idx++;
&lt;br&gt;my $idx_des_obj = $idx++;
&lt;br&gt;my $idx_aes_obj = $idx++;
&lt;br&gt;my $idx_bf_obj = $idx++;
&lt;br&gt;my $idx_md5_obj = $idx++;
&lt;br&gt;my $idx_sha1_obj = $idx++;
&lt;br&gt;my $idx_cast_obj = $idx++;
&lt;br&gt;my $idx_rc4_obj = $idx++;
&lt;br&gt;my $idx_rmd160_obj = $idx++;
&lt;br&gt;my $idx_rc5_obj = $idx++;
&lt;br&gt;my $idx_wp_obj = $idx++;
&lt;br&gt;my $idx_cmll_obj = $idx++;
&lt;br&gt;my $idx_perlasm_scheme = $idx++;
&lt;br&gt;my $idx_dso_scheme = $idx++;
&lt;br&gt;my $idx_shared_target = $idx++;
&lt;br&gt;my $idx_shared_cflag = $idx++;
&lt;br&gt;my $idx_shared_ldflag = $idx++;
&lt;br&gt;my $idx_shared_extension = $idx++;
&lt;br&gt;my $idx_ranlib = $idx++;
&lt;br&gt;my $idx_arflags = $idx++;
&lt;br&gt;my $idx_multilib = $idx++;
&lt;br&gt;&lt;br&gt;my $prefix=&amp;quot;&amp;quot;;
&lt;br&gt;my $libdir=&amp;quot;&amp;quot;;
&lt;br&gt;my $openssldir=&amp;quot;&amp;quot;;
&lt;br&gt;my $exe_ext=&amp;quot;&amp;quot;;
&lt;br&gt;my $install_prefix= &amp;quot;$ENV{'INSTALL_PREFIX'}&amp;quot;;
&lt;br&gt;my $cross_compile_prefix=&amp;quot;&amp;quot;;
&lt;br&gt;my $no_threads=0;
&lt;br&gt;my $threads=0;
&lt;br&gt;my $no_shared=0; # but &amp;quot;no-shared&amp;quot; is default
&lt;br&gt;my $zlib=1; &amp;nbsp; &amp;nbsp; &amp;nbsp;# but &amp;quot;no-zlib&amp;quot; is default
&lt;br&gt;my $no_krb5=0; &amp;nbsp; # but &amp;quot;no-krb5&amp;quot; is implied unless &amp;quot;--with-krb5-...&amp;quot; is used
&lt;br&gt;my $no_rfc3779=1; # but &amp;quot;no-rfc3779&amp;quot; is default
&lt;br&gt;my $no_asm=0;
&lt;br&gt;my $no_dso=0;
&lt;br&gt;my $no_gmp=0;
&lt;br&gt;my @skip=();
&lt;br&gt;my $Makefile=&amp;quot;Makefile&amp;quot;;
&lt;br&gt;my $des_locl=&amp;quot;crypto/des/des_locl.h&amp;quot;;
&lt;br&gt;my $des	=&amp;quot;crypto/des/des.h&amp;quot;;
&lt;br&gt;my $bn	=&amp;quot;crypto/bn/bn.h&amp;quot;;
&lt;br&gt;my $md2	=&amp;quot;crypto/md2/md2.h&amp;quot;;
&lt;br&gt;my $rc4	=&amp;quot;crypto/rc4/rc4.h&amp;quot;;
&lt;br&gt;my $rc4_locl=&amp;quot;crypto/rc4/rc4_locl.h&amp;quot;;
&lt;br&gt;my $idea	=&amp;quot;crypto/idea/idea.h&amp;quot;;
&lt;br&gt;my $rc2	=&amp;quot;crypto/rc2/rc2.h&amp;quot;;
&lt;br&gt;my $bf	=&amp;quot;crypto/bf/bf_locl.h&amp;quot;;
&lt;br&gt;my $bn_asm	=&amp;quot;bn_asm.o&amp;quot;;
&lt;br&gt;my $des_enc=&amp;quot;des_enc.o fcrypt_b.o&amp;quot;;
&lt;br&gt;my $aes_enc=&amp;quot;aes_core.o aes_cbc.o&amp;quot;;
&lt;br&gt;my $bf_enc	=&amp;quot;bf_enc.o&amp;quot;;
&lt;br&gt;my $cast_enc=&amp;quot;c_enc.o&amp;quot;;
&lt;br&gt;my $rc4_enc=&amp;quot;rc4_enc.o rc4_skey.o&amp;quot;;
&lt;br&gt;my $rc5_enc=&amp;quot;rc5_enc.o&amp;quot;;
&lt;br&gt;my $md5_obj=&amp;quot;&amp;quot;;
&lt;br&gt;my $sha1_obj=&amp;quot;&amp;quot;;
&lt;br&gt;my $rmd160_obj=&amp;quot;&amp;quot;;
&lt;br&gt;my $cmll_enc=&amp;quot;camellia.o cmll_misc.o cmll_cbc.o&amp;quot;;
&lt;br&gt;my $processor=&amp;quot;&amp;quot;;
&lt;br&gt;my $default_ranlib;
&lt;br&gt;my $perl;
&lt;br&gt;&lt;br&gt;&lt;br&gt;# All of the following is disabled by default (RC5 was enabled before 0.9.8):
&lt;br&gt;&lt;br&gt;my %disabled = ( # &amp;quot;what&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; &amp;quot;comment&amp;quot; [or special keyword &amp;quot;experimental&amp;quot;]
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;gmp&amp;quot;		 &amp;nbsp;=&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;jpake&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; &amp;quot;experimental&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;md2&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;rc5&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;rfc3779&amp;quot;	 &amp;nbsp;=&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;shared&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;store&amp;quot;	 &amp;nbsp;=&amp;gt; &amp;quot;experimental&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;zlib&amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =&amp;gt; &amp;quot;default&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;zlib-dynamic&amp;quot; &amp;nbsp; =&amp;gt; &amp;quot;default&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;);
&lt;br&gt;my @experimental = ();
&lt;br&gt;&lt;br&gt;# This is what $depflags will look like with the above defaults
&lt;br&gt;# (we need this to see if we should advise the user to run &amp;quot;make depend&amp;quot;):
&lt;br&gt;my $default_depflags = &amp;quot; -DOPENSSL_NO_GMP -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_RC5 -DOPENSSL_NO_RFC3779 -DOPENSSL_NO_STORE&amp;quot;;
&lt;br&gt;&lt;br&gt;# Explicit &amp;quot;no-...&amp;quot; options will be collected in %disabled along with the defaults.
&lt;br&gt;# To remove something from %disabled, use &amp;quot;enable-foo&amp;quot; (unless it's experimental).
&lt;br&gt;# For symmetry, &amp;quot;disable-foo&amp;quot; is a synonym for &amp;quot;no-foo&amp;quot;.
&lt;br&gt;&lt;br&gt;# For features called &amp;quot;experimental&amp;quot; here, a more explicit &amp;quot;experimental-foo&amp;quot; is needed to enable.
&lt;br&gt;# We will collect such requests in @experimental.
&lt;br&gt;# To avoid accidental use of experimental features, applications will have to use -DOPENSSL_EXPERIMENTAL_FOO.
&lt;br&gt;&lt;br&gt;&lt;br&gt;my $no_sse2=0;
&lt;br&gt;&lt;br&gt;&amp;usage if ($#ARGV &amp;lt; 0);
&lt;br&gt;&lt;br&gt;my $flags;
&lt;br&gt;my $depflags;
&lt;br&gt;my $openssl_experimental_defines;
&lt;br&gt;my $openssl_algorithm_defines;
&lt;br&gt;my $openssl_thread_defines;
&lt;br&gt;my $openssl_sys_defines=&amp;quot;&amp;quot;;
&lt;br&gt;my $openssl_other_defines;
&lt;br&gt;my $libs;
&lt;br&gt;my $libkrb5=&amp;quot;&amp;quot;;
&lt;br&gt;my $target;
&lt;br&gt;my $options;
&lt;br&gt;my $symlink;
&lt;br&gt;my $make_depend=0;
&lt;br&gt;my %withargs=();
&lt;br&gt;&lt;br&gt;my @argvcopy=@ARGV;
&lt;br&gt;my $argvstring=&amp;quot;&amp;quot;;
&lt;br&gt;my $argv_unprocessed=1;
&lt;br&gt;&lt;br&gt;while($argv_unprocessed)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $flags=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $depflags=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_experimental_defines=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_algorithm_defines=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_thread_defines=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_sys_defines=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_other_defines=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $libs=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $options=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $symlink=1;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $argv_unprocessed=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $argvstring=join(' ',@argvcopy);
&lt;br&gt;&lt;br&gt;PROCESS_ARGS:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach (@argvcopy)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s /^-no-/no-/; # some people just can't read the instructions
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # rewrite some options in &amp;quot;enable-...&amp;quot; form
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s /^-?-?shared$/enable-shared/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s /^threads$/enable-threads/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s /^zlib$/enable-zlib/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s /^zlib-dynamic$/enable-zlib-dynamic/;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^no-(.+)$/ || /^disable-(.+)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!($disabled{$1} eq &amp;quot;experimental&amp;quot;))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($1 eq &amp;quot;ssl&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ssl2&amp;quot;} = &amp;quot;option(ssl)&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ssl3&amp;quot;} = &amp;quot;option(ssl)&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($1 eq &amp;quot;tls&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;tls1&amp;quot;} = &amp;quot;option(tls)&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{$1} = &amp;quot;option&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }			
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^enable-(.+)$/ || /^experimental-(.+)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $algo = $1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($disabled{$algo} eq &amp;quot;experimental&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;You are requesting an experimental feature; please say 'experimental-$algo' if you are sure\n&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unless (/^experimental-/);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push @experimental, $algo;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete $disabled{$algo};
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $threads = 1 if ($algo eq &amp;quot;threads&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--test-sanity$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(&amp;test_sanity());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--strict-warnings/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $strict_warnings = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^reconfigure/ || /^reconf/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (open(IN,&amp;quot;&amp;lt;$Makefile&amp;quot;))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (&amp;lt;IN&amp;gt;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chomp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^CONFIGURE_ARGS=(.*)/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $argvstring=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @argvcopy=split(' ',$argvstring);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;Incorrect data to reconfigure, please do a normal configuration\n&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (grep(/^reconf/,@argvcopy));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot;Reconfiguring with: $argvstring\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $argv_unprocessed=1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(IN);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; last PROCESS_ARGS;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(IN);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;Insufficient data to reconfigure, please do a normal configuration\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^386$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $processor=386; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^rsaref$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # No RSAref support any more since it's not needed.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # The check for the option is there so scripts aren't
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # broken
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^[-+]/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^-[lL](.*)$/ or /^-Wl,/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $libs.=$_.&amp;quot; &amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^-[^-]/ or /^\+/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $flags.=$_.&amp;quot; &amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--prefix=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $prefix=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--libdir=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $libdir=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--openssldir=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssldir=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--install.prefix=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $install_prefix=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--with-krb5-(dir|lib|include|flavor)=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-&amp;quot;.$1}=$2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--with-zlib-lib=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;zlib-lib&amp;quot;}=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--with-zlib-include=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;zlib-include&amp;quot;}=&amp;quot;-I$1&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^--cross-compile-prefix=(.*)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cross_compile_prefix=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR $usage;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($_ =~ /^([^:]+):(.+)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; eval &amp;quot;\$table{\$1} = \&amp;quot;$2\&amp;quot;&amp;quot;; # allow $xxx constructs in the string
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;target already defined - $target (offending arg: $_)\n&amp;quot; if ($target ne &amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target=$_;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unless ($_ eq $target || /^no-/ || /^disable-/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;quot;no-...&amp;quot; follows later after implied disactivations
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # have been derived. &amp;nbsp;(Don't take this too seroiusly,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # we really only write OPTIONS to the Makefile out of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # nostalgia.)
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($options eq &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $options = $_; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $options .= &amp;quot; &amp;quot;.$_; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;if ($processor eq &amp;quot;386&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;sse2&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (!defined($withargs{&amp;quot;krb5-flavor&amp;quot;}) || $withargs{&amp;quot;krb5-flavor&amp;quot;} eq &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;krb5&amp;quot;} = &amp;quot;krb5-flavor not specified&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (!defined($disabled{&amp;quot;zlib-dynamic&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # &amp;quot;zlib-dynamic&amp;quot; was specifically enabled, so enable &amp;quot;zlib&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete $disabled{&amp;quot;zlib&amp;quot;};
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (defined($disabled{&amp;quot;rijndael&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;aes&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if (defined($disabled{&amp;quot;des&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;mdc2&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if (defined($disabled{&amp;quot;ec&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ecdsa&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ecdh&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# SSL 2.0 requires MD5 and RSA
&lt;br&gt;if (defined($disabled{&amp;quot;md5&amp;quot;}) || defined($disabled{&amp;quot;rsa&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ssl2&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# SSL 3.0 and TLS requires MD5 and SHA and either RSA or DSA+DH
&lt;br&gt;if (defined($disabled{&amp;quot;md5&amp;quot;}) || defined($disabled{&amp;quot;sha&amp;quot;})
&lt;br&gt;&amp;nbsp; &amp;nbsp; || (defined($disabled{&amp;quot;rsa&amp;quot;})
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; (defined($disabled{&amp;quot;dsa&amp;quot;}) || defined($disabled{&amp;quot;dh&amp;quot;}))))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;ssl3&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;tls1&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (defined($disabled{&amp;quot;tls1&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;tlsext&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (defined($disabled{&amp;quot;ec&amp;quot;}) || defined($disabled{&amp;quot;dsa&amp;quot;})
&lt;br&gt;&amp;nbsp; &amp;nbsp; || defined($disabled{&amp;quot;dh&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $disabled{&amp;quot;gost&amp;quot;} = &amp;quot;forced&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($target eq &amp;quot;TABLE&amp;quot;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $target (sort keys %table) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print_table_entry($target);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;if ($target eq &amp;quot;LIST&amp;quot;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach (sort keys %table) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;if ($target =~ m/^CygWin32(-.*)$/) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target = &amp;quot;Cygwin&amp;quot;.$1;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;print &amp;quot;Configuring for $target\n&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;usage if (!defined($table{$target}));
&lt;br&gt;&lt;br&gt;&lt;br&gt;foreach (sort (keys %disabled))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $options .= &amp;quot; no-$_&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf &amp;quot; &amp;nbsp; &amp;nbsp;no-%-12s %-10s&amp;quot;, $_, &amp;quot;[$disabled{$_}]&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^dso$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $no_dso = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^threads$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $no_threads = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^shared$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $no_shared = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^zlib$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $zlib = 0; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^static-engine$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^zlib-dynamic$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^symlinks$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $symlink = 0; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^sse2$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $no_sse2 = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my ($ALGO, $algo);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($ALGO = $algo = $_) =~ tr/[a-z]/[A-Z]/;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^asm$/ || /^err$/ || /^hw$/ || /^hw-/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_other_defines .= &amp;quot;#define OPENSSL_NO_$ALGO\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot; OPENSSL_NO_$ALGO&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^err$/)	{ $flags .= &amp;quot;-DOPENSSL_NO_ERR &amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^asm$/)	{ $no_asm = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_algorithm_defines .= &amp;quot;#define OPENSSL_NO_$ALGO\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot; OPENSSL_NO_$ALGO&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (/^krb5$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { $no_krb5 = 1; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push @skip, $algo;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot; (skip dir)&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $depflags .= &amp;quot; -DOPENSSL_NO_$ALGO&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;my $exp_cflags = &amp;quot;&amp;quot;;
&lt;br&gt;foreach (sort @experimental)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $ALGO;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($ALGO = $_) =~ tr/[a-z]/[A-Z]/;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # opensslconf.h will set OPENSSL_NO_... unless OPENSSL_EXPERIMENTAL_... is defined
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_experimental_defines .= &amp;quot;#define OPENSSL_NO_$ALGO\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $exp_cflags .= &amp;quot; -DOPENSSL_EXPERIMENTAL_$ALGO&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;my $IsMK1MF=scalar grep /^$target$/,@MK1MF_Builds;
&lt;br&gt;&lt;br&gt;$exe_ext=&amp;quot;.exe&amp;quot; if ($target eq &amp;quot;Cygwin&amp;quot; || $target eq &amp;quot;DJGPP&amp;quot; || $target =~ /^mingw/);
&lt;br&gt;$exe_ext=&amp;quot;.nlm&amp;quot; if ($target =~ /netware/);
&lt;br&gt;$exe_ext=&amp;quot;.pm&amp;quot; &amp;nbsp;if ($target =~ /vos/);
&lt;br&gt;$openssldir=&amp;quot;/usr/local/ssl&amp;quot; if ($openssldir eq &amp;quot;&amp;quot; and $prefix eq &amp;quot;&amp;quot;);
&lt;br&gt;$prefix=$openssldir if $prefix eq &amp;quot;&amp;quot;;
&lt;br&gt;&lt;br&gt;$libdir=&amp;quot;lib&amp;quot; if $libdir eq &amp;quot;&amp;quot;;
&lt;br&gt;&lt;br&gt;$default_ranlib= &amp;which(&amp;quot;ranlib&amp;quot;) or $default_ranlib=&amp;quot;true&amp;quot;;
&lt;br&gt;$perl=$ENV{'PERL'} or $perl=&amp;which(&amp;quot;perl5&amp;quot;) or $perl=&amp;which(&amp;quot;perl&amp;quot;)
&lt;br&gt;&amp;nbsp; or $perl=&amp;quot;perl&amp;quot;;
&lt;br&gt;my $make = $ENV{'MAKE'} || &amp;quot;make&amp;quot;;
&lt;br&gt;&lt;br&gt;$cross_compile_prefix=$ENV{'CROSS_COMPILE'} if $cross_compile_prefix eq &amp;quot;&amp;quot;;
&lt;br&gt;&lt;br&gt;chop $openssldir if $openssldir =~ /\/$/;
&lt;br&gt;chop $prefix if $prefix =~ /.\/$/;
&lt;br&gt;&lt;br&gt;$openssldir=$prefix . &amp;quot;/ssl&amp;quot; if $openssldir eq &amp;quot;&amp;quot;;
&lt;br&gt;$openssldir=$prefix . &amp;quot;/&amp;quot; . $openssldir if $openssldir !~ /(^\/|^[a-zA-Z]:[\\\/])/;
&lt;br&gt;&lt;br&gt;&lt;br&gt;print &amp;quot;IsMK1MF=$IsMK1MF\n&amp;quot;;
&lt;br&gt;&lt;br&gt;my @fields = split(/\s*:\s*/,$table{$target} . &amp;quot;:&amp;quot; x 30 , -1);
&lt;br&gt;my $cc = $fields[$idx_cc];
&lt;br&gt;# Allow environment CC to override compiler...
&lt;br&gt;if($ENV{CC}) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; $cc = $ENV{CC};
&lt;br&gt;}
&lt;br&gt;my $cflags = $fields[$idx_cflags];
&lt;br&gt;my $unistd = $fields[$idx_unistd];
&lt;br&gt;my $thread_cflag = $fields[$idx_thread_cflag];
&lt;br&gt;my $sys_id = $fields[$idx_sys_id];
&lt;br&gt;my $lflags = $fields[$idx_lflags];
&lt;br&gt;my $bn_ops = $fields[$idx_bn_ops];
&lt;br&gt;my $cpuid_obj = $fields[$idx_cpuid_obj];
&lt;br&gt;my $bn_obj = $fields[$idx_bn_obj];
&lt;br&gt;my $des_obj = $fields[$idx_des_obj];
&lt;br&gt;my $aes_obj = $fields[$idx_aes_obj];
&lt;br&gt;my $bf_obj = $fields[$idx_bf_obj];
&lt;br&gt;my $md5_obj = $fields[$idx_md5_obj];
&lt;br&gt;my $sha1_obj = $fields[$idx_sha1_obj];
&lt;br&gt;my $cast_obj = $fields[$idx_cast_obj];
&lt;br&gt;my $rc4_obj = $fields[$idx_rc4_obj];
&lt;br&gt;my $rmd160_obj = $fields[$idx_rmd160_obj];
&lt;br&gt;my $rc5_obj = $fields[$idx_rc5_obj];
&lt;br&gt;my $wp_obj = $fields[$idx_wp_obj];
&lt;br&gt;my $cmll_obj = $fields[$idx_cmll_obj];
&lt;br&gt;my $perlasm_scheme = $fields[$idx_perlasm_scheme];
&lt;br&gt;my $dso_scheme = $fields[$idx_dso_scheme];
&lt;br&gt;my $shared_target = $fields[$idx_shared_target];
&lt;br&gt;my $shared_cflag = $fields[$idx_shared_cflag];
&lt;br&gt;my $shared_ldflag = $fields[$idx_shared_ldflag];
&lt;br&gt;my $shared_extension = $fields[$idx_shared_extension];
&lt;br&gt;my $ranlib = $ENV{'RANLIB'} || $fields[$idx_ranlib];
&lt;br&gt;my $ar = $ENV{'AR'} || &amp;quot;ar&amp;quot;;
&lt;br&gt;my $arflags = $fields[$idx_arflags];
&lt;br&gt;my $multilib = $fields[$idx_multilib];
&lt;br&gt;&lt;br&gt;$cflags = &amp;quot;$cflags$exp_cflags&amp;quot;;
&lt;br&gt;&lt;br&gt;# '%' in $lflags is used to split flags to &amp;quot;pre-&amp;quot; and post-flags
&lt;br&gt;my ($prelflags,$postlflags)=split('%',$lflags);
&lt;br&gt;if (defined($postlflags))	{ $lflags=$postlflags;	}
&lt;br&gt;else				{ $lflags=$prelflags; undef $prelflags;	}
&lt;br&gt;&lt;br&gt;my $no_shared_warn=0;
&lt;br&gt;my $no_user_cflags=0;
&lt;br&gt;&lt;br&gt;if ($flags ne &amp;quot;&amp;quot;)	{ $cflags=&amp;quot;$flags$cflags&amp;quot;; }
&lt;br&gt;else			{ $no_user_cflags=1; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# Kerberos settings. &amp;nbsp;The flavor must be provided from outside, either through
&lt;br&gt;# the script &amp;quot;config&amp;quot; or manually.
&lt;br&gt;if (!$no_krb5)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my ($lresolv, $lpath, $lext);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($withargs{&amp;quot;krb5-flavor&amp;quot;} =~ /^[Hh]eimdal$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;Sorry, Heimdal is currently not supported\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ##### HACK to force use of Heimdal.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ##### WARNING: Since we don't really have adequate support for Heimdal,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ##### &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;using this will break the build. &amp;nbsp;You'll have to make
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ##### &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changes to the source, and if you do, please send
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ##### &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;patches to &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=13&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($withargs{&amp;quot;krb5-flavor&amp;quot;} =~ /^force-[Hh]eimdal$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; warn &amp;quot;Heimdal isn't really supported. &amp;nbsp;Your build WILL break\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; warn &amp;quot;If you fix the problems, please send a patch to openssl-dev\@openssl.org\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-dir&amp;quot;} = &amp;quot;/usr/heimdal&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-dir&amp;quot;} eq &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-lib&amp;quot;} = &amp;quot;-L&amp;quot;.$withargs{&amp;quot;krb5-dir&amp;quot;}.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;/lib -lgssapi -lkrb5 -lcom_err&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-lib&amp;quot;} eq &amp;quot;&amp;quot; &amp;&amp; !$IsMK1MF;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=&amp;quot;-DKRB5_HEIMDAL $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($withargs{&amp;quot;krb5-flavor&amp;quot;} =~ /^[Mm][Ii][Tt]/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-dir&amp;quot;} = &amp;quot;/usr/kerberos&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-dir&amp;quot;} eq &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-lib&amp;quot;} = &amp;quot;-L&amp;quot;.$withargs{&amp;quot;krb5-dir&amp;quot;}.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;/lib -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-lib&amp;quot;} eq &amp;quot;&amp;quot; &amp;&amp; !$IsMK1MF;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=&amp;quot;-DKRB5_MIT $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-flavor&amp;quot;} =~ s/^[Mm][Ii][Tt][._-]*//;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($withargs{&amp;quot;krb5-flavor&amp;quot;} =~ /^1[._-]*[01]/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=&amp;quot;-DKRB5_MIT_OLD11 $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LRESOLV:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $lpath (&amp;quot;/lib&amp;quot;, &amp;quot;/usr/lib&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $lext (&amp;quot;a&amp;quot;, &amp;quot;so&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $lresolv = &amp;quot;$lpath/libresolv.$lext&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; last LRESOLV	if (-r &amp;quot;$lresolv&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $lresolv = &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-lib&amp;quot;} .= &amp;quot; -lresolv&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (&amp;quot;$lresolv&amp;quot; ne &amp;quot;&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $withargs{&amp;quot;krb5-include&amp;quot;} = &amp;quot;-I&amp;quot;.$withargs{&amp;quot;krb5-dir&amp;quot;}.&amp;quot;/include&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-include&amp;quot;} eq &amp;quot;&amp;quot; &amp;&amp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$withargs{&amp;quot;krb5-dir&amp;quot;} ne &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# The DSO code currently always implements all functions so that no
&lt;br&gt;# applications will have to worry about that from a compilation point
&lt;br&gt;# of view. However, the &amp;quot;method&amp;quot;s may return zero unless that platform
&lt;br&gt;# has support compiled in for them. Currently each method is enabled
&lt;br&gt;# by a define &amp;quot;DSO_&amp;lt;name&amp;gt;&amp;quot; ... we translate the &amp;quot;dso_scheme&amp;quot; config
&lt;br&gt;# string entry into using the following logic;
&lt;br&gt;my $dso_cflags;
&lt;br&gt;if (!$no_dso &amp;&amp; $dso_scheme ne &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dso_scheme =~ tr/[a-z]/[A-Z]/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($dso_scheme eq &amp;quot;DLFCN&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dso_cflags = &amp;quot;-DDSO_DLFCN -DHAVE_DLFCN_H&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($dso_scheme eq &amp;quot;DLFCN_NO_H&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dso_cflags = &amp;quot;-DDSO_DLFCN&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $dso_cflags = &amp;quot;-DDSO_$dso_scheme&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags = &amp;quot;$dso_cflags $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;my $thread_cflags;
&lt;br&gt;my $thread_defines;
&lt;br&gt;if ($thread_cflag ne &amp;quot;(unknown)&amp;quot; &amp;&amp; !$no_threads)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # If we know how to do it, support threads by default.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $threads = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if ($thread_cflag eq &amp;quot;(unknown)&amp;quot; &amp;&amp; $threads)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # If the user asked for &amp;quot;threads&amp;quot;, [s]he is also expected to
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # provide any system-dependent compiler options that are
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # necessary.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($no_user_cflags)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot;You asked for multi-threading support, but didn't\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;quot;provide any system-specific compiler options\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $thread_cflags=&amp;quot;-DOPENSSL_THREADS $cflags&amp;quot; ;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $thread_defines .= &amp;quot;#define OPENSSL_THREADS\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $thread_cflags=&amp;quot;-DOPENSSL_THREADS $thread_cflag $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $thread_defines .= &amp;quot;#define OPENSSL_THREADS\n&amp;quot;;
&lt;br&gt;#	my $def;
&lt;br&gt;#	foreach $def (split ' ',$thread_cflag)
&lt;br&gt;#		{
&lt;br&gt;#		if ($def =~ s/^-D// &amp;&amp; $def !~ /^_/)
&lt;br&gt;#			{
&lt;br&gt;#			$thread_defines .= &amp;quot;#define $def\n&amp;quot;;
&lt;br&gt;#			}
&lt;br&gt;#		}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }	
&lt;br&gt;&lt;br&gt;$lflags=&amp;quot;$libs$lflags&amp;quot; if ($libs ne &amp;quot;&amp;quot;);
&lt;br&gt;&lt;br&gt;if ($no_asm)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cpuid_obj=$bn_obj=
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_obj=$aes_obj=$bf_obj=$cast_obj=$rc4_obj=$rc5_obj=$cmll_obj=
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $sha1_obj=$md5_obj=$rmd160_obj=$wp_obj=&amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (!$no_shared)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cast_obj=&amp;quot;&amp;quot;;	# CAST assembler is not PIC
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($threads)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=$thread_cflags;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_thread_defines .= $thread_defines;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($zlib)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags = &amp;quot;-DZLIB $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (defined($disabled{&amp;quot;zlib-dynamic&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (defined($withargs{&amp;quot;zlib-lib&amp;quot;}))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $lflags = &amp;quot;$lflags -L&amp;quot; . $withargs{&amp;quot;zlib-lib&amp;quot;} . &amp;quot; -lz&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $lflags = &amp;quot;$lflags -lz&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags = &amp;quot;-DZLIB_SHARED $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
&lt;br&gt;my $shared_mark = &amp;quot;&amp;quot;;
&lt;br&gt;if ($shared_target eq &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $no_shared_warn = 1 if !$no_shared;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $no_shared = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if (!$no_shared)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($shared_cflag ne &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags = &amp;quot;$shared_cflag -DOPENSSL_PIC $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if (!$IsMK1MF)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # add {no-}static-engine to options to allow mkdef.pl to work without extra arguments
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($no_shared)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_other_defines.=&amp;quot;#define OPENSSL_NO_DYNAMIC_ENGINE\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $options.=&amp;quot; static-engine&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_other_defines.=&amp;quot;#define OPENSSL_NO_STATIC_ENGINE\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $options.=&amp;quot; no-static-engine&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;$cpuid_obj.=&amp;quot; uplink.o uplink-cof.o&amp;quot; if ($cflags =~ /\-DOPENSSL_USE_APPLINK/);
&lt;br&gt;&lt;br&gt;#
&lt;br&gt;# Platform fix-ups
&lt;br&gt;#
&lt;br&gt;if ($target =~ /\-icc$/)	# Intel C compiler
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $iccver=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (open(FD,&amp;quot;$cc -V 2&amp;gt;&amp;1 |&amp;quot;))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(&amp;lt;FD&amp;gt;) { $iccver=$1 if (/Version ([0-9]+)\./); }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(FD);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($iccver&amp;gt;=8)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # Eliminate unnecessary dependency from libirc.a. This is
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # essential for shared library support, as otherwise
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # apps/openssl can end up in endless loop upon startup...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -Dmemcpy=__builtin_memcpy -Dmemset=__builtin_memset&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($iccver&amp;gt;=9)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -i-static&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=~s/\-no_cpprt/-no-cpprt/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($iccver&amp;gt;=10)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags=~s/\-i\-static/-static-intel/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
&lt;br&gt;# linkers (tested OpenBSD, NetBSD and FreeBSD) &amp;quot;demand&amp;quot; RPATH set on
&lt;br&gt;# .so objects. Apparently application RPATH is not global and does
&lt;br&gt;# not apply to .so linked with other .so. Problem manifests itself
&lt;br&gt;# when libssl.so fails to load libcrypto.so. One can argue that we
&lt;br&gt;# should engrave this into Makefile.shared rules or into BSD-* config
&lt;br&gt;# lines above. Meanwhile let's try to be cautious and pass -rpath to
&lt;br&gt;# linker only when --prefix is not /usr.
&lt;br&gt;if ($target =~ /^BSD\-/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $shared_ldflag.=&amp;quot; -Wl,-rpath,\$(LIBRPATH)&amp;quot; if ($prefix !~ m|^/usr[/]*$|);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($sys_id ne &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #$cflags=&amp;quot;-DOPENSSL_SYSNAME_$sys_id $cflags&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $openssl_sys_defines=&amp;quot;#define OPENSSL_SYSNAME_$sys_id\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($ranlib eq &amp;quot;&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $ranlib = $default_ranlib;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;#my ($bn1)=split(/\s+/,$bn_obj);
&lt;br&gt;#$bn1 = &amp;quot;&amp;quot; unless defined $bn1;
&lt;br&gt;#$bn1=$bn_asm unless ($bn1 =~ /\.o$/);
&lt;br&gt;#$bn_obj=&amp;quot;$bn1&amp;quot;;
&lt;br&gt;&lt;br&gt;$cpuid_obj=&amp;quot;&amp;quot; if ($processor eq &amp;quot;386&amp;quot;);
&lt;br&gt;&lt;br&gt;$bn_obj = $bn_asm unless $bn_obj ne &amp;quot;&amp;quot;;
&lt;br&gt;# bn-586 is the only one implementing bn_*_part_words
&lt;br&gt;$cflags.=&amp;quot; -DOPENSSL_BN_ASM_PART_WORDS&amp;quot; if ($bn_obj =~ /bn-586/);
&lt;br&gt;$cflags.=&amp;quot; -DOPENSSL_IA32_SSE2&amp;quot; if (!$no_sse2 &amp;&amp; $bn_obj =~ /86/);
&lt;br&gt;&lt;br&gt;$cflags.=&amp;quot; -DOPENSSL_BN_ASM_MONT&amp;quot; if ($bn_obj =~ /-mont/);
&lt;br&gt;&lt;br&gt;$cpuid_obj=&amp;quot;mem_clr.o&amp;quot;	unless ($cpuid_obj =~ /\.o$/);
&lt;br&gt;$des_obj=$des_enc	unless ($des_obj =~ /\.o$/);
&lt;br&gt;$bf_obj=$bf_enc		unless ($bf_obj =~ /\.o$/);
&lt;br&gt;$cast_obj=$cast_enc	unless ($cast_obj =~ /\.o$/);
&lt;br&gt;$rc4_obj=$rc4_enc	unless ($rc4_obj =~ /\.o$/);
&lt;br&gt;$rc5_obj=$rc5_enc	unless ($rc5_obj =~ /\.o$/);
&lt;br&gt;if ($sha1_obj =~ /\.o$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#	$sha1_obj=$sha1_enc;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DSHA1_ASM&amp;quot; &amp;nbsp; if ($sha1_obj =~ /sx86/ || $sha1_obj =~ /sha1/);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DSHA256_ASM&amp;quot; if ($sha1_obj =~ /sha256/);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DSHA512_ASM&amp;quot; if ($sha1_obj =~ /sha512/);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($sha1_obj =~ /sse2/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {	if ($no_sse2)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; $sha1_obj =~ s/\S*sse2\S+//; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($cflags !~ /OPENSSL_IA32_SSE2/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; $cflags.=&amp;quot; -DOPENSSL_IA32_SSE2&amp;quot;; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if ($md5_obj =~ /\.o$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#	$md5_obj=$md5_enc;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DMD5_ASM&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if ($rmd160_obj =~ /\.o$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#	$rmd160_obj=$rmd160_enc;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DRMD160_ASM&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;if ($aes_obj =~ /\.o$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DAES_ASM&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;else	{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $aes_obj=$aes_enc;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;$wp_obj=&amp;quot;&amp;quot; if ($wp_obj =~ /mmx/ &amp;&amp; $processor eq &amp;quot;386&amp;quot;);
&lt;br&gt;if ($wp_obj =~ /\.o$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags.=&amp;quot; -DWHIRLPOOL_ASM&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;else	{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $wp_obj=&amp;quot;wp_block.o&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;$cmll_obj=$cmll_enc	unless ($cmll_obj =~ /.o$/);
&lt;br&gt;&lt;br&gt;# &amp;quot;Stringify&amp;quot; the C flags string. &amp;nbsp;This permits it to be made part of a string
&lt;br&gt;# and works as well on command lines.
&lt;br&gt;$cflags =~ s/([\\\&amp;quot;])/\\\1/g;
&lt;br&gt;&lt;br&gt;my $version = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $version_num = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $major = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $minor = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $shlib_version_number = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $shlib_version_history = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $shlib_major = &amp;quot;unknown&amp;quot;;
&lt;br&gt;my $shlib_minor = &amp;quot;unknown&amp;quot;;
&lt;br&gt;&lt;br&gt;open(IN,'&amp;lt;crypto/opensslv.h') || die &amp;quot;unable to read opensslv.h:$!\n&amp;quot;;
&lt;br&gt;while (&amp;lt;IN&amp;gt;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $version=$1 if /OPENSSL.VERSION.TEXT.*OpenSSL (\S+) /;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $version_num=$1 if /OPENSSL.VERSION.NUMBER.*0x(\S+)/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $shlib_version_number=$1 if /SHLIB_VERSION_NUMBER *&amp;quot;([^&amp;quot;]+)&amp;quot;/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $shlib_version_history=$1 if /SHLIB_VERSION_HISTORY *&amp;quot;([^&amp;quot;]*)&amp;quot;/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;close(IN);
&lt;br&gt;if ($shlib_version_history ne &amp;quot;&amp;quot;) { $shlib_version_history .= &amp;quot;:&amp;quot;; }
&lt;br&gt;&lt;br&gt;if ($version =~ /(^[0-9]*)\.([0-9\.]*)/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $major=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $minor=$2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($shlib_version_number =~ /(^[0-9]*)\.([0-9\.]*)/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $shlib_major=$1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $shlib_minor=$2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;if ($strict_warnings)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $wopt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; die &amp;quot;ERROR --strict-warnings requires gcc&amp;quot; unless ($cc =~ /gcc$/);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $wopt (split /\s+/, $gcc_devteam_warn)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $cflags .= &amp;quot; $wopt&amp;quot; unless ($cflags =~ /$wopt/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;open(IN,'&amp;lt;Makefile.org') || die &amp;quot;unable to read Makefile.org:$!\n&amp;quot;;
&lt;br&gt;unlink(&amp;quot;$Makefile.new&amp;quot;) || die &amp;quot;unable to remove old $Makefile.new:$!\n&amp;quot; if -e &amp;quot;$Makefile.new&amp;quot;;
&lt;br&gt;open(OUT,&amp;quot;&amp;gt;$Makefile.new&amp;quot;) || die &amp;quot;unable to create $Makefile.new:$!\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot;### Generated automatically from Makefile.org by Configure.\n\n&amp;quot;;
&lt;br&gt;my $sdirs=0;
&lt;br&gt;while (&amp;lt;IN&amp;gt;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; chomp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $sdirs = 1 if /^SDIRS=/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($sdirs) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $dir;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $dir (@skip) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/(\s)$dir /$1/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/\s$dir$//;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $sdirs = 0 unless /\\$/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/engines // if (/^DIRS=/ &amp;&amp; $disabled{&amp;quot;engine&amp;quot;});
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/ccgost// if (/^ENGDIRS=/ &amp;&amp; $disabled{&amp;quot;gost&amp;quot;});
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^VERSION=.*/VERSION=$version/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MAJOR=.*/MAJOR=$major/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MINOR=.*/MINOR=$minor/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_VERSION_NUMBER=.*/SHLIB_VERSION_NUMBER=$shlib_version_number/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_VERSION_HISTORY=.*/SHLIB_VERSION_HISTORY=$shlib_version_history/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_MAJOR=.*/SHLIB_MAJOR=$shlib_major/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_MINOR=.*/SHLIB_MINOR=$shlib_minor/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_EXT=.*/SHLIB_EXT=$shared_extension/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^INSTALLTOP=.*$/INSTALLTOP=$prefix/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MULTILIB=.*$/MULTILIB=$multilib/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^OPENSSLDIR=.*$/OPENSSLDIR=$openssldir/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^LIBDIR=.*$/LIBDIR=$libdir/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^INSTALL_PREFIX=.*$/INSTALL_PREFIX=$install_prefix/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^PLATFORM=.*$/PLATFORM=$target/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^OPTIONS=.*$/OPTIONS=$options/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CONFIGURE_ARGS=.*$/CONFIGURE_ARGS=$argvstring/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($cross_compile_prefix)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CC=.*$/CROSS_COMPILE= $cross_compile_prefix\nCC= \$\(CROSS_COMPILE\)$cc/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^AR=\s*/AR= \$\(CROSS_COMPILE\)/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^NM=\s*/NM= \$\(CROSS_COMPILE\)/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^RANLIB=\s*/RANLIB= \$\(CROSS_COMPILE\)/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MAKEDEPPROG=.*$/MAKEDEPPROG= \$\(CROSS_COMPILE\)$cc/ if $cc eq &amp;quot;gcc&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else	{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CC=.*$/CC= $cc/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^AR=\s*ar/AR= $ar/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^RANLIB=.*/RANLIB= $ranlib/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MAKEDEPPROG=.*$/MAKEDEPPROG= $cc/ if $cc eq &amp;quot;gcc&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CFLAG=.*$/CFLAG= $cflags/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^DEPFLAG=.*$/DEPFLAG=$depflags/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^PEX_LIBS=.*$/PEX_LIBS= $prelflags/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^EX_LIBS=.*$/EX_LIBS= $lflags/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^EXE_EXT=.*$/EXE_EXT= $exe_ext/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CPUID_OBJ=.*$/CPUID_OBJ= $cpuid_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^BN_ASM=.*$/BN_ASM= $bn_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^DES_ENC=.*$/DES_ENC= $des_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^AES_ENC=.*$/AES_ENC= $aes_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^BF_ENC=.*$/BF_ENC= $bf_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CAST_ENC=.*$/CAST_ENC= $cast_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^RC4_ENC=.*$/RC4_ENC= $rc4_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^RC5_ENC=.*$/RC5_ENC= $rc5_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^MD5_ASM_OBJ=.*$/MD5_ASM_OBJ= $md5_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHA1_ASM_OBJ=.*$/SHA1_ASM_OBJ= $sha1_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^RMD160_ASM_OBJ=.*$/RMD160_ASM_OBJ= $rmd160_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^WP_ASM_OBJ=.*$/WP_ASM_OBJ= $wp_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^CMLL_ENC=.*$/CMLL_ENC= $cmll_obj/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^PERLASM_SCHEME=.*$/PERLASM_SCHEME= $perlasm_scheme/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^PROCESSOR=.*/PROCESSOR= $processor/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^ARFLAGS=.*/ARFLAGS= $arflags/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^PERL=.*/PERL= $perl/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^KRB5_INCLUDES=.*/KRB5_INCLUDES=$withargs{&amp;quot;krb5-include&amp;quot;}/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^LIBKRB5=.*/LIBKRB5=$withargs{&amp;quot;krb5-lib&amp;quot;}/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^LIBZLIB=.*/LIBZLIB=$withargs{&amp;quot;zlib-lib&amp;quot;}/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^ZLIB_INCLUDE=.*/ZLIB_INCLUDE=$withargs{&amp;quot;zlib-include&amp;quot;}/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_TARGET=.*/SHLIB_TARGET=$shared_target/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHLIB_MARK=.*/SHLIB_MARK=$shared_mark/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LIBS=.*/SHARED_LIBS=\$(SHARED_CRYPTO) \$(SHARED_SSL)/ if (!$no_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($shared_extension ne &amp;quot;&amp;quot; &amp;&amp; $shared_extension =~ /^\.s([ol])\.[^\.]*$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $sotmp = $1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($shared_extension ne &amp;quot;&amp;quot; &amp;&amp; $shared_extension =~ /^\.[^\.]*\.dylib$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.dylib/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($shared_extension ne &amp;quot;&amp;quot; &amp;&amp; $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $sotmp = $1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($shared_extension ne &amp;quot;&amp;quot; &amp;&amp; $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.\$(SHLIB_MAJOR).dylib .dylib/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s/^SHARED_LDFLAGS=.*/SHARED_LDFLAGS=$shared_ldflag/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT $_.&amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;close(IN);
&lt;br&gt;close(OUT);
&lt;br&gt;rename($Makefile,&amp;quot;$Makefile.bak&amp;quot;) || die &amp;quot;unable to rename $Makefile\n&amp;quot; if -e $Makefile;
&lt;br&gt;rename(&amp;quot;$Makefile.new&amp;quot;,$Makefile) || die &amp;quot;unable to rename $Makefile.new\n&amp;quot;;
&lt;br&gt;&lt;br&gt;print &amp;quot;CC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=$cc\n&amp;quot;;
&lt;br&gt;print &amp;quot;CFLAG &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; =$cflags\n&amp;quot;;
&lt;br&gt;print &amp;quot;EX_LIBS &amp;nbsp; &amp;nbsp; &amp;nbsp; =$lflags\n&amp;quot;;
&lt;br&gt;print &amp;quot;CPUID_OBJ &amp;nbsp; &amp;nbsp; =$cpuid_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;BN_ASM &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=$bn_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;DES_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp; =$des_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;AES_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp; =$aes_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;BF_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=$bf_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;CAST_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp;=$cast_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;RC4_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp; =$rc4_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;RC5_ENC &amp;nbsp; &amp;nbsp; &amp;nbsp; =$rc5_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;MD5_OBJ_ASM &amp;nbsp; =$md5_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;SHA1_OBJ_ASM &amp;nbsp;=$sha1_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;RMD160_OBJ_ASM=$rmd160_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;CMLL_ENC= &amp;nbsp; &amp;nbsp; =$cmll_obj\n&amp;quot;;
&lt;br&gt;print &amp;quot;PROCESSOR &amp;nbsp; &amp;nbsp; =$processor\n&amp;quot;;
&lt;br&gt;print &amp;quot;RANLIB &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=$ranlib\n&amp;quot;;
&lt;br&gt;print &amp;quot;ARFLAGS &amp;nbsp; &amp;nbsp; &amp;nbsp; =$arflags\n&amp;quot;;
&lt;br&gt;print &amp;quot;PERL &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;=$perl\n&amp;quot;;
&lt;br&gt;print &amp;quot;KRB5_INCLUDES =&amp;quot;,$withargs{&amp;quot;krb5-include&amp;quot;},&amp;quot;\n&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $withargs{&amp;quot;krb5-include&amp;quot;} ne &amp;quot;&amp;quot;;
&lt;br&gt;&lt;br&gt;my $des_ptr=0;
&lt;br&gt;my $des_risc1=0;
&lt;br&gt;my $des_risc2=0;
&lt;br&gt;my $des_unroll=0;
&lt;br&gt;my $bn_ll=0;
&lt;br&gt;my $def_int=2;
&lt;br&gt;my $rc4_int=$def_int;
&lt;br&gt;my $md2_int=$def_int;
&lt;br&gt;my $idea_int=$def_int;
&lt;br&gt;my $rc2_int=$def_int;
&lt;br&gt;my $rc4_idx=0;
&lt;br&gt;my $rc4_chunk=0;
&lt;br&gt;my $bf_ptr=0;
&lt;br&gt;my @type=(&amp;quot;char&amp;quot;,&amp;quot;short&amp;quot;,&amp;quot;int&amp;quot;,&amp;quot;long&amp;quot;);
&lt;br&gt;my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
&lt;br&gt;my $export_var_as_fn=0;
&lt;br&gt;&lt;br&gt;my $des_int;
&lt;br&gt;&lt;br&gt;foreach (sort split(/\s+/,$bn_ops))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_ptr=1 if /DES_PTR/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_risc1=1 if /DES_RISC1/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_risc2=1 if /DES_RISC2/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_unroll=1 if /DES_UNROLL/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $des_int=1 if /DES_INT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $bn_ll=1 if /BN_LLONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc4_int=0 if /RC4_CHAR/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc4_int=3 if /RC4_LONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc4_idx=1 if /RC4_INDEX/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc4_chunk=1 if /RC4_CHUNK/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc4_chunk=2 if /RC4_CHUNK_LL/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $md2_int=0 if /MD2_CHAR/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $md2_int=3 if /MD2_LONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $idea_int=1 if /IDEA_SHORT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $idea_int=3 if /IDEA_LONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc2_int=1 if /RC2_SHORT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $rc2_int=3 if /RC2_LONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $bf_ptr=1 if $_ eq &amp;quot;BF_PTR&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $bf_ptr=2 if $_ eq &amp;quot;BF_PTR2&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($b64l,$b64,$b32,$b16,$b8)=(0,1,0,0,0) if /SIXTY_FOUR_BIT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($b64l,$b64,$b32,$b16,$b8)=(1,0,0,0,0) if /SIXTY_FOUR_BIT_LONG/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;open(IN,'&amp;lt;crypto/opensslconf.h.in') || die &amp;quot;unable to read crypto/opensslconf.h.in:$!\n&amp;quot;;
&lt;br&gt;unlink(&amp;quot;crypto/opensslconf.h.new&amp;quot;) || die &amp;quot;unable to remove old crypto/opensslconf.h.new:$!\n&amp;quot; if -e &amp;quot;crypto/opensslconf.h.new&amp;quot;;
&lt;br&gt;open(OUT,'&amp;gt;crypto/opensslconf.h.new') || die &amp;quot;unable to create crypto/opensslconf.h.new:$!\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot;/* opensslconf.h */\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot;/* WARNING: Generated automatically from opensslconf.h.in by Configure. */\n\n&amp;quot;;
&lt;br&gt;&lt;br&gt;print OUT &amp;quot;/* OpenSSL was configured with the following options: */\n&amp;quot;;
&lt;br&gt;my $openssl_algorithm_defines_trans = $openssl_algorithm_defines;
&lt;br&gt;$openssl_experimental_defines =~ s/^\s*#\s*define\s+OPENSSL_NO_(.*)/#ifndef OPENSSL_EXPERIMENTAL_$1\n# ifndef OPENSSL_NO_$1\n# &amp;nbsp;define OPENSSL_NO_$1\n# endif\n#endif/mg;
&lt;br&gt;$openssl_algorithm_defines_trans =~ s/^\s*#\s*define\s+OPENSSL_(.*)/# if defined(OPENSSL_$1) \&amp;\&amp; !defined($1)\n# &amp;nbsp;define $1\n# endif/mg;
&lt;br&gt;$openssl_algorithm_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
&lt;br&gt;$openssl_algorithm_defines = &amp;quot; &amp;nbsp; /* no ciphers excluded */\n&amp;quot; if $openssl_algorithm_defines eq &amp;quot;&amp;quot;;
&lt;br&gt;$openssl_thread_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
&lt;br&gt;$openssl_sys_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
&lt;br&gt;$openssl_other_defines =~ s/^\s*#\s*define\s+(.*)/#ifndef $1\n# define $1\n#endif/mg;
&lt;br&gt;print OUT $openssl_sys_defines;
&lt;br&gt;print OUT &amp;quot;#ifndef OPENSSL_DOING_MAKEDEPEND\n\n&amp;quot;;
&lt;br&gt;print OUT $openssl_experimental_defines;
&lt;br&gt;print OUT &amp;quot;\n&amp;quot;;
&lt;br&gt;print OUT $openssl_algorithm_defines;
&lt;br&gt;print OUT &amp;quot;\n#endif /* OPENSSL_DOING_MAKEDEPEND */\n\n&amp;quot;;
&lt;br&gt;print OUT $openssl_thread_defines;
&lt;br&gt;print OUT $openssl_other_defines,&amp;quot;\n&amp;quot;;
&lt;br&gt;&lt;br&gt;print OUT &amp;quot;/* The OPENSSL_NO_* macros are also defined as NO_* if the application\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot; &amp;nbsp; asks for it. &amp;nbsp;This is a transient feature that is provided for those\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot; &amp;nbsp; who haven't had the time to do the appropriate changes in their\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot; &amp;nbsp; applications. &amp;nbsp;*/\n&amp;quot;;
&lt;br&gt;print OUT &amp;quot;#ifdef OPENSSL_ALGORITHM_DEFINES\n&amp;quot;;
&lt;br&gt;print OUT $openssl_algorithm_defines_trans;
&lt;br&gt;print OUT &amp;quot;#endif\n\n&amp;quot;;
&lt;br&gt;&lt;br&gt;print OUT &amp;quot;#define OPENSSL_CPUID_OBJ\n\n&amp;quot; if ($cpuid_obj ne &amp;quot;mem_clr.o&amp;quot;);
&lt;br&gt;&lt;br&gt;while (&amp;lt;IN&amp;gt;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if	(/^#define\s+OPENSSLDIR/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $foo = $openssldir;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $foo =~ s/\\/\\\\/g;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT &amp;quot;#define OPENSSLDIR \&amp;quot;$foo\&amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+ENGINESDIR/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # $foo is to become &amp;quot;$prefix/lib$multilib/engines&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # as Makefile.org and engines/Makefile are adapted for
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # $multilib suffix.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $foo = &amp;quot;$prefix/lib/engines&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $foo =~ s/\\/\\\\/g;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT &amp;quot;#define ENGINESDIR \&amp;quot;$foo\&amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $export_var_as_fn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($export_var_as_fn)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+OPENSSL_UNISTD/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $unistd = &amp;quot;&amp;lt;unistd.h&amp;gt;&amp;quot; if $unistd eq &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT &amp;quot;#define OPENSSL_UNISTD $unistd\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+SIXTY_FOUR_BIT_LONG/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s SIXTY_FOUR_BIT_LONG\n&amp;quot;,($b64l)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+SIXTY_FOUR_BIT/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s SIXTY_FOUR_BIT\n&amp;quot;,($b64)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+THIRTY_TWO_BIT/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s THIRTY_TWO_BIT\n&amp;quot;,($b32)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+SIXTEEN_BIT/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s SIXTEEN_BIT\n&amp;quot;,($b16)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+EIGHT_BIT/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s EIGHT_BIT\n&amp;quot;,($b8)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+BN_LLONG\s*$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s BN_LLONG\n&amp;quot;,($bn_ll)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^\#define\s+DES_LONG\s+.*/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#define DES_LONG unsigned %s\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($des_int)?'int':'long'; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^\#(define|undef)\s+DES_PTR/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s DES_PTR\n&amp;quot;,($des_ptr)?'define':'undef'; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^\#(define|undef)\s+DES_RISC1/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s DES_RISC1\n&amp;quot;,($des_risc1)?'define':'undef'; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^\#(define|undef)\s+DES_RISC2/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s DES_RISC2\n&amp;quot;,($des_risc2)?'define':'undef'; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^\#(define|undef)\s+DES_UNROLL/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s DES_UNROLL\n&amp;quot;,($des_unroll)?'define':'undef'; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+RC4_INT\s/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#define RC4_INT unsigned %s\n&amp;quot;,$type[$rc4_int]; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#undef\s+RC4_CHUNK/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#undef RC4_CHUNK\n&amp;quot; if $rc4_chunk==0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#define RC4_CHUNK unsigned long\n&amp;quot; if $rc4_chunk==1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#define RC4_CHUNK unsigned long long\n&amp;quot; if $rc4_chunk==2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#((define)|(undef))\s+RC4_INDEX/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s RC4_INDEX\n&amp;quot;,($rc4_idx)?&amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^#(define|undef)\s+I386_ONLY/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#%s I386_ONLY\n&amp;quot;, ($processor eq &amp;quot;386&amp;quot;)?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;quot;define&amp;quot;:&amp;quot;undef&amp;quot;; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+MD2_INT\s/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { printf OUT &amp;quot;#define MD2_INT unsigned %s\n&amp;quot;,$type[$md2_int]; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+IDEA_INT\s/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {printf OUT &amp;quot;#define IDEA_INT unsigned %s\n&amp;quot;,$type[$idea_int];}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif	(/^#define\s+RC2_INT\s/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {printf OUT &amp;quot;#define RC2_INT unsigned %s\n&amp;quot;,$type[$rc2_int];}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif (/^#(define|undef)\s+BF_PTR/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#undef BF_PTR\n&amp;quot; if $bf_ptr == 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#define BF_PTR\n&amp;quot; if $bf_ptr == 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;quot;#define BF_PTR2\n&amp;quot; if $bf_ptr == 2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { print OUT $_; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;close(IN);
&lt;br&gt;close(OUT);
&lt;br&gt;rename(&amp;quot;crypto/opensslconf.h&amp;quot;,&amp;quot;crypto/opensslconf.h.bak&amp;quot;) || die &amp;quot;unable to rename crypto/opensslconf.h\n&amp;quot; if -e &amp;quot;crypto/opensslconf.h&amp;quot;;
&lt;br&gt;rename(&amp;quot;crypto/opensslconf.h.new&amp;quot;,&amp;quot;crypto/opensslconf.h&amp;quot;) || die &amp;quot;unable to rename crypto/opensslconf.h.new\n&amp;quot;;
&lt;br&gt;&lt;br&gt;&lt;br&gt;# Fix the date
&lt;br&gt;&lt;br&gt;print &amp;quot;SIXTY_FOUR_BIT_LONG mode\n&amp;quot; if $b64l;
&lt;br&gt;print &amp;quot;SIXTY_FOUR_BIT mode\n&amp;quot; if $b64;
&lt;br&gt;print &amp;quot;THIRTY_TWO_BIT mode\n&amp;quot; if $b32;
&lt;br&gt;print &amp;quot;SIXTEEN_BIT mode\n&amp;quot; if $b16;
&lt;br&gt;print &amp;quot;EIGHT_BIT mode\n&amp;quot; if $b8;
&lt;br&gt;print &amp;quot;DES_PTR used\n&amp;quot; if $des_ptr;
&lt;br&gt;print &amp;quot;DES_RISC1 used\n&amp;quot; if $des_risc1;
&lt;br&gt;print &amp;quot;DES_RISC2 used\n&amp;quot; if $des_risc2;
&lt;br&gt;print &amp;quot;DES_UNROLL used\n&amp;quot; if $des_unroll;
&lt;br&gt;print &amp;quot;DES_INT used\n&amp;quot; if $des_int;
&lt;br&gt;print &amp;quot;BN_LLONG mode\n&amp;quot; if $bn_ll;
&lt;br&gt;print &amp;quot;RC4 uses u$type[$rc4_int]\n&amp;quot; if $rc4_int != $def_int;
&lt;br&gt;print &amp;quot;RC4_INDEX mode\n&amp;quot; if $rc4_idx;
&lt;br&gt;print &amp;quot;RC4_CHUNK is undefined\n&amp;quot; if $rc4_chunk==0;
&lt;br&gt;print &amp;quot;RC4_CHUNK is unsigned long\n&amp;quot; if $rc4_chunk==1;
&lt;br&gt;print &amp;quot;RC4_CHUNK is unsigned long long\n&amp;quot; if $rc4_chunk==2;
&lt;br&gt;print &amp;quot;MD2 uses u$type[$md2_int]\n&amp;quot; if $md2_int != $def_int;
&lt;br&gt;print &amp;quot;IDEA uses u$type[$idea_int]\n&amp;quot; if $idea_int != $def_int;
&lt;br&gt;print &amp;quot;RC2 uses u$type[$rc2_int]\n&amp;quot; if $rc2_int != $def_int;
&lt;br&gt;print &amp;quot;BF_PTR used\n&amp;quot; if $bf_ptr == 1; 
&lt;br&gt;print &amp;quot;BF_PTR2 used\n&amp;quot; if $bf_ptr == 2; 
&lt;br&gt;&lt;br&gt;if($IsMK1MF) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; open (OUT,&amp;quot;&amp;gt;crypto/buildinf.h&amp;quot;) || die &amp;quot;Can't open buildinf.h&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf OUT &amp;lt;&amp;lt;EOF;
&lt;br&gt;#ifndef MK1MF_BUILD
&lt;br&gt;&amp;nbsp; /* auto-generated by Configure for crypto/cversion.c:
&lt;br&gt;&amp;nbsp; &amp;nbsp;* for Unix builds, crypto/Makefile.ssl generates functional definitions;
&lt;br&gt;&amp;nbsp; &amp;nbsp;* Windows builds (and other mk1mf builds) compile cversion.c with
&lt;br&gt;&amp;nbsp; &amp;nbsp;* -DMK1MF_BUILD and use definitions added to this file by util/mk1mf.pl. */
&lt;br&gt;&amp;nbsp; #error &amp;quot;Windows builds (PLATFORM=$target) use mk1mf.pl-created Makefiles&amp;quot;
&lt;br&gt;#endif
&lt;br&gt;EOF
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(OUT);
&lt;br&gt;} else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $make_command = &amp;quot;$make PERL=\'$perl\'&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $make_targets = &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $make_targets .= &amp;quot; links&amp;quot; if $symlink;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $make_targets .= &amp;quot; depend&amp;quot; if $depflags ne $default_depflags &amp;&amp; $make_depend;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $make_targets .= &amp;quot; gentests&amp;quot; if $symlink;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (system $make_command.$make_targets) == 0 or exit $?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if $make_targets ne &amp;quot;&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ( $perl =~ m@^/@) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;dofile(&amp;quot;tools/c_rehash&amp;quot;,$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = &amp;quot;' . $openssldir . '&amp;quot;;');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;dofile(&amp;quot;apps/CA.pl&amp;quot;,$perl,'^#!/', '#!%s');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # No path for Perl known ...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;dofile(&amp;quot;tools/c_rehash&amp;quot;,'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = &amp;quot;' . $openssldir . '&amp;quot;;');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;dofile(&amp;quot;apps/CA.pl&amp;quot;,'/usr/local/bin/perl','^#!/', '#!%s');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($depflags ne $default_depflags &amp;&amp; !$make_depend) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;lt;&amp;lt;EOF;
&lt;br&gt;&lt;br&gt;Since you've disabled or enabled at least one algorithm, you need to do
&lt;br&gt;the following before building:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; make depend
&lt;br&gt;EOF
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;# create the ms/version32.rc file if needed
&lt;br&gt;if ($IsMK1MF &amp;&amp; ($target !~ /^netware/)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my ($v1, $v2, $v3, $v4);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($version_num =~ /(^[0-9a-f]{1})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $v1=hex $1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $v2=hex $2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $v3=hex $3;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $v4=hex $4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; open (OUT,&amp;quot;&amp;gt;ms/version32.rc&amp;quot;) || die &amp;quot;Can't open ms/version32.rc&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT &amp;lt;&amp;lt;EOF;
&lt;br&gt;#include &amp;lt;winver.h&amp;gt;
&lt;br&gt;&lt;br&gt;LANGUAGE 0x09,0x01
&lt;br&gt;&lt;br&gt;1 VERSIONINFO
&lt;br&gt;&amp;nbsp; FILEVERSION $v1,$v2,$v3,$v4
&lt;br&gt;&amp;nbsp; PRODUCTVERSION $v1,$v2,$v3,$v4
&lt;br&gt;&amp;nbsp; FILEFLAGSMASK 0x3fL
&lt;br&gt;#ifdef _DEBUG
&lt;br&gt;&amp;nbsp; FILEFLAGS 0x01L
&lt;br&gt;#else
&lt;br&gt;&amp;nbsp; FILEFLAGS 0x00L
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; FILEOS VOS__WINDOWS32
&lt;br&gt;&amp;nbsp; FILETYPE VFT_DLL
&lt;br&gt;&amp;nbsp; FILESUBTYPE 0x0L
&lt;br&gt;BEGIN
&lt;br&gt;&amp;nbsp; &amp;nbsp; BLOCK &amp;quot;StringFileInfo&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; BEGIN
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BLOCK &amp;quot;040904b0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BEGIN
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Required:	 &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;CompanyName&amp;quot;, &amp;quot;The OpenSSL Project, &lt;a href=&quot;http://www.openssl.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org/&lt;/a&gt;\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;FileDescription&amp;quot;, &amp;quot;OpenSSL Shared Library\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;FileVersion&amp;quot;, &amp;quot;$version\\0&amp;quot;
&lt;br&gt;#if defined(CRYPTO)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;InternalName&amp;quot;, &amp;quot;libeay32\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;OriginalFilename&amp;quot;, &amp;quot;libeay32.dll\\0&amp;quot;
&lt;br&gt;#elif defined(SSL)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;InternalName&amp;quot;, &amp;quot;ssleay32\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;OriginalFilename&amp;quot;, &amp;quot;ssleay32.dll\\0&amp;quot;
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;ProductName&amp;quot;, &amp;quot;The OpenSSL Toolkit\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;ProductVersion&amp;quot;, &amp;quot;$version\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Optional:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //VALUE &amp;quot;Comments&amp;quot;, &amp;quot;\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;LegalCopyright&amp;quot;, &amp;quot;Copyright © 1998-2005 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //VALUE &amp;quot;LegalTrademarks&amp;quot;, &amp;quot;\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //VALUE &amp;quot;PrivateBuild&amp;quot;, &amp;quot;\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //VALUE &amp;quot;SpecialBuild&amp;quot;, &amp;quot;\\0&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END
&lt;br&gt;&amp;nbsp; &amp;nbsp; END
&lt;br&gt;&amp;nbsp; &amp;nbsp; BLOCK &amp;quot;VarFileInfo&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; BEGIN
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; VALUE &amp;quot;Translation&amp;quot;, 0x409, 0x4b0
&lt;br&gt;&amp;nbsp; &amp;nbsp; END
&lt;br&gt;END
&lt;br&gt;EOF
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(OUT);
&lt;br&gt;&amp;nbsp; }
&lt;br&gt;&amp;nbsp; 
&lt;br&gt;print &amp;lt;&amp;lt;EOF;
&lt;br&gt;&lt;br&gt;Configured for $target.
&lt;br&gt;EOF
&lt;br&gt;&lt;br&gt;print &amp;lt;&amp;lt;\EOF if (!$no_threads &amp;&amp; !$threads);
&lt;br&gt;&lt;br&gt;The library could not be configured for supporting multi-threaded
&lt;br&gt;applications as the compiler options required on this system are not known.
&lt;br&gt;See file INSTALL for details if you need multi-threading.
&lt;br&gt;EOF
&lt;br&gt;&lt;br&gt;print &amp;lt;&amp;lt;\EOF if ($no_shared_warn);
&lt;br&gt;&lt;br&gt;You gave the option 'shared'. &amp;nbsp;Normally, that would give you shared libraries.
&lt;br&gt;Unfortunately, the OpenSSL configuration doesn't include shared library support
&lt;br&gt;for this platform yet, so it will pretend you gave the option 'no-shared'. &amp;nbsp;If
&lt;br&gt;you can inform the developpers (openssl-dev\@openssl.org) how to support shared
&lt;br&gt;libraries on this platform, they will at least look at it and try their best
&lt;br&gt;(but please first make sure you have tried with a current version of OpenSSL).
&lt;br&gt;EOF
&lt;br&gt;&lt;br&gt;exit(0);
&lt;br&gt;&lt;br&gt;sub usage
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR $usage;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;\npick os/compiler from:\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $j=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $i;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $k=0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $i (sort keys %table)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next if $i =~ /^debug/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $k += length($i) + 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($k &amp;gt; 78)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $k=length($i);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR $i . &amp;quot; &amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $i (sort keys %table)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; next if $i !~ /^debug/;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $k += length($i) + 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($k &amp;gt; 78)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $k=length($i);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR $i . &amp;quot; &amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;\n\nNOTE: If in doubt, on Unix-ish systems use './config'.\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;sub which
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my($name)=@_;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $path;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $path (split /:/, $ENV{PATH})
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (-f &amp;quot;$path/$name$exe_ext&amp;quot; and -x _)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return &amp;quot;$path/$name$exe_ext&amp;quot; unless ($name eq &amp;quot;perl&amp;quot; and
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;system(&amp;quot;$path/$name$exe_ext -e &amp;quot; . '\'exit($]&amp;lt;5.0);\''));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;sub dofile
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $f; my $p; my %m; my @a; my $k; my $ff;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ($f,$p,%m)=@_;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; open(IN,&amp;quot;&amp;lt;$f.in&amp;quot;) || open(IN,&amp;quot;&amp;lt;$f&amp;quot;) || die &amp;quot;unable to open $f:$!\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @a=&amp;lt;IN&amp;gt;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(IN);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $k (keys %m)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; grep(/$k/ &amp;&amp; ($_=sprintf($m{$k}.&amp;quot;\n&amp;quot;,$p)),@a);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; open(OUT,&amp;quot;&amp;gt;$f.new&amp;quot;) || die &amp;quot;unable to open $f.new:$!\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print OUT @a;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(OUT);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rename($f,&amp;quot;$f.bak&amp;quot;) || die &amp;quot;unable to rename $f\n&amp;quot; if -e $f;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rename(&amp;quot;$f.new&amp;quot;,$f) || die &amp;quot;unable to rename $f.new\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;sub print_table_entry
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $target = shift;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (my $cc,my $cflags,my $unistd,my $thread_cflag,my $sys_id,my $lflags,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $bn_ops,my $cpuid_obj,my $bn_obj,my $des_obj,my $aes_obj, my $bf_obj,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $md5_obj,my $sha1_obj,my $cast_obj,my $rc4_obj,my $rmd160_obj,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $rc5_obj,my $wp_obj,my $cmll_obj,my $perlasm_scheme,my $dso_scheme,my $shared_target,my $shared_cflag,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $shared_ldflag,my $shared_extension,my $ranlib,my $arflags,my $multilib)=
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; split(/\s*:\s*/,$table{$target} . &amp;quot;:&amp;quot; x 30 , -1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print &amp;lt;&amp;lt;EOF
&lt;br&gt;&lt;br&gt;*** $target
&lt;br&gt;\$cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = $cc
&lt;br&gt;\$cflags &amp;nbsp; &amp;nbsp; &amp;nbsp; = $cflags
&lt;br&gt;\$unistd &amp;nbsp; &amp;nbsp; &amp;nbsp; = $unistd
&lt;br&gt;\$thread_cflag = $thread_cflag
&lt;br&gt;\$sys_id &amp;nbsp; &amp;nbsp; &amp;nbsp; = $sys_id
&lt;br&gt;\$lflags &amp;nbsp; &amp;nbsp; &amp;nbsp; = $lflags
&lt;br&gt;\$bn_ops &amp;nbsp; &amp;nbsp; &amp;nbsp; = $bn_ops
&lt;br&gt;\$cpuid_obj &amp;nbsp; &amp;nbsp;= $cpuid_obj
&lt;br&gt;\$bn_obj &amp;nbsp; &amp;nbsp; &amp;nbsp; = $bn_obj
&lt;br&gt;\$des_obj &amp;nbsp; &amp;nbsp; &amp;nbsp;= $des_obj
&lt;br&gt;\$aes_obj &amp;nbsp; &amp;nbsp; &amp;nbsp;= $aes_obj
&lt;br&gt;\$bf_obj &amp;nbsp; &amp;nbsp; &amp;nbsp; = $bf_obj
&lt;br&gt;\$md5_obj &amp;nbsp; &amp;nbsp; &amp;nbsp;= $md5_obj
&lt;br&gt;\$sha1_obj &amp;nbsp; &amp;nbsp; = $sha1_obj
&lt;br&gt;\$cast_obj &amp;nbsp; &amp;nbsp; = $cast_obj
&lt;br&gt;\$rc4_obj &amp;nbsp; &amp;nbsp; &amp;nbsp;= $rc4_obj
&lt;br&gt;\$rmd160_obj &amp;nbsp; = $rmd160_obj
&lt;br&gt;\$rc5_obj &amp;nbsp; &amp;nbsp; &amp;nbsp;= $rc5_obj
&lt;br&gt;\$wp_obj &amp;nbsp; &amp;nbsp; &amp;nbsp; = $wp_obj
&lt;br&gt;\$cmll_obj &amp;nbsp; &amp;nbsp; = $cmll_obj
&lt;br&gt;\$perlasm_scheme = $perlasm_scheme
&lt;br&gt;\$dso_scheme &amp;nbsp; = $dso_scheme
&lt;br&gt;\$shared_target= $shared_target
&lt;br&gt;\$shared_cflag = $shared_cflag
&lt;br&gt;\$shared_ldflag = $shared_ldflag
&lt;br&gt;\$shared_extension = $shared_extension
&lt;br&gt;\$ranlib &amp;nbsp; &amp;nbsp; &amp;nbsp; = $ranlib
&lt;br&gt;\$arflags &amp;nbsp; &amp;nbsp; &amp;nbsp;= $arflags
&lt;br&gt;\$multilib &amp;nbsp; &amp;nbsp; = $multilib
&lt;br&gt;EOF
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&lt;br&gt;sub test_sanity
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my $errorcnt = 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;=&amp;quot; x 70, &amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;=== SANITY TESTING!\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;=== No configuration will be done, all other arguments will be ignored!\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;=&amp;quot; x 70, &amp;quot;\n&amp;quot;;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach $target (sort keys %table)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @fields = split(/\s*:\s*/,$table{$target} . &amp;quot;:&amp;quot; x 30 , -1);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ($fields[$idx_dso_scheme-1] =~ /^(beos|dl|dlfcn|win32|vms)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $errorcnt++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] values\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in the previous field\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($fields[$idx_dso_scheme+1] =~ /^(beos|dl|dlfcn|win32|vms)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $errorcnt++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] values\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in the following field\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; elsif ($fields[$idx_dso_scheme] !~ /^(beos|dl|dlfcn|win32|vms|)$/)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $errorcnt++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] field = &amp;quot;,$fields[$idx_dso_scheme],&amp;quot;\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;valid values are 'beos', 'dl', 'dlfcn', 'win32' and 'vms'\n&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print STDERR &amp;quot;No sanity errors detected!\n&amp;quot; if $errorcnt == 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $errorcnt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;-- 
&lt;br&gt;Member - Liberal International	This is &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=14&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;doctor@...&lt;/a&gt; Ici &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=15&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;doctor@...&lt;/a&gt;
&lt;br&gt;God, Queen and country! Never Satan President Republic! Beware AntiChrist rising! 
&lt;br&gt;&lt;a href=&quot;http://twitter.com/rootnl2k&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://twitter.com/rootnl2k&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://www.myspace.com/502748630&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.myspace.com/502748630&lt;/a&gt;&amp;nbsp;
&lt;br&gt;Merry Christmas 2009 and Happy New Year 2010
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=16&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26710466&amp;i=17&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Error-in-20091209-snaps-tp26710466p26710466.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26706694</id>
	<title>[openssl.org #2125] [PATCH] Fixup compilation for gcc-aix target</title>
	<published>2009-12-09T00:23:22Z</published>
	<updated>2009-12-09T00:23:22Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&lt;br&gt;sltest.c:157:1: error: &amp;quot;_XOPEN_SOURCE&amp;quot; redefined
&lt;br&gt;In file included from /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.2.0/include/assert.h:64,
&lt;br&gt;from ssltest.c:146:
&lt;br&gt;/usr/include/standards.h:114:1: error: this is the location of the previous definition
&lt;br&gt;make: 1254-004 The error code from the last command is 1.
&lt;br&gt;&lt;br&gt;&lt;br&gt;Stop.
&lt;br&gt;make: 1254-004 The error code from the last command is 1.
&lt;br&gt;&lt;br&gt;diff -urNp openssl-1.0.0-beta4.org/ssl/ssltest.c openssl-1.0.0-beta4/ssl/ssltest.c
&lt;br&gt;--- openssl-1.0.0-beta4.org/ssl/ssltest.c	2009-01-08 01:44:27.000000000 +0200
&lt;br&gt;+++ openssl-1.0.0-beta4/ssl/ssltest.c	2009-11-21 09:24:46.001175088 +0200
&lt;br&gt;@@ -143,6 +143,9 @@
&lt;br&gt;&amp;nbsp;#define _BSD_SOURCE 1		/* Or gethostname won't be declared properly
&lt;br&gt;&amp;nbsp;				 &amp;nbsp; on Linux and GNU platforms. */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+#define _XOPEN_SOURCE 500	/* Or isascii won't be declared properly on
&lt;br&gt;+				 &amp;nbsp; VMS (at least with DECompHP C). &amp;nbsp;*/
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#include &amp;lt;assert.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;errno.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;limits.h&amp;gt;
&lt;br&gt;@@ -154,8 +157,6 @@
&lt;br&gt;&amp;nbsp;#define USE_SOCKETS
&lt;br&gt;&amp;nbsp;#include &amp;quot;e_os.h&amp;quot;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-#define _XOPEN_SOURCE 500	/* Or isascii won't be declared properly on
&lt;br&gt;-				 &amp;nbsp; VMS (at least with DECompHP C). &amp;nbsp;*/
&lt;br&gt;&amp;nbsp;#include &amp;lt;ctype.h&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/bio.h&amp;gt;
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26706694&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26706694&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2125---PATCH--Fixup-compilation-for-gcc-aix-target-tp26706694p26706694.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26692996</id>
	<title>Re: [openssl.org #2124] memory mismanagement in OpenSSL (patch included against 0.9.8l)</title>
	<published>2009-12-08T04:12:55Z</published>
	<updated>2009-12-08T04:12:55Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">On Tue, 8 Dec 2009, Jan Pechanec wrote:
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sorry, forgot to include a link to the OpenSolaris bugster:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6441083&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6441083&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; with an explanation of a person who reported the problem.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; J.
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;	hi,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;	there are some places where functions allocating memory are not 
&lt;br&gt;&amp;gt;checked against NULL, or are checked too late (LHASH code). We run some 
&lt;br&gt;&amp;gt;tests with libumem(3lib) and &amp;quot;mtbf=5000&amp;quot; (mean time between failure) in 
&lt;br&gt;&amp;gt;UMEM_DEBUG, simulating occasional memory shortages and that was causing 
&lt;br&gt;&amp;gt;OpenSSL to crash.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;	the changes have been used here at Sun internally for 2 years 
&lt;br&gt;&amp;gt;against 0.9.8a. Attached is a patch generated against 0.9.8l. &amp;quot;make 
&lt;br&gt;&amp;gt;test&amp;quot; passes on the changed code after rebuilding it.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;	thanks, Jan.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;Jan Pechanec
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26692996&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26692996&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Re%3A--openssl.org--2124--memory-mismanagement-in-OpenSSL-%28patch-included-against-0.9.8l%29-tp26692996p26692996.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26692983</id>
	<title>[openssl.org #2124] memory mismanagement in OpenSSL (patch included against 0.9.8l)</title>
	<published>2009-12-08T04:11:45Z</published>
	<updated>2009-12-08T04:11:45Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hi,
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; there are some places where functions allocating memory are not 
&lt;br&gt;checked against NULL, or are checked too late (LHASH code). We run some 
&lt;br&gt;tests with libumem(3lib) and &amp;quot;mtbf=5000&amp;quot; (mean time between failure) in 
&lt;br&gt;UMEM_DEBUG, simulating occasional memory shortages and that was causing 
&lt;br&gt;OpenSSL to crash.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; the changes have been used here at Sun internally for 2 years 
&lt;br&gt;against 0.9.8a. Attached is a patch generated against 0.9.8l. &amp;quot;make 
&lt;br&gt;test&amp;quot; passes on the changed code after rebuilding it.
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; thanks, Jan.
&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;Jan Pechanec
&lt;br&gt;&lt;br&gt;&lt;br /&gt;diff -ur openssl-0.9.8l/crypto/evp/digest.c openssl-0.9.8l-patched//crypto/evp/digest.c
&lt;br&gt;--- openssl-0.9.8l/crypto/evp/digest.c	Tue Sep 16 00:21:40 2008
&lt;br&gt;+++ openssl-0.9.8l-patched//crypto/evp/digest.c	Tue Dec &amp;nbsp;8 12:06:21 2009
&lt;br&gt;@@ -127,7 +127,8 @@
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;	EVP_MD_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	EVP_MD_CTX_init(ctx);
&lt;br&gt;+	if (ctx)
&lt;br&gt;+		EVP_MD_CTX_init(ctx);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	return ctx;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;@@ -299,7 +300,14 @@
&lt;br&gt;&amp;nbsp;			OPENSSL_free(ctx-&amp;gt;md_data);
&lt;br&gt;&amp;nbsp;		ctx-&amp;gt;digest=type;
&lt;br&gt;&amp;nbsp;		if (type-&amp;gt;ctx_size)
&lt;br&gt;+			{
&lt;br&gt;&amp;nbsp;			ctx-&amp;gt;md_data=OPENSSL_malloc(type-&amp;gt;ctx_size);
&lt;br&gt;+			if (!ctx-&amp;gt;md_data)
&lt;br&gt;+				{
&lt;br&gt;+				EVPerr(EVP_F_EVP_DIGESTINIT_EX, ERR_R_MALLOC_FAILURE);
&lt;br&gt;+				return 0;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;&amp;nbsp;	skip_to_init:
&lt;br&gt;@@ -380,8 +388,17 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;	if (out-&amp;gt;digest-&amp;gt;ctx_size)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;-		if (tmp_buf) out-&amp;gt;md_data = tmp_buf;
&lt;br&gt;-		else out-&amp;gt;md_data=OPENSSL_malloc(out-&amp;gt;digest-&amp;gt;ctx_size);
&lt;br&gt;+		if (tmp_buf)
&lt;br&gt;+			out-&amp;gt;md_data = tmp_buf;
&lt;br&gt;+		else
&lt;br&gt;+			{
&lt;br&gt;+			out-&amp;gt;md_data=OPENSSL_malloc(out-&amp;gt;digest-&amp;gt;ctx_size);
&lt;br&gt;+			if (!out-&amp;gt;md_data)
&lt;br&gt;+				{
&lt;br&gt;+				EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_MALLOC_FAILURE);
&lt;br&gt;+				return 0;
&lt;br&gt;+				}
&lt;br&gt;+			}
&lt;br&gt;&amp;nbsp;		memcpy(out-&amp;gt;md_data,in-&amp;gt;md_data,out-&amp;gt;digest-&amp;gt;ctx_size);
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ur openssl-0.9.8l/crypto/lhash/lhash.c openssl-0.9.8l-patched//crypto/lhash/lhash.c
&lt;br&gt;--- openssl-0.9.8l/crypto/lhash/lhash.c	Sun Jan 21 14:16:32 2007
&lt;br&gt;+++ openssl-0.9.8l-patched//crypto/lhash/lhash.c	Tue Dec &amp;nbsp;8 12:06:21 2009
&lt;br&gt;@@ -305,16 +305,40 @@
&lt;br&gt;&amp;nbsp;static void expand(LHASH *lh)
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;	LHASH_NODE **n,**n1,**n2,*np;
&lt;br&gt;-	unsigned int p,i,j;
&lt;br&gt;+	unsigned int p,i,j,pmax;
&lt;br&gt;&amp;nbsp;	unsigned long hash,nni;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	p=(int)lh-&amp;gt;p++;
&lt;br&gt;+	nni=lh-&amp;gt;num_alloc_nodes;
&lt;br&gt;+	pmax=lh-&amp;gt;pmax;
&lt;br&gt;+
&lt;br&gt;+	if ((lh-&amp;gt;p) &amp;gt;= lh-&amp;gt;pmax)
&lt;br&gt;+		{
&lt;br&gt;+		j=(int)lh-&amp;gt;num_alloc_nodes*2;
&lt;br&gt;+		n=(LHASH_NODE **)OPENSSL_realloc(lh-&amp;gt;b,
&lt;br&gt;+			(int)sizeof(LHASH_NODE *)*j);
&lt;br&gt;+		if (n == NULL)
&lt;br&gt;+			{
&lt;br&gt;+/*			fputs(&amp;quot;realloc error in lhash&amp;quot;,stderr); */
&lt;br&gt;+			lh-&amp;gt;error++;
&lt;br&gt;+			lh-&amp;gt;p=0;
&lt;br&gt;+			return;
&lt;br&gt;+			}
&lt;br&gt;+		/* else */
&lt;br&gt;+		for (i=(int)lh-&amp;gt;num_alloc_nodes; i&amp;lt;j; i++)/* 26/02/92 eay */
&lt;br&gt;+			n[i]=NULL;			 &amp;nbsp;/* 02/03/92 eay */
&lt;br&gt;+		lh-&amp;gt;pmax=lh-&amp;gt;num_alloc_nodes;
&lt;br&gt;+		lh-&amp;gt;num_alloc_nodes=j;
&lt;br&gt;+		lh-&amp;gt;num_expand_reallocs++;
&lt;br&gt;+		lh-&amp;gt;p=0;
&lt;br&gt;+		lh-&amp;gt;b=n;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	lh-&amp;gt;num_nodes++;
&lt;br&gt;&amp;nbsp;	lh-&amp;gt;num_expands++;
&lt;br&gt;-	p=(int)lh-&amp;gt;p++;
&lt;br&gt;&amp;nbsp;	n1= &amp;(lh-&amp;gt;b[p]);
&lt;br&gt;-	n2= &amp;(lh-&amp;gt;b[p+(int)lh-&amp;gt;pmax]);
&lt;br&gt;+	n2= &amp;(lh-&amp;gt;b[p+pmax]);
&lt;br&gt;&amp;nbsp;	*n2=NULL; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* 27/07/92 - eay - undefined pointer bug */
&lt;br&gt;-	nni=lh-&amp;gt;num_alloc_nodes;
&lt;br&gt;&amp;nbsp;	
&lt;br&gt;&amp;nbsp;	for (np= *n1; np != NULL; )
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;@@ -335,35 +359,14 @@
&lt;br&gt;&amp;nbsp;		np= *n1;
&lt;br&gt;&amp;nbsp;		}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	if ((lh-&amp;gt;p) &amp;gt;= lh-&amp;gt;pmax)
&lt;br&gt;-		{
&lt;br&gt;-		j=(int)lh-&amp;gt;num_alloc_nodes*2;
&lt;br&gt;-		n=(LHASH_NODE **)OPENSSL_realloc(lh-&amp;gt;b,
&lt;br&gt;-			(int)(sizeof(LHASH_NODE *)*j));
&lt;br&gt;-		if (n == NULL)
&lt;br&gt;-			{
&lt;br&gt;-/*			fputs(&amp;quot;realloc error in lhash&amp;quot;,stderr); */
&lt;br&gt;-			lh-&amp;gt;error++;
&lt;br&gt;-			lh-&amp;gt;p=0;
&lt;br&gt;-			return;
&lt;br&gt;-			}
&lt;br&gt;-		/* else */
&lt;br&gt;-		for (i=(int)lh-&amp;gt;num_alloc_nodes; i&amp;lt;j; i++)/* 26/02/92 eay */
&lt;br&gt;-			n[i]=NULL;			 &amp;nbsp;/* 02/03/92 eay */
&lt;br&gt;-		lh-&amp;gt;pmax=lh-&amp;gt;num_alloc_nodes;
&lt;br&gt;-		lh-&amp;gt;num_alloc_nodes=j;
&lt;br&gt;-		lh-&amp;gt;num_expand_reallocs++;
&lt;br&gt;-		lh-&amp;gt;p=0;
&lt;br&gt;-		lh-&amp;gt;b=n;
&lt;br&gt;-		}
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;static void contract(LHASH *lh)
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;&amp;nbsp;	LHASH_NODE **n,*n1,*np;
&lt;br&gt;+	int idx = lh-&amp;gt;p+lh-&amp;gt;pmax-1;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	np=lh-&amp;gt;b[lh-&amp;gt;p+lh-&amp;gt;pmax-1];
&lt;br&gt;-	lh-&amp;gt;b[lh-&amp;gt;p+lh-&amp;gt;pmax-1]=NULL; /* 24/07-92 - eay - weird but :-( */
&lt;br&gt;+	np=lh-&amp;gt;b[idx];
&lt;br&gt;&amp;nbsp;	if (lh-&amp;gt;p == 0)
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;&amp;nbsp;		n=(LHASH_NODE **)OPENSSL_realloc(lh-&amp;gt;b,
&lt;br&gt;@@ -383,6 +386,7 @@
&lt;br&gt;&amp;nbsp;	else
&lt;br&gt;&amp;nbsp;		lh-&amp;gt;p--;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+	lh-&amp;gt;b[idx] = NULL;
&lt;br&gt;&amp;nbsp;	lh-&amp;gt;num_nodes--;
&lt;br&gt;&amp;nbsp;	lh-&amp;gt;num_contracts++;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;diff -ur openssl-0.9.8l/crypto/rsa/rsa_eng.c openssl-0.9.8l-patched//crypto/rsa/rsa_eng.c
&lt;br&gt;--- openssl-0.9.8l/crypto/rsa/rsa_eng.c	Tue Sep 16 16:55:26 2008
&lt;br&gt;+++ openssl-0.9.8l-patched//crypto/rsa/rsa_eng.c	Tue Dec &amp;nbsp;8 12:31:24 2009
&lt;br&gt;@@ -208,7 +208,16 @@
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;mt_blinding=NULL;
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;bignum_data=NULL;
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;flags=ret-&amp;gt;meth-&amp;gt;flags;
&lt;br&gt;-	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &amp;ret-&amp;gt;ex_data);
&lt;br&gt;+	if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_RSA, ret, &amp;ret-&amp;gt;ex_data))
&lt;br&gt;+		{
&lt;br&gt;+#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;+	if (ret-&amp;gt;engine)
&lt;br&gt;+		ENGINE_finish(ret-&amp;gt;engine);
&lt;br&gt;+#endif
&lt;br&gt;+		OPENSSL_free(ret);
&lt;br&gt;+		return(NULL);
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	if ((ret-&amp;gt;meth-&amp;gt;init != NULL) &amp;&amp; !ret-&amp;gt;meth-&amp;gt;init(ret))
&lt;br&gt;&amp;nbsp;		{
&lt;br&gt;&amp;nbsp;#ifndef OPENSSL_NO_ENGINE
&lt;br&gt;diff -ur openssl-0.9.8l/crypto/x509/x509_lu.c openssl-0.9.8l-patched//crypto/x509/x509_lu.c
&lt;br&gt;--- openssl-0.9.8l/crypto/x509/x509_lu.c	Wed May 11 05:45:35 2005
&lt;br&gt;+++ openssl-0.9.8l-patched//crypto/x509/x509_lu.c	Tue Dec &amp;nbsp;8 12:06:21 2009
&lt;br&gt;@@ -198,7 +198,13 @@
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;cert_crl = 0;
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;cleanup = 0;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &amp;ret-&amp;gt;ex_data);
&lt;br&gt;+	if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &amp;ret-&amp;gt;ex_data))
&lt;br&gt;+		{
&lt;br&gt;+		sk_X509_OBJECT_free(ret-&amp;gt;objs);
&lt;br&gt;+		OPENSSL_free(ret);
&lt;br&gt;+		return NULL;
&lt;br&gt;+		}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;	ret-&amp;gt;references=1;
&lt;br&gt;&amp;nbsp;	return ret;
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2124--memory-mismanagement-in-OpenSSL-%28patch-included-against-0.9.8l%29-tp26692983p26692983.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26679048</id>
	<title>Re: [openssl.org #2121] [PATCH] DTLS extensions</title>
	<published>2009-12-07T07:40:22Z</published>
	<updated>2009-12-07T07:40:22Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&lt;br&gt;On Dec 7, 2009, at 4:06 PM, Stephen Henson via RT wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;&amp;gt; [&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679048&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;seggelmann@...&lt;/a&gt; - Thu Dec 03 20:54:44 2009]:
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; This patch enables the servername, renegotiation and session ticket
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; extensions for DTLS. The TLS code is reused and my former separate
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; implementation of the renegotiation extension removed. The other
&lt;br&gt;&amp;gt;&amp;gt; &amp;nbsp; not yet implemented extensions are disabled.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks. I note that the functions dtls1_send_newsession_ticket and
&lt;br&gt;&amp;gt; tl1s_send_newsession_ticket() are very similar. Could we further reduce
&lt;br&gt;&amp;gt; code duplication by having one version which checks the version and does
&lt;br&gt;&amp;gt; the right thing?
&lt;/div&gt;&lt;br&gt;I decided to duplicate it because the header is different for DTLS, and therefore several lenghts and buffer positions differ all across the function. That'd require many checks, and that's probably the reason why all message assembling functions are duplicated for DTLS while the receiving ones are the same.
&lt;br&gt;&lt;br&gt;I just noticed that in the submitted patch the declaration of dtls1_send_newsession_ticket() is missing. That'd be:
&lt;br&gt;&lt;br&gt;--- ssl/ssl_locl.h	2009-11-09 19:58:50.000000000 +0100
&lt;br&gt;+++ ssl/ssl_locl.h	2009-12-07 11:21:16.000000000 +0100
&lt;br&gt;@@ -949,6 +949,7 @@
&lt;br&gt;&amp;nbsp;void dtls1_stop_timer(SSL *s);
&lt;br&gt;&amp;nbsp;int dtls1_is_timer_expired(SSL *s);
&lt;br&gt;&amp;nbsp;void dtls1_double_timeout(SSL *s);
&lt;br&gt;+int dtls1_send_newsession_ticket(SSL *s);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/* some client-only functions */
&lt;br&gt;&lt;br&gt;&lt;br&gt;Regards,
&lt;br&gt;Robin
&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679048&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679048&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2121---PATCH--DTLS-extensions-tp26678504p26679048.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26678504</id>
	<title>[openssl.org #2121] [PATCH] DTLS extensions</title>
	<published>2009-12-07T07:06:01Z</published>
	<updated>2009-12-07T07:06:01Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&amp;gt; [&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26678504&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;seggelmann@...&lt;/a&gt; - Thu Dec 03 20:54:44 2009]:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; This patch enables the servername, renegotiation and session ticket
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;extensions for DTLS. The TLS code is reused and my former separate
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;implementation of the renegotiation extension removed. The other
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;not yet implemented extensions are disabled.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Thanks. I note that the functions dtls1_send_newsession_ticket and
&lt;br&gt;tl1s_send_newsession_ticket() are very similar. Could we further reduce
&lt;br&gt;code duplication by having one version which checks the version and does
&lt;br&gt;the right thing?
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;-- 
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26678504&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26678504&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2121---PATCH--DTLS-extensions-tp26678504p26678504.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26679939</id>
	<title>[openssl.org #2122] bug report</title>
	<published>2009-12-07T06:36:44Z</published>
	<updated>2009-12-07T06:36:44Z</updated>
	<author>
		<name>Alon Bar-Lev via RT</name>
	</author>
	<content type="html">&amp;gt; [&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679939&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gpk32@...&lt;/a&gt; - Thu Dec 03 20:55:37 2009]:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Hi, 
&lt;br&gt;&amp;gt; am I missing something or following source code shows an OpenSSL
&lt;br&gt;&amp;gt; bug 
&lt;br&gt;&amp;gt; (duplication is not well performed) ? 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;Your problem is accessing the structures directly. This should be
&lt;br&gt;avoided where possible as it can produce misleading results, the &amp;quot;sn&amp;quot;
&lt;br&gt;field is only currently set if the OID is directly initialised from the
&lt;br&gt;registered table, duplicated OIDs wont have it set.
&lt;br&gt;&lt;br&gt;If instead of accessing &amp;quot;sn&amp;quot; you use OBJ_nid2sn(OBJ_nid2obj(oid)) you
&lt;br&gt;get the correct result.
&lt;br&gt;&lt;br&gt;Note that you can also avoid accessing the X509_ALGOR directly by using
&lt;br&gt;X509_ALGOR_get0().
&lt;br&gt;&lt;br&gt;Steve.
&lt;br&gt;-- 
&lt;br&gt;Dr Stephen N. Henson. OpenSSL project core developer.
&lt;br&gt;Commercial tech support now available see: &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679939&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26679939&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-openssl.org--2122--bug-report-tp26679939p26679939.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26662858</id>
	<title>Re: EVP_SignFinal   dramatically slow</title>
	<published>2009-12-05T23:37:26Z</published>
	<updated>2009-12-05T23:37:26Z</updated>
	<author>
		<name>armstrong</name>
	</author>
	<content type="html">Thank your help, Kirk. &amp;nbsp;
&lt;br&gt;i have solved this problem now. the big difference of time is consumed by dll loading. &amp;nbsp;So the benchmark is correct. &amp;nbsp;thank you
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; armstrong
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2009-12-06
&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;Kirk81 wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;armstrong wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message&quot;&gt;Hi
&lt;br&gt;&amp;nbsp; &amp;nbsp; Is someone here can help me? &amp;nbsp;I am using &amp;quot;EVP Public Key Interface&amp;quot; to sign and verify some digital signatures. And i find the call to &amp;quot;EVP_SignFinal&amp;quot; is very slow.
&lt;br&gt;&lt;br&gt;In the test, RSA1024-SHA1 was used, &amp;nbsp; the call to &amp;quot;EVP_SignFinal&amp;quot; consuming almost 0.19~0.2 second. 
&lt;br&gt;&lt;br&gt;In contrast to the openssl benchmark(i.e openssl &amp;nbsp; speed &amp;nbsp; rsa1024), &amp;nbsp;the benchmark reports &amp;nbsp;'rsa 1024 bit' sign operation only take 0.002s(approximate) on my computer. &amp;nbsp; This result is close to my call to RSA_sign directly.
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
Hi,
&lt;br&gt;&lt;br&gt;I've created a RSA application for MVS: RSA-1024 with SHA56 using the native functions (RSA_sign, SHA256, ...). Here u can find the code:
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/file/p26096986/rsa.cpp&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;rsa.cpp&lt;/a&gt;&lt;br&gt;&lt;br&gt;With an IA-32 Pentium M 1.5 GHz, I'm in the order of milliseconds:
&lt;br&gt;- signature: 3.6 ms
&lt;br&gt;- verify: 0.19 ms 
&lt;br&gt;&lt;br&gt;Now you can try the EVP interface.
&lt;br&gt;&lt;br&gt;Kirk
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/EVP_SignFinal---dramatically-slow-tp25730650p26662858.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26652979</id>
	<title>Re: openssl-0.9.8a - Why does the UNIX process display [error:00000000:lib(0):func(0):reason(0)]?</title>
	<published>2009-12-04T19:36:08Z</published>
	<updated>2009-12-04T19:36:08Z</updated>
	<author>
		<name>Salvatore DeGrezia</name>
	</author>
	<content type="html">Thank you Dave for your response.
&lt;br&gt;Let me try using SSL_get_error() as you described to see what information it 
&lt;br&gt;gives me.
&lt;br&gt;-sal
&lt;br&gt;&lt;br&gt;--------------------------------------------------
&lt;br&gt;From: &amp;quot;Dave Thompson&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;dave.thompson@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Sent: Friday, December 04, 2009 7:58 PM
&lt;br&gt;To: &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Subject: RE: openssl-0.9.8a - Why does the UNIX process display 
&lt;br&gt;[error:00000000:lib(0):func(0):reason(0)]?
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt;&amp;gt; From: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-openssl-dev@...&lt;/a&gt; On Behalf Of Salvatore DeGrezia
&lt;br&gt;&amp;gt;&amp;gt; Sent: Thursday, 03 December, 2009 15:05
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; I have written a simple Winform application (based on .NET Framework
&lt;br&gt;&amp;gt; 2.0) that
&lt;br&gt;&amp;gt;&amp;gt; tries to establish an SSL connection with a server-side UNIX (SunOS
&lt;br&gt;&amp;gt; version 5.10) process
&lt;br&gt;&amp;gt;&amp;gt; that is using openssl-0.9.8a. When i run the application, the UNIX
&lt;br&gt;&amp;gt; process
&lt;br&gt;&amp;gt;&amp;gt; displays the following message
&lt;br&gt;&amp;gt; &amp;quot;[error:00000000:lib(0):func(0):reason(0)]&amp;quot;
&lt;br&gt;&amp;gt;&amp;gt; when it calls the SSL_accept() call.
&lt;br&gt;&amp;gt; &amp;lt;snip&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; int err = SSL_accept((SSL *)SockObj-&amp;gt;SSLCtx);
&lt;br&gt;&amp;gt; ...
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; SSL_accept() itself should not display anything (in a normal build).
&lt;br&gt;&amp;gt; There must be some code in your &amp;quot;...&amp;quot; (or later) that displays this.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; If it is trying to decode-and-display the returned value from 
&lt;br&gt;&amp;gt; SSL_accept(),
&lt;br&gt;&amp;gt; i.e. the value in err, that is wrong, and could produce this useless 
&lt;br&gt;&amp;gt; result.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; After a &amp;lt;=0 return from SSL_accept (and several other, see the man page)
&lt;br&gt;&amp;gt; your code should call SSL_get_error() to determine whether this was:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - a protocol error (SSL_ERROR_SSL) in which case you should display
&lt;br&gt;&amp;gt; the OpenSSL error queue (call ERR_get_error, preferably decode and
&lt;br&gt;&amp;gt; display the result, loop until zero; or just call ERR_print_errors*)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - an underlying communications error (SSL_ERROR_SYSCALL) in which case
&lt;br&gt;&amp;gt; the man page says there *may* be an error queue (but I've never seen it)
&lt;br&gt;&amp;gt; and if not you should display the (real operation) return value and
&lt;br&gt;&amp;gt; Unix errno (preferably explained with perror() or strerror() etc.)
&lt;br&gt;&amp;gt; (or Windows WSAGetLastError(), not quite as easy to explain)
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; - a nonblocking operation that needs to be rescheduled (SSL_WANT_READ 
&lt;br&gt;&amp;gt; etc.)
&lt;br&gt;&amp;gt; but if you are using nonblocking and your code doesn't already handle 
&lt;br&gt;&amp;gt; these
&lt;br&gt;&amp;gt; it won't ever work or ever have worked, and you would have noticed
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; PS- 0.9.8a is pretty old. That may or may not matter to your problem.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; ______________________________________________________________________
&lt;br&gt;&amp;gt; OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;&amp;gt; Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;&amp;gt; 
&lt;/div&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26652979&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/openssl-0.9.8a---Why-does-the-UNIX-process-display--error%3A00000000%3Alib%280%29%3Afunc%280%29%3Areason%280%29---tp26632348p26652979.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26651972</id>
	<title>RE: openssl-0.9.8a - Why does the UNIX process display [error:00000000:lib(0):func(0):reason(0)]?</title>
	<published>2009-12-04T16:58:51Z</published>
	<updated>2009-12-04T16:58:51Z</updated>
	<author>
		<name>Dave Thompson-4</name>
	</author>
	<content type="html">&amp;gt;	From: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26651972&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;owner-openssl-dev@...&lt;/a&gt; On Behalf Of Salvatore DeGrezia
&lt;br&gt;&amp;gt;	Sent: Thursday, 03 December, 2009 15:05
&lt;br&gt;&lt;br&gt;&amp;gt;	I have written a simple Winform application (based on .NET Framework
&lt;br&gt;2.0) that
&lt;br&gt;&amp;gt;	tries to establish an SSL connection with a server-side UNIX (SunOS
&lt;br&gt;version 5.10) process
&lt;br&gt;&amp;gt;	that is using openssl-0.9.8a. When i run the application, the UNIX
&lt;br&gt;process
&lt;br&gt;&amp;gt;	displays the following message
&lt;br&gt;&amp;quot;[error:00000000:lib(0):func(0):reason(0)]&amp;quot;
&lt;br&gt;&amp;gt;	when it calls the SSL_accept() call.
&lt;br&gt;&amp;lt;snip&amp;gt;
&lt;br&gt;&amp;gt;	int err = SSL_accept((SSL *)SockObj-&amp;gt;SSLCtx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...
&lt;br&gt;&lt;br&gt;SSL_accept() itself should not display anything (in a normal build).
&lt;br&gt;There must be some code in your &amp;quot;...&amp;quot; (or later) that displays this.
&lt;br&gt;&lt;br&gt;If it is trying to decode-and-display the returned value from SSL_accept(), 
&lt;br&gt;i.e. the value in err, that is wrong, and could produce this useless result.
&lt;br&gt;&lt;br&gt;After a &amp;lt;=0 return from SSL_accept (and several other, see the man page)
&lt;br&gt;your code should call SSL_get_error() to determine whether this was:
&lt;br&gt;&lt;br&gt;- a protocol error (SSL_ERROR_SSL) in which case you should display 
&lt;br&gt;the OpenSSL error queue (call ERR_get_error, preferably decode and 
&lt;br&gt;display the result, loop until zero; or just call ERR_print_errors*)
&lt;br&gt;&lt;br&gt;- an underlying communications error (SSL_ERROR_SYSCALL) in which case 
&lt;br&gt;the man page says there *may* be an error queue (but I've never seen it) 
&lt;br&gt;and if not you should display the (real operation) return value and 
&lt;br&gt;Unix errno (preferably explained with perror() or strerror() etc.)
&lt;br&gt;(or Windows WSAGetLastError(), not quite as easy to explain)
&lt;br&gt;&lt;br&gt;- a nonblocking operation that needs to be rescheduled (SSL_WANT_READ etc.) 
&lt;br&gt;but if you are using nonblocking and your code doesn't already handle these 
&lt;br&gt;it won't ever work or ever have worked, and you would have noticed
&lt;br&gt;&lt;br&gt;PS- 0.9.8a is pretty old. That may or may not matter to your problem.
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26651972&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26651972&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/openssl-0.9.8a---Why-does-the-UNIX-process-display--error%3A00000000%3Alib%280%29%3Afunc%280%29%3Areason%280%29---tp26632348p26651972.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-26641647</id>
	<title>proposed patch for WINCE to the latest openssl cvs</title>
	<published>2009-12-04T02:08:15Z</published>
	<updated>2009-12-04T02:08:15Z</updated>
	<author>
		<name>valerino</name>
	</author>
	<content type="html">hi,
&lt;br&gt;i've made this patch to compile the latest openssl cvs on WINCE. i've
&lt;br&gt;succesfully compiled the these dlls on Windows Mobile 6.x :
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1.222.144 libeay32.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 258.560 ssleay32.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12.288 4758cca.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;10.752 aep.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 8.704 atalla.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;13.824 cswift.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4.096 gmp.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;15.360 chil.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 7.168 nuron.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;15.872 sureware.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;12.288 ubsec.dll
&lt;br&gt;04/12/2009 &amp;nbsp;10:49 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4.096 padlock.dll
&lt;br&gt;compiled using nmake -f /ms/cedll.mak using these patches (just a
&lt;br&gt;bunch of includes and fixing outdated stuff like winsock.lib instead
&lt;br&gt;of ws2.lib). I'm using the WceCompat library, of which i'm a
&lt;br&gt;contributor, so my patches are only related to compiling on WINCE
&lt;br&gt;using that libc extension.
&lt;br&gt;&lt;br&gt;regards,
&lt;br&gt;valerio
&lt;br&gt;&lt;br&gt;&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /v/openssl/cvs/openssl/e_os.h,v
&lt;br&gt;retrieving revision 1.100
&lt;br&gt;diff -u -r1.100 e_os.h
&lt;br&gt;--- e_os.h	26 Aug 2009 15:15:14 -0000	1.100
&lt;br&gt;+++ e_os.h	4 Dec 2009 04:58:56 -0000
&lt;br&gt;@@ -499,7 +499,8 @@
&lt;br&gt;&amp;nbsp;# &amp;nbsp; &amp;nbsp; &amp;nbsp;endif
&lt;br&gt;&amp;nbsp;# &amp;nbsp; &amp;nbsp; &amp;nbsp;if !defined(IPPROTO_IP)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* winsock[2].h was included already? */
&lt;br&gt;-# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;include &amp;lt;winsock.h&amp;gt;
&lt;br&gt;+# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;include &amp;lt;winsock2.h&amp;gt;
&lt;br&gt;+#				 include &amp;lt;ws2tcpip.h&amp;gt;
&lt;br&gt;&amp;nbsp;# &amp;nbsp; &amp;nbsp; &amp;nbsp;endif
&lt;br&gt;&amp;nbsp;# &amp;nbsp; &amp;nbsp; &amp;nbsp;ifdef getservbyname
&lt;br&gt;&amp;nbsp;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;undef getservbyname
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /v/openssl/cvs/openssl/crypto/bio/bss_fd.c,v
&lt;br&gt;retrieving revision 1.7
&lt;br&gt;diff -u -r1.7 bss_fd.c
&lt;br&gt;--- crypto/bio/bss_fd.c	12 Feb 2006 23:11:30 -0000	1.7
&lt;br&gt;+++ crypto/bio/bss_fd.c	4 Dec 2009 05:15:31 -0000
&lt;br&gt;@@ -64,8 +64,26 @@
&lt;br&gt;&amp;nbsp;#if defined(OPENSSL_NO_POSIX_IO)
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * One can argue that one should implement dummy placeholder for
&lt;br&gt;- * BIO_s_fd here...
&lt;br&gt;+ * BIO_s_fd here... NEEDED for WINCE
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;+	BIO *BIO_new_fd(int fd,int close_flag)
&lt;br&gt;+	{
&lt;br&gt;+		return NULL;
&lt;br&gt;+	}
&lt;br&gt;+	int BIO_fd_non_fatal_error(int err)	
&lt;br&gt;+	{
&lt;br&gt;+		return 0;
&lt;br&gt;+	}
&lt;br&gt;+	int BIO_fd_should_retry(int i)	
&lt;br&gt;+	{
&lt;br&gt;+		return 0;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	BIO_METHOD *BIO_s_fd(void)
&lt;br&gt;+	{
&lt;br&gt;+		return NULL;
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;&amp;nbsp;#else
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * As for unconditional usage of &amp;quot;UPLINK&amp;quot; interface in this module.
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /v/openssl/cvs/openssl/crypto/cms/cms.h,v
&lt;br&gt;retrieving revision 1.29
&lt;br&gt;diff -u -r1.29 cms.h
&lt;br&gt;--- crypto/cms/cms.h	26 Nov 2009 18:57:39 -0000	1.29
&lt;br&gt;+++ crypto/cms/cms.h	4 Dec 2009 05:10:10 -0000
&lt;br&gt;@@ -55,6 +55,7 @@
&lt;br&gt;&amp;nbsp;#ifndef HEADER_CMS_H
&lt;br&gt;&amp;nbsp;#define HEADER_CMS_H
&lt;br&gt;&lt;br&gt;+#include &amp;lt;e_os.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;openssl/x509.h&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp;#ifdef OPENSSL_NO_CMS
&lt;br&gt;===================================================================
&lt;br&gt;RCS file: /v/openssl/cvs/openssl/util/pl/VC-32.pl,v
&lt;br&gt;retrieving revision 1.63
&lt;br&gt;diff -u -r1.63 VC-32.pl
&lt;br&gt;--- util/pl/VC-32.pl	19 Nov 2009 22:29:03 -0000	1.63
&lt;br&gt;+++ util/pl/VC-32.pl	4 Dec 2009 07:20:22 -0000
&lt;br&gt;@@ -99,7 +99,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;$cc='$(CC)';
&lt;br&gt;- &amp;nbsp; &amp;nbsp;$base_cflags=' /W3 /WX /GF /Gy /nologo -DUNICODE -D_UNICODE
&lt;br&gt;-DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32
&lt;br&gt;-DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT';
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;$base_cflags=' /W3 /GF /Gy /nologo -DUNICODE -D_UNICODE
&lt;br&gt;-DOPENSSL_SYSNAME_WINCE -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32
&lt;br&gt;-DNO_CHMOD -DOPENSSL_SMALL_FOOTPRINT';
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;$base_cflags.=&amp;quot; $wcecdefs&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;$base_cflags.=' -I$(WCECOMPAT)/include'		if (defined($ENV{'WCECOMPAT'}));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;$base_cflags.=' -I$(PORTSDK_LIBPATH)/../../include'	if
&lt;br&gt;(defined($ENV{'PORTSDK_LIBPATH'}));
&lt;br&gt;@@ -143,12 +143,12 @@
&lt;br&gt;&amp;nbsp;$efile=&amp;quot;/out:&amp;quot;;
&lt;br&gt;&amp;nbsp;$exep='.exe';
&lt;br&gt;&amp;nbsp;if ($no_sock)		{ $ex_libs=''; }
&lt;br&gt;-elsif ($FLAVOR =~ /CE/)	{ $ex_libs='winsock.lib'; }
&lt;br&gt;+elsif ($FLAVOR =~ /CE/)	{ $ex_libs='ws2.lib'; }
&lt;br&gt;&amp;nbsp;else			{ $ex_libs='ws2_32.lib'; }
&lt;br&gt;&lt;br&gt;&amp;nbsp;if ($FLAVOR =~ /CE/)
&lt;br&gt;&amp;nbsp;	{
&lt;br&gt;-	$ex_libs.=' $(WCECOMPAT)/lib/wcecompatex.lib'	if (defined($ENV{'WCECOMPAT'}));
&lt;br&gt;+	$ex_libs.=' /NODEFAULTLIB:oldnames.lib coredll.lib corelibc.lib
&lt;br&gt;$(WCECOMPAT)/lib/wcecompat.lib'	if (defined($ENV{'WCECOMPAT'}));
&lt;br&gt;&amp;nbsp;	$ex_libs.=' $(PORTSDK_LIBPATH)/portlib.lib'	if
&lt;br&gt;(defined($ENV{'PORTSDK_LIBPATH'}));
&lt;br&gt;&amp;nbsp;	$ex_libs.=' /nodefaultlib:oldnames.lib coredll.lib corelibc.lib' if
&lt;br&gt;($ENV{'TARGETCPU'} eq &amp;quot;X86&amp;quot;);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;______________________________________________________________________
&lt;br&gt;OpenSSL Project &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.openssl.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.openssl.org&lt;/a&gt;&lt;br&gt;Development Mailing List &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26641647&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;openssl-dev@...&lt;/a&gt;
&lt;br&gt;Automated List Manager &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=26641647&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;majordomo@...&lt;/a&gt;
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/proposed-patch-for-WINCE-to-the-latest-openssl-cvs-tp26641647p26641647.html" />
</entry>

</feed>
