Browse Source

Merge branch 'thirdparty'

Source commit: 92ad765b837db3a219af401606415e67b3162607
Martin Prikryl 10 years ago
parent
commit
b1314508e0
80 changed files with 832 additions and 463 deletions
  1. 10 0
      libs/openssl/crypto/asn1/asn1_par.c
  2. 11 4
      libs/openssl/crypto/asn1/d2i_pr.c
  3. 7 4
      libs/openssl/crypto/asn1/tasn_dec.c
  4. 3 2
      libs/openssl/crypto/asn1/x_bignum.c
  5. 4 1
      libs/openssl/crypto/asn1/x_pubkey.c
  6. 4 5
      libs/openssl/crypto/asn1/x_x509.c
  7. 0 1
      libs/openssl/crypto/bio/b_dump.c
  8. 10 3
      libs/openssl/crypto/bio/bss_file.c
  9. 4 3
      libs/openssl/crypto/bn/bn_exp.c
  10. 2 0
      libs/openssl/crypto/bn/bn_gcd.c
  11. 7 4
      libs/openssl/crypto/bn/bn_gf2m.c
  12. 6 3
      libs/openssl/crypto/bn/bn_mont.c
  13. 3 1
      libs/openssl/crypto/bn/bn_recp.c
  14. 5 2
      libs/openssl/crypto/bn/bn_x931p.c
  15. 14 7
      libs/openssl/crypto/buffer/buf_str.c
  16. 6 0
      libs/openssl/crypto/buffer/buffer.h
  17. 2 2
      libs/openssl/crypto/buildinf.h
  18. 2 1
      libs/openssl/crypto/comp/c_zlib.c
  19. 1 2
      libs/openssl/crypto/conf/conf_def.c
  20. 1 0
      libs/openssl/crypto/conf/conf_sap.c
  21. 21 5
      libs/openssl/crypto/cryptlib.c
  22. 1 0
      libs/openssl/crypto/dsa/dsa_ameth.c
  23. 6 13
      libs/openssl/crypto/dsa/dsa_gen.c
  24. 1 1
      libs/openssl/crypto/ec/ec.h
  25. 6 2
      libs/openssl/crypto/ec/ec_asn1.c
  26. 8 4
      libs/openssl/crypto/ec/ec_key.c
  27. 1 1
      libs/openssl/crypto/evp/e_des3.c
  28. 100 98
      libs/openssl/crypto/evp/encode.c
  29. 4 2
      libs/openssl/crypto/evp/evp_key.c
  30. 27 6
      libs/openssl/crypto/evp/evp_lib.c
  31. 12 4
      libs/openssl/crypto/evp/evp_pbe.c
  32. 1 1
      libs/openssl/crypto/evp/p_lib.c
  33. 7 2
      libs/openssl/crypto/evp/pmeth_gn.c
  34. 7 2
      libs/openssl/crypto/hmac/hm_ameth.c
  35. 4 0
      libs/openssl/crypto/mem_clr.c
  36. 0 6
      libs/openssl/crypto/ocsp/ocsp_lib.c
  37. 1 2
      libs/openssl/crypto/ocsp/ocsp_prn.c
  38. 1 1
      libs/openssl/crypto/opensslconf.h
  39. 3 3
      libs/openssl/crypto/opensslv.h
  40. 6 0
      libs/openssl/crypto/pem/pem_info.c
  41. 4 6
      libs/openssl/crypto/pem/pvkfmt.c
  42. 20 7
      libs/openssl/crypto/pkcs12/p12_add.c
  43. 3 0
      libs/openssl/crypto/pkcs12/p12_crpt.c
  44. 2 2
      libs/openssl/crypto/pkcs12/p12_mutl.c
  45. 2 1
      libs/openssl/crypto/pkcs7/pk7_doit.c
  46. 1 1
      libs/openssl/crypto/rsa/rsa_ameth.c
  47. 3 1
      libs/openssl/crypto/rsa/rsa_gen.c
  48. 5 6
      libs/openssl/crypto/rsa/rsa_sign.c
  49. 25 9
      libs/openssl/crypto/srp/srp_vfy.c
  50. 1 1
      libs/openssl/crypto/ts/ts_rsp_verify.c
  51. 14 1
      libs/openssl/crypto/x509/x509_cmp.c
  52. 0 2
      libs/openssl/crypto/x509/x509_lu.c
  53. 4 0
      libs/openssl/crypto/x509v3/v3_cpols.c
  54. 2 0
      libs/openssl/crypto/x509v3/v3_ncons.c
  55. 1 1
      libs/openssl/crypto/x509v3/v3_pci.c
  56. 1 1
      libs/openssl/crypto/x509v3/v3_pcia.c
  57. 4 4
      libs/openssl/e_os.h
  58. 4 0
      libs/openssl/ssl/bio_ssl.c
  59. 5 2
      libs/openssl/ssl/d1_both.c
  60. 17 6
      libs/openssl/ssl/d1_clnt.c
  61. 26 5
      libs/openssl/ssl/d1_srvr.c
  62. 7 14
      libs/openssl/ssl/s23_clnt.c
  63. 30 15
      libs/openssl/ssl/s3_cbc.c
  64. 84 35
      libs/openssl/ssl/s3_clnt.c
  65. 63 45
      libs/openssl/ssl/s3_enc.c
  66. 1 1
      libs/openssl/ssl/s3_lib.c
  67. 51 27
      libs/openssl/ssl/s3_srvr.c
  68. 4 0
      libs/openssl/ssl/ssl.h
  69. 2 0
      libs/openssl/ssl/ssl3.h
  70. 4 1
      libs/openssl/ssl/ssl_asn1.c
  71. 1 1
      libs/openssl/ssl/ssl_cert.c
  72. 7 4
      libs/openssl/ssl/ssl_ciph.c
  73. 5 0
      libs/openssl/ssl/ssl_err.c
  74. 6 3
      libs/openssl/ssl/ssl_lib.c
  75. 10 10
      libs/openssl/ssl/ssl_locl.h
  76. 21 2
      libs/openssl/ssl/ssl_rsa.c
  77. 2 2
      libs/openssl/ssl/ssl_sess.c
  78. 33 15
      libs/openssl/ssl/t1_enc.c
  79. 32 25
      libs/openssl/ssl/t1_lib.c
  80. 6 9
      libs/openssl/ssl/tls1.h

+ 10 - 0
libs/openssl/crypto/asn1/asn1_par.c

@@ -62,6 +62,10 @@
 #include <openssl/objects.h>
 #include <openssl/objects.h>
 #include <openssl/asn1.h>
 #include <openssl/asn1.h>
 
 
+#ifndef ASN1_PARSE_MAXDEPTH
+#define ASN1_PARSE_MAXDEPTH 128
+#endif
+
 static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
 static int asn1_print_info(BIO *bp, int tag, int xclass, int constructed,
                            int indent);
                            int indent);
 static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
 static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
@@ -128,6 +132,12 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
 #else
 #else
     dump_indent = 6;            /* Because we know BIO_dump_indent() */
     dump_indent = 6;            /* Because we know BIO_dump_indent() */
 #endif
 #endif
+
+    if (depth > ASN1_PARSE_MAXDEPTH) {
+            BIO_puts(bp, "BAD RECURSION DEPTH\n");
+            return 0;
+    }
+
     p = *pp;
     p = *pp;
     tot = p + length;
     tot = p + length;
     op = p - 1;
     op = p - 1;

+ 11 - 4
libs/openssl/crypto/asn1/d2i_pr.c

@@ -72,6 +72,7 @@ EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp,
                          long length)
                          long length)
 {
 {
     EVP_PKEY *ret;
     EVP_PKEY *ret;
+    const unsigned char *p = *pp;
 
 
     if ((a == NULL) || (*a == NULL)) {
     if ((a == NULL) || (*a == NULL)) {
         if ((ret = EVP_PKEY_new()) == NULL) {
         if ((ret = EVP_PKEY_new()) == NULL) {
@@ -94,21 +95,23 @@ EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp,
     }
     }
 
 
     if (!ret->ameth->old_priv_decode ||
     if (!ret->ameth->old_priv_decode ||
-        !ret->ameth->old_priv_decode(ret, pp, length)) {
+        !ret->ameth->old_priv_decode(ret, &p, length)) {
         if (ret->ameth->priv_decode) {
         if (ret->ameth->priv_decode) {
             PKCS8_PRIV_KEY_INFO *p8 = NULL;
             PKCS8_PRIV_KEY_INFO *p8 = NULL;
-            p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, pp, length);
+            p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, length);
             if (!p8)
             if (!p8)
                 goto err;
                 goto err;
             EVP_PKEY_free(ret);
             EVP_PKEY_free(ret);
             ret = EVP_PKCS82PKEY(p8);
             ret = EVP_PKCS82PKEY(p8);
             PKCS8_PRIV_KEY_INFO_free(p8);
             PKCS8_PRIV_KEY_INFO_free(p8);
-
+            if (ret == NULL)
+                goto err;
         } else {
         } else {
             ASN1err(ASN1_F_D2I_PRIVATEKEY, ERR_R_ASN1_LIB);
             ASN1err(ASN1_F_D2I_PRIVATEKEY, ERR_R_ASN1_LIB);
             goto err;
             goto err;
         }
         }
     }
     }
+    *pp = p;
     if (a != NULL)
     if (a != NULL)
         (*a) = ret;
         (*a) = ret;
     return (ret);
     return (ret);
@@ -136,6 +139,7 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp,
      * input is surrounded by an ASN1 SEQUENCE.
      * input is surrounded by an ASN1 SEQUENCE.
      */
      */
     inkey = d2i_ASN1_SEQUENCE_ANY(NULL, &p, length);
     inkey = d2i_ASN1_SEQUENCE_ANY(NULL, &p, length);
+    p = *pp;
     /*
     /*
      * Since we only need to discern "traditional format" RSA and DSA keys we
      * Since we only need to discern "traditional format" RSA and DSA keys we
      * can just count the elements.
      * can just count the elements.
@@ -146,7 +150,7 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp,
         keytype = EVP_PKEY_EC;
         keytype = EVP_PKEY_EC;
     else if (sk_ASN1_TYPE_num(inkey) == 3) { /* This seems to be PKCS8, not
     else if (sk_ASN1_TYPE_num(inkey) == 3) { /* This seems to be PKCS8, not
                                               * traditional format */
                                               * traditional format */
-        PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, pp, length);
+        PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL, &p, length);
         EVP_PKEY *ret;
         EVP_PKEY *ret;
 
 
         sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);
         sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);
@@ -157,6 +161,9 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp,
         }
         }
         ret = EVP_PKCS82PKEY(p8);
         ret = EVP_PKCS82PKEY(p8);
         PKCS8_PRIV_KEY_INFO_free(p8);
         PKCS8_PRIV_KEY_INFO_free(p8);
+        if (ret == NULL)
+            return NULL;
+        *pp = p;
         if (a) {
         if (a) {
             *a = ret;
             *a = ret;
         }
         }

+ 7 - 4
libs/openssl/crypto/asn1/tasn_dec.c

@@ -180,6 +180,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
     int otag;
     int otag;
     int ret = 0;
     int ret = 0;
     ASN1_VALUE **pchptr, *ptmpval;
     ASN1_VALUE **pchptr, *ptmpval;
+    int combine = aclass & ASN1_TFLG_COMBINE;
+    aclass &= ~ASN1_TFLG_COMBINE;
     if (!pval)
     if (!pval)
         return 0;
         return 0;
     if (aux && aux->asn1_cb)
     if (aux && aux->asn1_cb)
@@ -350,9 +352,9 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
         }
         }
 
 
         asn1_set_choice_selector(pval, i, it);
         asn1_set_choice_selector(pval, i, it);
-        *in = p;
         if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
         if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
             goto auxerr;
             goto auxerr;
+        *in = p;
         return 1;
         return 1;
 
 
     case ASN1_ITYPE_NDEF_SEQUENCE:
     case ASN1_ITYPE_NDEF_SEQUENCE:
@@ -489,9 +491,9 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
         /* Save encoding */
         /* Save encoding */
         if (!asn1_enc_save(pval, *in, p - *in, it))
         if (!asn1_enc_save(pval, *in, p - *in, it))
             goto auxerr;
             goto auxerr;
-        *in = p;
         if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
         if (asn1_cb && !asn1_cb(ASN1_OP_D2I_POST, pval, it, NULL))
             goto auxerr;
             goto auxerr;
+        *in = p;
         return 1;
         return 1;
 
 
     default:
     default:
@@ -500,7 +502,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
  auxerr:
  auxerr:
     ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_AUX_ERROR);
     ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_AUX_ERROR);
  err:
  err:
-    ASN1_item_ex_free(pval, it);
+    if (combine == 0)
+        ASN1_item_ex_free(pval, it);
     if (errtt)
     if (errtt)
         ERR_add_error_data(4, "Field=", errtt->field_name,
         ERR_add_error_data(4, "Field=", errtt->field_name,
                            ", Type=", it->sname);
                            ", Type=", it->sname);
@@ -689,7 +692,7 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val,
     } else {
     } else {
         /* Nothing special */
         /* Nothing special */
         ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item),
         ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item),
