<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">Apply by doing:  
	cd /usr/src
	patch -p0 &lt; 021_ssl.patch

And then rebuild and install OpenSSL:
	rm -fr /usr/obj/lib/libssl
	cd lib/libssl
	make -f Makefile.bsd-wrapper obj
	make -f Makefile.bsd-wrapper prereq
	make -f Makefile.bsd-wrapper includes
	make -f Makefile.bsd-wrapper depend
	make -f Makefile.bsd-wrapper
	make -f Makefile.bsd-wrapper install

Index: lib/libssl/src/crypto/mem.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/mem.c,v
retrieving revision 1.4
retrieving revision 1.4.6.1
diff -u -r1.4 -r1.4.6.1
--- lib/libssl/src/crypto/mem.c	15 Dec 2000 02:57:02 -0000	1.4
+++ lib/libssl/src/crypto/mem.c	23 Feb 2003 16:16:02 -0000	1.4.6.1
@@ -174,6 +174,8 @@
 	{
 	void *ret = NULL;
 
+	if (num &lt; 0) return NULL;
+
 	allow_customize = 0;
 	if (malloc_debug_func != NULL)
 		{
@@ -206,6 +208,8 @@
 	{
 	void *ret = NULL;
 
+	if (num &lt; 0) return NULL;
+
 	allow_customize = 0;
 	if (malloc_debug_func != NULL)
 		{
@@ -225,6 +229,8 @@
 void *CRYPTO_realloc(void *str, int num, const char *file, int line)
 	{
 	void *ret = NULL;
+
+	if (num &lt; 0) return NULL;
 
 	if (realloc_debug_func != NULL)
 		realloc_debug_func(str, NULL, num, file, line, 0);
Index: lib/libssl/src/ssl/s3_pkt.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/ssl/s3_pkt.c,v
retrieving revision 1.5
retrieving revision 1.5.4.1
diff -u -r1.5 -r1.5.4.1
--- lib/libssl/src/ssl/s3_pkt.c	22 Jun 2001 00:03:40 -0000	1.5
+++ lib/libssl/src/ssl/s3_pkt.c	22 Feb 2003 17:46:48 -0000	1.5.4.1
@@ -231,7 +231,7 @@
 static int ssl3_get_record(SSL *s)
 	{
 	int ssl_major,ssl_minor,al;
-	int n,i,ret= -1;
+	int enc_err,n,i,ret= -1;
 	SSL3_RECORD *rr;
 	SSL_SESSION *sess;
 	unsigned char *p;
@@ -239,6 +239,8 @@
 	short version;
 	unsigned int mac_size;
 	int clear=0,extra;
+	int decryption_failed_or_bad_record_mac = 0;
+	unsigned char *mac = NULL;
 
 	rr= &amp;(s-&gt;s3-&gt;rrec);
 	sess=s-&gt;session;
@@ -342,16 +344,26 @@
 	/* decrypt in place in 'rr-&gt;input' */
 	rr-&gt;data=rr-&gt;input;
 
-	if (!s-&gt;method-&gt;ssl3_enc-&gt;enc(s,0))
+	enc_err = s-&gt;method-&gt;ssl3_enc-&gt;enc(s,0);
+	if (enc_err &lt;= 0)
 		{
-		al=SSL_AD_DECRYPT_ERROR;
-		goto f_err;
+		if (enc_err == 0)
+			/* SSLerr() and ssl3_send_alert() have been called */
+			goto err;
+
+		/* Otherwise enc_err == -1, which indicates bad padding
+		 * (rec-&gt;length has not been changed in this case).
+		 * To minimize information leaked via timing, we will perform
+		 * the MAC computation anyway. */
+		decryption_failed_or_bad_record_mac = 1;
 		}
+
 #ifdef TLS_DEBUG
 printf("dec %d\n",rr-&gt;length);
 { unsigned int z; for (z=0; z&lt;rr-&gt;length; z++) printf("%02X%c",rr-&gt;data[z],((z+1)%16)?' ':'\n'); }
 printf("\n");
 #endif
+
 	/* r-&gt;length is now the compressed data plus mac */
 	if (	(sess == NULL) ||
 		(s-&gt;enc_read_ctx == NULL) ||
@@ -364,26 +376,49 @@
 
 		if (rr-&gt;length &gt; SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
 			{
+#if 0 /* OK only for stream ciphers (then rr-&gt;length is visible from ciphertext anyway) */
 			al=SSL_AD_RECORD_OVERFLOW;
 			SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
 			goto f_err;
+#else
+			decryption_failed_or_bad_record_mac = 1;
+#endif
 			}
 		/* check the MAC for rr-&gt;input (it's in mac_size bytes at the tail) */
-		if (rr-&gt;length &lt; mac_size)
+		if (rr-&gt;length &gt;= mac_size)
 			{
+			rr-&gt;length -= mac_size;
+			mac = &amp;rr-&gt;data[rr-&gt;length];
+			}
+		else
+			{
+			/* record (minus padding) is too short to contain a MAC */
+#if 0 /* OK only for stream ciphers */
 			al=SSL_AD_DECODE_ERROR;
 			SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
 			goto f_err;
+#else
+			decryption_failed_or_bad_record_mac = 1;
+			rr-&gt;length = 0;
+#endif
 			}
-		rr-&gt;length-=mac_size;
 		i=s-&gt;method-&gt;ssl3_enc-&gt;mac(s,md,0);
-		if (memcmp(md,&amp;(rr-&gt;data[rr-&gt;length]),mac_size) != 0)
+		if (mac == NULL || memcmp(md, mac, mac_size) != 0)
 			{
-			al=SSL_AD_BAD_RECORD_MAC;
-			SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_MAC_DECODE);
-			ret= -1;
-			goto f_err;
+			decryption_failed_or_bad_record_mac = 1;
 			}
+		}
+
+	if (decryption_failed_or_bad_record_mac)
+		{
+		/* A separate 'decryption_failed' alert was introduced with TLS 1.0,
+		 * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
+		 * failure is directly visible from the ciphertext anyway,
+		 * we should not reveal which kind of error occured -- this
+		 * might become visible to an attacker (e.g. via a logfile) */
+		al=SSL_AD_BAD_RECORD_MAC;
+		SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
+		goto f_err;
 		}
 
 	/* r-&gt;length is now just compressed */
Index: lib/libssl/src/ssl/ssl.h
===================================================================
RCS file: /cvs/src/lib/libssl/src/ssl/ssl.h,v
retrieving revision 1.6
retrieving revision 1.6.4.2
diff -u -r1.6 -r1.6.4.2
--- lib/libssl/src/ssl/ssl.h	22 Jun 2001 00:03:40 -0000	1.6
+++ lib/libssl/src/ssl/ssl.h	22 Feb 2003 17:46:48 -0000	1.6.4.2
@@ -1403,6 +1403,7 @@
 #define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED		 145
 #define SSL_R_DATA_LENGTH_TOO_LONG			 146
 #define SSL_R_DECRYPTION_FAILED				 147
+#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC	 1109
 #define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG		 148
 #define SSL_R_DIGEST_CHECK_FAILED			 149
 #define SSL_R_ENCRYPTED_LENGTH_TOO_LONG			 150
Index: lib/libssl/src/ssl/ssl_err.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/ssl/ssl_err.c,v
retrieving revision 1.6
retrieving revision 1.6.4.2
diff -u -r1.6 -r1.6.4.2
--- lib/libssl/src/ssl/ssl_err.c	22 Jun 2001 00:03:41 -0000	1.6
+++ lib/libssl/src/ssl/ssl_err.c	22 Feb 2003 17:46:48 -0000	1.6.4.2
@@ -258,6 +258,7 @@
 {SSL_R_DATA_BETWEEN_CCS_AND_FINISHED     ,"data between ccs and finished"},
 {SSL_R_DATA_LENGTH_TOO_LONG              ,"data length too long"},
 {SSL_R_DECRYPTION_FAILED                 ,"decryption failed"},
+{SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC,"decryption failed or bad record mac"},
 {SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG   ,"dh public value length is wrong"},
 {SSL_R_DIGEST_CHECK_FAILED               ,"digest check failed"},
 {SSL_R_ENCRYPTED_LENGTH_TOO_LONG         ,"encrypted length too long"},
</pre></body></html>