untrusted comment: signature from openbsd 5.7 base secret key
RWSvUZXnw9gUb/RUef97IvNWdo/ATqh/E6SLVblpV5x/ydtJGAYlpfJKMm1aZS25L9Mv37ogb9SMlj2CEzyxLy4ZtWqNfiHGvAg=

OpenBSD 5.7 errata 9, June 11, 2015

Fix several defects from OpenSSL.  These include:

CVE-2015-1788 - Malformed ECParameters causes infinite loop
CVE-2015-1789 - Exploitable out-of-bounds read in X509_cmp_time
CVE-2015-1792 - CMS verify infinite loop with unknown hash function

Several other issues did not apply or were already fixed.  One low
severity issue is still in review.  For further details, please refer to
https://www.openssl.org/news/secadv_20150611.txt

Apply patch using:

   signify -Vep /etc/signify/openbsd-57-base.pub -x 009_openssl.patch.sig \
       -m - | (cd /usr/src && patch -p0)

Then build and install libcrypto

   cd /usr/src/lib/libcrypto/crypto
   make obj
   make
   make install

Index: lib/libssl/src/crypto/bn/bn_gf2m.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/bn/bn_gf2m.c,v
retrieving revision 1.18
diff -u -p -r1.18 bn_gf2m.c
--- lib/libssl/src/crypto/bn/bn_gf2m.c  10 Feb 2015 09:50:12 -0000      1.18
+++ lib/libssl/src/crypto/bn/bn_gf2m.c  11 Jun 2015 16:21:08 -0000
@@ -745,8 +745,13 @@ BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM
                               ubits--;
                       }

-                       if (ubits <= BN_BITS2 && udp[0] == 1)
-                               break;
+                       if (ubits <= BN_BITS2) {
+                               /* See if poly was reducible. */
+                               if (udp[0] == 0)
+                                       goto err;
+                               if (udp[0] == 1)
+                                       break;
+                       }

                       if (ubits < vbits) {
                               i = ubits;
Index: lib/libssl/src/crypto/cms/cms_smime.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/cms/cms_smime.c,v
retrieving revision 1.12
diff -u -p -r1.12 cms_smime.c
--- lib/libssl/src/crypto/cms/cms_smime.c       11 Jul 2014 12:12:39 -0000      1.12
+++ lib/libssl/src/crypto/cms/cms_smime.c       11 Jun 2015 16:21:09 -0000
@@ -132,7 +132,7 @@ do_free_upto(BIO *f, BIO *upto)
                       tbio = BIO_pop(f);
                       BIO_free(f);
                       f = tbio;
-               } while (f != upto);
+               } while (f != NULL && f != upto);
       } else
               BIO_free_all(f);
}
Index: lib/libssl/src/crypto/x509/x509_vfy.c
===================================================================
RCS file: /cvs/src/lib/libssl/src/crypto/x509/x509_vfy.c,v
retrieving revision 1.40
diff -u -p -r1.40 x509_vfy.c
--- lib/libssl/src/crypto/x509/x509_vfy.c       11 Feb 2015 02:17:59 -0000      1.40
+++ lib/libssl/src/crypto/x509/x509_vfy.c       11 Jun 2015 16:21:09 -0000
@@ -1650,34 +1650,57 @@ X509_cmp_time(const ASN1_TIME *ctm, time
               memcpy(p, str, 10);
               p += 10;
               str += 10;
+               i -= 10;
       } else {
               if (i < 13)
                       return 0;
               memcpy(p, str, 12);
               p += 12;
               str += 12;
+               i -= 12;
       }

+       if (i < 1)
+               return 0;
       if ((*str == 'Z') || (*str == '-') || (*str == '+')) {
               *(p++) = '0';
               *(p++) = '0';
       } else {
+               if (i < 2)
+                       return 0;
               *(p++) = *(str++);
               *(p++) = *(str++);
+               i -= 2;
+               if (i < 1)
+                       return 0;
               /* Skip any fractional seconds... */
               if (*str == '.') {
                       str++;
-                       while ((*str >= '0') && (*str <= '9'))
+                       i--;
+                       while (i > 1 && (*str >= '0') && (*str <= '9')) {
                               str++;
+                               i--;
+                       }
               }
       }
       *(p++) = 'Z';
       *(p++) = '\0';

-       if (*str == 'Z')
+       if (i < 1)
+               return 0;
+       if (*str == 'Z') {
+               if (i != 1)
+                       return 0;
               offset = 0;
-       else {
+       } else {
+               if (i != 5)
+                       return 0;
               if ((*str != '+') && (*str != '-'))
+                       return 0;
+               if (str[1] < '0' || str[1] > '9' ||
+                   str[2] < '0' || str[2] > '9' ||
+                   str[3] < '0' || str[3] > '9' ||
+                   str[4] < '0' || str[4] > '9')
                       return 0;
               offset = ((str[1] - '0') * 10 + (str[2] - '0')) * 60;
               offset += (str[3] - '0') * 10 + (str[4] - '0');