-                               -1, 0, opt, ctx);
+                               -1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx);
         if (!ret) {
         if (!ret) {
             ASN1err(ASN1_F_ASN1_TEMPLATE_NOEXP_D2I, ERR_R_NESTED_ASN1_ERROR);
             ASN1err(ASN1_F_ASN1_TEMPLATE_NOEXP_D2I, ERR_R_NESTED_ASN1_ERROR);
             goto err;
             goto err;

+ 3 - 2
libs/openssl/crypto/asn1/x_bignum.c

@@ -141,8 +141,9 @@ static int bn_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len,
                   int utype, char *free_cont, const ASN1_ITEM *it)
                   int utype, char *free_cont, const ASN1_ITEM *it)
 {
 {
     BIGNUM *bn;
     BIGNUM *bn;
-    if (!*pval)
-        bn_new(pval, it);
+
+    if (*pval == NULL && !bn_new(pval, it))
+        return 0;
     bn = (BIGNUM *)*pval;
     bn = (BIGNUM *)*pval;
     if (!BN_bin2bn(cont, len, bn)) {
     if (!BN_bin2bn(cont, len, bn)) {
         bn_free(pval, it);
         bn_free(pval, it);

+ 4 - 1
libs/openssl/crypto/asn1/x_pubkey.c

@@ -188,13 +188,16 @@ EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length)
 {
 {
     X509_PUBKEY *xpk;
     X509_PUBKEY *xpk;
     EVP_PKEY *pktmp;
     EVP_PKEY *pktmp;
-    xpk = d2i_X509_PUBKEY(NULL, pp, length);
+    const unsigned char *q;
+    q = *pp;
+    xpk = d2i_X509_PUBKEY(NULL, &q, length);
     if (!xpk)
     if (!xpk)
         return NULL;
         return NULL;
     pktmp = X509_PUBKEY_get(xpk);
     pktmp = X509_PUBKEY_get(xpk);
     X509_PUBKEY_free(xpk);
     X509_PUBKEY_free(xpk);
     if (!pktmp)
     if (!pktmp)
         return NULL;
         return NULL;
+    *pp = q;
     if (a) {
     if (a) {
         EVP_PKEY_free(*a);
         EVP_PKEY_free(*a);
         *a = pktmp;
         *a = pktmp;

+ 4 - 5
libs/openssl/crypto/asn1/x_x509.c

@@ -180,16 +180,15 @@ X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length)
     if (!a || *a == NULL) {
     if (!a || *a == NULL) {
         freeret = 1;
         freeret = 1;
     }
     }
-    ret = d2i_X509(a, pp, length);
+    ret = d2i_X509(a, &q, length);
     /* If certificate unreadable then forget it */
     /* If certificate unreadable then forget it */
     if (!ret)
     if (!ret)
         return NULL;
         return NULL;
     /* update length */
     /* update length */
-    length -= *pp - q;
-    if (!length)
-        return ret;
-    if (!d2i_X509_CERT_AUX(&ret->aux, pp, length))
+    length -= q - *pp;
+    if (length > 0 && !d2i_X509_CERT_AUX(&ret->aux, &q, length))
         goto err;
         goto err;
+    *pp = q;
     return ret;
     return ret;
  err:
  err:
     if (freeret) {
     if (freeret) {

+ 0 - 1
libs/openssl/crypto/bio/b_dump.c

@@ -104,7 +104,6 @@ int BIO_dump_indent_cb(int (*cb) (const void *data, size_t len, void *u),
     if ((rows * dump_width) < len)
     if ((rows * dump_width) < len)
         rows++;
         rows++;
     for (i = 0; i < rows; i++) {
     for (i = 0; i < rows; i++) {
-        buf[0] = '\0';          /* start with empty string */
         BUF_strlcpy(buf, str, sizeof buf);
         BUF_strlcpy(buf, str, sizeof buf);
         BIO_snprintf(tmp, sizeof tmp, "%04x - ", i * dump_width);
         BIO_snprintf(tmp, sizeof tmp, "%04x - ", i * dump_width);
         BUF_strlcat(buf, tmp, sizeof buf);
         BUF_strlcat(buf, tmp, sizeof buf);

+ 10 - 3
libs/openssl/crypto/bio/bss_file.c

@@ -115,9 +115,8 @@ static BIO_METHOD methods_filep = {
     NULL,
     NULL,
 };
 };
 
 
-BIO *BIO_new_file(const char *filename, const char *mode)
+static FILE *file_fopen(const char *filename, const char *mode)
 {
 {
-    BIO *ret;
     FILE *file = NULL;
     FILE *file = NULL;
 
 
 #  if defined(_WIN32) && defined(CP_UTF8)
 #  if defined(_WIN32) && defined(CP_UTF8)
@@ -164,6 +163,14 @@ BIO *BIO_new_file(const char *filename, const char *mode)
 #  else
 #  else
     file = fopen(filename, mode);
     file = fopen(filename, mode);
 #  endif
 #  endif
+    return (file);
+}
+
+BIO *BIO_new_file(const char *filename, const char *mode)
+{
+    BIO  *ret;
+    FILE *file = file_fopen(filename, mode);
+
     if (file == NULL) {
     if (file == NULL) {
         SYSerr(SYS_F_FOPEN, get_last_sys_error());
         SYSerr(SYS_F_FOPEN, get_last_sys_error());
         ERR_add_error_data(5, "fopen('", filename, "','", mode, "')");
         ERR_add_error_data(5, "fopen('", filename, "','", mode, "')");
@@ -386,7 +393,7 @@ static long MS_CALLBACK file_ctrl(BIO *b, int cmd, long num, void *ptr)
         else
         else
             strcat(p, "t");
             strcat(p, "t");
 #  endif
 #  endif
-        fp = fopen(ptr, p);
+        fp = file_fopen(ptr, p);
         if (fp == NULL) {
         if (fp == NULL) {
             SYSerr(SYS_F_FOPEN, get_last_sys_error());
             SYSerr(SYS_F_FOPEN, get_last_sys_error());
             ERR_add_error_data(5, "fopen('", ptr, "','", p, "')");
             ERR_add_error_data(5, "fopen('", ptr, "','", p, "')");

+ 4 - 3
libs/openssl/crypto/bn/bn_exp.c

@@ -599,12 +599,13 @@ int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
     bn_check_top(p);
     bn_check_top(p);
     bn_check_top(m);
     bn_check_top(m);
 
 
-    top = m->top;
-
-    if (!(m->d[0] & 1)) {
+    if (!BN_is_odd(m)) {
         BNerr(BN_F_BN_MOD_EXP_MONT_CONSTTIME, BN_R_CALLED_WITH_EVEN_MODULUS);
         BNerr(BN_F_BN_MOD_EXP_MONT_CONSTTIME, BN_R_CALLED_WITH_EVEN_MODULUS);
         return (0);
         return (0);
     }
     }
+
+    top = m->top;
+
     bits = BN_num_bits(p);
     bits = BN_num_bits(p);
     if (bits == 0) {
     if (bits == 0) {
         ret = BN_one(rr);
         ret = BN_one(rr);

+ 2 - 0
libs/openssl/crypto/bn/bn_gcd.c

@@ -583,6 +583,7 @@ static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *in,
          * BN_div_no_branch will be called eventually.
          * BN_div_no_branch will be called eventually.
          */
          */
         pB = &local_B;
         pB = &local_B;
+        local_B.flags = 0;
         BN_with_flags(pB, B, BN_FLG_CONSTTIME);
         BN_with_flags(pB, B, BN_FLG_CONSTTIME);
         if (!BN_nnmod(B, pB, A, ctx))
         if (!BN_nnmod(B, pB, A, ctx))
             goto err;
             goto err;
@@ -610,6 +611,7 @@ static BIGNUM *BN_mod_inverse_no_branch(BIGNUM *in,
          * BN_div_no_branch will be called eventually.
          * BN_div_no_branch will be called eventually.
          */
          */
         pA = &local_A;
         pA = &local_A;
+        local_A.flags = 0;
         BN_with_flags(pA, A, BN_FLG_CONSTTIME);
         BN_with_flags(pA, A, BN_FLG_CONSTTIME);
 
 
         /* (D, M) := (A/B, A%B) ... */
         /* (D, M) := (A/B, A%B) ... */

+ 7 - 4
libs/openssl/crypto/bn/bn_gf2m.c

@@ -576,7 +576,7 @@ int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[],
     bn_check_top(a);
     bn_check_top(a);
     BN_CTX_start(ctx);
     BN_CTX_start(ctx);
     if ((s = BN_CTX_get(ctx)) == NULL)
     if ((s = BN_CTX_get(ctx)) == NULL)
-        return 0;
+        goto err;
     if (!bn_wexpand(s, 2 * a->top))
     if (!bn_wexpand(s, 2 * a->top))
         goto err;
         goto err;
 
 
@@ -700,18 +700,21 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
         int top = p->top;
         int top = p->top;
         BN_ULONG *udp, *bdp, *vdp, *cdp;
         BN_ULONG *udp, *bdp, *vdp, *cdp;
 
 
-        bn_wexpand(u, top);
+        if (!bn_wexpand(u, top))
+            goto err;
         udp = u->d;
         udp = u->d;
         for (i = u->top; i < top; i++)
         for (i = u->top; i < top; i++)
             udp[i] = 0;
             udp[i] = 0;
         u->top = top;
         u->top = top;
-        bn_wexpand(b, top);
+        if (!bn_wexpand(b, top))
+          goto err;
         bdp = b->d;
         bdp = b->d;
         bdp[0] = 1;
         bdp[0] = 1;
         for (i = 1; i < top; i++)
         for (i = 1; i < top; i++)
             bdp[i] = 0;
             bdp[i] = 0;
         b->top = top;
         b->top = top;
-        bn_wexpand(c, top);
+        if (!bn_wexpand(c, top))
+          goto err;
         cdp = c->d;
         cdp = c->d;
         for (i = 0; i < top; i++)
         for (i = 0; i < top; i++)
             cdp[i] = 0;
             cdp[i] = 0;

+ 6 - 3
libs/openssl/crypto/bn/bn_mont.c

@@ -361,9 +361,9 @@ void BN_MONT_CTX_free(BN_MONT_CTX *mont)
     if (mont == NULL)
     if (mont == NULL)
         return;
         return;
 
 
-    BN_free(&(mont->RR));
-    BN_free(&(mont->N));
-    BN_free(&(mont->Ni));
+    BN_clear_free(&(mont->RR));
+    BN_clear_free(&(mont->N));
+    BN_clear_free(&(mont->Ni));
     if (mont->flags & BN_FLG_MALLOCED)
     if (mont->flags & BN_FLG_MALLOCED)
         OPENSSL_free(mont);
         OPENSSL_free(mont);
 }
 }
@@ -373,6 +373,9 @@ int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx)
     int ret = 0;
     int ret = 0;
     BIGNUM *Ri, *R;
     BIGNUM *Ri, *R;
 
 
+    if (BN_is_zero(mod))
+        return 0;
+
     BN_CTX_start(ctx);
     BN_CTX_start(ctx);
     if ((Ri = BN_CTX_get(ctx)) == NULL)
     if ((Ri = BN_CTX_get(ctx)) == NULL)
         goto err;
         goto err;

+ 3 - 1
libs/openssl/crypto/bn/bn_recp.c

@@ -152,8 +152,10 @@ int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
 
 
     if (BN_ucmp(m, &(recp->N)) < 0) {
     if (BN_ucmp(m, &(recp->N)) < 0) {
         BN_zero(d);
         BN_zero(d);
-        if (!BN_copy(r, m))
+        if (!BN_copy(r, m)) {
+            BN_CTX_end(ctx);
             return 0;
             return 0;
+        }
         BN_CTX_end(ctx);
         BN_CTX_end(ctx);
         return (1);
         return (1);
     }
     }

+ 5 - 2
libs/openssl/crypto/bn/bn_x931p.c

@@ -213,14 +213,14 @@ int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx)
      * exceeded.
      * exceeded.
      */
      */
     if (!BN_rand(Xp, nbits, 1, 0))
     if (!BN_rand(Xp, nbits, 1, 0))
-        return 0;
+        goto err;
 
 
     BN_CTX_start(ctx);
     BN_CTX_start(ctx);
     t = BN_CTX_get(ctx);
     t = BN_CTX_get(ctx);
 
 
     for (i = 0; i < 1000; i++) {
     for (i = 0; i < 1000; i++) {
         if (!BN_rand(Xq, nbits, 1, 0))
         if (!BN_rand(Xq, nbits, 1, 0))
-            return 0;
+            goto err;
         /* Check that |Xp - Xq| > 2^(nbits - 100) */
         /* Check that |Xp - Xq| > 2^(nbits - 100) */
         BN_sub(t, Xp, Xq);
         BN_sub(t, Xp, Xq);
         if (BN_num_bits(t) > (nbits - 100))
         if (BN_num_bits(t) > (nbits - 100))
@@ -234,6 +234,9 @@ int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx)
 
 
     return 0;
     return 0;
 
 
+ err:
+    BN_CTX_end(ctx);
+    return 0;
 }
 }
 
 
 /*
 /*

+ 14 - 7
libs/openssl/crypto/buffer/buf_str.c

@@ -58,12 +58,13 @@
 
 
 #include <stdio.h>
 #include <stdio.h>
 #include "cryptlib.h"
 #include "cryptlib.h"
+#include <limits.h>
 #include <openssl/buffer.h>
 #include <openssl/buffer.h>
 
 
 char *BUF_strdup(const char *str)
 char *BUF_strdup(const char *str)
 {
 {
     if (str == NULL)
     if (str == NULL)
-        return (NULL);
+        return NULL;
     return BUF_strndup(str, strlen(str));
     return BUF_strndup(str, strlen(str));
 }
 }
 
 
@@ -72,14 +73,20 @@ char *BUF_strndup(const char *str, size_t siz)
     char *ret;
     char *ret;
 
 
     if (str == NULL)
     if (str == NULL)
-        return (NULL);
+        return NULL;
+
+    if (siz >= INT_MAX)
+        return NULL;
 
 
     ret = OPENSSL_malloc(siz + 1);
     ret = OPENSSL_malloc(siz + 1);
     if (ret == NULL) {
     if (ret == NULL) {
         BUFerr(BUF_F_BUF_STRNDUP, ERR_R_MALLOC_FAILURE);
         BUFerr(BUF_F_BUF_STRNDUP, ERR_R_MALLOC_FAILURE);
-        return (NULL);
+        return NULL;
     }
     }
-    BUF_strlcpy(ret, str, siz + 1);
+
+    memcpy(ret, str, siz);
+    ret[siz] = '\0';
+
     return (ret);
     return (ret);
 }
 }
 
 
@@ -87,13 +94,13 @@ void *BUF_memdup(const void *data, size_t siz)
 {
 {
     void *ret;
     void *ret;
 
 
-    if (data == NULL)
-        return (NULL);
+    if (data == NULL || siz >= INT_MAX)
+        return NULL;
 
 
     ret = OPENSSL_malloc(siz);
     ret = OPENSSL_malloc(siz);
     if (ret == NULL) {
     if (ret == NULL) {
         BUFerr(BUF_F_BUF_MEMDUP, ERR_R_MALLOC_FAILURE);
         BUFerr(BUF_F_BUF_MEMDUP, ERR_R_MALLOC_FAILURE);
-        return (NULL);
+        return NULL;
     }
     }
     return memcpy(ret, data, siz);
     return memcpy(ret, data, siz);
 }
 }

+ 6 - 0
libs/openssl/crypto/buffer/buffer.h

@@ -85,7 +85,13 @@ void BUF_MEM_free(BUF_MEM *a);
 int BUF_MEM_grow(BUF_MEM *str, size_t len);
 int BUF_MEM_grow(BUF_MEM *str, size_t len);
 int BUF_MEM_grow_clean(BUF_MEM *str, size_t len);
 int BUF_MEM_grow_clean(BUF_MEM *str, size_t len);
 char *BUF_strdup(const char *str);
 char *BUF_strdup(const char *str);
+
+/*
+ * Like strndup, but in addition, explicitly guarantees to never read past the
+ * first |siz| bytes of |str|.
+ */
 char *BUF_strndup(const char *str, size_t siz);
 char *BUF_strndup(const char *str, size_t siz);
+
 void *BUF_memdup(const void *data, size_t siz);
 void *BUF_memdup(const void *data, size_t siz);
 void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz);
 void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz);
 
 

+ 2 - 2
libs/openssl/crypto/buildinf.h

@@ -9,11 +9,11 @@
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   #define CFLAGS "compiler: cl  /MD /Ox /O2 /Ob2 -DOPENSSL_THREADS  -DDSO_WIN32  -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE    "
   #define CFLAGS "compiler: cl  /MD /Ox /O2 /Ob2 -DOPENSSL_THREADS  -DDSO_WIN32  -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE    "
   #define PLATFORM "VC-WIN32"
   #define PLATFORM "VC-WIN32"
-  #define DATE "Mon Jul 20 10:57:37 2015"
+  #define DATE "Tue Dec  8 14:24:23 2015"
 #endif
 #endif
 #ifdef MK1MF_PLATFORM_BC_NT
 #ifdef MK1MF_PLATFORM_BC_NT
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   /* auto-generated/updated by util/mk1mf.pl for crypto/cversion.c */
   #define CFLAGS "compiler: bcc32 -DWIN32_LEAN_AND_MEAN -q -w-ccc -w-rch -w-pia -w-aus -w-par -w-inl  -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_stricmp=stricmp -D_strnicmp=strnicmp -D_timeb=timeb -D_ftime=ftime -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_DYNAMIC_ENGINE    "
   #define CFLAGS "compiler: bcc32 -DWIN32_LEAN_AND_MEAN -q -w-ccc -w-rch -w-pia -w-aus -w-par -w-inl  -c -tWC -tWM -DOPENSSL_SYSNAME_WIN32 -DL_ENDIAN -DDSO_WIN32 -D_stricmp=stricmp -D_strnicmp=strnicmp -D_timeb=timeb -D_ftime=ftime -O2 -ff -fp -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_DYNAMIC_ENGINE    "
   #define PLATFORM "BC-NT"
   #define PLATFORM "BC-NT"
-  #define DATE "Mon Jul 20 10:57:37 2015"
+  #define DATE "Tue Dec  8 14:24:23 2015"
 #endif
 #endif

+ 2 - 1
libs/openssl/crypto/comp/c_zlib.c

@@ -404,8 +404,9 @@ COMP_METHOD *COMP_zlib(void)
 void COMP_zlib_cleanup(void)
 void COMP_zlib_cleanup(void)
 {
 {
 #ifdef ZLIB_SHARED
 #ifdef ZLIB_SHARED
-    if (zlib_dso)
+    if (zlib_dso != NULL)
         DSO_free(zlib_dso);
         DSO_free(zlib_dso);
+    zlib_dso = NULL;
 #endif
 #endif
 }
 }
 
 

+ 1 - 2
libs/openssl/crypto/conf/conf_def.c

@@ -225,12 +225,11 @@ static int def_load_bio(CONF *conf, BIO *in, long *line)
         goto err;
         goto err;
     }
     }
 
 
-    section = (char *)OPENSSL_malloc(10);
+    section = BUF_strdup("default");
     if (section == NULL) {
     if (section == NULL) {
         CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE);
         CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE);
         goto err;
         goto err;
     }
     }
-    BUF_strlcpy(section, "default", 10);
 
 
     if (_CONF_new_data(conf) == 0) {
     if (_CONF_new_data(conf) == 0) {
         CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE);
         CONFerr(CONF_F_DEF_LOAD_BIO, ERR_R_MALLOC_FAILURE);

+ 1 - 0
libs/openssl/crypto/conf/conf_sap.c

@@ -90,6 +90,7 @@ void OPENSSL_config(const char *config_name)
     CONF_modules_load_file(NULL, config_name,
     CONF_modules_load_file(NULL, config_name,
                                CONF_MFLAGS_DEFAULT_SECTION |
                                CONF_MFLAGS_DEFAULT_SECTION |
                                CONF_MFLAGS_IGNORE_MISSING_FILE);
                                CONF_MFLAGS_IGNORE_MISSING_FILE);
+    openssl_configured = 1;
 }
 }
 
 
 void OPENSSL_no_config()
 void OPENSSL_no_config()

+ 21 - 5
libs/openssl/crypto/cryptlib.c

@@ -930,13 +930,29 @@ void OPENSSL_showfatal(const char *fmta, ...)
 # if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
 # if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333
     /* this -------------v--- guards NT-specific calls */
     /* this -------------v--- guards NT-specific calls */
     if (check_winnt() && OPENSSL_isservice() > 0) {
     if (check_winnt() && OPENSSL_isservice() > 0) {
-        HANDLE h = RegisterEventSource(0, _T("OPENSSL"));
-        const TCHAR *pmsg = buf;
-        ReportEvent(h, EVENTLOG_ERROR_TYPE, 0, 0, 0, 1, 0, &pmsg, 0);
-        DeregisterEventSource(h);
+        HANDLE hEventLog = RegisterEventSource(NULL, _T("OpenSSL"));
+
+        if (hEventLog != NULL) {
+            const TCHAR *pmsg = buf;
+
+            if (!ReportEvent(hEventLog, EVENTLOG_ERROR_TYPE, 0, 0, NULL,
+                             1, 0, &pmsg, NULL)) {
+#if defined(DEBUG)
+                /*
+                 * We are in a situation where we tried to report a critical
+                 * error and this failed for some reason. As a last resort,
+                 * in debug builds, send output to the debugger or any other
+                 * tool like DebugView which can monitor the output.
+                 */
+                OutputDebugString(pmsg);
+#endif
+            }
+
+            (void)DeregisterEventSource(hEventLog);
+        }
     } else
     } else
 # endif
 # endif
-        MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONSTOP);
+        MessageBox(NULL, buf, _T("OpenSSL: FATAL"), MB_OK | MB_ICONERROR);
 }
 }
 #else
 #else
 void OPENSSL_showfatal(const char *fmta, ...)
 void OPENSSL_showfatal(const char *fmta, ...)

+ 1 - 0
libs/openssl/crypto/dsa/dsa_ameth.c

@@ -318,6 +318,7 @@ static int dsa_priv_encode(PKCS8_PRIV_KEY_INFO *p8, const EVP_PKEY *pkey)
     dplen = i2d_ASN1_INTEGER(prkey, &dp);
     dplen = i2d_ASN1_INTEGER(prkey, &dp);
 
 
     ASN1_STRING_clear_free(prkey);
     ASN1_STRING_clear_free(prkey);
+    prkey = NULL;
 
 
     if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
     if (!PKCS8_pkey_set0(p8, OBJ_nid2obj(NID_dsa), 0,
                          V_ASN1_SEQUENCE, params, dp, dplen))
                          V_ASN1_SEQUENCE, params, dp, dplen))

+ 6 - 13
libs/openssl/crypto/dsa/dsa_gen.c

@@ -112,16 +112,8 @@ int DSA_generate_parameters_ex(DSA *ret, int bits,
     }
     }
 # endif
 # endif
     else {
     else {
-        const EVP_MD *evpmd;
-        size_t qbits = bits >= 2048 ? 256 : 160;
-
-        if (bits >= 2048) {
-            qbits = 256;
-            evpmd = EVP_sha256();
-        } else {
-            qbits = 160;
-            evpmd = EVP_sha1();
-        }
+        const EVP_MD *evpmd = bits >= 2048 ? EVP_sha256() : EVP_sha1();
+        size_t qbits = EVP_MD_size(evpmd) * 8;
 
 
         return dsa_builtin_paramgen(ret, bits, qbits, evpmd,
         return dsa_builtin_paramgen(ret, bits, qbits, evpmd,
                                     seed_in, seed_len, NULL, counter_ret,
                                     seed_in, seed_len, NULL, counter_ret,
@@ -174,13 +166,14 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,
     if (seed_in != NULL)
     if (seed_in != NULL)
         memcpy(seed, seed_in, seed_len);
         memcpy(seed, seed_in, seed_len);
 
 
-    if ((ctx = BN_CTX_new()) == NULL)
+    if ((mont = BN_MONT_CTX_new()) == NULL)
         goto err;
         goto err;
 
 
-    if ((mont = BN_MONT_CTX_new()) == NULL)
+    if ((ctx = BN_CTX_new()) == NULL)
         goto err;
         goto err;
 
 
     BN_CTX_start(ctx);
     BN_CTX_start(ctx);
+
     r0 = BN_CTX_get(ctx);
     r0 = BN_CTX_get(ctx);
     g = BN_CTX_get(ctx);
     g = BN_CTX_get(ctx);
     W = BN_CTX_get(ctx);
     W = BN_CTX_get(ctx);
@@ -201,7 +194,7 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,
             if (!BN_GENCB_call(cb, 0, m++))
             if (!BN_GENCB_call(cb, 0, m++))
                 goto err;
                 goto err;
 
 
-            if (!seed_len) {
+            if (!seed_len || !seed_in) {
                 if (RAND_pseudo_bytes(seed, qsize) < 0)
                 if (RAND_pseudo_bytes(seed, qsize) < 0)
                     goto err;
                     goto err;
                 seed_is_random = 1;
                 seed_is_random = 1;

+ 1 - 1
libs/openssl/crypto/ec/ec.h

@@ -106,7 +106,7 @@ typedef enum {
         /** the point is encoded as z||x, where the octet z specifies
         /** the point is encoded as z||x, where the octet z specifies
          *  which solution of the quadratic equation y is  */
          *  which solution of the quadratic equation y is  */
     POINT_CONVERSION_COMPRESSED = 2,
     POINT_CONVERSION_COMPRESSED = 2,
-        /** the point is encoded as z||x||y, where z is the octet 0x02  */
+        /** the point is encoded as z||x||y, where z is the octet 0x04  */
     POINT_CONVERSION_UNCOMPRESSED = 4,
     POINT_CONVERSION_UNCOMPRESSED = 4,
         /** the point is encoded as z||x||y, where the octet z specifies
         /** the point is encoded as z||x||y, where the octet z specifies
          *  which solution of the quadratic equation y is  */
          *  which solution of the quadratic equation y is  */

+ 6 - 2
libs/openssl/crypto/ec/ec_asn1.c

@@ -970,8 +970,9 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len)
 {
 {
     EC_GROUP *group = NULL;
     EC_GROUP *group = NULL;
     ECPKPARAMETERS *params = NULL;
     ECPKPARAMETERS *params = NULL;
+    const unsigned char *p = *in;
 
 
-    if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL) {
+    if ((params = d2i_ECPKPARAMETERS(NULL, &p, len)) == NULL) {
         ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE);
         ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE);
         ECPKPARAMETERS_free(params);
         ECPKPARAMETERS_free(params);
         return NULL;
         return NULL;
@@ -989,6 +990,7 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len)
         *a = group;
         *a = group;
 
 
     ECPKPARAMETERS_free(params);
     ECPKPARAMETERS_free(params);
+    *in = p;
     return (group);
     return (group);
 }
 }
 
 
@@ -1016,8 +1018,9 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)
     int ok = 0;
     int ok = 0;
     EC_KEY *ret = NULL;
     EC_KEY *ret = NULL;
     EC_PRIVATEKEY *priv_key = NULL;
     EC_PRIVATEKEY *priv_key = NULL;
+    const unsigned char *p = *in;
 
 
-    if ((priv_key = d2i_EC_PRIVATEKEY(NULL, in, len)) == NULL) {
+    if ((priv_key = d2i_EC_PRIVATEKEY(NULL, &p, len)) == NULL) {
         ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);
         ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);
         return NULL;
         return NULL;
     }
     }
@@ -1096,6 +1099,7 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)
 
 
     if (a)
     if (a)
         *a = ret;
         *a = ret;
+    *in = p;
     ok = 1;
     ok = 1;
  err:
  err:
     if (!ok) {
     if (!ok) {

+ 8 - 4
libs/openssl/crypto/ec/ec_key.c

@@ -366,7 +366,10 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
     BN_CTX *ctx = NULL;
     BN_CTX *ctx = NULL;
     BIGNUM *tx, *ty;
     BIGNUM *tx, *ty;
     EC_POINT *point = NULL;
     EC_POINT *point = NULL;
-    int ok = 0, tmp_nid, is_char_two = 0;
+    int ok = 0;
+#ifndef OPENSSL_NO_EC2M
+    int tmp_nid, is_char_two = 0;
+#endif
 
 
     if (!key || !key->group || !x || !y) {
     if (!key || !key->group || !x || !y) {
         ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES,
         ECerr(EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES,
@@ -382,14 +385,15 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
     if (!point)
     if (!point)
         goto err;
         goto err;
 
 
+    tx = BN_CTX_get(ctx);
+    ty = BN_CTX_get(ctx);
+
+#ifndef OPENSSL_NO_EC2M
     tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(key->group));
     tmp_nid = EC_METHOD_get_field_type(EC_GROUP_method_of(key->group));
 
 
     if (tmp_nid == NID_X9_62_characteristic_two_field)
     if (tmp_nid == NID_X9_62_characteristic_two_field)
         is_char_two = 1;
         is_char_two = 1;
 
 
-    tx = BN_CTX_get(ctx);
-    ty = BN_CTX_get(ctx);
-#ifndef OPENSSL_NO_EC2M
     if (is_char_two) {
     if (is_char_two) {
         if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point,
         if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point,
                                                   x, y, ctx))
                                                   x, y, ctx))

+ 1 - 1
libs/openssl/crypto/evp/e_des3.c

@@ -241,7 +241,7 @@ static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
     DES_cblock *deskey = (DES_cblock *)key;
     DES_cblock *deskey = (DES_cblock *)key;
 #  ifdef EVP_CHECK_DES_KEY
 #  ifdef EVP_CHECK_DES_KEY
     if (DES_set_key_checked(&deskey[0], &data(ctx)->ks1)
     if (DES_set_key_checked(&deskey[0], &data(ctx)->ks1)
-        ! !DES_set_key_checked(&deskey[1], &data(ctx)->ks2))
+        || DES_set_key_checked(&deskey[1], &data(ctx)->ks2))
         return 0;
         return 0;
 #  else
 #  else
     DES_set_key_unchecked(&deskey[0], &data(ctx)->ks1);
     DES_set_key_unchecked(&deskey[0], &data(ctx)->ks1);

+ 100 - 98
libs/openssl/crypto/evp/encode.c

@@ -60,9 +60,9 @@
 #include "cryptlib.h"
 #include "cryptlib.h"
 #include <openssl/evp.h>
 #include <openssl/evp.h>
 
 
+static unsigned char conv_ascii2bin(unsigned char a);
 #ifndef CHARSET_EBCDIC
 #ifndef CHARSET_EBCDIC
 # define conv_bin2ascii(a)       (data_bin2ascii[(a)&0x3f])
 # define conv_bin2ascii(a)       (data_bin2ascii[(a)&0x3f])
-# define conv_ascii2bin(a)       (data_ascii2bin[(a)&0x7f])
 #else
 #else
 /*
 /*
  * We assume that PEM encoded files are EBCDIC files (i.e., printable text
  * We assume that PEM encoded files are EBCDIC files (i.e., printable text
@@ -71,7 +71,6 @@
  * as the underlying textstring data_bin2ascii[] is already EBCDIC)
  * as the underlying textstring data_bin2ascii[] is already EBCDIC)
  */
  */
 # define conv_bin2ascii(a)       (data_bin2ascii[(a)&0x3f])
 # define conv_bin2ascii(a)       (data_bin2ascii[(a)&0x3f])
-# define conv_ascii2bin(a)       (data_ascii2bin[os_toascii[a]&0x7f])
 #endif
 #endif
 
 
 /*-
 /*-
@@ -103,6 +102,7 @@ abcdefghijklmnopqrstuvwxyz0123456789+/";
 #define B64_WS                  0xE0
 #define B64_WS                  0xE0
 #define B64_ERROR               0xFF
 #define B64_ERROR               0xFF
 #define B64_NOT_BASE64(a)       (((a)|0x13) == 0xF3)
 #define B64_NOT_BASE64(a)       (((a)|0x13) == 0xF3)
+#define B64_BASE64(a)           !B64_NOT_BASE64(a)
 
 
 static const unsigned char data_ascii2bin[128] = {
 static const unsigned char data_ascii2bin[128] = {
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -123,6 +123,23 @@ static const unsigned char data_ascii2bin[128] = {
     0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
     0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
 };
 };
 
 
+#ifndef CHARSET_EBCDIC
+static unsigned char conv_ascii2bin(unsigned char a)
+{
+    if (a & 0x80)
+        return B64_ERROR;
+    return data_ascii2bin[a];
+}
+#else
+static unsigned char conv_ascii2bin(unsigned char a)
+{
+    a = os_toascii[a];
+    if (a & 0x80)
+        return B64_ERROR;
+    return data_ascii2bin[a];
+}
+#endif
+
 void EVP_EncodeInit(EVP_ENCODE_CTX *ctx)
 void EVP_EncodeInit(EVP_ENCODE_CTX *ctx)
 {
 {
     ctx->length = 48;
     ctx->length = 48;
@@ -218,8 +235,9 @@ int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int dlen)
 
 
 void EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
 void EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
 {
 {
-    ctx->length = 30;
+    /* Only ctx->num is used during decoding. */
     ctx->num = 0;
     ctx->num = 0;
+    ctx->length = 0;
     ctx->line_num = 0;
     ctx->line_num = 0;
     ctx->expect_nl = 0;
     ctx->expect_nl = 0;
 }
 }
@@ -228,139 +246,123 @@ void EVP_DecodeInit(EVP_ENCODE_CTX *ctx)
  * -1 for error
  * -1 for error
  *  0 for last line
  *  0 for last line
  *  1 for full line
  *  1 for full line
+ *
+ * Note: even though EVP_DecodeUpdate attempts to detect and report end of
+ * content, the context doesn't currently remember it and will accept more data
+ * in the next call. Therefore, the caller is responsible for checking and
+ * rejecting a 0 return value in the middle of content.
+ *
+ * Note: even though EVP_DecodeUpdate has historically tried to detect end of
+ * content based on line length, this has never worked properly. Therefore,
+ * we now return 0 when one of the following is true:
+ *   - Padding or B64_EOF was detected and the last block is complete.
+ *   - Input has zero-length.
+ * -1 is returned if:
+ *   - Invalid characters are detected.
+ *   - There is extra trailing padding, or data after padding.
+ *   - B64_EOF is detected after an incomplete base64 block.
  */
  */
 int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
 int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,
                      const unsigned char *in, int inl)
                      const unsigned char *in, int inl)
 {
 {
-    int seof = -1, eof = 0, rv = -1, ret = 0, i, v, tmp, n, ln, exp_nl;
+    int seof = 0, eof = 0, rv = -1, ret = 0, i, v, tmp, n, decoded_len;
     unsigned char *d;
     unsigned char *d;
 
 
     n = ctx->num;
     n = ctx->num;
     d = ctx->enc_data;
     d = ctx->enc_data;
-    ln = ctx->line_num;
-    exp_nl = ctx->expect_nl;
 
 
-    /* last line of input. */
-    if ((inl == 0) || ((n == 0) && (conv_ascii2bin(in[0]) == B64_EOF))) {
+    if (n > 0 && d[n - 1] == '=') {
+        eof++;
+        if (n > 1 && d[n - 2] == '=')
+            eof++;
+    }
+
+     /* Legacy behaviour: an empty input chunk signals end of input. */
+    if (inl == 0) {
         rv = 0;
         rv = 0;
         goto end;
         goto end;
     }
     }
 
 
-    /* We parse the input data */
     for (i = 0; i < inl; i++) {
     for (i = 0; i < inl; i++) {
-        /* If the current line is > 80 characters, scream alot */
-        if (ln >= 80) {
-            rv = -1;
-            goto end;
-        }
-
-        /* Get char and put it into the buffer */
         tmp = *(in++);
         tmp = *(in++);
         v = conv_ascii2bin(tmp);
         v = conv_ascii2bin(tmp);
-        /* only save the good data :-) */
-        if (!B64_NOT_BASE64(v)) {
-            OPENSSL_assert(n < (int)sizeof(ctx->enc_data));
-            d[n++] = tmp;
-            ln++;
-        } else if (v == B64_ERROR) {
+        if (v == B64_ERROR) {
             rv = -1;
             rv = -1;
             goto end;
             goto end;
         }
         }
 
 
-        /*
-         * have we seen a '=' which is 'definitly' the last input line.  seof
-         * will point to the character that holds it. and eof will hold how
-         * many characters to chop off.
-         */
         if (tmp == '=') {
         if (tmp == '=') {
-            if (seof == -1)
-                seof = n;
             eof++;
             eof++;
+        } else if (eof > 0 && B64_BASE64(v)) {
+            /* More data after padding. */
+            rv = -1;
+            goto end;
         }
         }
 
 
-        if (v == B64_CR) {
-            ln = 0;
-            if (exp_nl)
-                continue;
+        if (eof > 2) {
+            rv = -1;
+            goto end;
         }
         }
 
 
-        /* eoln */
-        if (v == B64_EOLN) {
-            ln = 0;
-            if (exp_nl) {
-                exp_nl = 0;
-                continue;
-            }
-        }
-        exp_nl = 0;
-
-        /*
-         * If we are at the end of input and it looks like a line, process
-         * it.
-         */
-        if (((i + 1) == inl) && (((n & 3) == 0) || eof)) {
-            v = B64_EOF;
-            /*
-             * In case things were given us in really small records (so two
-             * '=' were given in separate updates), eof may contain the
-             * incorrect number of ending bytes to skip, so let's redo the
-             * count
-             */
-            eof = 0;
-            if (d[n - 1] == '=')
-                eof++;
-            if (d[n - 2] == '=')
-                eof++;
-            /* There will never be more than two '=' */
+        if (v == B64_EOF) {
+            seof = 1;
+            goto tail;
         }
         }
 
 
-        if ((v == B64_EOF && (n & 3) == 0) || (n >= 64)) {
-            /*
-             * This is needed to work correctly on 64 byte input lines.  We
-             * process the line and then need to accept the '\n'
-             */
-            if ((v != B64_EOF) && (n >= 64))
-                exp_nl = 1;
-            if (n > 0) {
-                v = EVP_DecodeBlock(out, d, n);
-                n = 0;
-                if (v < 0) {
-                    rv = 0;
-                    goto end;
-                }
-                if (eof > v) {
-                    rv = -1;
-                    goto end;
-                }
-                ret += (v - eof);
-            } else {
-                eof = 1;
-                v = 0;
+        /* Only save valid base64 characters. */
+        if (B64_BASE64(v)) {
+            if (n >= 64) {
+                /*
+                 * We increment n once per loop, and empty the buffer as soon as
+                 * we reach 64 characters, so this can only happen if someone's
+                 * manually messed with the ctx. Refuse to write any more data.
+                 */
+                rv = -1;
+                goto end;
             }
             }
+            OPENSSL_assert(n < (int)sizeof(ctx->enc_data));
+            d[n++] = tmp;
+        }
 
 
-            /*
-             * This is the case where we have had a short but valid input
-             * line
-             */
-            if ((v < ctx->length) && eof) {
-                rv = 0;
+        if (n == 64) {
+            decoded_len = EVP_DecodeBlock(out, d, n);
+            n = 0;
+            if (decoded_len < 0 || eof > decoded_len) {
+                rv = -1;
                 goto end;
                 goto end;
-            } else
-                ctx->length = v;
+            }
+            ret += decoded_len - eof;
+            out += decoded_len - eof;
+        }
+    }
 
 
-            if (seof >= 0) {
-                rv = 0;
+    /*
+     * Legacy behaviour: if the current line is a full base64-block (i.e., has
+     * 0 mod 4 base64 characters), it is processed immediately. We keep this
+     * behaviour as applications may not be calling EVP_DecodeFinal properly.
+     */
+tail:
+    if (n > 0) {
+        if ((n & 3) == 0) {
+            decoded_len = EVP_DecodeBlock(out, d, n);
+            n = 0;
+            if (decoded_len < 0 || eof > decoded_len) {
+                rv = -1;
                 goto end;
                 goto end;
             }
             }
-            out += v;
+            ret += (decoded_len - eof);
+        } else if (seof) {
+            /* EOF in the middle of a base64 block. */
+            rv = -1;
+            goto end;
         }
         }
     }
     }
-    rv = 1;
- end:
+
+    rv = seof || (n == 0 && eof) ? 0 : 1;
+end:
+    /* Legacy behaviour. This should probably rather be zeroed on error. */
     *outl = ret;
     *outl = ret;
     ctx->num = n;
     ctx->num = n;
-    ctx->line_num = ln;
-    ctx->expect_nl = exp_nl;
     return (rv);
     return (rv);
 }
 }
 
 

