On Mon, Mar 02, 2009 at 05:36:15PM -0800, Claus Assmann wrote:

> Out of the box OpenSSL 0.9.8j fails to install on SunOS 5.10 ( cp:
> cannot access fipscanister.o).  I found a mail in the archives about
> this and applied the patch to disable FIPS (see below). However,
> after doing that compilation fails because fips.h is missing:
> 
> [ ... ]
> 
> What's the "correct" way to fix this? For now I "hacked" the Makefile
> to ignore the result of the cp command.

For me the "correct" solution was to not even consider using 0.9.8j at
this time. It is IMNSHO not a "patch" release, rather a major feature
release, with a lot of new code that has been sufficiently stress-tested.

The fact that this release is also a critical security release, in my
opinion, highlights a significant deficiency in the OpenSSL release
process. There are no OpenSSL "patch" releases, there are only feature
releases, some with fewer new features, and some with more.

So, I back-ported the recent security patch and other miscellaneous fixes
to 0.9.8i instead. I won't be adopting the 0.9.8j+ releases until the
new FIPS code undergoes significant field testing.

You can check the CVS histories of the patched files to find the relevant
fixes these represent. I should have these handy, but I don't...

It should not be necessary for distribution maintainers to back-port
critical fixes while weeding out new OpenSSL features, but sadly this
is for now the situation we are in.

-- 
        Viktor.
--- apps/speed.c        2007-11-15 13:33:47.000000000 +0000
+++ apps/speed-new.c    2008-12-04 00:00:00.000000000 +0000
@@ -2132,7 +2132,7 @@
                                {
                                ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
                                        rsa_num, rsa_key[j]);
