OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /v/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 28-Sep-2006 14:47:56
Branch: OPENPKG_2_5_SOLID Handle: 2006092813475600
Modified files: (Branch: OPENPKG_2_5_SOLID)
openpkg-src/openssl openssl.patch openssl.spec
Log:
Security Fixes (CVE-2006-2937 CVE-2006-2940 CVE-2006-3738
CVE-2006-4343)
Summary:
Revision Changes Path
1.22.2.2 +409 -0 openpkg-src/openssl/openssl.patch
1.70.2.4 +1 -1 openpkg-src/openssl/openssl.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/openssl/openssl.patch
============================================================================
$ cvs diff -u -r1.22.2.1 -r1.22.2.2 openssl.patch
--- openpkg-src/openssl/openssl.patch 6 Sep 2006 07:20:48 -0000 1.22.2.1
+++ openpkg-src/openssl/openssl.patch 28 Sep 2006 12:47:56 -0000 1.22.2.2
@@ -96,3 +96,412 @@
sigtype=OBJ_obj2nid(sig->algor->algorithm);
+-----------------------------------------------------------------------------
+
+Security Fixes (OpenPKG-SA-2006.018-openssl)
+CVE-2006-2937 CVE-2006-2940 CVE-2006-3738 CVE-2006-4343
+http://www.openssl.org/news/secadv_20060928.txt
+
+Index: crypto/asn1/tasn_dec.c
+--- crypto/asn1/tasn_dec.c 31 Aug 2006 20:11:09 -0000 1.26.2.4
++++ crypto/asn1/tasn_dec.c 26 Sep 2006 11:49:24 -0000
+@@ -832,6 +832,7 @@ static int asn1_d2i_ex_primitive(ASN1_VA
+ }
+ else if (ret == -1)
+ return -1;
++ ret = 0;
+ /* SEQUENCE, SET and "OTHER" are left in encoded form */
+ if ((utype == V_ASN1_SEQUENCE)
+ || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER))
+Index: crypto/dh/dh.h
+--- crypto/dh/dh.h 9 Jan 2006 16:05:22 -0000 1.37.2.2
++++ crypto/dh/dh.h 26 Sep 2006 11:49:24 -0000
+@@ -73,6 +73,10 @@
+ #include <openssl/bn.h>
+ #endif
+
++#ifndef OPENSSL_DH_MAX_MODULUS_BITS
++# define OPENSSL_DH_MAX_MODULUS_BITS 10000
++#endif
++
+ #define DH_FLAG_CACHE_MONT_P 0x01
+ #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
+ * implementation now uses constant
time
+@@ -221,6 +225,7 @@ void ERR_load_DH_strings(void);
+ /* Reason codes. */
+ #define DH_R_BAD_GENERATOR 101
+ #define DH_R_NO_PRIVATE_VALUE 100
++#define DH_R_MODULUS_TOO_LARGE 103
+ #define DH_R_INVALID_PUBKEY 102
+
+ #ifdef __cplusplus
+Index: crypto/dh/dh_err.c
+--- crypto/dh/dh_err.c 9 Jan 2006 16:05:22 -0000 1.11.2.2
++++ crypto/dh/dh_err.c 26 Sep 2006 11:49:24 -0000
+@@ -84,6 +84,7 @@ static ERR_STRING_DATA DH_str_reasons[]=
+ {
+ {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"},
+ {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"},
++{ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"},
+ {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"},
+ {0,NULL}
+ };
+Index: crypto/dh/dh_key.c
+--- crypto/dh/dh_key.c 13 Mar 2006 23:12:06 -0000 1.24.2.3
++++ crypto/dh/dh_key.c 26 Sep 2006 11:49:24 -0000
+@@ -179,6 +179,12 @@ static int compute_key(unsigned char *ke
+ int ret= -1;
+ int check_result;
+
++ if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS)
++ {
++ DHerr(DH_F_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE);
++ goto err;
++ }
++
+ ctx = BN_CTX_new();
+ if (ctx == NULL) goto err;
+ BN_CTX_start(ctx);
+Index: crypto/dsa/dsa.h
+--- crypto/dsa/dsa.h 16 May 2005 01:43:30 -0000 1.39
++++ crypto/dsa/dsa.h 26 Sep 2006 11:49:24 -0000
+@@ -84,6 +84,10 @@
+ #endif
+ #endif
+
++#ifndef OPENSSL_DSA_MAX_MODULUS_BITS
++# define OPENSSL_DSA_MAX_MODULUS_BITS 10000
++#endif
++
+ #define DSA_FLAG_CACHE_MONT_P 0x01
+ #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the
built-in DSA
+ * implementation now uses
constant time
+@@ -270,8 +274,10 @@ void ERR_load_DSA_strings(void);
+ #define DSA_F_SIG_CB 114
+
+ /* Reason codes. */
++#define DSA_R_BAD_Q_VALUE 102
+ #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100
+ #define DSA_R_MISSING_PARAMETERS 101
++#define DSA_R_MODULUS_TOO_LARGE 103
+
+ #ifdef __cplusplus
+ }
+Index: crypto/dsa/dsa_err.c
+--- crypto/dsa/dsa_err.c 12 Apr 2005 16:15:12 -0000 1.13
++++ crypto/dsa/dsa_err.c 26 Sep 2006 11:49:24 -0000
+@@ -89,8 +89,10 @@ static ERR_STRING_DATA DSA_str_functs[]=
+
+ static ERR_STRING_DATA DSA_str_reasons[]=
+ {
++{ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"},
+ {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key
size"},
+ {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"},
++{ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
+ {0,NULL}
+ };
+
+Index: crypto/dsa/dsa_ossl.c
+--- crypto/dsa/dsa_ossl.c 26 May 2005 04:40:57 -0000 1.24.2.1
++++ crypto/dsa/dsa_ossl.c 26 Sep 2006 11:49:24 -0000
+@@ -304,6 +304,18 @@ static int dsa_do_verify(const unsigned
+ return -1;
+ }
+
++ if (BN_num_bits(dsa->q) != 160)
++ {
++ DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_BAD_Q_VALUE);
++ return -1;
++ }
++
++ if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS)
++ {
++ DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_MODULUS_TOO_LARGE);
++ return -1;
++ }
++
+ BN_init(&u1);
+ BN_init(&u2);
+ BN_init(&t1);
+Index: crypto/ec/ec.h
+--- crypto/ec/ec.h 8 Jan 2006 21:52:43 -0000 1.77.2.2
++++ crypto/ec/ec.h 26 Sep 2006 11:49:24 -0000
+@@ -93,6 +93,10 @@ extern "C" {
+ #endif
+
+
++#ifndef OPENSSL_ECC_MAX_FIELD_BITS
++# define OPENSSL_ECC_MAX_FIELD_BITS 661
++#endif
++
+ typedef enum {
+ /* values as defined in X9.62 (ECDSA) and elsewhere */
+ POINT_CONVERSION_COMPRESSED = 2,
+@@ -482,6 +486,7 @@ void ERR_load_EC_strings(void);
+ #define EC_R_D2I_ECPKPARAMETERS_FAILURE 117
+ #define EC_R_DISCRIMINANT_IS_ZERO 118
+ #define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119
++#define EC_R_FIELD_TOO_LARGE 138
+ #define EC_R_GROUP2PKPARAMETERS_FAILURE 120
+ #define EC_R_I2D_ECPKPARAMETERS_FAILURE 121
+ #define EC_R_INCOMPATIBLE_OBJECTS 101
+@@ -492,7 +497,9 @@ void ERR_load_EC_strings(void);
+ #define EC_R_INVALID_FIELD 103
+ #define EC_R_INVALID_FORM 104
+ #define EC_R_INVALID_GROUP_ORDER 122
++#define EC_R_INVALID_PENTANOMIAL_BASIS 132
+ #define EC_R_INVALID_PRIVATE_KEY 123
++#define EC_R_INVALID_TRINOMIAL_BASIS 137
+ #define EC_R_MISSING_PARAMETERS 124
+ #define EC_R_MISSING_PRIVATE_KEY 125
+ #define EC_R_NOT_A_NIST_PRIME 135
+Index: crypto/ec/ec_asn1.c
+--- crypto/ec/ec_asn1.c 8 Feb 2006 19:16:13 -0000 1.19.2.1
++++ crypto/ec/ec_asn1.c 26 Sep 2006 11:49:25 -0000
+@@ -741,6 +741,7 @@ static EC_GROUP *ec_asn1_parameters2grou
+ EC_GROUP *ret = NULL;
+ BIGNUM *p = NULL, *a = NULL, *b = NULL;
+ EC_POINT *point=NULL;
++ long field_bits;
+
+ if (!params->fieldID || !params->fieldID->fieldType ||
+ !params->fieldID->p.ptr)
+@@ -779,6 +780,13 @@ static EC_GROUP *ec_asn1_parameters2grou
+
+ char_two = params->fieldID->p.char_two;
+
++ field_bits = char_two->m;
++ if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_FIELD_TOO_LARGE);
++ goto err;
++ }
++
+ if ((p = BN_new()) == NULL)
+ {
+ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
ERR_R_MALLOC_FAILURE);
+@@ -799,6 +807,13 @@ static EC_GROUP *ec_asn1_parameters2grou
+ }
+
+ tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis);
++
++ if (!(char_two->m > tmp_long && tmp_long > 0))
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_INVALID_TRINOMIAL_BASIS);
++ goto err;
++ }
++
+ /* create the polynomial */
+ if (!BN_set_bit(p, (int)char_two->m))
+ goto err;
+@@ -817,6 +832,13 @@ static EC_GROUP *ec_asn1_parameters2grou
+ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_ASN1_ERROR);
+ goto err;
+ }
++
++ if (!(char_two->m > penta->k3 && penta->k3 > penta->k2
&& penta->k2 > penta->k1 && penta->k1 > 0))
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_INVALID_PENTANOMIAL_BASIS);
++ goto err;
++ }
++
+ /* create the polynomial */
+ if (!BN_set_bit(p, (int)char_two->m)) goto err;
+ if (!BN_set_bit(p, (int)penta->k1)) goto err;
+@@ -853,6 +875,20 @@ static EC_GROUP *ec_asn1_parameters2grou
+ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
+ goto err;
+ }
++
++ if (BN_is_negative(p) || BN_is_zero(p))
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_INVALID_FIELD);
++ goto err;
++ }
++
++ field_bits = BN_num_bits(p);
++ if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP,
EC_R_FIELD_TOO_LARGE);
++ goto err;
++ }
++
+ /* create the EC_GROUP structure */
+ ret = EC_GROUP_new_curve_GFp(p, a, b, NULL);
+ }
+@@ -910,6 +946,16 @@ static EC_GROUP *ec_asn1_parameters2grou
+ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
+ goto err;
+ }
++ if (BN_is_negative(a) || BN_is_zero(a))
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);
++ goto err;
++ }
++ if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */
++ {
++ ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);
++ goto err;
++ }
+
+ /* extract the cofactor (optional) */
+ if (params->cofactor == NULL)
+Index: crypto/ec/ec_err.c
+--- crypto/ec/ec_err.c 9 Jan 2006 16:05:20 -0000 1.36.2.2
++++ crypto/ec/ec_err.c 26 Sep 2006 11:49:25 -0000
+@@ -188,6 +188,7 @@ static ERR_STRING_DATA EC_str_reasons[]=
+ {ERR_REASON(EC_R_D2I_ECPKPARAMETERS_FAILURE),"d2i ecpkparameters failure"},
+ {ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"},
+ {ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name
failure"},
++{ERR_REASON(EC_R_FIELD_TOO_LARGE) ,"field too large"},
+ {ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"},
+ {ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"},
+ {ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"},
+@@ -198,7 +199,9 @@ static ERR_STRING_DATA EC_str_reasons[]=
+ {ERR_REASON(EC_R_INVALID_FIELD) ,"invalid field"},
+ {ERR_REASON(EC_R_INVALID_FORM) ,"invalid form"},
+ {ERR_REASON(EC_R_INVALID_GROUP_ORDER) ,"invalid group order"},
++{ERR_REASON(EC_R_INVALID_PENTANOMIAL_BASIS),"invalid pentanomial basis"},
+ {ERR_REASON(EC_R_INVALID_PRIVATE_KEY) ,"invalid private key"},
++{ERR_REASON(EC_R_INVALID_TRINOMIAL_BASIS),"invalid trinomial basis"},
+ {ERR_REASON(EC_R_MISSING_PARAMETERS) ,"missing parameters"},
+ {ERR_REASON(EC_R_MISSING_PRIVATE_KEY) ,"missing private key"},
+ {ERR_REASON(EC_R_NOT_A_NIST_PRIME) ,"not a NIST prime"},
+Index: crypto/rsa/rsa.h
+--- crypto/rsa/rsa.h 6 Sep 2006 06:43:25 -0000 1.55.2.6
++++ crypto/rsa/rsa.h 26 Sep 2006 11:49:25 -0000
+@@ -159,6 +159,17 @@ struct rsa_st
+ BN_BLINDING *mt_blinding;
+ };
+
++#ifndef OPENSSL_RSA_MAX_MODULUS_BITS
++# define OPENSSL_RSA_MAX_MODULUS_BITS 16384
++#endif
++
++#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS
++# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072
++#endif
++#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS
++# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced
for "large" modulus only */
++#endif
++
+ #define RSA_3 0x3L
+ #define RSA_F4 0x10001L
+
+@@ -407,6 +418,7 @@ void ERR_load_RSA_strings(void);
+ #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126
+ #define RSA_R_KEY_SIZE_TOO_SMALL 120
+ #define RSA_R_LAST_OCTET_INVALID 134
++#define RSA_R_MODULUS_TOO_LARGE 105
+ #define RSA_R_NO_PUBLIC_EXPONENT 140
+ #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113
+ #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127
+Index: crypto/rsa/rsa_eay.c
+--- crypto/rsa/rsa_eay.c 6 Sep 2006 06:43:25 -0000 1.46.2.6
++++ crypto/rsa/rsa_eay.c 26 Sep 2006 11:49:25 -0000
+@@ -168,6 +168,28 @@ static int RSA_eay_public_encrypt(int fl
+ unsigned char *buf=NULL;
+ BN_CTX *ctx=NULL;
+
++ if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
++ return -1;
++ }
++
++ if (BN_ucmp(rsa->n, rsa->e) <= 0)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
++ return -1;
++ }
++
++ /* for large moduli, enforce exponent limit */
++ if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
++ {
++ if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
++ return -1;
++ }
++ }
++
+ if ((ctx=BN_CTX_new()) == NULL) goto err;
+ BN_CTX_start(ctx);
+ f = BN_CTX_get(ctx);
+@@ -597,6 +619,28 @@ static int RSA_eay_public_decrypt(int fl
+ unsigned char *buf=NULL;
+ BN_CTX *ctx=NULL;
+
++ if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
++ return -1;
++ }
++
++ if (BN_ucmp(rsa->n, rsa->e) <= 0)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
++ return -1;
++ }
++
++ /* for large moduli, enforce exponent limit */
++ if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
++ {
++ if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
++ {
++ RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
++ return -1;
++ }
++ }
++
+ if((ctx = BN_CTX_new()) == NULL) goto err;
+ BN_CTX_start(ctx);
+ f = BN_CTX_get(ctx);
+Index: crypto/rsa/rsa_err.c
+--- crypto/rsa/rsa_err.c 6 Sep 2006 06:43:26 -0000 1.17.2.5
++++ crypto/rsa/rsa_err.c 26 Sep 2006 11:49:25 -0000
+@@ -137,6 +137,7 @@ static ERR_STRING_DATA RSA_str_reasons[]
+ {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"},
+ {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"},
+ {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"},
++{ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
+ {ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"},
+ {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"},
+ {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"},
+Index: ssl/s2_clnt.c
+--- ssl/s2_clnt.c 5 Dec 2005 17:32:20 -0000 1.51.2.2
++++ ssl/s2_clnt.c 26 Sep 2006 11:49:25 -0000
+@@ -520,7 +520,8 @@ static int get_server_hello(SSL *s)
+ CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
+ }
+
+- if (s->session->peer != s->session->sess_cert->peer_key->x509)
++ if (s->session->sess_cert == NULL
++ || s->session->peer != s->session->sess_cert->peer_key->x509)
+ /* can't happen */
+ {
+ ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
+Index: ssl/s3_srvr.c
+--- ssl/s3_srvr.c 8 Feb 2006 19:16:33 -0000 1.126.2.7
++++ ssl/s3_srvr.c 26 Sep 2006 11:49:25 -0000
+@@ -2003,7 +2003,7 @@ int ssl3_get_client_key_exchange(SSL *s)
+
+ if (kssl_ctx->client_princ)
+ {
+- int len = strlen(kssl_ctx->client_princ);
++ size_t len = strlen(kssl_ctx->client_princ);
+ if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
+ {
+ s->session->krb5_client_princ_len = len;
+Index: ssl/ssl_lib.c
+--- ssl/ssl_lib.c 5 Dec 2005 17:32:21 -0000 1.133.2.6
++++ ssl/ssl_lib.c 26 Sep 2006 11:49:26 -0000
+@@ -1219,7 +1219,7 @@ char *SSL_get_shared_ciphers(const SSL *
+ c=sk_SSL_CIPHER_value(sk,i);
+ for (cp=c->name; *cp; )
+ {
+- if (len-- == 0)
++ if (len-- <= 0)
+ {
+ *p='\0';
+ return(buf);
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/openssl/openssl.spec
============================================================================
$ cvs diff -u -r1.70.2.3 -r1.70.2.4 openssl.spec
--- openpkg-src/openssl/openssl.spec 6 Sep 2006 07:20:48 -0000 1.70.2.3
+++ openpkg-src/openssl/openssl.spec 28 Sep 2006 12:47:56 -0000 1.70.2.4
@@ -33,7 +33,7 @@
Group: Cryptography
License: BSD-style
Version: 0.9.8a
-Release: 2.5.2
+Release: 2.5.3
# package options
%option with_zlib no
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [email protected]