+ 4 - 2
libs/openssl/crypto/evp/evp_key.c

@@ -104,6 +104,8 @@ int EVP_read_pw_string_min(char *buf, int min, int len, const char *prompt,
     if ((prompt == NULL) && (prompt_string[0] != '\0'))
     if ((prompt == NULL) && (prompt_string[0] != '\0'))
         prompt = prompt_string;
         prompt = prompt_string;
     ui = UI_new();
     ui = UI_new();
+    if (ui == NULL)
+        return -1;
     UI_add_input_string(ui, prompt, 0, buf, min,
     UI_add_input_string(ui, prompt, 0, buf, min,
                         (len >= BUFSIZ) ? BUFSIZ - 1 : len);
                         (len >= BUFSIZ) ? BUFSIZ - 1 : len);
     if (verify)
     if (verify)
@@ -137,7 +139,7 @@ int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md,
     EVP_MD_CTX_init(&c);
     EVP_MD_CTX_init(&c);
     for (;;) {
     for (;;) {
         if (!EVP_DigestInit_ex(&c, md, NULL))
         if (!EVP_DigestInit_ex(&c, md, NULL))
-            return 0;
+            goto err;
         if (addmd++)
         if (addmd++)
             if (!EVP_DigestUpdate(&c, &(md_buf[0]), mds))
             if (!EVP_DigestUpdate(&c, &(md_buf[0]), mds))
                 goto err;
                 goto err;
@@ -188,6 +190,6 @@ int EVP_BytesToKey(const EVP_CIPHER *type, const EVP_MD *md,
     rv = type->key_len;
     rv = type->key_len;
  err:
  err:
     EVP_MD_CTX_cleanup(&c);
     EVP_MD_CTX_cleanup(&c);
-    OPENSSL_cleanse(&(md_buf[0]), EVP_MAX_MD_SIZE);
+    OPENSSL_cleanse(md_buf, sizeof(md_buf));
     return rv;
     return rv;
 }
 }

+ 27 - 6
libs/openssl/crypto/evp/evp_lib.c

@@ -67,9 +67,19 @@ int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
 
 
     if (c->cipher->set_asn1_parameters != NULL)
     if (c->cipher->set_asn1_parameters != NULL)
         ret = c->cipher->set_asn1_parameters(c, type);
         ret = c->cipher->set_asn1_parameters(c, type);
-    else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
-        ret = EVP_CIPHER_set_asn1_iv(c, type);
-    else
+    else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
+        switch (EVP_CIPHER_CTX_mode(c)) {
+
+        case EVP_CIPH_GCM_MODE:
+        case EVP_CIPH_CCM_MODE:
+        case EVP_CIPH_XTS_MODE:
+            ret = -1;
+            break;
+
+        default:
+            ret = EVP_CIPHER_set_asn1_iv(c, type);
+        }
+    } else
         ret = -1;
         ret = -1;
     return (ret);
     return (ret);
 }
 }
@@ -80,9 +90,20 @@ int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
 
 
     if (c->cipher->get_asn1_parameters != NULL)
     if (c->cipher->get_asn1_parameters != NULL)
         ret = c->cipher->get_asn1_parameters(c, type);
         ret = c->cipher->get_asn1_parameters(c, type);
-    else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
-        ret = EVP_CIPHER_get_asn1_iv(c, type);
-    else
+    else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
+        switch (EVP_CIPHER_CTX_mode(c)) {
+
+        case EVP_CIPH_GCM_MODE:
+        case EVP_CIPH_CCM_MODE:
+        case EVP_CIPH_XTS_MODE:
+            ret = -1;
+            break;
+
+        default:
+            ret = EVP_CIPHER_get_asn1_iv(c, type);
+            break;
+        }
+    } else
         ret = -1;
         ret = -1;
     return (ret);
     return (ret);
 }
 }

+ 12 - 4
libs/openssl/crypto/evp/evp_pbe.c

@@ -228,12 +228,16 @@ int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid,
                          int md_nid, EVP_PBE_KEYGEN *keygen)
                          int md_nid, EVP_PBE_KEYGEN *keygen)
 {
 {
     EVP_PBE_CTL *pbe_tmp;
     EVP_PBE_CTL *pbe_tmp;
-    if (!pbe_algs)
+
+    if (pbe_algs == NULL) {
         pbe_algs = sk_EVP_PBE_CTL_new(pbe_cmp);
         pbe_algs = sk_EVP_PBE_CTL_new(pbe_cmp);
-    if (!(pbe_tmp = (EVP_PBE_CTL *)OPENSSL_malloc(sizeof(EVP_PBE_CTL)))) {
-        EVPerr(EVP_F_EVP_PBE_ALG_ADD_TYPE, ERR_R_MALLOC_FAILURE);
-        return 0;
+        if (pbe_algs == NULL)
+            goto err;
     }
     }
+
+    if ((pbe_tmp = OPENSSL_malloc(sizeof(*pbe_tmp))) == NULL)
+        goto err;
+
     pbe_tmp->pbe_type = pbe_type;
     pbe_tmp->pbe_type = pbe_type;
     pbe_tmp->pbe_nid = pbe_nid;
     pbe_tmp->pbe_nid = pbe_nid;
     pbe_tmp->cipher_nid = cipher_nid;
     pbe_tmp->cipher_nid = cipher_nid;
@@ -242,6 +246,10 @@ int EVP_PBE_alg_add_type(int pbe_type, int pbe_nid, int cipher_nid,
 
 
     sk_EVP_PBE_CTL_push(pbe_algs, pbe_tmp);
     sk_EVP_PBE_CTL_push(pbe_algs, pbe_tmp);
     return 1;
     return 1;
+
+ err:
+    EVPerr(EVP_F_EVP_PBE_ALG_ADD_TYPE, ERR_R_MALLOC_FAILURE);
+    return 0;
 }
 }
 
 
 int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
 int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,

+ 1 - 1
libs/openssl/crypto/evp/p_lib.c

@@ -253,7 +253,7 @@ int EVP_PKEY_set_type_str(EVP_PKEY *pkey, const char *str, int len)
 
 
 int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
 int EVP_PKEY_assign(EVP_PKEY *pkey, int type, void *key)
 {
 {
-    if (!EVP_PKEY_set_type(pkey, type))
+    if (pkey == NULL || !EVP_PKEY_set_type(pkey, type))
         return 0;
         return 0;
     pkey->pkey.ptr = key;
     pkey->pkey.ptr = key;
     return (key != NULL);
     return (key != NULL);

+ 7 - 2
libs/openssl/crypto/evp/pmeth_gn.c

@@ -96,12 +96,17 @@ int EVP_PKEY_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey)
         return -1;
         return -1;
     }
     }
 
 
-    if (!ppkey)
+    if (ppkey == NULL)
         return -1;
         return -1;
 
 
-    if (!*ppkey)
+    if (*ppkey == NULL)
         *ppkey = EVP_PKEY_new();
         *ppkey = EVP_PKEY_new();
 
 
+    if (*ppkey == NULL) {
+        EVPerr(EVP_F_EVP_PKEY_PARAMGEN, ERR_R_MALLOC_FAILURE);
+        return -1;
+    }
+
     ret = ctx->pmeth->paramgen(ctx, *ppkey);
     ret = ctx->pmeth->paramgen(ctx, *ppkey);
     if (ret <= 0) {
     if (ret <= 0) {
         EVP_PKEY_free(*ppkey);
         EVP_PKEY_free(*ppkey);

+ 7 - 2
libs/openssl/crypto/hmac/hm_ameth.c

@@ -108,9 +108,14 @@ static int old_hmac_decode(EVP_PKEY *pkey,
     ASN1_OCTET_STRING *os;
     ASN1_OCTET_STRING *os;
     os = ASN1_OCTET_STRING_new();
     os = ASN1_OCTET_STRING_new();
     if (!os || !ASN1_OCTET_STRING_set(os, *pder, derlen))
     if (!os || !ASN1_OCTET_STRING_set(os, *pder, derlen))
-        return 0;
-    EVP_PKEY_assign(pkey, EVP_PKEY_HMAC, os);
+        goto err;
+    if (!EVP_PKEY_assign(pkey, EVP_PKEY_HMAC, os))
+        goto err;
     return 1;
     return 1;
+
+ err:
+    ASN1_OCTET_STRING_free(os);
+    return 0;
 }
 }
 
 
 static int old_hmac_encode(const EVP_PKEY *pkey, unsigned char **pder)
 static int old_hmac_encode(const EVP_PKEY *pkey, unsigned char **pder)

+ 4 - 0
libs/openssl/crypto/mem_clr.c

@@ -66,6 +66,10 @@ void OPENSSL_cleanse(void *ptr, size_t len)
 {
 {
     unsigned char *p = ptr;
     unsigned char *p = ptr;
     size_t loop = len, ctr = cleanse_ctr;
     size_t loop = len, ctr = cleanse_ctr;
+
+    if (ptr == NULL)
+        return;
+
     while (loop--) {
     while (loop--) {
         *(p++) = (unsigned char)ctr;
         *(p++) = (unsigned char)ctr;
         ctr += (17 + ((size_t)p & 0xF));
         ctr += (17 + ((size_t)p & 0xF));

+ 0 - 6
libs/openssl/crypto/ocsp/ocsp_lib.c

@@ -246,12 +246,6 @@ int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath,
     if ((p = strchr(p, ':'))) {
     if ((p = strchr(p, ':'))) {
         *p = 0;
         *p = 0;
         port = p + 1;
         port = p + 1;
-    } else {
-        /* Not found: set default port */
-        if (*pssl)
-            port = "443";
-        else
-            port = "80";
     }
     }
 
 
     *pport = BUF_strdup(port);
     *pport = BUF_strdup(port);

+ 1 - 2
libs/openssl/crypto/ocsp/ocsp_prn.c

@@ -212,8 +212,7 @@ int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE *o, unsigned long flags)
         return 1;
         return 1;
     }
     }
 
 
-    i = ASN1_STRING_length(rb->response);
-    if (!(br = OCSP_response_get1_basic(o)))
+    if ((br = OCSP_response_get1_basic(o)) == NULL)
         goto err;
         goto err;
     rd = br->tbsResponseData;
     rd = br->tbsResponseData;
     l = ASN1_INTEGER_get(rd->version);
     l = ASN1_INTEGER_get(rd->version);

+ 1 - 1
libs/openssl/crypto/opensslconf.h

@@ -208,7 +208,7 @@ extern "C" {
    optimization options.  Older Sparc's work better with only UNROLL, but
    optimization options.  Older Sparc's work better with only UNROLL, but
    there's no way to tell at compile time what it is you're running on */
    there's no way to tell at compile time what it is you're running on */
  
  
-#if defined( sun )		/* Newer Sparc's */
+#if defined( __sun ) || defined ( sun )		/* Newer Sparc's */
 #  define DES_PTR
 #  define DES_PTR
 #  define DES_RISC1
 #  define DES_RISC1
 #  define DES_UNROLL
 #  define DES_UNROLL

+ 3 - 3
libs/openssl/crypto/opensslv.h

@@ -30,11 +30,11 @@ extern "C" {
  * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
  * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
  *  major minor fix final patch/beta)
  *  major minor fix final patch/beta)
  */
  */
-# define OPENSSL_VERSION_NUMBER  0x1000110fL
+# define OPENSSL_VERSION_NUMBER  0x1000111fL
 # ifdef OPENSSL_FIPS
 # ifdef OPENSSL_FIPS
-#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1p-fips 9 Jul 2015"
+#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1q-fips 3 Dec 2015"
 # else
 # else
-#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1p 9 Jul 2015"
+#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1q 3 Dec 2015"
 # endif
 # endif
 # define OPENSSL_VERSION_PTEXT   " part of " OPENSSL_VERSION_TEXT
 # define OPENSSL_VERSION_PTEXT   " part of " OPENSSL_VERSION_TEXT
 
 

+ 6 - 0
libs/openssl/crypto/pem/pem_info.c

@@ -172,6 +172,8 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk,
             xi->enc_len = 0;
             xi->enc_len = 0;
 
 
             xi->x_pkey = X509_PKEY_new();
             xi->x_pkey = X509_PKEY_new();
+            if (xi->x_pkey == NULL)
+                goto err;
             ptype = EVP_PKEY_RSA;
             ptype = EVP_PKEY_RSA;
             pp = &xi->x_pkey->dec_pkey;
             pp = &xi->x_pkey->dec_pkey;
             if ((int)strlen(header) > 10) /* assume encrypted */
             if ((int)strlen(header) > 10) /* assume encrypted */
@@ -193,6 +195,8 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk,
             xi->enc_len = 0;
             xi->enc_len = 0;
 
 
             xi->x_pkey = X509_PKEY_new();
             xi->x_pkey = X509_PKEY_new();
+            if (xi->x_pkey == NULL)
+                goto err;
             ptype = EVP_PKEY_DSA;
             ptype = EVP_PKEY_DSA;
             pp = &xi->x_pkey->dec_pkey;
             pp = &xi->x_pkey->dec_pkey;
             if ((int)strlen(header) > 10) /* assume encrypted */
             if ((int)strlen(header) > 10) /* assume encrypted */
@@ -214,6 +218,8 @@ STACK_OF(X509_INFO) *PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk,
             xi->enc_len = 0;
             xi->enc_len = 0;
 
 
             xi->x_pkey = X509_PKEY_new();
             xi->x_pkey = X509_PKEY_new();
+            if (xi->x_pkey == NULL)
+                goto err;
             ptype = EVP_PKEY_EC;
             ptype = EVP_PKEY_EC;
             pp = &xi->x_pkey->dec_pkey;
             pp = &xi->x_pkey->dec_pkey;
             if ((int)strlen(header) > 10) /* assume encrypted */
             if ((int)strlen(header) > 10) /* assume encrypted */

+ 4 - 6
libs/openssl/crypto/pem/pvkfmt.c

@@ -624,13 +624,11 @@ static int do_PVK_header(const unsigned char **in, unsigned int length,
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_PVK_TOO_SHORT);
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_PVK_TOO_SHORT);
             return 0;
             return 0;
         }
         }