-                               if (ret == 0)
+                               if (ret <= 0)
                                        {
                                        BIO_printf(bio_err,
                                                "RSA verify failure\n");
--- apps/spkac.c        2005-04-05 19:11:18.000000000 +0000
+++ apps/spkac.c        2008-12-04 00:00:00.000000000 +0000
@@ -285,7 +285,7 @@
        pkey = NETSCAPE_SPKI_get_pubkey(spki);
        if(verify) {
                i = NETSCAPE_SPKI_verify(spki, pkey);
-               if(i) BIO_printf(bio_err, "Signature OK\n");
+               if (i > 0) BIO_printf(bio_err, "Signature OK\n");
                else {
                        BIO_printf(bio_err, "Signature Failure\n");
                        ERR_print_errors(bio_err);
--- apps/verify.c       2004-11-29 11:28:07.000000000 +0000
+++ apps/verify.c       2008-12-04 00:00:00.600000000 +0000
@@ -266,7 +266,7 @@
 
        ret=0;
 end:
-       if (i)
+       if (i > 0)
                {
                fprintf(stdout,"OK\n");
                ret=1;
@@ -367,4 +367,3 @@
                ERR_clear_error();
        return(ok);
        }
-
--- apps/x509.c 2007-10-12 00:00:10.000000000 +0000
+++ apps/x509.c 2008-12-04 00:00:00.400000000 +0000
@@ -1151,7 +1151,7 @@
        /* NOTE: this certificate can/should be self signed, unless it was
         * a certificate request in which case it is not. */
        X509_STORE_CTX_set_cert(&xsc,x);
-       if (!reqfile && !X509_verify_cert(&xsc))
+       if (!reqfile && X509_verify_cert(&xsc) <= 0)
                goto end;
 
        if (!X509_check_private_key(xca,pkey))
--- crypto/cms/cms_sd.c 2008-04-06 16:30:38.000000000 +0000
+++ crypto/cms/cms_sd.c 2008-12-04 00:00:00.400000000 +0000
@@ -830,7 +830,7 @@
        cms_fixup_mctx(&mctx, si->pkey);
        r = EVP_VerifyFinal(&mctx,
                        si->signature->data, si->signature->length, si->pkey);
-       if (!r)
+       if (r <= 0)
                CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE);
        err:
        EVP_MD_CTX_cleanup(&mctx);
--- ssl/s2_clnt.c       2007-09-06 12:43:53.000000000 +0000
+++ ssl/s2_clnt.c       2008-12-04 00:00:00.100000000 +0000
@@ -1044,7 +1044,7 @@
 
        i=ssl_verify_cert_chain(s,sk);
                
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i))
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
                {
                
SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
                goto err;
--- ssl/s2_srvr.c       2007-09-06 12:43:53.000000000 +0000
+++ ssl/s2_srvr.c       2008-12-04 00:00:00.900000000 +0000
@@ -1054,7 +1054,7 @@
 
        i=ssl_verify_cert_chain(s,sk);
 
-       if (i)  /* we like the packet, now check the chksum */
+       if (i > 0)      /* we like the packet, now check the chksum */
                {
                EVP_MD_CTX ctx;
                EVP_PKEY *pkey=NULL;
@@ -1083,7 +1083,7 @@
                EVP_PKEY_free(pkey);
                EVP_MD_CTX_cleanup(&ctx);
 
-               if (i) 
+               if (i > 0)
                        {
                        if (s->session->peer != NULL)
                                X509_free(s->session->peer);
--- ssl/s3_clnt.c       2008-06-16 16:56:41.000000000 +0000
+++ ssl/s3_clnt.c       2008-12-04 00:00:00.100000000 +0000
@@ -972,7 +972,7 @@
                }
 
        i=ssl_verify_cert_chain(s,sk);
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
 #ifndef OPENSSL_NO_KRB5
                && (s->s3->tmp.new_cipher->algorithms & 
(SSL_MKEY_MASK|SSL_AUTH_MASK))
                != (SSL_aKRB5|SSL_kKRB5)
@@ -1459,7 +1459,7 @@
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;
@@ -1477,7 +1477,7 @@
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;
--- ssl/s3_srvr.c       2008-09-14 18:16:09.000000000 +0000
+++ ssl/s3_srvr.c       2008-12-04 00:00:00.100000000 +0000
@@ -2560,7 +2560,7 @@
        else
                {
                i=ssl_verify_cert_chain(s,sk);
-               if (!i)
+               if (i <= 0)
                        {
                        al=ssl_verify_alarm_type(s->verify_result);
                        
SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);
--- ssl/ssltest.c       2008-06-16 16:56:42.000000000 +0000
+++ ssl/ssltest.c       2008-12-04 00:00:00.900000000 +0000
@@ -2093,7 +2093,7 @@
 
        if (cb_arg->proxy_auth)
                {
-               if (ok)
+               if (ok > 0)
                        {
                        const char *cond_end = NULL;
 

--- crypto/asn1/a_sign.c        2005-05-08 20:27:32.679157175 -0400
+++ crypto/asn1/a_sign.c        2008-09-25 13:01:32.000000000 -0400
@@ -267,7 +267,12 @@
                goto err;
                }
 
-       EVP_SignInit_ex(&ctx,type, NULL);
+       if (!EVP_SignInit_ex(&ctx,type, NULL))
+               {
+               outl=0;
+               ASN1err(ASN1_F_ASN1_ITEM_SIGN,ERR_R_EVP_LIB);
+               goto err;
+               }
        EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
        if (!EVP_SignFinal(&ctx,(unsigned char *)buf_out,
                        (unsigned int *)&outl,pkey))
--- crypto/asn1/a_verify.c      2005-05-08 20:27:32.095808360 -0400
+++ crypto/asn1/a_verify.c      2008-09-25 13:01:32.000000000 -0400
@@ -100,7 +100,12 @@
        p=buf_in;
 
        i2d(data,&p);
-       EVP_VerifyInit_ex(&ctx,type, NULL);
+       if (!EVP_VerifyInit_ex(&ctx,type, NULL))
+               {
+               ASN1err(ASN1_F_ASN1_VERIFY,ERR_R_EVP_LIB);
+               ret=0;
+               goto err;
+               }
        EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl);
 
        OPENSSL_cleanse(buf_in,(unsigned int)inl);
--- crypto/bn/bn_shift.c        2003-11-13 10:03:14.000000000 -0500
+++ crypto/bn/bn_shift.c        2008-10-28 10:01:41.000000000 -0400
@@ -177,7 +177,7 @@
        nw=n/BN_BITS2;
        rb=n%BN_BITS2;
        lb=BN_BITS2-rb;
-       if (nw > a->top || a->top == 0)
+       if (nw >= a->top || a->top == 0)
                {
                BN_zero(r);
                return(1);
--- crypto/ec/ec_key.c  2005-05-17 08:23:16.992458116 -0400
+++ crypto/ec/ec_key.c  2008-09-23 14:02:17.000000000 -0400
@@ -296,7 +296,7 @@
        {
        int     ok   = 0;
        BN_CTX  *ctx = NULL;
-       BIGNUM  *order  = NULL;
+       const BIGNUM    *order  = NULL;
        EC_POINT *point = NULL;
 
        if (!eckey || !eckey->group || !eckey->pub_key)
@@ -307,8 +307,6 @@
        
        if ((ctx = BN_CTX_new()) == NULL)
                goto err;
-       if ((order = BN_new()) == NULL)
-               goto err;
        if ((point = EC_POINT_new(eckey->group)) == NULL)
                goto err;
 
@@ -319,17 +317,13 @@
                goto err;
                }
        /* testing whether pub_key * order is the point at infinity */
-       if (!EC_GROUP_get_order(eckey->group, order, ctx))
+       order = &eckey->group->order;
+       if (BN_is_zero(order))
                {
                ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_INVALID_GROUP_ORDER);
                goto err;
                }
-       if (!EC_POINT_copy(point, eckey->pub_key))
-               {
-               ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB);
-               goto err;
-               }
-       if (!EC_POINT_mul(eckey->group, point, order, NULL, NULL, ctx))
+       if (!EC_POINT_mul(eckey->group, point, NULL, eckey->pub_key, order, 
ctx))
                {
                ECerr(EC_F_EC_KEY_CHECK_KEY, ERR_R_EC_LIB);
                goto err;
@@ -366,8 +360,6 @@
 err:
        if (ctx   != NULL)
                BN_CTX_free(ctx);
-       if (order != NULL)
-               BN_free(order);
        if (point != NULL)
                EC_POINT_free(point);
        return(ok);
--- crypto/pqueue/pq_compat.h   2007-09-17 12:21:21.736417599 -0400
+++ crypto/pqueue/pq_compat.h   2008-10-20 09:01:36.000000000 -0400
@@ -57,6 +57,9 @@
  *
  */
 
+#ifndef HEADER_PQ_COMPAT_H
+#define HEADER_PQ_COMPAT_H
+
 #include <openssl/opensslconf.h>
 #include <openssl/bn.h>
 
@@ -145,3 +148,5 @@
                                               *(x) |= mask; \
                                           } while(0)
 #endif /* OPENSSL_SYS_VMS */
+
+#endif
--- crypto/x509v3/v3_addr.c     2008-09-14 11:46:35.439805980 -0400
+++ crypto/x509v3/v3_addr.c     2008-10-14 16:01:46.000000000 -0400
@@ -878,6 +878,7 @@
                                    v3_addr_get_afi(f)))
       return 0;
   }