-        length -= 20;
     } else {
     } else {
         if (length < 24) {
         if (length < 24) {
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_PVK_TOO_SHORT);
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_PVK_TOO_SHORT);
             return 0;
             return 0;
         }
         }
-        length -= 24;
         pvk_magic = read_ledword(&p);
         pvk_magic = read_ledword(&p);
         if (pvk_magic != MS_PVKMAGIC) {
         if (pvk_magic != MS_PVKMAGIC) {
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_BAD_MAGIC_NUMBER);
             PEMerr(PEM_F_DO_PVK_HEADER, PEM_R_BAD_MAGIC_NUMBER);
@@ -692,23 +690,23 @@ static EVP_PKEY *do_PVK_body(const unsigned char **in,
             inlen = PEM_def_callback(psbuf, PEM_BUFSIZE, 0, u);
             inlen = PEM_def_callback(psbuf, PEM_BUFSIZE, 0, u);
         if (inlen <= 0) {
         if (inlen <= 0) {
             PEMerr(PEM_F_DO_PVK_BODY, PEM_R_BAD_PASSWORD_READ);
             PEMerr(PEM_F_DO_PVK_BODY, PEM_R_BAD_PASSWORD_READ);
-            return NULL;
+            goto err;
         }
         }
         enctmp = OPENSSL_malloc(keylen + 8);
         enctmp = OPENSSL_malloc(keylen + 8);
         if (!enctmp) {
         if (!enctmp) {
             PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE);
             PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE);
-            return NULL;
+            goto err;
         }
         }
         if (!derive_pvk_key(keybuf, p, saltlen,
         if (!derive_pvk_key(keybuf, p, saltlen,
                             (unsigned char *)psbuf, inlen))
                             (unsigned char *)psbuf, inlen))
-            return NULL;
+            goto err;
         p += saltlen;
         p += saltlen;
         /* Copy BLOBHEADER across, decrypt rest */
         /* Copy BLOBHEADER across, decrypt rest */
         memcpy(enctmp, p, 8);
         memcpy(enctmp, p, 8);
         p += 8;
         p += 8;
         if (keylen < 8) {
         if (keylen < 8) {
             PEMerr(PEM_F_DO_PVK_BODY, PEM_R_PVK_TOO_SHORT);
             PEMerr(PEM_F_DO_PVK_BODY, PEM_R_PVK_TOO_SHORT);
-            return NULL;
+            goto err;
         }
         }
         inlen = keylen - 8;
         inlen = keylen - 8;
         q = enctmp + 8;
         q = enctmp + 8;

+ 20 - 7
libs/openssl/crypto/pkcs12/p12_add.c

@@ -75,15 +75,19 @@ PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it,
     bag->type = OBJ_nid2obj(nid1);
     bag->type = OBJ_nid2obj(nid1);
     if (!ASN1_item_pack(obj, it, &bag->value.octet)) {
     if (!ASN1_item_pack(obj, it, &bag->value.octet)) {
         PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
-        return NULL;
+        goto err;
     }
     }
     if (!(safebag = PKCS12_SAFEBAG_new())) {
     if (!(safebag = PKCS12_SAFEBAG_new())) {
         PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, ERR_R_MALLOC_FAILURE);
-        return NULL;
+        goto err;
     }
     }
     safebag->value.bag = bag;
     safebag->value.bag = bag;
     safebag->type = OBJ_nid2obj(nid2);
     safebag->type = OBJ_nid2obj(nid2);
     return safebag;
     return safebag;
+
+ err:
+    PKCS12_BAGS_free(bag);
+    return NULL;
 }
 }
 
 
 /* Turn PKCS8 object into a keybag */
 /* Turn PKCS8 object into a keybag */
@@ -127,6 +131,7 @@ PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
           PKCS8_encrypt(pbe_nid, pbe_ciph, pass, passlen, salt, saltlen, iter,
           PKCS8_encrypt(pbe_nid, pbe_ciph, pass, passlen, salt, saltlen, iter,
                         p8))) {
                         p8))) {
         PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE);
+        PKCS12_SAFEBAG_free(bag);
         return NULL;
         return NULL;
     }
     }
 
 
@@ -144,14 +149,18 @@ PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk)
     p7->type = OBJ_nid2obj(NID_pkcs7_data);
     p7->type = OBJ_nid2obj(NID_pkcs7_data);
     if (!(p7->d.data = M_ASN1_OCTET_STRING_new())) {
     if (!(p7->d.data = M_ASN1_OCTET_STRING_new())) {
         PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE);
-        return NULL;
+        goto err;
     }
     }
 
 
     if (!ASN1_item_pack(sk, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), &p7->d.data)) {
     if (!ASN1_item_pack(sk, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), &p7->d.data)) {
         PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, PKCS12_R_CANT_PACK_STRUCTURE);
         PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, PKCS12_R_CANT_PACK_STRUCTURE);
-        return NULL;
+        goto err;
     }
     }
     return p7;
     return p7;
+
+ err:
+    PKCS7_free(p7);
+    return NULL;
 }
 }
 
 
 /* Unpack SAFEBAGS from PKCS#7 data ContentInfo */
 /* Unpack SAFEBAGS from PKCS#7 data ContentInfo */
@@ -181,7 +190,7 @@ PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
     if (!PKCS7_set_type(p7, NID_pkcs7_encrypted)) {
     if (!PKCS7_set_type(p7, NID_pkcs7_encrypted)) {
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA,
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA,
                   PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE);
                   PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE);
-        return NULL;
+        goto err;
     }
     }
 
 
     pbe_ciph = EVP_get_cipherbynid(pbe_nid);
     pbe_ciph = EVP_get_cipherbynid(pbe_nid);
@@ -193,7 +202,7 @@ PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
 
 
     if (!pbe) {
     if (!pbe) {
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE);
-        return NULL;
+        goto err;
     }
     }
     X509_ALGOR_free(p7->d.encrypted->enc_data->algorithm);
     X509_ALGOR_free(p7->d.encrypted->enc_data->algorithm);
     p7->d.encrypted->enc_data->algorithm = pbe;
     p7->d.encrypted->enc_data->algorithm = pbe;
@@ -202,10 +211,14 @@ PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
           PKCS12_item_i2d_encrypt(pbe, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), pass,
           PKCS12_item_i2d_encrypt(pbe, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), pass,
                                   passlen, bags, 1))) {
                                   passlen, bags, 1))) {
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, PKCS12_R_ENCRYPT_ERROR);
         PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, PKCS12_R_ENCRYPT_ERROR);
-        return NULL;
+        goto err;
     }
     }
 
 
     return p7;
     return p7;
+
+ err:
+    PKCS7_free(p7);
+    return NULL;
 }
 }
 
 
 STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass,
 STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass,

+ 3 - 0
libs/openssl/crypto/pkcs12/p12_crpt.c

@@ -77,6 +77,9 @@ int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
     const unsigned char *pbuf;
     const unsigned char *pbuf;
     unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
     unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
 
 
+    if (cipher == NULL)
+        return 0;
+
     /* Extract useful info from parameter */
     /* Extract useful info from parameter */
     if (param == NULL || param->type != V_ASN1_SEQUENCE ||
     if (param == NULL || param->type != V_ASN1_SEQUENCE ||
         param->value.sequence == NULL) {
         param->value.sequence == NULL) {

+ 2 - 2
libs/openssl/crypto/pkcs12/p12_mutl.c

@@ -173,11 +173,11 @@ int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, int saltlen,
     }
     }
     if (!saltlen)
     if (!saltlen)
         saltlen = PKCS12_SALT_LEN;
         saltlen = PKCS12_SALT_LEN;
-    p12->mac->salt->length = saltlen;
-    if (!(p12->mac->salt->data = OPENSSL_malloc(saltlen))) {
+    if ((p12->mac->salt->data = OPENSSL_malloc(saltlen)) == NULL) {
         PKCS12err(PKCS12_F_PKCS12_SETUP_MAC, ERR_R_MALLOC_FAILURE);
         PKCS12err(PKCS12_F_PKCS12_SETUP_MAC, ERR_R_MALLOC_FAILURE);
         return 0;
         return 0;
     }
     }
+    p12->mac->salt->length = saltlen;
     if (!salt) {
     if (!salt) {
         if (RAND_pseudo_bytes(p12->mac->salt->data, saltlen) < 0)
         if (RAND_pseudo_bytes(p12->mac->salt->data, saltlen) < 0)
             return 0;
             return 0;

+ 2 - 1
libs/openssl/crypto/pkcs7/pk7_doit.c

@@ -656,6 +656,8 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
             bio = BIO_new_mem_buf(data_body->data, data_body->length);
             bio = BIO_new_mem_buf(data_body->data, data_body->length);
         else {
         else {
             bio = BIO_new(BIO_s_mem());
             bio = BIO_new(BIO_s_mem());
+            if (bio == NULL)
+                goto err;
             BIO_set_mem_eof_return(bio, 0);
             BIO_set_mem_eof_return(bio, 0);
         }
         }
         if (bio == NULL)
         if (bio == NULL)
@@ -1156,7 +1158,6 @@ PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx)
     rsk = p7->d.signed_and_enveloped->recipientinfo;
     rsk = p7->d.signed_and_enveloped->recipientinfo;
     if (rsk == NULL)
     if (rsk == NULL)
         return NULL;
         return NULL;
-    ri = sk_PKCS7_RECIP_INFO_value(rsk, 0);
     if (sk_PKCS7_RECIP_INFO_num(rsk) <= idx)
     if (sk_PKCS7_RECIP_INFO_num(rsk) <= idx)
         return (NULL);
         return (NULL);
     ri = sk_PKCS7_RECIP_INFO_value(rsk, idx);
     ri = sk_PKCS7_RECIP_INFO_value(rsk, idx);

+ 1 - 1
libs/openssl/crypto/rsa/rsa_ameth.c

@@ -279,7 +279,7 @@ static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
     if (pss->maskGenAlgorithm) {
     if (pss->maskGenAlgorithm) {
         ASN1_TYPE *param = pss->maskGenAlgorithm->parameter;
         ASN1_TYPE *param = pss->maskGenAlgorithm->parameter;
         if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1
         if (OBJ_obj2nid(pss->maskGenAlgorithm->algorithm) == NID_mgf1
-            && param->type == V_ASN1_SEQUENCE) {
+            && param && param->type == V_ASN1_SEQUENCE) {
             p = param->value.sequence->data;
             p = param->value.sequence->data;
             plen = param->value.sequence->length;
             plen = param->value.sequence->length;
             *pmaskHash = d2i_X509_ALGOR(NULL, &p, plen);
             *pmaskHash = d2i_X509_ALGOR(NULL, &p, plen);

+ 3 - 1
libs/openssl/crypto/rsa/rsa_gen.c

@@ -69,6 +69,8 @@
 #include <openssl/rsa.h>
 #include <openssl/rsa.h>
 #ifdef OPENSSL_FIPS
 #ifdef OPENSSL_FIPS
 # include <openssl/fips.h>
 # include <openssl/fips.h>
+extern int FIPS_rsa_x931_generate_key_ex(RSA *rsa, int bits, BIGNUM *e,
+                                         BN_GENCB *cb);
 #endif
 #endif
 
 
 static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value,
 static int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value,
@@ -94,7 +96,7 @@ int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
         return rsa->meth->rsa_keygen(rsa, bits, e_value, cb);
         return rsa->meth->rsa_keygen(rsa, bits, e_value, cb);
 #ifdef OPENSSL_FIPS
 #ifdef OPENSSL_FIPS
     if (FIPS_mode())
     if (FIPS_mode())
-        return FIPS_rsa_generate_key_ex(rsa, bits, e_value, cb);
+        return FIPS_rsa_x931_generate_key_ex(rsa, bits, e_value, cb);
 #endif
 #endif
     return rsa_builtin_keygen(rsa, bits, e_value, cb);
     return rsa_builtin_keygen(rsa, bits, e_value, cb);
 }
 }

+ 5 - 6
libs/openssl/crypto/rsa/rsa_sign.c

@@ -218,14 +218,13 @@ int int_rsa_verify(int dtype, const unsigned char *m,
             memcpy(rm, s + 2, 16);
             memcpy(rm, s + 2, 16);
             *prm_len = 16;
             *prm_len = 16;
             ret = 1;
             ret = 1;
-        } else if (memcmp(m, s + 2, 16))
+        } else if (memcmp(m, s + 2, 16)) {
             RSAerr(RSA_F_INT_RSA_VERIFY, RSA_R_BAD_SIGNATURE);
             RSAerr(RSA_F_INT_RSA_VERIFY, RSA_R_BAD_SIGNATURE);
-        else
+        } else {
             ret = 1;
             ret = 1;
-    }
-
-    /* Special case: SSL signature */
-    if (dtype == NID_md5_sha1) {
+        }
+    } else if (dtype == NID_md5_sha1) {
+        /* Special case: SSL signature */
         if ((i != SSL_SIG_LENGTH) || memcmp(s, m, SSL_SIG_LENGTH))
         if ((i != SSL_SIG_LENGTH) || memcmp(s, m, SSL_SIG_LENGTH))
             RSAerr(RSA_F_INT_RSA_VERIFY, RSA_R_BAD_SIGNATURE);
             RSAerr(RSA_F_INT_RSA_VERIFY, RSA_R_BAD_SIGNATURE);
         else
         else

+ 25 - 9
libs/openssl/crypto/srp/srp_vfy.c

@@ -521,12 +521,12 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
                           char **verifier, const char *N, const char *g)
                           char **verifier, const char *N, const char *g)
 {
 {
     int len;
     int len;
-    char *result = NULL;
-    char *vf;
+    char *result = NULL, *vf = NULL;
     BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL;
     BIGNUM *N_bn = NULL, *g_bn = NULL, *s = NULL, *v = NULL;
     unsigned char tmp[MAX_LEN];
     unsigned char tmp[MAX_LEN];
     unsigned char tmp2[MAX_LEN];
     unsigned char tmp2[MAX_LEN];
     char *defgNid = NULL;
     char *defgNid = NULL;
+    int vfsize = 0;
 
 
     if ((user == NULL) ||
     if ((user == NULL) ||
         (pass == NULL) || (salt == NULL) || (verifier == NULL))
         (pass == NULL) || (salt == NULL) || (verifier == NULL))
@@ -564,22 +564,23 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
         goto err;
         goto err;
 
 
     BN_bn2bin(v, tmp);
     BN_bn2bin(v, tmp);
-    if (((vf = OPENSSL_malloc(BN_num_bytes(v) * 2)) == NULL))
+    vfsize = BN_num_bytes(v) * 2;
+    if (((vf = OPENSSL_malloc(vfsize)) == NULL))
         goto err;
         goto err;
     t_tob64(vf, tmp, BN_num_bytes(v));
     t_tob64(vf, tmp, BN_num_bytes(v));
 
 
-    *verifier = vf;
     if (*salt == NULL) {
     if (*salt == NULL) {
         char *tmp_salt;
         char *tmp_salt;
 
 
         if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) {
         if ((tmp_salt = OPENSSL_malloc(SRP_RANDOM_SALT_LEN * 2)) == NULL) {
-            OPENSSL_free(vf);
             goto err;
             goto err;
         }
         }
         t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN);
         t_tob64(tmp_salt, tmp2, SRP_RANDOM_SALT_LEN);
         *salt = tmp_salt;
         *salt = tmp_salt;
     }
     }
 
 
+    *verifier = vf;
+    vf = NULL;
     result = defgNid;
     result = defgNid;
 
 
  err:
  err:
@@ -587,11 +588,21 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,
         BN_free(N_bn);
         BN_free(N_bn);
         BN_free(g_bn);
         BN_free(g_bn);
     }
     }
+    OPENSSL_cleanse(vf, vfsize);
+    OPENSSL_free(vf);
+    BN_clear_free(s);
+    BN_clear_free(v);
     return result;
     return result;
 }
 }
 
 
 /*
 /*
- * create a verifier (*salt,*verifier,g and N are BIGNUMs)
+ * create a verifier (*salt,*verifier,g and N are BIGNUMs). If *salt != NULL
+ * then the provided salt will be used. On successful exit *verifier will point
+ * to a newly allocated BIGNUM containing the verifier and (if a salt was not
+ * provided) *salt will be populated with a newly allocated BIGNUM containing a
+ * random salt.
+ * The caller is responsible for freeing the allocated *salt and *verifier
+ * BIGNUMS.
  */
  */
 int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
 int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
                            BIGNUM **verifier, BIGNUM *N, BIGNUM *g)
                            BIGNUM **verifier, BIGNUM *N, BIGNUM *g)
@@ -600,6 +611,7 @@ int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
     BIGNUM *x = NULL;
     BIGNUM *x = NULL;
     BN_CTX *bn_ctx = BN_CTX_new();
     BN_CTX *bn_ctx = BN_CTX_new();
     unsigned char tmp2[MAX_LEN];
     unsigned char tmp2[MAX_LEN];
+    BIGNUM *salttmp = NULL;
 
 
     if ((user == NULL) ||
     if ((user == NULL) ||
         (pass == NULL) ||
         (pass == NULL) ||
@@ -614,10 +626,12 @@ int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
         if (RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN) < 0)
         if (RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN) < 0)
             goto err;
             goto err;
 
 
-        *salt = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);
+        salttmp = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);
+    } else {
+        salttmp = *salt;
     }
     }
 
 
-    x = SRP_Calc_x(*salt, user, pass);
+    x = SRP_Calc_x(salttmp, user, pass);
 
 
     *verifier = BN_new();
     *verifier = BN_new();
     if (*verifier == NULL)
     if (*verifier == NULL)
@@ -631,9 +645,11 @@ int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,
     srp_bn_print(*verifier);
     srp_bn_print(*verifier);
 
 
     result = 1;
     result = 1;
+    *salt = salttmp;
 
 
  err:
  err:
-
+    if (*salt != salttmp)
+        BN_clear_free(salttmp);
     BN_clear_free(x);
     BN_clear_free(x);
     BN_CTX_free(bn_ctx);
     BN_CTX_free(bn_ctx);
     return result;
     return result;

+ 1 - 1
libs/openssl/crypto/ts/ts_rsp_verify.c

@@ -522,7 +522,7 @@ static int TS_check_status_info(TS_RESP *response)
             if (ASN1_BIT_STRING_get_bit(info->failure_info,
             if (ASN1_BIT_STRING_get_bit(info->failure_info,
                                         TS_failure_info[i].code)) {
                                         TS_failure_info[i].code)) {
                 if (!first)
                 if (!first)
-                    strcpy(failure_text, ",");
+                    strcat(failure_text, ",");
                 else
                 else
                     first = 0;
                     first = 0;
                 strcat(failure_text, TS_failure_info[i].text);
                 strcat(failure_text, TS_failure_info[i].text);

+ 14 - 1
libs/openssl/crypto/x509/x509_cmp.c

@@ -179,11 +179,24 @@ unsigned long X509_subject_name_hash_old(X509 *x)
  */
  */
 int X509_cmp(const X509 *a, const X509 *b)
 int X509_cmp(const X509 *a, const X509 *b)
 {
 {
+    int rv;
+
     /* ensure hash is valid */
     /* ensure hash is valid */
     X509_check_purpose((X509 *)a, -1, 0);
     X509_check_purpose((X509 *)a, -1, 0);
     X509_check_purpose((X509 *)b, -1, 0);
     X509_check_purpose((X509 *)b, -1, 0);
 
 
-    return memcmp(a->sha1_hash, b->sha1_hash, SHA_DIGEST_LENGTH);
+    rv = memcmp(a->sha1_hash, b->sha1_hash, SHA_DIGEST_LENGTH);
+    if (rv)
+        return rv;
+    /* Check for match against stored encoding too */
+    if (!a->cert_info->enc.modified && !b->cert_info->enc.modified) {
+        rv = (int)(a->cert_info->enc.len - b->cert_info->enc.len);
+        if (rv)
+            return rv;
+        return memcmp(a->cert_info->enc.enc, b->cert_info->enc.enc,
+                      a->cert_info->enc.len);
+    }
+    return rv;
 }
 }
 #endif
 #endif
 
 

+ 0 - 2
libs/openssl/crypto/x509/x509_lu.c

@@ -523,8 +523,6 @@ STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
     X509_OBJECT *obj, xobj;
     X509_OBJECT *obj, xobj;
     sk = sk_X509_CRL_new_null();
     sk = sk_X509_CRL_new_null();
     CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
     CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
-    /* Check cache first */
-    idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
 
 
     /*
     /*
      * Always do lookup to possibly add new CRLs to cache
      * Always do lookup to possibly add new CRLs to cache

+ 4 - 0
libs/openssl/crypto/x509v3/v3_cpols.c

@@ -186,6 +186,10 @@ static STACK_OF(POLICYINFO) *r2i_certpol(X509V3_EXT_METHOD *method,
                 goto err;
                 goto err;
             }
             }
             pol = POLICYINFO_new();
             pol = POLICYINFO_new();
+            if (pol == NULL) {
+                X509V3err(X509V3_F_R2I_CERTPOL, ERR_R_MALLOC_FAILURE);
+                goto err;
+            }
             pol->policyid = pobj;
             pol->policyid = pobj;
         }
         }
         if (!sk_POLICYINFO_push(pols, pol)) {
         if (!sk_POLICYINFO_push(pols, pol)) {

+ 2 - 0
libs/openssl/crypto/x509v3/v3_ncons.c

@@ -132,6 +132,8 @@ static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method,
         }
         }
         tval.value = val->value;
         tval.value = val->value;
         sub = GENERAL_SUBTREE_new();
         sub = GENERAL_SUBTREE_new();
+        if (sub == NULL)
+            goto memerr;
         if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1))
         if (!v2i_GENERAL_NAME_ex(sub->base, method, ctx, &tval, 1))
             goto err;
             goto err;
         if (!*ptree)
         if (!*ptree)

+ 1 - 1
libs/openssl/crypto/x509v3/v3_pci.c

@@ -3,7 +3,7 @@
  * Contributed to the OpenSSL Project 2004 by Richard Levitte
  * Contributed to the OpenSSL Project 2004 by Richard Levitte
  * ([email protected])
  * ([email protected])
  */
  */
-/* Copyright (c) 2004 Kungliga Tekniska Högskolan
+/* Copyright (c) 2004 Kungliga Tekniska Högskolan
  * (Royal Institute of Technology, Stockholm, Sweden).
  * (Royal Institute of Technology, Stockholm, Sweden).
  * All rights reserved.
  * All rights reserved.
  *
  *

+ 1 - 1
libs/openssl/crypto/x509v3/v3_pcia.c

@@ -3,7 +3,7 @@
  * Contributed to the OpenSSL Project 2004 by Richard Levitte
  * Contributed to the OpenSSL Project 2004 by Richard Levitte
  * ([email protected])
  * ([email protected])
  */
  */
-/* Copyright (c) 2004 Kungliga Tekniska Högskolan
+/* Copyright (c) 2004 Kungliga Tekniska Högskolan
  * (Royal Institute of Technology, Stockholm, Sweden).
  * (Royal Institute of Technology, Stockholm, Sweden).
  * All rights reserved.
  * All rights reserved.
  *
  *

+ 4 - 4
libs/openssl/e_os.h

@@ -315,7 +315,7 @@ static __inline unsigned int _strlen31(const char *str)
 #    undef isxdigit
 #    undef isxdigit
 #   endif
 #   endif
 #   if defined(_MSC_VER) && !defined(_DLL) && defined(stdin)
 #   if defined(_MSC_VER) && !defined(_DLL) && defined(stdin)
-#    if _MSC_VER>=1300
+#    if _MSC_VER>=1300 && _MSC_VER<1600
 #     undef stdin
 #     undef stdin
 #     undef stdout
 #     undef stdout
 #     undef stderr
 #     undef stderr
@@ -323,7 +323,7 @@ FILE *__iob_func();
 #     define stdin  (&__iob_func()[0])
 #     define stdin  (&__iob_func()[0])
 #     define stdout (&__iob_func()[1])
 #     define stdout (&__iob_func()[1])
 #     define stderr (&__iob_func()[2])
 #     define stderr (&__iob_func()[2])
-#    elif defined(I_CAN_LIVE_WITH_LNK4049)
+#    elif _MSC_VER<1300 && defined(I_CAN_LIVE_WITH_LNK4049)
 #     undef stdin
 #     undef stdin
 #     undef stdout
 #     undef stdout
 #     undef stderr
 #     undef stderr
@@ -612,7 +612,7 @@ struct servent *PASCAL getservbyname(const char *, const char *);
 #    include <sys/select.h>
 #    include <sys/select.h>
 #   endif
 #   endif
 
 
-#   if defined(sun)
+#   if defined(__sun) || defined(sun)
 #    include <sys/filio.h>
 #    include <sys/filio.h>
 #   else
 #   else
 #    ifndef VMS
 #    ifndef VMS
@@ -654,7 +654,7 @@ struct servent *PASCAL getservbyname(const char *, const char *);
 
 
 # endif
 # endif
 
 
-# if defined(sun) && !defined(__svr4__) && !defined(__SVR4)
+# if (defined(__sun) || defined(sun)) && !defined(__svr4__) && !defined(__SVR4)
   /* include headers first, so our defines don't break it */
   /* include headers first, so our defines don't break it */
 #  include <stdlib.h>
 #  include <stdlib.h>
 #  include <string.h>
 #  include <string.h>

+ 4 - 0
libs/openssl/ssl/bio_ssl.c

@@ -419,6 +419,10 @@ static long ssl_ctrl(BIO *b, int cmd, long num, void *ptr)
             BIO_set_flags(b, BIO_FLAGS_IO_SPECIAL | BIO_FLAGS_SHOULD_RETRY);
             BIO_set_flags(b, BIO_FLAGS_IO_SPECIAL | BIO_FLAGS_SHOULD_RETRY);
             b->retry_reason = b->next_bio->retry_reason;
             b->retry_reason = b->next_bio->retry_reason;
             break;
             break;
+        case SSL_ERROR_WANT_X509_LOOKUP:
+            BIO_set_retry_special(b);
+            b->retry_reason = BIO_RR_SSL_X509_LOOKUP;
+            break;
         default:
         default:
             break;
             break;
         }
         }

+ 5 - 2
libs/openssl/ssl/d1_both.c

@@ -1490,9 +1490,12 @@ int dtls1_shutdown(SSL *s)
 {
 {
     int ret;
     int ret;
 #ifndef OPENSSL_NO_SCTP
 #ifndef OPENSSL_NO_SCTP
-    if (BIO_dgram_is_sctp(SSL_get_wbio(s)) &&
+    BIO *wbio;
+
+    wbio = SSL_get_wbio(s);
+    if (wbio != NULL && BIO_dgram_is_sctp(wbio) &&
         !(s->shutdown & SSL_SENT_SHUTDOWN)) {
         !(s->shutdown & SSL_SENT_SHUTDOWN)) {
-        ret = BIO_dgram_sctp_wait_for_dry(SSL_get_wbio(s));
+        ret = BIO_dgram_sctp_wait_for_dry(wbio);
         if (ret < 0)
         if (ret < 0)
             return -1;
             return -1;
 
 

+ 17 - 6
libs/openssl/ssl/d1_clnt.c

@@ -299,13 +299,12 @@ int dtls1_connect(SSL *s)
 #endif
 #endif
 
 
         case SSL3_ST_CW_CLNT_HELLO_A:
         case SSL3_ST_CW_CLNT_HELLO_A:
-        case SSL3_ST_CW_CLNT_HELLO_B:
-
             s->shutdown = 0;
             s->shutdown = 0;
 
 
             /* every DTLS ClientHello resets Finished MAC */
             /* every DTLS ClientHello resets Finished MAC */
             ssl3_init_finished_mac(s);
             ssl3_init_finished_mac(s);
 
 
+        case SSL3_ST_CW_CLNT_HELLO_B:
             dtls1_start_timer(s);
             dtls1_start_timer(s);
             ret = dtls1_client_hello(s);
             ret = dtls1_client_hello(s);
             if (ret <= 0)
             if (ret <= 0)
@@ -350,11 +349,15 @@ int dtls1_connect(SSL *s)
                              sizeof(DTLS1_SCTP_AUTH_LABEL),
                              sizeof(DTLS1_SCTP_AUTH_LABEL),
                              DTLS1_SCTP_AUTH_LABEL);
                              DTLS1_SCTP_AUTH_LABEL);
 
 
-                    SSL_export_keying_material(s, sctpauthkey,
+                    if (SSL_export_keying_material(s, sctpauthkey,
                                                sizeof(sctpauthkey),
                                                sizeof(sctpauthkey),
                                                labelbuffer,
                                                labelbuffer,
                                                sizeof(labelbuffer), NULL, 0,
                                                sizeof(labelbuffer), NULL, 0,
-                                               0);
+                                               0) <= 0) {
+                        ret = -1;
+                        s->state = SSL_ST_ERR;
+                        goto end;
+                    }
 
 
                     BIO_ctrl(SSL_get_wbio(s),
                     BIO_ctrl(SSL_get_wbio(s),
                              BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                              BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
@@ -362,6 +365,10 @@ int dtls1_connect(SSL *s)
 #endif
 #endif
 
 
                     s->state = SSL3_ST_CR_FINISHED_A;
                     s->state = SSL3_ST_CR_FINISHED_A;
+                    if (s->tlsext_ticket_expected) {
+                        /* receive renewed session ticket */
+                        s->state = SSL3_ST_CR_SESSION_TICKET_A;
+                    }
                 } else
                 } else
                     s->state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
                     s->state = DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
             }
             }
@@ -484,9 +491,13 @@ int dtls1_connect(SSL *s)
             snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
             snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
                      DTLS1_SCTP_AUTH_LABEL);
                      DTLS1_SCTP_AUTH_LABEL);
 
 
-            SSL_export_keying_material(s, sctpauthkey,
+            if (SSL_export_keying_material(s, sctpauthkey,
                                        sizeof(sctpauthkey), labelbuffer,
                                        sizeof(sctpauthkey), labelbuffer,
-                                       sizeof(labelbuffer), NULL, 0, 0);
+                                       sizeof(labelbuffer), NULL, 0, 0) <= 0) {
+                ret = -1;
+                s->state = SSL_ST_ERR;
+                goto end;
+            }
 
 
             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                      sizeof(sctpauthkey), sctpauthkey);
                      sizeof(sctpauthkey), sctpauthkey);

+ 26 - 5
libs/openssl/ssl/d1_srvr.c

@@ -267,6 +267,19 @@ int dtls1_accept(SSL *s)
                 ssl3_init_finished_mac(s);
                 ssl3_init_finished_mac(s);
                 s->state = SSL3_ST_SR_CLNT_HELLO_A;
                 s->state = SSL3_ST_SR_CLNT_HELLO_A;
                 s->ctx->stats.sess_accept++;
                 s->ctx->stats.sess_accept++;
+            } else if (!s->s3->send_connection_binding &&
+                       !(s->options &
+                         SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION)) {
+                /*
+                 * Server attempting to renegotiate with client that doesn't
+                 * support secure renegotiation.
+                 */
+                SSLerr(SSL_F_DTLS1_ACCEPT,
+                       SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED);
+                ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
+                ret = -1;
+                s->state = SSL_ST_ERR;
+                goto end;
             } else {
             } else {
                 /*
                 /*
                  * s->state == SSL_ST_RENEGOTIATE, we will just send a
                  * s->state == SSL_ST_RENEGOTIATE, we will just send a
@@ -405,9 +418,13 @@ int dtls1_accept(SSL *s)
                 snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
                 snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
                          DTLS1_SCTP_AUTH_LABEL);
                          DTLS1_SCTP_AUTH_LABEL);
 
 
-                SSL_export_keying_material(s, sctpauthkey,
-                                           sizeof(sctpauthkey), labelbuffer,
-                                           sizeof(labelbuffer), NULL, 0, 0);
+                if (SSL_export_keying_material(s, sctpauthkey,
+                        sizeof(sctpauthkey), labelbuffer,
+                        sizeof(labelbuffer), NULL, 0, 0) <= 0) {
+                    ret = -1;
+                    s->state = SSL_ST_ERR;
+                    goto end;
+                }
 
 
                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                 BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                          sizeof(sctpauthkey), sctpauthkey);
                          sizeof(sctpauthkey), sctpauthkey);
@@ -628,9 +645,13 @@ int dtls1_accept(SSL *s)
             snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
             snprintf((char *)labelbuffer, sizeof(DTLS1_SCTP_AUTH_LABEL),
                      DTLS1_SCTP_AUTH_LABEL);
                      DTLS1_SCTP_AUTH_LABEL);
 
 
-            SSL_export_keying_material(s, sctpauthkey,
+            if (SSL_export_keying_material(s, sctpauthkey,
                                        sizeof(sctpauthkey), labelbuffer,
                                        sizeof(sctpauthkey), labelbuffer,
-                                       sizeof(labelbuffer), NULL, 0, 0);
+                                       sizeof(labelbuffer), NULL, 0, 0) <= 0) {
+                ret = -1;
+                s->state = SSL_ST_ERR;
+                goto end;
+            }
 
 
             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
             BIO_ctrl(SSL_get_wbio(s), BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY,
                      sizeof(sctpauthkey), sctpauthkey);
                      sizeof(sctpauthkey), sctpauthkey);

+ 7 - 14
libs/openssl/ssl/s23_clnt.c

@@ -373,12 +373,13 @@ static int ssl23_client_hello(SSL *s)
 
 
     buf = (unsigned char *)s->init_buf->data;
     buf = (unsigned char *)s->init_buf->data;
     if (s->state == SSL23_ST_CW_CLNT_HELLO_A) {
     if (s->state == SSL23_ST_CW_CLNT_HELLO_A) {
-#if 0
-        /* don't reuse session-id's */
+        /*
+         * Since we're sending s23 client hello, we're not reusing a session, as
+         * we'd be using the method from the saved session instead
+         */
         if (!ssl_get_new_session(s, 0)) {
         if (!ssl_get_new_session(s, 0)) {
-            return (-1);
+            return -1;
         }
         }
-#endif
 
 
         p = s->s3->client_random;
         p = s->s3->client_random;
         if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0)
         if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0)
@@ -439,9 +440,6 @@ static int ssl23_client_hello(SSL *s)
             /*
             /*
              * put in the session-id length (zero since there is no reuse)
              * put in the session-id length (zero since there is no reuse)
              */
              */
-#if 0
-            s->session->session_id_length = 0;
-#endif
             s2n(0, d);
             s2n(0, d);
 
 
             if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
             if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG)
@@ -729,6 +727,8 @@ static int ssl23_get_server_hello(SSL *s)
             goto err;
             goto err;
         }
         }
 
 
+        s->session->ssl_version = s->version;
+
         /* ensure that TLS_MAX_VERSION is up-to-date */
         /* ensure that TLS_MAX_VERSION is up-to-date */
         OPENSSL_assert(s->version <= TLS_MAX_VERSION);
         OPENSSL_assert(s->version <= TLS_MAX_VERSION);
 
 
@@ -784,13 +784,6 @@ static int ssl23_get_server_hello(SSL *s)
     }
     }
     s->init_num = 0;
     s->init_num = 0;
 
 
-    /*
-     * Since, if we are sending a ssl23 client hello, we are not reusing a
-     * session-id
-     */
-    if (!ssl_get_new_session(s, 0))
-        goto err;
-
     return (SSL_connect(s));
     return (SSL_connect(s));
  err:
  err:
     return (-1);
     return (-1);

+ 30 - 15
libs/openssl/ssl/s3_cbc.c

@@ -411,8 +411,9 @@ char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx)
  * functions, above, we know that data_plus_mac_size is large enough to contain
  * functions, above, we know that data_plus_mac_size is large enough to contain
  * a padding byte and MAC. (If the padding was invalid, it might contain the
  * a padding byte and MAC. (If the padding was invalid, it might contain the
  * padding too. )
  * padding too. )
+ * Returns 1 on success or 0 on error
  */
  */
-void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
+int ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
                             unsigned char *md_out,
                             unsigned char *md_out,
                             size_t *md_out_size,
                             size_t *md_out_size,
                             const unsigned char header[13],
                             const unsigned char header[13],
@@ -455,7 +456,8 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
 
 
     switch (EVP_MD_CTX_type(ctx)) {
     switch (EVP_MD_CTX_type(ctx)) {
     case NID_md5:
     case NID_md5:
-        MD5_Init((MD5_CTX *)md_state.c);
+        if (MD5_Init((MD5_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_md5_final_raw;
         md_final_raw = tls1_md5_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))MD5_Transform;
             (void (*)(void *ctx, const unsigned char *block))MD5_Transform;
@@ -464,7 +466,8 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
         length_is_big_endian = 0;
         length_is_big_endian = 0;
         break;
         break;
     case NID_sha1:
     case NID_sha1:
-        SHA1_Init((SHA_CTX *)md_state.c);
+        if (SHA1_Init((SHA_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_sha1_final_raw;
         md_final_raw = tls1_sha1_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))SHA1_Transform;
             (void (*)(void *ctx, const unsigned char *block))SHA1_Transform;
@@ -472,14 +475,16 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
         break;
         break;
 #ifndef OPENSSL_NO_SHA256
 #ifndef OPENSSL_NO_SHA256
     case NID_sha224:
     case NID_sha224:
-        SHA224_Init((SHA256_CTX *)md_state.c);
+        if (SHA224_Init((SHA256_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_sha256_final_raw;
         md_final_raw = tls1_sha256_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))SHA256_Transform;
             (void (*)(void *ctx, const unsigned char *block))SHA256_Transform;
         md_size = 224 / 8;
         md_size = 224 / 8;
         break;
         break;
     case NID_sha256:
     case NID_sha256:
-        SHA256_Init((SHA256_CTX *)md_state.c);
+        if (SHA256_Init((SHA256_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_sha256_final_raw;
         md_final_raw = tls1_sha256_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))SHA256_Transform;
             (void (*)(void *ctx, const unsigned char *block))SHA256_Transform;
@@ -488,7 +493,8 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
 #endif
 #endif
 #ifndef OPENSSL_NO_SHA512
 #ifndef OPENSSL_NO_SHA512
     case NID_sha384:
     case NID_sha384:
-        SHA384_Init((SHA512_CTX *)md_state.c);
+        if (SHA384_Init((SHA512_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_sha512_final_raw;
         md_final_raw = tls1_sha512_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))SHA512_Transform;
             (void (*)(void *ctx, const unsigned char *block))SHA512_Transform;
@@ -497,7 +503,8 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
         md_length_size = 16;
         md_length_size = 16;
         break;
         break;
     case NID_sha512:
     case NID_sha512:
-        SHA512_Init((SHA512_CTX *)md_state.c);
+        if (SHA512_Init((SHA512_CTX *)md_state.c) <= 0)
+            return 0;
         md_final_raw = tls1_sha512_final_raw;
         md_final_raw = tls1_sha512_final_raw;
         md_transform =
         md_transform =
             (void (*)(void *ctx, const unsigned char *block))SHA512_Transform;
             (void (*)(void *ctx, const unsigned char *block))SHA512_Transform;
@@ -514,7 +521,7 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
         OPENSSL_assert(0);
         OPENSSL_assert(0);
         if (md_out_size)
         if (md_out_size)
             *md_out_size = -1;
             *md_out_size = -1;
-        return;
+        return 0;
     }
     }
 
 
     OPENSSL_assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
     OPENSSL_assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
@@ -652,7 +659,7 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
              */
              */
             if (header_length <= md_block_size) {
             if (header_length <= md_block_size) {
                 /* Should never happen */
                 /* Should never happen */
-                return;
+                return 0;
             }
             }
             overhang = header_length - md_block_size;
             overhang = header_length - md_block_size;
             md_transform(md_state.c, header);
             md_transform(md_state.c, header);
@@ -733,26 +740,34 @@ void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
     }
     }
 
 
     EVP_MD_CTX_init(&md_ctx);
     EVP_MD_CTX_init(&md_ctx);
-    EVP_DigestInit_ex(&md_ctx, ctx->digest, NULL /* engine */ );
+    if (EVP_DigestInit_ex(&md_ctx, ctx->digest, NULL /* engine */ ) <= 0)
+        goto err;
     if (is_sslv3) {
     if (is_sslv3) {
         /* We repurpose |hmac_pad| to contain the SSLv3 pad2 block. */
         /* We repurpose |hmac_pad| to contain the SSLv3 pad2 block. */
         memset(hmac_pad, 0x5c, sslv3_pad_length);
         memset(hmac_pad, 0x5c, sslv3_pad_length);
 
 
-        EVP_DigestUpdate(&md_ctx, mac_secret, mac_secret_length);
-        EVP_DigestUpdate(&md_ctx, hmac_pad, sslv3_pad_length);
-        EVP_DigestUpdate(&md_ctx, mac_out, md_size);
+        if (EVP_DigestUpdate(&md_ctx, mac_secret, mac_secret_length) <= 0
+                || EVP_DigestUpdate(&md_ctx, hmac_pad, sslv3_pad_length) <= 0
+                || EVP_DigestUpdate(&md_ctx, mac_out, md_size) <= 0)
+            goto err;
     } else {
     } else {
         /* Complete the HMAC in the standard manner. */
         /* Complete the HMAC in the standard manner. */
         for (i = 0; i < md_block_size; i++)
         for (i = 0; i < md_block_size; i++)
             hmac_pad[i] ^= 0x6a;
             hmac_pad[i] ^= 0x6a;
 
 
-        EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size);
-        EVP_DigestUpdate(&md_ctx, mac_out, md_size);
+        if (EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size) <= 0
+                || EVP_DigestUpdate(&md_ctx, mac_out, md_size) <= 0)
+            goto err;
     }
     }
     EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
     EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
     if (md_out_size)
     if (md_out_size)
         *md_out_size = md_out_size_u;
         *md_out_size = md_out_size_u;
     EVP_MD_CTX_cleanup(&md_ctx);
     EVP_MD_CTX_cleanup(&md_ctx);
+
+    return 1;
+err:
+    EVP_MD_CTX_cleanup(&md_ctx);
+    return 0;
 }
 }
 
 
 #ifdef OPENSSL_FIPS
 #ifdef OPENSSL_FIPS

+ 84 - 35
libs/openssl/ssl/s3_clnt.c

@@ -1624,6 +1624,12 @@ int ssl3_get_key_exchange(SSL *s)
         }
         }
         p += i;
         p += i;
 
 
+        if (BN_is_zero(dh->p)) {
+            SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_P_VALUE);
+            goto f_err;
+        }
+
+
         if (2 > n - param_len) {
         if (2 > n - param_len) {
             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
             goto f_err;
             goto f_err;
@@ -1644,6 +1650,11 @@ int ssl3_get_key_exchange(SSL *s)
         }
         }
         p += i;
         p += i;
 
 