+  sk_IPAddressFamily_set_cmp_func(addr, IPAddressFamily_cmp);
   sk_IPAddressFamily_sort(addr);
   assert(v3_addr_is_canonical(addr));
   return 1;
--- ssl/s3_srvr.c       2008-09-14 14:16:09.000000000 -0400
+++ ssl/s3_srvr.c       2008-09-22 18:02:13.000000000 -0400
@@ -902,22 +902,28 @@
                                break;
                                }
                        }
-               if (j == 0)
+               if (j == 0 && (s->options & 
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
                        {
-                       if ((s->options & 
SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1))
+                       /* Special case as client bug workaround: the 
previously used cipher may
+                        * not be in the current list, the client instead might 
be trying to
+                        * continue using a cipher that before wasn't chosen 
due to server
+                        * preferences.  We'll have to reject the connection if 
the cipher is not
+                        * enabled, though. */
+                       c = sk_SSL_CIPHER_value(ciphers, 0);
+                       if (sk_SSL_CIPHER_find(SSL_get_ciphers(s), c) >= 0)
                                {
-                               /* Very bad for multi-threading.... */
-                               s->session->cipher=sk_SSL_CIPHER_value(ciphers, 
0);
-                               }
-                       else
-                               {
-                               /* we need to have the cipher in the cipher
-                                * list if we are asked to reuse it */
-                               al=SSL_AD_ILLEGAL_PARAMETER;
-                               
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
-                               goto f_err;
+                               s->session->cipher = c;
+                               j = 1;
                                }
                        }
+               if (j == 0)
+                       {
+                       /* we need to have the cipher in the cipher
+                        * list if we are asked to reuse it */
+                       al=SSL_AD_ILLEGAL_PARAMETER;
+                       
SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING);
+                       goto f_err;
+                       }
                }
 
        /* compression */

Reply via email to