+        if (BN_is_zero(dh->g)) {
+            SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_G_VALUE);
+            goto f_err;
+        }
+
         if (2 > n - param_len) {
         if (2 > n - param_len) {
             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
             SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_LENGTH_TOO_SHORT);
             goto f_err;
             goto f_err;
@@ -1665,6 +1676,11 @@ int ssl3_get_key_exchange(SSL *s)
         p += i;
         p += i;
         n -= param_len;
         n -= param_len;
 
 
+        if (BN_is_zero(dh->pub_key)) {
+            SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, SSL_R_BAD_DH_PUB_KEY_VALUE);
+            goto f_err;
+        }
+
 # ifndef OPENSSL_NO_RSA
 # ifndef OPENSSL_NO_RSA
         if (alg_a & SSL_aRSA)
         if (alg_a & SSL_aRSA)
             pkey =
             pkey =
@@ -1867,14 +1883,20 @@ int ssl3_get_key_exchange(SSL *s)
             q = md_buf;
             q = md_buf;
             for (num = 2; num > 0; num--) {
             for (num = 2; num > 0; num--) {
                 EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
                 EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-                EVP_DigestInit_ex(&md_ctx, (num == 2)
-                                  ? s->ctx->md5 : s->ctx->sha1, NULL);
-                EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]),
-                                 SSL3_RANDOM_SIZE);
-                EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]),
-                                 SSL3_RANDOM_SIZE);
-                EVP_DigestUpdate(&md_ctx, param, param_len);
-                EVP_DigestFinal_ex(&md_ctx, q, &size);
+                if (EVP_DigestInit_ex(&md_ctx,
+                                      (num == 2) ? s->ctx->md5 : s->ctx->sha1,
+                                      NULL) <= 0
+                        || EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]),
+                                            SSL3_RANDOM_SIZE) <= 0
+                        || EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]),
+                                            SSL3_RANDOM_SIZE) <= 0
+                        || EVP_DigestUpdate(&md_ctx, param, param_len) <= 0
+                        || EVP_DigestFinal_ex(&md_ctx, q, &size) <= 0) {
+                    SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
+                           ERR_R_INTERNAL_ERROR);
+                    al = SSL_AD_INTERNAL_ERROR;
+                    goto f_err;
+                }
                 q += size;
                 q += size;
                 j += size;
                 j += size;
             }
             }
@@ -1893,12 +1915,16 @@ int ssl3_get_key_exchange(SSL *s)
         } else
         } else
 #endif
 #endif
         {
         {
-            EVP_VerifyInit_ex(&md_ctx, md, NULL);
-            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_VerifyInit_ex(&md_ctx, md, NULL) <= 0
+                    || EVP_VerifyUpdate(&md_ctx, &(s->s3->client_random[0]),
+                                        SSL3_RANDOM_SIZE) <= 0
+                    || EVP_VerifyUpdate(&md_ctx, &(s->s3->server_random[0]),
+                                        SSL3_RANDOM_SIZE) <= 0
+                    || EVP_VerifyUpdate(&md_ctx, param, param_len) <= 0) {
+                al = SSL_AD_INTERNAL_ERROR;
+                SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE, ERR_R_EVP_LIB);
+                goto f_err;
+            }
             if (EVP_VerifyFinal(&md_ctx, p, (int)n, pkey) <= 0) {
             if (EVP_VerifyFinal(&md_ctx, p, (int)n, pkey) <= 0) {
                 /* bad signature */
                 /* bad signature */
                 al = SSL_AD_DECRYPT_ERROR;
                 al = SSL_AD_DECRYPT_ERROR;
@@ -2118,6 +2144,7 @@ int ssl3_get_new_session_ticket(SSL *s)
     long n;
     long n;
     const unsigned char *p;
     const unsigned char *p;
     unsigned char *d;
     unsigned char *d;
+    unsigned long ticket_lifetime_hint;
 
 
     n = s->method->ssl_get_message(s,
     n = s->method->ssl_get_message(s,
                                    SSL3_ST_CR_SESSION_TICKET_A,
                                    SSL3_ST_CR_SESSION_TICKET_A,
@@ -2136,6 +2163,19 @@ int ssl3_get_new_session_ticket(SSL *s)
 
 
     p = d = (unsigned char *)s->init_msg;
     p = d = (unsigned char *)s->init_msg;
 
 
+    n2l(p, ticket_lifetime_hint);
+    n2s(p, ticklen);
+    /* ticket_lifetime_hint + ticket_length + ticket */
+    if (ticklen + 6 != n) {
+        al = SSL_AD_DECODE_ERROR;
+        SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH);
+        goto f_err;
+    }
+
+    /* Server is allowed to change its mind and send an empty ticket. */
+    if (ticklen == 0)
+        return 1;
+
     if (s->session->session_id_length > 0) {
     if (s->session->session_id_length > 0) {
         int i = s->session_ctx->session_cache_mode;
         int i = s->session_ctx->session_cache_mode;
         SSL_SESSION *new_sess;
         SSL_SESSION *new_sess;
@@ -2167,14 +2207,6 @@ int ssl3_get_new_session_ticket(SSL *s)
         s->session = new_sess;
         s->session = new_sess;
     }
     }
 
 
-    n2l(p, s->session->tlsext_tick_lifetime_hint);
-    n2s(p, ticklen);
-    /* ticket_lifetime_hint + ticket_length + ticket */
-    if (ticklen + 6 != n) {
-        al = SSL_AD_DECODE_ERROR;
-        SSLerr(SSL_F_SSL3_GET_NEW_SESSION_TICKET, SSL_R_LENGTH_MISMATCH);
-        goto f_err;
-    }
     if (s->session->tlsext_tick) {
     if (s->session->tlsext_tick) {
         OPENSSL_free(s->session->tlsext_tick);
         OPENSSL_free(s->session->tlsext_tick);
         s->session->tlsext_ticklen = 0;
         s->session->tlsext_ticklen = 0;
@@ -2185,6 +2217,7 @@ int ssl3_get_new_session_ticket(SSL *s)
         goto err;
         goto err;
     }
     }
     memcpy(s->session->tlsext_tick, p, ticklen);
     memcpy(s->session->tlsext_tick, p, ticklen);
+    s->session->tlsext_tick_lifetime_hint = ticket_lifetime_hint;
     s->session->tlsext_ticklen = ticklen;
     s->session->tlsext_ticklen = ticklen;
     /*
     /*
      * There are two ways to detect a resumed ticket session. One is to set
      * There are two ways to detect a resumed ticket session. One is to set
@@ -2354,6 +2387,7 @@ int ssl3_send_client_key_exchange(SSL *s)
                     || (pkey->pkey.rsa == NULL)) {
                     || (pkey->pkey.rsa == NULL)) {
                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
                     SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
                            ERR_R_INTERNAL_ERROR);
                            ERR_R_INTERNAL_ERROR);
+                    EVP_PKEY_free(pkey);
                     goto err;
                     goto err;
                 }
                 }
                 rsa = pkey->pkey.rsa;
                 rsa = pkey->pkey.rsa;
@@ -2801,6 +2835,11 @@ int ssl3_send_client_key_exchange(SSL *s)
 
 
             pkey_ctx = EVP_PKEY_CTX_new(pub_key =
             pkey_ctx = EVP_PKEY_CTX_new(pub_key =
                                         X509_get_pubkey(peer_cert), NULL);
                                         X509_get_pubkey(peer_cert), NULL);
+            if (pkey_ctx == NULL) {
+                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
+                       ERR_R_MALLOC_FAILURE);
+                goto err;
+            }
             /*
             /*
              * If we have send a certificate, and certificate key
              * If we have send a certificate, and certificate key
              *
              *
@@ -2810,10 +2849,13 @@ int ssl3_send_client_key_exchange(SSL *s)
 
 
             /* Otherwise, generate ephemeral key pair */
             /* Otherwise, generate ephemeral key pair */
 
 
-            EVP_PKEY_encrypt_init(pkey_ctx);
-            /* Generate session key */
-            if (RAND_bytes(premaster_secret, 32) <= 0) {
+            if (pkey_ctx == NULL
+                    || EVP_PKEY_encrypt_init(pkey_ctx) <= 0
+                    /* Generate session key */
+                    || RAND_bytes(premaster_secret, 32) <= 0) {
                 EVP_PKEY_CTX_free(pkey_ctx);
                 EVP_PKEY_CTX_free(pkey_ctx);
+                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
+                       ERR_R_INTERNAL_ERROR);
                 goto err;
                 goto err;
             }
             }
             /*
             /*
@@ -2834,13 +2876,18 @@ int ssl3_send_client_key_exchange(SSL *s)
              * data
              * data
              */
              */
             ukm_hash = EVP_MD_CTX_create();
             ukm_hash = EVP_MD_CTX_create();
-            EVP_DigestInit(ukm_hash,
-                           EVP_get_digestbynid(NID_id_GostR3411_94));
-            EVP_DigestUpdate(ukm_hash, s->s3->client_random,
-                             SSL3_RANDOM_SIZE);
-            EVP_DigestUpdate(ukm_hash, s->s3->server_random,
-                             SSL3_RANDOM_SIZE);
-            EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len);
+            if (EVP_DigestInit(ukm_hash,
+                               EVP_get_digestbynid(NID_id_GostR3411_94)) <= 0
+                    || EVP_DigestUpdate(ukm_hash, s->s3->client_random,
+                                        SSL3_RANDOM_SIZE) <= 0
+                    || EVP_DigestUpdate(ukm_hash, s->s3->server_random,
+                                        SSL3_RANDOM_SIZE) <= 0
+                    || EVP_DigestFinal_ex(ukm_hash, shared_ukm, &md_len) <= 0) {
+                EVP_MD_CTX_destroy(ukm_hash);
+                SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
+                       ERR_R_INTERNAL_ERROR);
+                goto err;
+            }
             EVP_MD_CTX_destroy(ukm_hash);
             EVP_MD_CTX_destroy(ukm_hash);
             if (EVP_PKEY_CTX_ctrl
             if (EVP_PKEY_CTX_ctrl
                 (pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, EVP_PKEY_CTRL_SET_IV, 8,
                 (pkey_ctx, -1, EVP_PKEY_OP_ENCRYPT, EVP_PKEY_CTRL_SET_IV, 8,
@@ -2856,7 +2903,7 @@ int ssl3_send_client_key_exchange(SSL *s)
             *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED;
             *(p++) = V_ASN1_SEQUENCE | V_ASN1_CONSTRUCTED;
             msglen = 255;
             msglen = 255;
             if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, premaster_secret, 32)
             if (EVP_PKEY_encrypt(pkey_ctx, tmp, &msglen, premaster_secret, 32)
-                < 0) {
+                <= 0) {
                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
                 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
                        SSL_R_LIBRARY_BUG);
                        SSL_R_LIBRARY_BUG);
                 goto err;
                 goto err;
@@ -3057,7 +3104,10 @@ int ssl3_send_client_verify(SSL *s)
         pkey = s->cert->key->privatekey;
         pkey = s->cert->key->privatekey;
 /* Create context from key and test if sha1 is allowed as digest */
 /* Create context from key and test if sha1 is allowed as digest */
         pctx = EVP_PKEY_CTX_new(pkey, NULL);
         pctx = EVP_PKEY_CTX_new(pkey, NULL);
-        EVP_PKEY_sign_init(pctx);
+        if (pctx == NULL || EVP_PKEY_sign_init(pctx) <= 0) {
+            SSLerr(SSL_F_SSL3_SEND_CLIENT_VERIFY, ERR_R_INTERNAL_ERROR);
+            goto err;
+        }
         if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) {
         if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) > 0) {
             if (TLS1_get_version(s) < TLS1_2_VERSION)
             if (TLS1_get_version(s) < TLS1_2_VERSION)
                 s->method->ssl3_enc->cert_verify_mac(s,
                 s->method->ssl3_enc->cert_verify_mac(s,
@@ -3194,7 +3244,6 @@ int ssl3_send_client_certificate(SSL *s)
          * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP;
          * If we get an error, we need to ssl->rwstate=SSL_X509_LOOKUP;
          * return(-1); We then get retied later
          * return(-1); We then get retied later
          */
          */
-        i = 0;
         i = ssl_do_client_cert_cb(s, &x509, &pkey);
         i = ssl_do_client_cert_cb(s, &x509, &pkey);
         if (i < 0) {
         if (i < 0) {
             s->rwstate = SSL_X509_LOOKUP;
             s->rwstate = SSL_X509_LOOKUP;

+ 63 - 45
libs/openssl/ssl/s3_enc.c

@@ -253,7 +253,10 @@ int ssl3_change_cipher_state(SSL *s, int which)
             EVP_CIPHER_CTX_init(s->enc_read_ctx);
             EVP_CIPHER_CTX_init(s->enc_read_ctx);
         dd = s->enc_read_ctx;
         dd = s->enc_read_ctx;
 
 
-        ssl_replace_hash(&s->read_hash, m);
+        if (ssl_replace_hash(&s->read_hash, m) == NULL) {
+                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
+                goto err2;
+        }
 #ifndef OPENSSL_NO_COMP
 #ifndef OPENSSL_NO_COMP
         /* COMPRESS */
         /* COMPRESS */
         if (s->expand != NULL) {
         if (s->expand != NULL) {
@@ -288,7 +291,10 @@ int ssl3_change_cipher_state(SSL *s, int which)
              */
              */
             EVP_CIPHER_CTX_init(s->enc_write_ctx);
             EVP_CIPHER_CTX_init(s->enc_write_ctx);
         dd = s->enc_write_ctx;
         dd = s->enc_write_ctx;
-        ssl_replace_hash(&s->write_hash, m);
+        if (ssl_replace_hash(&s->write_hash, m) == NULL) {
+                SSLerr(SSL_F_SSL3_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
+                goto err2;
+        }
 #ifndef OPENSSL_NO_COMP
 #ifndef OPENSSL_NO_COMP
         /* COMPRESS */
         /* COMPRESS */
         if (s->compress != NULL) {
         if (s->compress != NULL) {
@@ -674,19 +680,21 @@ static int ssl3_handshake_mac(SSL *s, int md_nid,
         return 0;
         return 0;
 
 
     npad = (48 / n) * n;
     npad = (48 / n) * n;
-    if (sender != NULL)
-        EVP_DigestUpdate(&ctx, sender, len);
-    EVP_DigestUpdate(&ctx, s->session->master_key,
-                     s->session->master_key_length);
-    EVP_DigestUpdate(&ctx, ssl3_pad_1, npad);
-    EVP_DigestFinal_ex(&ctx, md_buf, &i);
-
-    EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL);
-    EVP_DigestUpdate(&ctx, s->session->master_key,
-                     s->session->master_key_length);
-    EVP_DigestUpdate(&ctx, ssl3_pad_2, npad);
-    EVP_DigestUpdate(&ctx, md_buf, i);
-    EVP_DigestFinal_ex(&ctx, p, &ret);
+    if ((sender != NULL && EVP_DigestUpdate(&ctx, sender, len) <= 0)
+            || EVP_DigestUpdate(&ctx, s->session->master_key,
+                                s->session->master_key_length) <= 0
+            || EVP_DigestUpdate(&ctx, ssl3_pad_1, npad) <= 0
+            || EVP_DigestFinal_ex(&ctx, md_buf, &i) <= 0
+
+            || EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL) <= 0
+            || EVP_DigestUpdate(&ctx, s->session->master_key,
+                                s->session->master_key_length) <= 0
+            || EVP_DigestUpdate(&ctx, ssl3_pad_2, npad) <= 0
+            || EVP_DigestUpdate(&ctx, md_buf, i) <= 0
+            || EVP_DigestFinal_ex(&ctx, p, &ret) <= 0) {
+        SSLerr(SSL_F_SSL3_HANDSHAKE_MAC, ERR_R_INTERNAL_ERROR);
+        ret = 0;
+    }
 
 
     EVP_MD_CTX_cleanup(&ctx);
     EVP_MD_CTX_cleanup(&ctx);
 
 
@@ -758,33 +766,36 @@ int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
         header[j++] = rec->length & 0xff;
         header[j++] = rec->length & 0xff;
 
 
         /* Final param == is SSLv3 */
         /* Final param == is SSLv3 */
-        ssl3_cbc_digest_record(hash,
-                               md, &md_size,
-                               header, rec->input,
-                               rec->length + md_size, orig_len,
-                               mac_sec, md_size, 1);
+        if (ssl3_cbc_digest_record(hash,
+                                   md, &md_size,
+                                   header, rec->input,
+                                   rec->length + md_size, orig_len,
+                                   mac_sec, md_size, 1) <= 0)
+            return -1;
     } else {
     } else {
         unsigned int md_size_u;
         unsigned int md_size_u;
         /* Chop the digest off the end :-) */
         /* Chop the digest off the end :-) */
         EVP_MD_CTX_init(&md_ctx);
         EVP_MD_CTX_init(&md_ctx);
 
 
-        EVP_MD_CTX_copy_ex(&md_ctx, hash);
-        EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
-        EVP_DigestUpdate(&md_ctx, ssl3_pad_1, npad);
-        EVP_DigestUpdate(&md_ctx, seq, 8);
         rec_char = rec->type;
         rec_char = rec->type;
-        EVP_DigestUpdate(&md_ctx, &rec_char, 1);
         p = md;
         p = md;
         s2n(rec->length, p);
         s2n(rec->length, p);
-        EVP_DigestUpdate(&md_ctx, md, 2);
-        EVP_DigestUpdate(&md_ctx, rec->input, rec->length);
-        EVP_DigestFinal_ex(&md_ctx, md, NULL);
-
-        EVP_MD_CTX_copy_ex(&md_ctx, hash);
-        EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
-        EVP_DigestUpdate(&md_ctx, ssl3_pad_2, npad);
-        EVP_DigestUpdate(&md_ctx, md, md_size);
-        EVP_DigestFinal_ex(&md_ctx, md, &md_size_u);
+        if (EVP_MD_CTX_copy_ex(&md_ctx, hash) <= 0
+                || EVP_DigestUpdate(&md_ctx, mac_sec, md_size) <= 0
+                || EVP_DigestUpdate(&md_ctx, ssl3_pad_1, npad) <= 0
+                || EVP_DigestUpdate(&md_ctx, seq, 8) <= 0
+                || EVP_DigestUpdate(&md_ctx, &rec_char, 1) <= 0
+                || EVP_DigestUpdate(&md_ctx, md, 2) <= 0
+                || EVP_DigestUpdate(&md_ctx, rec->input, rec->length) <= 0
+                || EVP_DigestFinal_ex(&md_ctx, md, NULL) <= 0
+                || EVP_MD_CTX_copy_ex(&md_ctx, hash) <= 0
+                || EVP_DigestUpdate(&md_ctx, mac_sec, md_size) <= 0
+                || EVP_DigestUpdate(&md_ctx, ssl3_pad_2, npad) <= 0
+                || EVP_DigestUpdate(&md_ctx, md, md_size) <= 0
+                || EVP_DigestFinal_ex(&md_ctx, md, &md_size_u) <= 0) {
+            EVP_MD_CTX_cleanup(&md_ctx);
+            return -1;
+        }
         md_size = md_size_u;
         md_size = md_size_u;
 
 
         EVP_MD_CTX_cleanup(&md_ctx);
         EVP_MD_CTX_cleanup(&md_ctx);
@@ -826,17 +837,24 @@ int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
 
 
     EVP_MD_CTX_init(&ctx);
     EVP_MD_CTX_init(&ctx);
     for (i = 0; i < 3; i++) {
     for (i = 0; i < 3; i++) {
-        EVP_DigestInit_ex(&ctx, s->ctx->sha1, NULL);
-        EVP_DigestUpdate(&ctx, salt[i], strlen((const char *)salt[i]));
-        EVP_DigestUpdate(&ctx, p, len);
-        EVP_DigestUpdate(&ctx, &(s->s3->client_random[0]), SSL3_RANDOM_SIZE);
-        EVP_DigestUpdate(&ctx, &(s->s3->server_random[0]), SSL3_RANDOM_SIZE);
-        EVP_DigestFinal_ex(&ctx, buf, &n);
-
-        EVP_DigestInit_ex(&ctx, s->ctx->md5, NULL);
-        EVP_DigestUpdate(&ctx, p, len);
-        EVP_DigestUpdate(&ctx, buf, n);
-        EVP_DigestFinal_ex(&ctx, out, &n);
+        if (EVP_DigestInit_ex(&ctx, s->ctx->sha1, NULL) <= 0
+                || EVP_DigestUpdate(&ctx, salt[i],
+                                    strlen((const char *)salt[i])) <= 0
+                || EVP_DigestUpdate(&ctx, p, len) <= 0
+                || EVP_DigestUpdate(&ctx, &(s->s3->client_random[0]),
+                                    SSL3_RANDOM_SIZE) <= 0
+                || EVP_DigestUpdate(&ctx, &(s->s3->server_random[0]),
+                                    SSL3_RANDOM_SIZE) <= 0
+                || EVP_DigestFinal_ex(&ctx, buf, &n) <= 0
+
+                || EVP_DigestInit_ex(&ctx, s->ctx->md5, NULL) <= 0
+                || EVP_DigestUpdate(&ctx, p, len) <= 0
+                || EVP_DigestUpdate(&ctx, buf, n) <= 0
+                || EVP_DigestFinal_ex(&ctx, out, &n) <= 0) {
+            SSLerr(SSL_F_SSL3_GENERATE_MASTER_SECRET, ERR_R_INTERNAL_ERROR);
+            ret = 0;
+            break;
+        }
         out += n;
         out += n;
         ret += n;
         ret += n;
     }
     }

+ 1 - 1
libs/openssl/ssl/s3_lib.c

@@ -2955,7 +2955,7 @@ int ssl3_new(SSL *s)
 
 
 void ssl3_free(SSL *s)
 void ssl3_free(SSL *s)
 {
 {
-    if (s == NULL)
+    if (s == NULL || s->s3 == NULL)
         return;
         return;
 
 
 #ifdef TLSEXT_TYPE_opaque_prf_input
 #ifdef TLSEXT_TYPE_opaque_prf_input

+ 51 - 27
libs/openssl/ssl/s3_srvr.c

@@ -383,7 +383,6 @@ int ssl3_accept(SSL *s)
                      */
                      */
                     if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY)
                     if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY)
                         SSLerr(SSL_F_SSL3_ACCEPT, SSL_R_CLIENTHELLO_TLSEXT);
                         SSLerr(SSL_F_SSL3_ACCEPT, SSL_R_CLIENTHELLO_TLSEXT);
-                    ret = SSL_TLSEXT_ERR_ALERT_FATAL;
                     ret = -1;
                     ret = -1;
                     s->state = SSL_ST_ERR;
                     s->state = SSL_ST_ERR;
                     goto end;
                     goto end;
@@ -967,7 +966,7 @@ int ssl3_check_client_hello(SSL *s)
 
 
 int ssl3_get_client_hello(SSL *s)
 int ssl3_get_client_hello(SSL *s)
 {
 {
-    int i, j, ok, al, ret = -1;
+    int i, j, ok, al, ret = -1, cookie_valid = 0;
     unsigned int cookie_len;
     unsigned int cookie_len;
     long n;
     long n;
     unsigned long id;
     unsigned long id;
@@ -1155,8 +1154,7 @@ int ssl3_get_client_hello(SSL *s)
                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_COOKIE_MISMATCH);
                 SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_COOKIE_MISMATCH);
                 goto f_err;
                 goto f_err;
             }
             }
-
-            ret = 2;
+            cookie_valid = 1;
         }
         }
 
 
         p += cookie_len;
         p += cookie_len;
@@ -1264,7 +1262,7 @@ int ssl3_get_client_hello(SSL *s)
 #ifndef OPENSSL_NO_TLSEXT
 #ifndef OPENSSL_NO_TLSEXT
     /* TLS extensions */
     /* TLS extensions */
     if (s->version >= SSL3_VERSION) {
     if (s->version >= SSL3_VERSION) {
-        if (!ssl_parse_clienthello_tlsext(s, &p, d, n, &al)) {
+        if (!ssl_parse_clienthello_tlsext(s, &p, d + n, &al)) {
             /* 'al' set by ssl_parse_clienthello_tlsext */
             /* 'al' set by ssl_parse_clienthello_tlsext */
             SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT);
             SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO, SSL_R_PARSE_TLSEXT);
             goto f_err;
             goto f_err;
@@ -1492,8 +1490,7 @@ int ssl3_get_client_hello(SSL *s)
         }
         }
     }
     }
 
 
-    if (ret < 0)
-        ret = 1;
+    ret = cookie_valid ? 2 : 1;
     if (0) {
     if (0) {
  f_err:
  f_err:
         ssl3_send_alert(s, SSL3_AL_FATAL, al);
         ssl3_send_alert(s, SSL3_AL_FATAL, al);
@@ -1503,7 +1500,7 @@ int ssl3_get_client_hello(SSL *s)
 
 
     if (ciphers != NULL)
     if (ciphers != NULL)
         sk_SSL_CIPHER_free(ciphers);
         sk_SSL_CIPHER_free(ciphers);
-    return (ret);
+    return ret;
 }
 }
 
 
 int ssl3_send_server_hello(SSL *s)
 int ssl3_send_server_hello(SSL *s)
@@ -1987,14 +1984,22 @@ int ssl3_send_server_key_exchange(SSL *s)
                 for (num = 2; num > 0; num--) {
                 for (num = 2; num > 0; num--) {
                     EVP_MD_CTX_set_flags(&md_ctx,
                     EVP_MD_CTX_set_flags(&md_ctx,
                                          EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
                                          EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
-                    EVP_DigestInit_ex(&md_ctx, (num == 2)
-                                      ? s->ctx->md5 : s->ctx->sha1, NULL);
-                    EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]),
-                                     SSL3_RANDOM_SIZE);
-                    EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]),
-                                     SSL3_RANDOM_SIZE);
-                    EVP_DigestUpdate(&md_ctx, &(d[4]), n);
-                    EVP_DigestFinal_ex(&md_ctx, q, (unsigned int *)&i);
+                    if (EVP_DigestInit_ex(&md_ctx,
+                                          (num == 2) ? s->ctx->md5
+                                                     : s->ctx->sha1,
+                                          NULL) <= 0
+                        || EVP_DigestUpdate(&md_ctx, &(s->s3->client_random[0]),
+                                            SSL3_RANDOM_SIZE) <= 0
+                        || EVP_DigestUpdate(&md_ctx, &(s->s3->server_random[0]),
+                                            SSL3_RANDOM_SIZE) <= 0
+                        || EVP_DigestUpdate(&md_ctx, &(d[4]), n) <= 0
+                        || EVP_DigestFinal_ex(&md_ctx, q,
+                                              (unsigned int *)&i) <= 0) {
+                        SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE,
+                               ERR_LIB_EVP);
+                        al = SSL_AD_INTERNAL_ERROR;
+                        goto f_err;
+                    }
                     q += i;
                     q += i;
                     j += i;
                     j += i;
                 }
                 }
@@ -2024,16 +2029,17 @@ int ssl3_send_server_key_exchange(SSL *s)
 #ifdef SSL_DEBUG
 #ifdef SSL_DEBUG
                 fprintf(stderr, "Using hash %s\n", EVP_MD_name(md));
                 fprintf(stderr, "Using hash %s\n", EVP_MD_name(md));
 #endif
 #endif
-                EVP_SignInit_ex(&md_ctx, md, NULL);
-                EVP_SignUpdate(&md_ctx, &(s->s3->client_random[0]),
-                               SSL3_RANDOM_SIZE);
-                EVP_SignUpdate(&md_ctx, &(s->s3->server_random[0]),
-                               SSL3_RANDOM_SIZE);
-                EVP_SignUpdate(&md_ctx, &(d[4]), n);
-                if (!EVP_SignFinal(&md_ctx, &(p[2]),
-                                   (unsigned int *)&i, pkey)) {
+                if (EVP_SignInit_ex(&md_ctx, md, NULL) <= 0
+                        || EVP_SignUpdate(&md_ctx, &(s->s3->client_random[0]),
+                                          SSL3_RANDOM_SIZE) <= 0
+                        || EVP_SignUpdate(&md_ctx, &(s->s3->server_random[0]),
+                                          SSL3_RANDOM_SIZE) <= 0
+                        || EVP_SignUpdate(&md_ctx, &(d[4]), n) <= 0
+                        || EVP_SignFinal(&md_ctx, &(p[2]),
+                                         (unsigned int *)&i, pkey) <= 0) {
                     SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_LIB_EVP);
                     SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_LIB_EVP);
-                    goto err;
+                    al = SSL_AD_INTERNAL_ERROR;
+                    goto f_err;
                 }
                 }
                 s2n(i, p);
                 s2n(i, p);
                 n += i + 2;
                 n += i + 2;
@@ -2879,7 +2885,15 @@ int ssl3_get_client_key_exchange(SSL *s)
             pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey;
             pk = s->cert->pkeys[SSL_PKEY_GOST01].privatekey;
 
 
         pkey_ctx = EVP_PKEY_CTX_new(pk, NULL);
         pkey_ctx = EVP_PKEY_CTX_new(pk, NULL);
-        EVP_PKEY_decrypt_init(pkey_ctx);
+        if (pkey_ctx == NULL) {
+            al = SSL_AD_INTERNAL_ERROR;
+            SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, ERR_R_MALLOC_FAILURE);
+            goto f_err;
+        }
+        if (EVP_PKEY_decrypt_init(pkey_ctx) <= 0) {
+            SSLerr(SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
+            goto gerr;
+        }
         /*
         /*
          * If client certificate is present and is of the same type, maybe
          * If client certificate is present and is of the same type, maybe
          * use it for key exchange.  Don't mind errors from
          * use it for key exchange.  Don't mind errors from
@@ -3123,7 +3137,17 @@ int ssl3_get_cert_verify(SSL *s)
         unsigned char signature[64];
         unsigned char signature[64];
         int idx;
         int idx;
         EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL);
         EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new(pkey, NULL);
-        EVP_PKEY_verify_init(pctx);
+        if (pctx == NULL) {
+            al = SSL_AD_INTERNAL_ERROR;
+            SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, ERR_R_MALLOC_FAILURE);
+            goto f_err;
+        }
+        if (EVP_PKEY_verify_init(pctx) <= 0) {
+            EVP_PKEY_CTX_free(pctx);
+            al = SSL_AD_INTERNAL_ERROR;
+            SSLerr(SSL_F_SSL3_GET_CERT_VERIFY, ERR_R_INTERNAL_ERROR);
+            goto f_err;
+        }
         if (i != 64) {
         if (i != 64) {
             fprintf(stderr, "GOST signature length is %d", i);
             fprintf(stderr, "GOST signature length is %d", i);
         }
         }

+ 4 - 0
libs/openssl/ssl/ssl.h

@@ -2313,6 +2313,7 @@ void ERR_load_SSL_strings(void);
 # define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC                 292
 # define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC                 292
 # define SSL_F_SSL3_ENC                                   134
 # define SSL_F_SSL3_ENC                                   134
 # define SSL_F_SSL3_GENERATE_KEY_BLOCK                    238
 # define SSL_F_SSL3_GENERATE_KEY_BLOCK                    238
+# define SSL_F_SSL3_GENERATE_MASTER_SECRET                388
 # define SSL_F_SSL3_GET_CERTIFICATE_REQUEST               135
 # define SSL_F_SSL3_GET_CERTIFICATE_REQUEST               135
 # define SSL_F_SSL3_GET_CERT_STATUS                       289
 # define SSL_F_SSL3_GET_CERT_STATUS                       289
 # define SSL_F_SSL3_GET_CERT_VERIFY                       136
 # define SSL_F_SSL3_GET_CERT_VERIFY                       136
@@ -2465,8 +2466,11 @@ void ERR_load_SSL_strings(void);
 # define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK              106
 # define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK              106
 # define SSL_R_BAD_DECOMPRESSION                          107
 # define SSL_R_BAD_DECOMPRESSION                          107
 # define SSL_R_BAD_DH_G_LENGTH                            108
 # define SSL_R_BAD_DH_G_LENGTH                            108
+# define SSL_R_BAD_DH_G_VALUE                             375
 # define SSL_R_BAD_DH_PUB_KEY_LENGTH                      109
 # define SSL_R_BAD_DH_PUB_KEY_LENGTH                      109
+# define SSL_R_BAD_DH_PUB_KEY_VALUE                       393
 # define SSL_R_BAD_DH_P_LENGTH                            110
 # define SSL_R_BAD_DH_P_LENGTH                            110
+# define SSL_R_BAD_DH_P_VALUE                             395
 # define SSL_R_BAD_DIGEST_LENGTH                          111
 # define SSL_R_BAD_DIGEST_LENGTH                          111
 # define SSL_R_BAD_DSA_SIGNATURE                          112
 # define SSL_R_BAD_DSA_SIGNATURE                          112
 # define SSL_R_BAD_ECC_CERT                               304
 # define SSL_R_BAD_ECC_CERT                               304

+ 2 - 0
libs/openssl/ssl/ssl3.h

@@ -263,6 +263,8 @@ extern "C" {
 # define SSL3_SESSION_ID_SIZE                    32
 # define SSL3_SESSION_ID_SIZE                    32
 # define SSL3_RT_HEADER_LENGTH                   5
 # define SSL3_RT_HEADER_LENGTH                   5
 
 
+# define SSL3_HM_HEADER_LENGTH                   4
+
 # ifndef SSL3_ALIGN_PAYLOAD
 # ifndef SSL3_ALIGN_PAYLOAD
  /*
  /*
   * Some will argue that this increases memory footprint, but it's not
   * Some will argue that this increases memory footprint, but it's not

+ 4 - 1
libs/openssl/ssl/ssl_asn1.c

@@ -121,13 +121,16 @@ typedef struct ssl_session_asn1_st {
 int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
 int i2d_SSL_SESSION(SSL_SESSION *in, unsigned char **pp)
 {
 {
 #define LSIZE2 (sizeof(long)*2)
 #define LSIZE2 (sizeof(long)*2)
-    int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v7 = 0, v8 = 0;
+    int v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0;
     unsigned char buf[4], ibuf1[LSIZE2], ibuf2[LSIZE2];
     unsigned char buf[4], ibuf1[LSIZE2], ibuf2[LSIZE2];
     unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2];
     unsigned char ibuf3[LSIZE2], ibuf4[LSIZE2], ibuf5[LSIZE2];
 #ifndef OPENSSL_NO_TLSEXT
 #ifndef OPENSSL_NO_TLSEXT
     int v6 = 0, v9 = 0, v10 = 0;
     int v6 = 0, v9 = 0, v10 = 0;
     unsigned char ibuf6[LSIZE2];
     unsigned char ibuf6[LSIZE2];
 #endif
 #endif
+#ifndef OPENSSL_NO_PSK
+    int v7 = 0, v8 = 0;
+#endif
 #ifndef OPENSSL_NO_COMP
 #ifndef OPENSSL_NO_COMP
     unsigned char cbuf;
     unsigned char cbuf;
     int v11 = 0;
     int v11 = 0;

+ 1 - 1
libs/openssl/ssl/ssl_cert.c

@@ -206,6 +206,7 @@ CERT *ssl_cert_dup(CERT *cert)
 
 
     memset(ret, 0, sizeof(CERT));
     memset(ret, 0, sizeof(CERT));
 
 
+    ret->references = 1;
     ret->key = &ret->pkeys[cert->key - &cert->pkeys[0]];
     ret->key = &ret->pkeys[cert->key - &cert->pkeys[0]];
     /*
     /*
      * or ret->key = ret->pkeys + (cert->key - cert->pkeys), if you find that
      * or ret->key = ret->pkeys + (cert->key - cert->pkeys), if you find that
@@ -282,7 +283,6 @@ CERT *ssl_cert_dup(CERT *cert)
      * chain is held inside SSL_CTX
      * chain is held inside SSL_CTX
      */
      */
 
 
-    ret->references = 1;
     /*
     /*
      * Set digests to defaults. NB: we don't copy existing values as they
      * Set digests to defaults. NB: we don't copy existing values as they
      * will be set during handshake.
      * will be set during handshake.

+ 7 - 4
libs/openssl/ssl/ssl_ciph.c

@@ -356,10 +356,11 @@ static int get_optional_pkey_id(const char *pkey_name)
     const EVP_PKEY_ASN1_METHOD *ameth;
     const EVP_PKEY_ASN1_METHOD *ameth;
     int pkey_id = 0;
     int pkey_id = 0;
     ameth = EVP_PKEY_asn1_find_str(NULL, pkey_name, -1);
     ameth = EVP_PKEY_asn1_find_str(NULL, pkey_name, -1);
-    if (ameth) {
-        EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth);
+    if (ameth && EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL,
+                                         ameth) > 0) {
+        return pkey_id;
     }
     }
-    return pkey_id;
+    return 0;
 }
 }
 
 
 #else
 #else
@@ -371,7 +372,9 @@ static int get_optional_pkey_id(const char *pkey_name)
     int pkey_id = 0;
     int pkey_id = 0;
     ameth = EVP_PKEY_asn1_find_str(&tmpeng, pkey_name, -1);
     ameth = EVP_PKEY_asn1_find_str(&tmpeng, pkey_name, -1);
     if (ameth) {
     if (ameth) {
-        EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth);
+        if (EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL,
+                                    ameth) <= 0)
+            pkey_id = 0;
     }
     }
     if (tmpeng)
     if (tmpeng)
         ENGINE_finish(tmpeng);
         ENGINE_finish(tmpeng);

+ 5 - 0
libs/openssl/ssl/ssl_err.c

@@ -162,6 +162,8 @@ static ERR_STRING_DATA SSL_str_functs[] = {
     {ERR_FUNC(SSL_F_SSL3_ENC), "SSL3_ENC"},
     {ERR_FUNC(SSL_F_SSL3_ENC), "SSL3_ENC"},
     {ERR_FUNC(SSL_F_SSL3_CHECK_FINISHED), "SSL3_CHECK_FINISHED"},
     {ERR_FUNC(SSL_F_SSL3_CHECK_FINISHED), "SSL3_CHECK_FINISHED"},
     {ERR_FUNC(SSL_F_SSL3_GENERATE_KEY_BLOCK), "SSL3_GENERATE_KEY_BLOCK"},
     {ERR_FUNC(SSL_F_SSL3_GENERATE_KEY_BLOCK), "SSL3_GENERATE_KEY_BLOCK"},
+    {ERR_FUNC(SSL_F_SSL3_GENERATE_MASTER_SECRET),
+     "ssl3_generate_master_secret"},
     {ERR_FUNC(SSL_F_SSL3_GET_CERTIFICATE_REQUEST),
     {ERR_FUNC(SSL_F_SSL3_GET_CERTIFICATE_REQUEST),
      "SSL3_GET_CERTIFICATE_REQUEST"},
      "SSL3_GET_CERTIFICATE_REQUEST"},
     {ERR_FUNC(SSL_F_SSL3_GET_CERT_STATUS), "SSL3_GET_CERT_STATUS"},
     {ERR_FUNC(SSL_F_SSL3_GET_CERT_STATUS), "SSL3_GET_CERT_STATUS"},
@@ -369,8 +371,11 @@ static ERR_STRING_DATA SSL_str_reasons[] = {
      "bad data returned by callback"},
      "bad data returned by callback"},
     {ERR_REASON(SSL_R_BAD_DECOMPRESSION), "bad decompression"},
     {ERR_REASON(SSL_R_BAD_DECOMPRESSION), "bad decompression"},
     {ERR_REASON(SSL_R_BAD_DH_G_LENGTH), "bad dh g length"},
     {ERR_REASON(SSL_R_BAD_DH_G_LENGTH), "bad dh g length"},
+    {ERR_REASON(SSL_R_BAD_DH_G_VALUE), "bad dh g value"},
     {ERR_REASON(SSL_R_BAD_DH_PUB_KEY_LENGTH), "bad dh pub key length"},
     {ERR_REASON(SSL_R_BAD_DH_PUB_KEY_LENGTH), "bad dh pub key length"},
+    {ERR_REASON(SSL_R_BAD_DH_PUB_KEY_VALUE), "bad dh pub key value"},
     {ERR_REASON(SSL_R_BAD_DH_P_LENGTH), "bad dh p length"},
     {ERR_REASON(SSL_R_BAD_DH_P_LENGTH), "bad dh p length"},
+    {ERR_REASON(SSL_R_BAD_DH_P_VALUE), "bad dh p value"},
     {ERR_REASON(SSL_R_BAD_DIGEST_LENGTH), "bad digest length"},
     {ERR_REASON(SSL_R_BAD_DIGEST_LENGTH), "bad digest length"},
     {ERR_REASON(SSL_R_BAD_DSA_SIGNATURE), "bad dsa signature"},
     {ERR_REASON(SSL_R_BAD_DSA_SIGNATURE), "bad dsa signature"},
     {ERR_REASON(SSL_R_BAD_ECC_CERT), "bad ecc cert"},
     {ERR_REASON(SSL_R_BAD_ECC_CERT), "bad ecc cert"},

+ 6 - 3
libs/openssl/ssl/ssl_lib.c

@@ -307,6 +307,7 @@ SSL *SSL_new(SSL_CTX *ctx)
     s->options = ctx->options;
     s->options = ctx->options;
     s->mode = ctx->mode;
     s->mode = ctx->mode;
     s->max_cert_list = ctx->max_cert_list;
     s->max_cert_list = ctx->max_cert_list;
+    s->references = 1;
 
 
     if (ctx->cert != NULL) {
     if (ctx->cert != NULL) {
         /*
         /*
@@ -375,7 +376,6 @@ SSL *SSL_new(SSL_CTX *ctx)
     if (!s->method->ssl_new(s))
     if (!s->method->ssl_new(s))
         goto err;
         goto err;
 
 
-    s->references = 1;
     s->server = (ctx->method->ssl_accept == ssl_undefined_function) ? 0 : 1;
     s->server = (ctx->method->ssl_accept == ssl_undefined_function) ? 0 : 1;
 
 
     SSL_clear(s);
     SSL_clear(s);
@@ -3283,8 +3283,11 @@ EVP_MD_CTX *ssl_replace_hash(EVP_MD_CTX **hash, const EVP_MD *md)
 {
 {
     ssl_clear_hash_ctx(hash);
     ssl_clear_hash_ctx(hash);
     *hash = EVP_MD_CTX_create();
     *hash = EVP_MD_CTX_create();
-    if (md)
-        EVP_DigestInit_ex(*hash, md, NULL);
+    if (*hash == NULL || (md && EVP_DigestInit_ex(*hash, md, NULL) <= 0)) {
+        EVP_MD_CTX_destroy(*hash);
+        *hash = NULL;
+        return NULL;
+    }
     return *hash;
     return *hash;
 }
 }
 
 

+ 10 - 10
libs/openssl/ssl/ssl_locl.h

@@ -1154,7 +1154,7 @@ unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf,
 unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
 unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
                                           unsigned char *limit);
                                           unsigned char *limit);
 int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data,
 int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **data,
-                                 unsigned char *d, int n, int *al);
+                                 unsigned char *limit, int *al);
 int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data,
 int ssl_parse_serverhello_tlsext(SSL *s, unsigned char **data,
                                  unsigned char *d, int n, int *al);
                                  unsigned char *d, int n, int *al);
 int ssl_prepare_clienthello_tlsext(SSL *s);
 int ssl_prepare_clienthello_tlsext(SSL *s);
@@ -1218,15 +1218,15 @@ int tls1_cbc_remove_padding(const SSL *s,
                             SSL3_RECORD *rec,
                             SSL3_RECORD *rec,
                             unsigned block_size, unsigned mac_size);
                             unsigned block_size, unsigned mac_size);
 char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx);
 char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx);
-void ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
-                            unsigned char *md_out,
-                            size_t *md_out_size,
-                            const unsigned char header[13],
-                            const unsigned char *data,
-                            size_t data_plus_mac_size,
-                            size_t data_plus_mac_plus_padding_size,
-                            const unsigned char *mac_secret,
-                            unsigned mac_secret_length, char is_sslv3);
+int ssl3_cbc_digest_record(const EVP_MD_CTX *ctx,
+                           unsigned char *md_out,
+                           size_t *md_out_size,
+                           const unsigned char header[13],
+                           const unsigned char *data,
+                           size_t data_plus_mac_size,
+                           size_t data_plus_mac_plus_padding_size,
+                           const unsigned char *mac_secret,
+                           unsigned mac_secret_length, char is_sslv3);
 
 
 void tls_fips_digest_extra(const EVP_CIPHER_CTX *cipher_ctx,
 void tls_fips_digest_extra(const EVP_CIPHER_CTX *cipher_ctx,
                            EVP_MD_CTX *mac_ctx, const unsigned char *data,
                            EVP_MD_CTX *mac_ctx, const unsigned char *data,

+ 21 - 2
libs/openssl/ssl/ssl_rsa.c

@@ -160,7 +160,10 @@ int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
     }
     }
 
 
     RSA_up_ref(rsa);
     RSA_up_ref(rsa);
-    EVP_PKEY_assign_RSA(pkey, rsa);
+    if (EVP_PKEY_assign_RSA(pkey, rsa) <= 0) {
+        RSA_free(rsa);
+        return 0;
+    }
 
 
     ret = ssl_set_pkey(ssl->cert, pkey);
     ret = ssl_set_pkey(ssl->cert, pkey);
     EVP_PKEY_free(pkey);
     EVP_PKEY_free(pkey);
@@ -181,6 +184,15 @@ static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
     if (c->pkeys[i].x509 != NULL) {
     if (c->pkeys[i].x509 != NULL) {
         EVP_PKEY *pktmp;
         EVP_PKEY *pktmp;
         pktmp = X509_get_pubkey(c->pkeys[i].x509);
         pktmp = X509_get_pubkey(c->pkeys[i].x509);
+        if (pktmp == NULL) {
+            SSLerr(SSL_F_SSL_SET_PKEY, ERR_R_MALLOC_FAILURE);
+            EVP_PKEY_free(pktmp);
+            return 0;
+        }
+        /*
+         * The return code from EVP_PKEY_copy_parameters is deliberately
+         * ignored. Some EVP_PKEY types cannot do this.
+         */
         EVP_PKEY_copy_parameters(pktmp, pkey);
         EVP_PKEY_copy_parameters(pktmp, pkey);
         EVP_PKEY_free(pktmp);
         EVP_PKEY_free(pktmp);
         ERR_clear_error();
         ERR_clear_error();
@@ -382,6 +394,10 @@ static int ssl_set_cert(CERT *c, X509 *x)
     }
     }
 
 
     if (c->pkeys[i].privatekey != NULL) {
     if (c->pkeys[i].privatekey != NULL) {
+        /*
+         * The return code from EVP_PKEY_copy_parameters is deliberately
+         * ignored. Some EVP_PKEY types cannot do this.
+         */
         EVP_PKEY_copy_parameters(pkey, c->pkeys[i].privatekey);
         EVP_PKEY_copy_parameters(pkey, c->pkeys[i].privatekey);
         ERR_clear_error();
         ERR_clear_error();
 
 
@@ -502,7 +518,10 @@ int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa)
     }
     }
 
 
     RSA_up_ref(rsa);
     RSA_up_ref(rsa);
-    EVP_PKEY_assign_RSA(pkey, rsa);
+    if (EVP_PKEY_assign_RSA(pkey, rsa) <= 0) {
+        RSA_free(rsa);
+        return 0;
+    }
 
 
     ret = ssl_set_pkey(ctx->cert, pkey);
     ret = ssl_set_pkey(ctx->cert, pkey);
     EVP_PKEY_free(pkey);
     EVP_PKEY_free(pkey);

+ 2 - 2
libs/openssl/ssl/ssl_sess.c

@@ -256,8 +256,8 @@ SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
     dest->tlsext_ecpointformatlist = NULL;
     dest->tlsext_ecpointformatlist = NULL;
     dest->tlsext_ellipticcurvelist = NULL;
     dest->tlsext_ellipticcurvelist = NULL;
 # endif
 # endif
-#endif
     dest->tlsext_tick = NULL;
     dest->tlsext_tick = NULL;
+#endif
 #ifndef OPENSSL_NO_SRP
 #ifndef OPENSSL_NO_SRP
     dest->srp_username = NULL;
     dest->srp_username = NULL;
 #endif
 #endif
@@ -324,7 +324,6 @@ SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
             goto err;
             goto err;
     }
     }
 # endif
 # endif
-#endif
 
 
     if (ticket != 0) {
     if (ticket != 0) {
         dest->tlsext_tick = BUF_memdup(src->tlsext_tick, src->tlsext_ticklen);
         dest->tlsext_tick = BUF_memdup(src->tlsext_tick, src->tlsext_ticklen);
@@ -334,6 +333,7 @@ SSL_SESSION *ssl_session_dup(SSL_SESSION *src, int ticket)
         dest->tlsext_tick_lifetime_hint = 0;
         dest->tlsext_tick_lifetime_hint = 0;
         dest->tlsext_ticklen = 0;
         dest->tlsext_ticklen = 0;
     }
     }
+#endif
 
 
 #ifndef OPENSSL_NO_SRP
 #ifndef OPENSSL_NO_SRP
     if (src->srp_username) {
     if (src->srp_username) {

+ 33 - 15
libs/openssl/ssl/t1_enc.c

@@ -385,6 +385,8 @@ int tls1_change_cipher_state(SSL *s, int which)
             EVP_CIPHER_CTX_init(s->enc_read_ctx);
             EVP_CIPHER_CTX_init(s->enc_read_ctx);
         dd = s->enc_read_ctx;
         dd = s->enc_read_ctx;
         mac_ctx = ssl_replace_hash(&s->read_hash, NULL);
         mac_ctx = ssl_replace_hash(&s->read_hash, NULL);
+        if (mac_ctx == NULL)
+            goto err;
 #ifndef OPENSSL_NO_COMP
 #ifndef OPENSSL_NO_COMP
         if (s->expand != NULL) {
         if (s->expand != NULL) {
             COMP_CTX_free(s->expand);
             COMP_CTX_free(s->expand);
@@ -423,11 +425,14 @@ int tls1_change_cipher_state(SSL *s, int which)
         dd = s->enc_write_ctx;
         dd = s->enc_write_ctx;
         if (SSL_IS_DTLS(s)) {
         if (SSL_IS_DTLS(s)) {
             mac_ctx = EVP_MD_CTX_create();
             mac_ctx = EVP_MD_CTX_create();
-            if (!mac_ctx)
+            if (mac_ctx == NULL)
                 goto err;
                 goto err;
             s->write_hash = mac_ctx;
             s->write_hash = mac_ctx;
-        } else
+        } else {
             mac_ctx = ssl_replace_hash(&s->write_hash, NULL);
             mac_ctx = ssl_replace_hash(&s->write_hash, NULL);
+            if (mac_ctx == NULL)
+                goto err;
+        }
 #ifndef OPENSSL_NO_COMP
 #ifndef OPENSSL_NO_COMP
         if (s->compress != NULL) {
         if (s->compress != NULL) {
             COMP_CTX_free(s->compress);
             COMP_CTX_free(s->compress);
@@ -500,7 +505,12 @@ int tls1_change_cipher_state(SSL *s, int which)
     if (!(EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
     if (!(EVP_CIPHER_flags(c) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
         mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
         mac_key = EVP_PKEY_new_mac_key(mac_type, NULL,
                                        mac_secret, *mac_secret_size);
                                        mac_secret, *mac_secret_size);
-        EVP_DigestSignInit(mac_ctx, NULL, m, NULL, mac_key);
+        if (mac_key == NULL
+                || EVP_DigestSignInit(mac_ctx, NULL, m, NULL, mac_key) <= 0) {
+            EVP_PKEY_free(mac_key);
+            SSLerr(SSL_F_TLS1_CHANGE_CIPHER_STATE, ERR_R_INTERNAL_ERROR);
+            goto err2;
+        }
         EVP_PKEY_free(mac_key);
         EVP_PKEY_free(mac_key);
     }
     }
 #ifdef TLS_DEBUG
 #ifdef TLS_DEBUG
@@ -913,8 +923,9 @@ int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
     }
     }
 
 
     EVP_MD_CTX_init(&ctx);
     EVP_MD_CTX_init(&ctx);
-    EVP_MD_CTX_copy_ex(&ctx, d);
-    EVP_DigestFinal_ex(&ctx, out, &ret);
+    if (EVP_MD_CTX_copy_ex(&ctx, d) <=0
+            || EVP_DigestFinal_ex(&ctx, out, &ret) <= 0)
+        ret = 0;
     EVP_MD_CTX_cleanup(&ctx);
     EVP_MD_CTX_cleanup(&ctx);
     return ((int)ret);
     return ((int)ret);
 }
 }
@@ -1041,17 +1052,24 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
          * are hashing because that gives an attacker a timing-oracle.
          * are hashing because that gives an attacker a timing-oracle.
          */
          */
         /* Final param == not SSLv3 */
         /* Final param == not SSLv3 */
-        ssl3_cbc_digest_record(mac_ctx,
-                               md, &md_size,
-                               header, rec->input,
-                               rec->length + md_size, orig_len,
-                               ssl->s3->read_mac_secret,
-                               ssl->s3->read_mac_secret_size, 0);
+        if (ssl3_cbc_digest_record(mac_ctx,
+                                   md, &md_size,
+                                   header, rec->input,
+                                   rec->length + md_size, orig_len,
+                                   ssl->s3->read_mac_secret,
+                                   ssl->s3->read_mac_secret_size, 0) <= 0) {
+            if (!stream_mac)
+                EVP_MD_CTX_cleanup(&hmac);
+            return -1;
+        }
     } else {
     } else {
-        EVP_DigestSignUpdate(mac_ctx, header, sizeof(header));
-        EVP_DigestSignUpdate(mac_ctx, rec->input, rec->length);
-        t = EVP_DigestSignFinal(mac_ctx, md, &md_size);
-        OPENSSL_assert(t > 0);
+        if (EVP_DigestSignUpdate(mac_ctx, header, sizeof(header)) <= 0
+                || EVP_DigestSignUpdate(mac_ctx, rec->input, rec->length) <= 0
+                || EVP_DigestSignFinal(mac_ctx, md, &md_size) <= 0) {
+            if (!stream_mac)
+                EVP_MD_CTX_cleanup(&hmac);
+            return -1;
+        }
 #ifdef OPENSSL_FIPS
 #ifdef OPENSSL_FIPS
         if (!send && FIPS_mode())
         if (!send && FIPS_mode())
             tls_fips_digest_extra(ssl->enc_read_ctx,
             tls_fips_digest_extra(ssl->enc_read_ctx,

+ 32 - 25
libs/openssl/ssl/t1_lib.c

@@ -913,7 +913,7 @@ unsigned char *ssl_add_serverhello_tlsext(SSL *s, unsigned char *buf,
  * 10.8..10.8.3 (which don't work).
  * 10.8..10.8.3 (which don't work).
  */
  */
 static void ssl_check_for_safari(SSL *s, const unsigned char *data,
 static void ssl_check_for_safari(SSL *s, const unsigned char *data,
-                                 const unsigned char *d, int n)
+                                 const unsigned char *limit)
 {
 {
     unsigned short type, size;
     unsigned short type, size;
     static const unsigned char kSafariExtensionsBlock[] = {
     static const unsigned char kSafariExtensionsBlock[] = {
@@ -942,11 +942,11 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
         0x02, 0x03,             /* SHA-1/ECDSA */
         0x02, 0x03,             /* SHA-1/ECDSA */
     };
     };
 
 
-    if (data >= (d + n - 2))
+    if (data >= (limit - 2))
         return;
         return;
     data += 2;
     data += 2;
 
 
-    if (data > (d + n - 4))
+    if (data > (limit - 4))
         return;
         return;
     n2s(data, type);
     n2s(data, type);
     n2s(data, size);
     n2s(data, size);
@@ -954,7 +954,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
     if (type != TLSEXT_TYPE_server_name)
     if (type != TLSEXT_TYPE_server_name)
         return;
         return;
 
 
-    if (data + size > d + n)
+    if (data + size > limit)
         return;
         return;
     data += size;
     data += size;
 
 
@@ -962,7 +962,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
         const size_t len1 = sizeof(kSafariExtensionsBlock);
         const size_t len1 = sizeof(kSafariExtensionsBlock);
         const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
         const size_t len2 = sizeof(kSafariTLS12ExtensionsBlock);
 
 
-        if (data + len1 + len2 != d + n)
+        if (data + len1 + len2 != limit)
             return;
             return;
         if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
         if (memcmp(data, kSafariExtensionsBlock, len1) != 0)
             return;
             return;
@@ -971,7 +971,7 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
     } else {
     } else {
         const size_t len = sizeof(kSafariExtensionsBlock);
         const size_t len = sizeof(kSafariExtensionsBlock);
 
 
-        if (data + len != d + n)
+        if (data + len != limit)
             return;
             return;
         if (memcmp(data, kSafariExtensionsBlock, len) != 0)
         if (memcmp(data, kSafariExtensionsBlock, len) != 0)
             return;
             return;
@@ -981,8 +981,8 @@ static void ssl_check_for_safari(SSL *s, const unsigned char *data,
 }
 }
 # endif                         /* !OPENSSL_NO_EC */
 # endif                         /* !OPENSSL_NO_EC */
 
 
-int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
-                                 int n, int *al)
+int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p,
+                                 unsigned char *limit, int *al)
 {
 {
     unsigned short type;
     unsigned short type;
     unsigned short size;
     unsigned short size;
@@ -1004,7 +1004,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
 
 
 # ifndef OPENSSL_NO_EC
 # ifndef OPENSSL_NO_EC
     if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
     if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
-        ssl_check_for_safari(s, data, d, n);
+        ssl_check_for_safari(s, data, limit);
 # endif                         /* !OPENSSL_NO_EC */
 # endif                         /* !OPENSSL_NO_EC */
 
 
 # ifndef OPENSSL_NO_SRP
 # ifndef OPENSSL_NO_SRP
@@ -1016,22 +1016,22 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
 
 
     s->srtp_profile = NULL;
     s->srtp_profile = NULL;
 
 
-    if (data == d + n)
+    if (data == limit)
         goto ri_check;
         goto ri_check;
 
 
-    if (data > (d + n - 2))
+    if (data > (limit - 2))
         goto err;
         goto err;
 
 
     n2s(data, len);
     n2s(data, len);
 
 
-    if (data > (d + n - len))
+    if (data + len != limit)
         goto err;
         goto err;
 
 
-    while (data <= (d + n - 4)) {
+    while (data <= (limit - 4)) {
         n2s(data, type);
         n2s(data, type);
         n2s(data, size);
         n2s(data, size);
 
 
-        if (data + size > (d + n))
+        if (data + size > (limit))
             goto err;
             goto err;
 # if 0
 # if 0
         fprintf(stderr, "Received extension type %d size %d\n", type, size);
         fprintf(stderr, "Received extension type %d size %d\n", type, size);
@@ -1396,7 +1396,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
     }
     }
 
 
     /* Spurious data on the end */
     /* Spurious data on the end */
-    if (data != d + n)
+    if (data != limit)
         goto err;
         goto err;
 
 
     *p = data;
     *p = data;
@@ -2291,10 +2291,13 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
         /* Check key name matches */
         /* Check key name matches */
         if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
         if (memcmp(etick, tctx->tlsext_tick_key_name, 16))
             return 2;
             return 2;
-        HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
-                     tlsext_tick_md(), NULL);
-        EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
-                           tctx->tlsext_tick_aes_key, etick + 16);
+        if (HMAC_Init_ex(&hctx, tctx->tlsext_tick_hmac_key, 16,
+                         tlsext_tick_md(), NULL) <= 0
+                || EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL,
+                                      tctx->tlsext_tick_aes_key,
+                                      etick + 16) <= 0) {
+            goto err;
+       }
     }
     }
     /*
     /*
      * Attempt to process session ticket, first conduct sanity and integrity
      * Attempt to process session ticket, first conduct sanity and integrity
@@ -2302,13 +2305,14 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
      */
      */
     mlen = HMAC_size(&hctx);
     mlen = HMAC_size(&hctx);
     if (mlen < 0) {
     if (mlen < 0) {
-        EVP_CIPHER_CTX_cleanup(&ctx);
-        return -1;
+        goto err;
     }
     }
     eticklen -= mlen;
     eticklen -= mlen;
     /* Check HMAC of encrypted ticket */
     /* Check HMAC of encrypted ticket */
-    HMAC_Update(&hctx, etick, eticklen);
-    HMAC_Final(&hctx, tick_hmac, NULL);
+    if (HMAC_Update(&hctx, etick, eticklen) <= 0
+            || HMAC_Final(&hctx, tick_hmac, NULL) <= 0) {
+        goto err;
+    }
     HMAC_CTX_cleanup(&hctx);
     HMAC_CTX_cleanup(&hctx);
     if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
     if (CRYPTO_memcmp(tick_hmac, etick + eticklen, mlen)) {
         EVP_CIPHER_CTX_cleanup(&ctx);
         EVP_CIPHER_CTX_cleanup(&ctx);
@@ -2319,11 +2323,10 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
     p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
     p = etick + 16 + EVP_CIPHER_CTX_iv_length(&ctx);
     eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
     eticklen -= 16 + EVP_CIPHER_CTX_iv_length(&ctx);
     sdec = OPENSSL_malloc(eticklen);
     sdec = OPENSSL_malloc(eticklen);
-    if (!sdec) {
+    if (!sdec || EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen) <= 0) {
         EVP_CIPHER_CTX_cleanup(&ctx);
         EVP_CIPHER_CTX_cleanup(&ctx);
         return -1;
         return -1;
     }
     }
-    EVP_DecryptUpdate(&ctx, sdec, &slen, p, eticklen);
     if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0) {
     if (EVP_DecryptFinal(&ctx, sdec + slen, &mlen) <= 0) {
         EVP_CIPHER_CTX_cleanup(&ctx);
         EVP_CIPHER_CTX_cleanup(&ctx);
         OPENSSL_free(sdec);
         OPENSSL_free(sdec);
@@ -2356,6 +2359,10 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick,
      * For session parse failure, indicate that we need to send a new ticket.
      * For session parse failure, indicate that we need to send a new ticket.
      */
      */
     return 2;
     return 2;
+err:
+    EVP_CIPHER_CTX_cleanup(&ctx);
+    HMAC_CTX_cleanup(&hctx);
+    return -1;
 }
 }
 
 
 /* Tables to translate from NIDs to TLS v1.2 ids */
 /* Tables to translate from NIDs to TLS v1.2 ids */

+ 6 - 9
libs/openssl/ssl/tls1.h

@@ -235,8 +235,7 @@ extern "C" {
 
 
 /*
 /*
  * ExtensionType value for TLS padding extension.
  * ExtensionType value for TLS padding extension.
- * http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml
- * http://tools.ietf.org/html/draft-agl-tls-padding-03
+ * http://tools.ietf.org/html/draft-agl-tls-padding
  */
  */
 # define TLSEXT_TYPE_padding     21
 # define TLSEXT_TYPE_padding     21
 
 
@@ -261,20 +260,19 @@ extern "C" {
 #  define TLSEXT_TYPE_next_proto_neg              13172
 #  define TLSEXT_TYPE_next_proto_neg              13172
 # endif
 # endif
 
 
-/* NameType value from RFC 3546 */
+/* NameType value from RFC3546 */
 # define TLSEXT_NAMETYPE_host_name 0
 # define TLSEXT_NAMETYPE_host_name 0
-/* status request value from RFC 3546 */
+/* status request value from RFC3546 */
 # define TLSEXT_STATUSTYPE_ocsp 1
 # define TLSEXT_STATUSTYPE_ocsp 1
 
 
-/* ECPointFormat values from draft-ietf-tls-ecc-12 */
+/* ECPointFormat values from RFC4492 */
 # define TLSEXT_ECPOINTFORMAT_first                      0
 # define TLSEXT_ECPOINTFORMAT_first                      0
 # define TLSEXT_ECPOINTFORMAT_uncompressed               0
 # define TLSEXT_ECPOINTFORMAT_uncompressed               0
 # define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime  1
 # define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime  1
 # define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2  2
 # define TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2  2
 # define TLSEXT_ECPOINTFORMAT_last                       2
 # define TLSEXT_ECPOINTFORMAT_last                       2
 
 
-/* Signature and hash algorithms from RFC 5246 */
-
+/* Signature and hash algorithms from RFC5246 */
 # define TLSEXT_signature_anonymous                      0
 # define TLSEXT_signature_anonymous                      0
 # define TLSEXT_signature_rsa                            1
 # define TLSEXT_signature_rsa                            1
 # define TLSEXT_signature_dsa                            2
 # define TLSEXT_signature_dsa                            2
@@ -404,7 +402,6 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
 # define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA                0x03000066
 # define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA                0x03000066
 
 
 /* AES ciphersuites from RFC3268 */
 /* AES ciphersuites from RFC3268 */
-
 # define TLS1_CK_RSA_WITH_AES_128_SHA                    0x0300002F
 # define TLS1_CK_RSA_WITH_AES_128_SHA                    0x0300002F
 # define TLS1_CK_DH_DSS_WITH_AES_128_SHA                 0x03000030
 # define TLS1_CK_DH_DSS_WITH_AES_128_SHA                 0x03000030
 # define TLS1_CK_DH_RSA_WITH_AES_128_SHA                 0x03000031
 # define TLS1_CK_DH_RSA_WITH_AES_128_SHA                 0x03000031
@@ -570,7 +567,7 @@ SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)
 # define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA               "DHE-RSA-AES256-SHA"
 # define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA               "DHE-RSA-AES256-SHA"
 # define TLS1_TXT_ADH_WITH_AES_256_SHA                   "ADH-AES256-SHA"
 # define TLS1_TXT_ADH_WITH_AES_256_SHA                   "ADH-AES256-SHA"
 
 
-/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */
+/* ECC ciphersuites from RFC4492 */
 # define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA               "ECDH-ECDSA-NULL-SHA"
 # define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA               "ECDH-ECDSA-NULL-SHA"
 # define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA            "ECDH-ECDSA-RC4-SHA"
 # define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA            "ECDH-ECDSA-RC4-SHA"
 # define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA       "ECDH-ECDSA-DES-CBC3-SHA"
 # define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA       "ECDH-ECDSA-DES-CBC3-SHA"