diff options
Diffstat (limited to 'openssl/crypto')
132 files changed, 796 insertions, 268 deletions
| diff --git a/openssl/crypto/Makefile b/openssl/crypto/Makefile index 2355661f4..618c95878 100644 --- a/openssl/crypto/Makefile +++ b/openssl/crypto/Makefile @@ -125,12 +125,17 @@ install:  lint:  	@target=lint; $(RECURSIVE_MAKE) -depend: +update: local_depend +	@[ -z "$(THIS)" ] || (set -e; target=update; $(RECURSIVE_MAKE) ) +	@if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi + +depend: local_depend +	@[ -z "$(THIS)" ] || (set -e; target=depend; $(RECURSIVE_MAKE) ) +	@if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi +local_depend:  	@[ -z "$(THIS)" -o -f buildinf.h ] || touch buildinf.h # fake buildinf.h if it does not exist  	@[ -z "$(THIS)" ] || $(MAKEDEPEND) -- $(CFLAG) $(INCLUDE) $(DEPFLAG) -- $(PROGS) $(LIBSRC)  	@[ -z "$(THIS)" -o -s buildinf.h ] || rm buildinf.h -	@[ -z "$(THIS)" ] || (set -e; target=depend; $(RECURSIVE_MAKE) ) -	@if [ -z "$(THIS)" ]; then $(MAKE) -f $(TOP)/Makefile reflect THIS=$@; fi  clean:  	rm -f buildinf.h *.s *.o */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff diff --git a/openssl/crypto/aes/Makefile b/openssl/crypto/aes/Makefile index 45ede0a0b..b3a95812a 100644 --- a/openssl/crypto/aes/Makefile +++ b/openssl/crypto/aes/Makefile @@ -106,6 +106,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/asn1/Makefile b/openssl/crypto/asn1/Makefile index f7787005d..d774f7821 100644 --- a/openssl/crypto/asn1/Makefile +++ b/openssl/crypto/asn1/Makefile @@ -93,6 +93,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by top Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/asn1/a_int.c b/openssl/crypto/asn1/a_int.c index 70c2b8e62..7e26704a5 100644 --- a/openssl/crypto/asn1/a_int.c +++ b/openssl/crypto/asn1/a_int.c @@ -124,6 +124,8 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)      else {          ret = a->length;          i = a->data[0]; +        if (ret == 1 && i == 0) +            neg = 0;          if (!neg && (i > 127)) {              pad = 1;              pb = 0; @@ -162,7 +164,7 @@ int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)          p += a->length - 1;          i = a->length;          /* Copy zeros to destination as long as source is zero */ -        while (!*n) { +        while (!*n && i > 1) {              *(p--) = 0;              n--;              i--; @@ -419,7 +421,7 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(const BIGNUM *bn, ASN1_INTEGER *ai)          ASN1err(ASN1_F_BN_TO_ASN1_INTEGER, ERR_R_NESTED_ASN1_ERROR);          goto err;      } -    if (BN_is_negative(bn)) +    if (BN_is_negative(bn) && !BN_is_zero(bn))          ret->type = V_ASN1_NEG_INTEGER;      else          ret->type = V_ASN1_INTEGER; diff --git a/openssl/crypto/asn1/asn1_gen.c b/openssl/crypto/asn1/asn1_gen.c index 11b582dd3..65749239b 100644 --- a/openssl/crypto/asn1/asn1_gen.c +++ b/openssl/crypto/asn1/asn1_gen.c @@ -74,6 +74,8 @@  #define ASN1_GEN_STR(str,val)   {str, sizeof(str) - 1, val}  #define ASN1_FLAG_EXP_MAX       20 +/* Maximum number of nested sequences */ +#define ASN1_GEN_SEQ_MAX_DEPTH  50  /* Input formats */ @@ -110,13 +112,16 @@ typedef struct {      int exp_count;  } tag_exp_arg; +static ASN1_TYPE *generate_v3(char *str, X509V3_CTX *cnf, int depth, +                              int *perr);  static int bitstr_cb(const char *elem, int len, void *bitstr);  static int asn1_cb(const char *elem, int len, void *bitstr);  static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class,                        int exp_constructed, int exp_pad, int imp_ok);  static int parse_tagging(const char *vstart, int vlen, int *ptag,                           int *pclass); -static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf); +static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf, +                             int depth, int *perr);  static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype);  static int asn1_str2tag(const char *tagstr, int len); @@ -133,6 +138,16 @@ ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf)  ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf)  { +    int err = 0; +    ASN1_TYPE *ret = generate_v3(str, cnf, 0, &err); +    if (err) +        ASN1err(ASN1_F_ASN1_GENERATE_V3, err); +    return ret; +} + +static ASN1_TYPE *generate_v3(char *str, X509V3_CTX *cnf, int depth, +                              int *perr) +{      ASN1_TYPE *ret;      tag_exp_arg asn1_tags;      tag_exp_type *etmp; @@ -152,17 +167,22 @@ ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf)      asn1_tags.imp_class = -1;      asn1_tags.format = ASN1_GEN_FORMAT_ASCII;      asn1_tags.exp_count = 0; -    if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) +    if (CONF_parse_list(str, ',', 1, asn1_cb, &asn1_tags) != 0) { +        *perr = ASN1_R_UNKNOWN_TAG;          return NULL; +    }      if ((asn1_tags.utype == V_ASN1_SEQUENCE)          || (asn1_tags.utype == V_ASN1_SET)) {          if (!cnf) { -            ASN1err(ASN1_F_ASN1_GENERATE_V3, -                    ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG); +            *perr = ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG;              return NULL;          } -        ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf); +        if (depth >= ASN1_GEN_SEQ_MAX_DEPTH) { +            *perr = ASN1_R_ILLEGAL_NESTED_TAGGING; +            return NULL; +        } +        ret = asn1_multi(asn1_tags.utype, asn1_tags.str, cnf, depth, perr);      } else          ret = asn1_str2type(asn1_tags.str, asn1_tags.format, asn1_tags.utype); @@ -280,7 +300,7 @@ static int asn1_cb(const char *elem, int len, void *bitstr)      int tmp_tag, tmp_class;      if (elem == NULL) -        return 0; +        return -1;      for (i = 0, p = elem; i < len; p++, i++) {          /* Look for the ':' in name value pairs */ @@ -353,7 +373,7 @@ static int asn1_cb(const char *elem, int len, void *bitstr)          break;      case ASN1_GEN_FLAG_FORMAT: -        if(!vstart) { +        if (!vstart) {              ASN1err(ASN1_F_ASN1_CB, ASN1_R_UNKNOWN_FORMAT);              return -1;          } @@ -435,7 +455,8 @@ static int parse_tagging(const char *vstart, int vlen, int *ptag, int *pclass)  /* Handle multiple types: SET and SEQUENCE */ -static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf) +static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf, +                             int depth, int *perr)  {      ASN1_TYPE *ret = NULL;      STACK_OF(ASN1_TYPE) *sk = NULL; @@ -454,7 +475,8 @@ static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf)              goto bad;          for (i = 0; i < sk_CONF_VALUE_num(sect); i++) {              ASN1_TYPE *typ = -                ASN1_generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf); +                generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf, +                            depth + 1, perr);              if (!typ)                  goto bad;              if (!sk_ASN1_TYPE_push(sk, typ)) diff --git a/openssl/crypto/asn1/asn_mime.c b/openssl/crypto/asn1/asn_mime.c index 7e2f28e6d..96110c540 100644 --- a/openssl/crypto/asn1/asn_mime.c +++ b/openssl/crypto/asn1/asn_mime.c @@ -289,7 +289,8 @@ int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags,      if ((flags & SMIME_DETACHED) && data) {          /* We want multipart/signed */          /* Generate a random boundary */ -        RAND_pseudo_bytes((unsigned char *)bound, 32); +        if (RAND_pseudo_bytes((unsigned char *)bound, 32) < 0) +            return 0;          for (i = 0; i < 32; i++) {              c = bound[i] & 0xf;              if (c < 10) diff --git a/openssl/crypto/asn1/bio_ndef.c b/openssl/crypto/asn1/bio_ndef.c index 4a73ca9ea..31949b879 100644 --- a/openssl/crypto/asn1/bio_ndef.c +++ b/openssl/crypto/asn1/bio_ndef.c @@ -162,7 +162,7 @@ static int ndef_prefix(BIO *b, unsigned char **pbuf, int *plen, void *parg)      derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it);      p = OPENSSL_malloc(derlen); -    if(!p) +    if (!p)          return 0;      ndef_aux->derbuf = p; @@ -232,7 +232,7 @@ static int ndef_suffix(BIO *b, unsigned char **pbuf, int *plen, void *parg)      derlen = ASN1_item_ndef_i2d(ndef_aux->val, NULL, ndef_aux->it);      p = OPENSSL_malloc(derlen); -    if(!p) +    if (!p)          return 0;      ndef_aux->derbuf = p; diff --git a/openssl/crypto/asn1/tasn_new.c b/openssl/crypto/asn1/tasn_new.c index 7d2964f02..b0c73beeb 100644 --- a/openssl/crypto/asn1/tasn_new.c +++ b/openssl/crypto/asn1/tasn_new.c @@ -100,9 +100,6 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,      else          asn1_cb = 0; -    if (!combine) -        *pval = NULL; -  #ifdef CRYPTO_MDEBUG      if (it->sname)          CRYPTO_push_info(it->sname); diff --git a/openssl/crypto/asn1/tasn_prn.c b/openssl/crypto/asn1/tasn_prn.c index 7c54f9d1d..5e7d53e98 100644 --- a/openssl/crypto/asn1/tasn_prn.c +++ b/openssl/crypto/asn1/tasn_prn.c @@ -290,7 +290,7 @@ static int asn1_item_print_ctx(BIO *out, ASN1_VALUE **fld, int indent,          for (i = 0, tt = it->templates; i < it->tcount; i++, tt++) {              const ASN1_TEMPLATE *seqtt;              seqtt = asn1_do_adb(fld, tt, 1); -            if(!seqtt) +            if (!seqtt)                  return 0;              tmpfld = asn1_get_field_ptr(fld, seqtt);              if (!asn1_template_print_ctx(out, tmpfld, diff --git a/openssl/crypto/asn1/x_x509.c b/openssl/crypto/asn1/x_x509.c index d51b76e79..f56e837b3 100644 --- a/openssl/crypto/asn1/x_x509.c +++ b/openssl/crypto/asn1/x_x509.c @@ -177,7 +177,7 @@ X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length)      /* Save start position */      q = *pp; -    if(!a || *a == NULL) { +    if (!a || *a == NULL) {          freeret = 1;      }      ret = d2i_X509(a, pp, length); @@ -192,7 +192,7 @@ X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length)          goto err;      return ret;   err: -    if(freeret) { +    if (freeret) {          X509_free(ret);          if (a)              *a = NULL; diff --git a/openssl/crypto/bf/Makefile b/openssl/crypto/bf/Makefile index d01bfaa31..6dd201553 100644 --- a/openssl/crypto/bf/Makefile +++ b/openssl/crypto/bf/Makefile @@ -72,6 +72,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/bio/Makefile b/openssl/crypto/bio/Makefile index c395d8049..ef526f6be 100644 --- a/openssl/crypto/bio/Makefile +++ b/openssl/crypto/bio/Makefile @@ -73,6 +73,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/bio/b_print.c b/openssl/crypto/bio/b_print.c index c2cf6e619..7c81e25d4 100644 --- a/openssl/crypto/bio/b_print.c +++ b/openssl/crypto/bio/b_print.c @@ -704,32 +704,29 @@ doapr_outch(char **sbuffer,      /* If we haven't at least one buffer, someone has doe a big booboo */      assert(*sbuffer != NULL || buffer != NULL); -    if (buffer) { -        while (*currlen >= *maxlen) { -            if (*buffer == NULL) { -                if (*maxlen == 0) -                    *maxlen = 1024; -                *buffer = OPENSSL_malloc(*maxlen); -                if(!*buffer) { -                    /* Panic! Can't really do anything sensible. Just return */ -                    return; -                } -                if (*currlen > 0) { -                    assert(*sbuffer != NULL); -                    memcpy(*buffer, *sbuffer, *currlen); -                } -                *sbuffer = NULL; -            } else { -                *maxlen += 1024; -                *buffer = OPENSSL_realloc(*buffer, *maxlen); -                if(!*buffer) { -                    /* Panic! Can't really do anything sensible. Just return */ -                    return; -                } +    /* |currlen| must always be <= |*maxlen| */ +    assert(*currlen <= *maxlen); + +    if (buffer && *currlen == *maxlen) { +        *maxlen += 1024; +        if (*buffer == NULL) { +            *buffer = OPENSSL_malloc(*maxlen); +            if (!*buffer) { +                /* Panic! Can't really do anything sensible. Just return */ +                return; +            } +            if (*currlen > 0) { +                assert(*sbuffer != NULL); +                memcpy(*buffer, *sbuffer, *currlen); +            } +            *sbuffer = NULL; +        } else { +            *buffer = OPENSSL_realloc(*buffer, *maxlen); +            if (!*buffer) { +                /* Panic! Can't really do anything sensible. Just return */ +                return;              }          } -        /* What to do if *buffer is NULL? */ -        assert(*sbuffer != NULL || *buffer != NULL);      }      if (*currlen < *maxlen) { diff --git a/openssl/crypto/bio/bf_nbio.c b/openssl/crypto/bio/bf_nbio.c index da88a8a1b..a04f32a00 100644 --- a/openssl/crypto/bio/bf_nbio.c +++ b/openssl/crypto/bio/bf_nbio.c @@ -139,7 +139,8 @@ static int nbiof_read(BIO *b, char *out, int outl)      BIO_clear_retry_flags(b);  #if 1 -    RAND_pseudo_bytes(&n, 1); +    if (RAND_pseudo_bytes(&n, 1) < 0) +        return -1;      num = (n & 0x07);      if (outl > num) @@ -178,7 +179,8 @@ static int nbiof_write(BIO *b, const char *in, int inl)          num = nt->lwn;          nt->lwn = 0;      } else { -        RAND_pseudo_bytes(&n, 1); +        if (RAND_pseudo_bytes(&n, 1) < 0) +            return -1;          num = (n & 7);      } diff --git a/openssl/crypto/bio/bio_lib.c b/openssl/crypto/bio/bio_lib.c index 5267010cb..07934f8a6 100644 --- a/openssl/crypto/bio/bio_lib.c +++ b/openssl/crypto/bio/bio_lib.c @@ -536,8 +536,10 @@ BIO *BIO_dup_chain(BIO *in)          /* copy app data */          if (!CRYPTO_dup_ex_data(CRYPTO_EX_INDEX_BIO, &new_bio->ex_data, -                                &bio->ex_data)) +                                &bio->ex_data)) { +            BIO_free(new_bio);              goto err; +        }          if (ret == NULL) {              eoc = new_bio; @@ -549,8 +551,8 @@ BIO *BIO_dup_chain(BIO *in)      }      return (ret);   err: -    if (ret != NULL) -        BIO_free(ret); +    BIO_free_all(ret); +      return (NULL);  } diff --git a/openssl/crypto/bio/bss_dgram.c b/openssl/crypto/bio/bss_dgram.c index b495db26e..e3e3dd050 100644 --- a/openssl/crypto/bio/bss_dgram.c +++ b/openssl/crypto/bio/bss_dgram.c @@ -299,16 +299,17 @@ static void dgram_adjust_rcv_timeout(BIO *b)          /* Calculate time left until timer expires */          memcpy(&timeleft, &(data->next_timeout), sizeof(struct timeval)); -        timeleft.tv_sec -= timenow.tv_sec; -        timeleft.tv_usec -= timenow.tv_usec; -        if (timeleft.tv_usec < 0) { +        if (timeleft.tv_usec < timenow.tv_usec) { +            timeleft.tv_usec = 1000000 - timenow.tv_usec + timeleft.tv_usec;              timeleft.tv_sec--; -            timeleft.tv_usec += 1000000; +        } else { +            timeleft.tv_usec -= timenow.tv_usec;          } - -        if (timeleft.tv_sec < 0) { +        if (timeleft.tv_sec < timenow.tv_sec) {              timeleft.tv_sec = 0;              timeleft.tv_usec = 1; +        } else { +            timeleft.tv_sec -= timenow.tv_sec;          }          /* @@ -953,7 +954,7 @@ BIO *BIO_new_dgram_sctp(int fd, int close_flag)       */      sockopt_len = (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));      authchunks = OPENSSL_malloc(sockopt_len); -    if(!authchunks) { +    if (!authchunks) {          BIO_vfree(bio);          return (NULL);      } @@ -1293,7 +1294,7 @@ static int dgram_sctp_read(BIO *b, char *out, int outl)                  (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));              authchunks = OPENSSL_malloc(optlen);              if (!authchunks) { -                BIOerr(BIO_F_DGRAM_SCTP_READ, ERR_R_MALLOC_ERROR); +                BIOerr(BIO_F_DGRAM_SCTP_READ, ERR_R_MALLOC_FAILURE);                  return -1;              }              memset(authchunks, 0, sizeof(optlen)); @@ -1364,8 +1365,8 @@ static int dgram_sctp_write(BIO *b, const char *in, int inl)      if (data->save_shutdown && !BIO_dgram_sctp_wait_for_dry(b)) {          char *tmp;          data->saved_message.bio = b; -        if(!(tmp = OPENSSL_malloc(inl))) { -            BIOerr(BIO_F_DGRAM_SCTP_WRITE, ERR_R_MALLOC_ERROR); +        if (!(tmp = OPENSSL_malloc(inl))) { +            BIOerr(BIO_F_DGRAM_SCTP_WRITE, ERR_R_MALLOC_FAILURE);              return -1;          }          if (data->saved_message.data) diff --git a/openssl/crypto/bn/Makefile b/openssl/crypto/bn/Makefile index 6dd136be5..3d0158c15 100644 --- a/openssl/crypto/bn/Makefile +++ b/openssl/crypto/bn/Makefile @@ -167,6 +167,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: bn_prime.h depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/bn/bn.h b/openssl/crypto/bn/bn.h index 7d57e9834..47d8c71d9 100644 --- a/openssl/crypto/bn/bn.h +++ b/openssl/crypto/bn/bn.h @@ -797,6 +797,7 @@ int RAND_pseudo_bytes(unsigned char *buf, int num);                           * wouldn't be constructed with top!=dmax. */ \                          BN_ULONG *_not_const; \                          memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ +                        /* Debug only - safe to ignore error return */ \                          RAND_pseudo_bytes(&_tmp_char, 1); \                          memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \                                  (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ @@ -910,6 +911,7 @@ void ERR_load_BN_strings(void);  # define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR                  135  # define BN_F_BN_GF2M_MOD_SQR                             136  # define BN_F_BN_GF2M_MOD_SQRT                            137 +# define BN_F_BN_LSHIFT                                   145  # define BN_F_BN_MOD_EXP2_MONT                            118  # define BN_F_BN_MOD_EXP_MONT                             109  # define BN_F_BN_MOD_EXP_MONT_CONSTTIME                   124 @@ -925,12 +927,14 @@ void ERR_load_BN_strings(void);  # define BN_F_BN_NEW                                      113  # define BN_F_BN_RAND                                     114  # define BN_F_BN_RAND_RANGE                               122 +# define BN_F_BN_RSHIFT                                   146  # define BN_F_BN_USUB                                     115  /* Reason codes. */  # define BN_R_ARG2_LT_ARG3                                100  # define BN_R_BAD_RECIPROCAL                              101  # define BN_R_BIGNUM_TOO_LONG                             114 +# define BN_R_BITS_TOO_SMALL                              118  # define BN_R_CALLED_WITH_EVEN_MODULUS                    102  # define BN_R_DIV_BY_ZERO                                 103  # define BN_R_ENCODING_ERROR                              104 @@ -938,6 +942,7 @@ void ERR_load_BN_strings(void);  # define BN_R_INPUT_NOT_REDUCED                           110  # define BN_R_INVALID_LENGTH                              106  # define BN_R_INVALID_RANGE                               115 +# define BN_R_INVALID_SHIFT                               119  # define BN_R_NOT_A_SQUARE                                111  # define BN_R_NOT_INITIALIZED                             107  # define BN_R_NO_INVERSE                                  108 diff --git a/openssl/crypto/bn/bn_err.c b/openssl/crypto/bn/bn_err.c index faa7e226b..e7a703826 100644 --- a/openssl/crypto/bn/bn_err.c +++ b/openssl/crypto/bn/bn_err.c @@ -1,6 +1,6 @@  /* crypto/bn/bn_err.c */  /* ==================================================================== - * Copyright (c) 1999-2007 The OpenSSL Project.  All rights reserved. + * Copyright (c) 1999-2015 The OpenSSL Project.  All rights reserved.   *   * Redistribution and use in source and binary forms, with or without   * modification, are permitted provided that the following conditions @@ -94,6 +94,7 @@ static ERR_STRING_DATA BN_str_functs[] = {      {ERR_FUNC(BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR), "BN_GF2m_mod_solve_quad_arr"},      {ERR_FUNC(BN_F_BN_GF2M_MOD_SQR), "BN_GF2m_mod_sqr"},      {ERR_FUNC(BN_F_BN_GF2M_MOD_SQRT), "BN_GF2m_mod_sqrt"}, +    {ERR_FUNC(BN_F_BN_LSHIFT), "BN_lshift"},      {ERR_FUNC(BN_F_BN_MOD_EXP2_MONT), "BN_mod_exp2_mont"},      {ERR_FUNC(BN_F_BN_MOD_EXP_MONT), "BN_mod_exp_mont"},      {ERR_FUNC(BN_F_BN_MOD_EXP_MONT_CONSTTIME), "BN_mod_exp_mont_consttime"}, @@ -109,6 +110,7 @@ static ERR_STRING_DATA BN_str_functs[] = {      {ERR_FUNC(BN_F_BN_NEW), "BN_new"},      {ERR_FUNC(BN_F_BN_RAND), "BN_rand"},      {ERR_FUNC(BN_F_BN_RAND_RANGE), "BN_rand_range"}, +    {ERR_FUNC(BN_F_BN_RSHIFT), "BN_rshift"},      {ERR_FUNC(BN_F_BN_USUB), "BN_usub"},      {0, NULL}  }; @@ -117,6 +119,7 @@ static ERR_STRING_DATA BN_str_reasons[] = {      {ERR_REASON(BN_R_ARG2_LT_ARG3), "arg2 lt arg3"},      {ERR_REASON(BN_R_BAD_RECIPROCAL), "bad reciprocal"},      {ERR_REASON(BN_R_BIGNUM_TOO_LONG), "bignum too long"}, +    {ERR_REASON(BN_R_BITS_TOO_SMALL), "bits too small"},      {ERR_REASON(BN_R_CALLED_WITH_EVEN_MODULUS), "called with even modulus"},      {ERR_REASON(BN_R_DIV_BY_ZERO), "div by zero"},      {ERR_REASON(BN_R_ENCODING_ERROR), "encoding error"}, @@ -125,6 +128,7 @@ static ERR_STRING_DATA BN_str_reasons[] = {      {ERR_REASON(BN_R_INPUT_NOT_REDUCED), "input not reduced"},      {ERR_REASON(BN_R_INVALID_LENGTH), "invalid length"},      {ERR_REASON(BN_R_INVALID_RANGE), "invalid range"}, +    {ERR_REASON(BN_R_INVALID_SHIFT), "invalid shift"},      {ERR_REASON(BN_R_NOT_A_SQUARE), "not a square"},      {ERR_REASON(BN_R_NOT_INITIALIZED), "not initialized"},      {ERR_REASON(BN_R_NO_INVERSE), "no inverse"}, diff --git a/openssl/crypto/bn/bn_gf2m.c b/openssl/crypto/bn/bn_gf2m.c index aeee49a01..a0ba8de31 100644 --- a/openssl/crypto/bn/bn_gf2m.c +++ b/openssl/crypto/bn/bn_gf2m.c @@ -694,9 +694,10 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)      }  # else      { -        int i, ubits = BN_num_bits(u), vbits = BN_num_bits(v), /* v is copy -                                                                * of p */ -            top = p->top; +        int i; +        int ubits = BN_num_bits(u); +        int vbits = BN_num_bits(v); /* v is copy of p */ +        int top = p->top;          BN_ULONG *udp, *bdp, *vdp, *cdp;          bn_wexpand(u, top); @@ -740,8 +741,12 @@ int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)                  ubits--;              } -            if (ubits <= BN_BITS2 && udp[0] == 1) -                break; +            if (ubits <= BN_BITS2) { +                if (udp[0] == 0) /* poly was reducible */ +                    goto err; +                if (udp[0] == 1) +                    break; +            }              if (ubits < vbits) {                  i = ubits; diff --git a/openssl/crypto/bn/bn_lcl.h b/openssl/crypto/bn/bn_lcl.h index 1059d1d4b..904a72349 100644 --- a/openssl/crypto/bn/bn_lcl.h +++ b/openssl/crypto/bn/bn_lcl.h @@ -276,7 +276,7 @@ unsigned __int64 _umul128(unsigned __int64 a, unsigned __int64 b,  #   endif  #  elif defined(__mips) && (defined(SIXTY_FOUR_BIT) || defined(SIXTY_FOUR_BIT_LONG))  #   if defined(__GNUC__) && __GNUC__>=2 -#    if __GNUC__>=4 && __GNUC_MINOR__>=4 +#    if __GNUC__>4 || (__GNUC__>=4 && __GNUC_MINOR__>=4)                                       /* "h" constraint is no more since 4.4 */  #     define BN_UMULT_HIGH(a,b)          (((__uint128_t)(a)*(b))>>64)  #     define BN_UMULT_LOHI(low,high,a,b) ({     \ diff --git a/openssl/crypto/bn/bn_print.c b/openssl/crypto/bn/bn_print.c index 4dcaae32b..ab10b957b 100644 --- a/openssl/crypto/bn/bn_print.c +++ b/openssl/crypto/bn/bn_print.c @@ -71,7 +71,12 @@ char *BN_bn2hex(const BIGNUM *a)      char *buf;      char *p; -    buf = (char *)OPENSSL_malloc(a->top * BN_BYTES * 2 + 2); +    if (a->neg && BN_is_zero(a)) { +        /* "-0" == 3 bytes including NULL terminator */ +        buf = OPENSSL_malloc(3); +    } else { +        buf = OPENSSL_malloc(a->top * BN_BYTES * 2 + 2); +    }      if (buf == NULL) {          BNerr(BN_F_BN_BN2HEX, ERR_R_MALLOC_FAILURE);          goto err; diff --git a/openssl/crypto/bn/bn_rand.c b/openssl/crypto/bn/bn_rand.c index 7ac71ec8e..f9fb2e9e4 100644 --- a/openssl/crypto/bn/bn_rand.c +++ b/openssl/crypto/bn/bn_rand.c @@ -121,6 +121,11 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom)      int ret = 0, bit, bytes, mask;      time_t tim; +    if (bits < 0 || (bits == 1 && top > 0)) { +        BNerr(BN_F_BNRAND, BN_R_BITS_TOO_SMALL); +        return 0; +    } +      if (bits == 0) {          BN_zero(rnd);          return 1; @@ -157,7 +162,8 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom)          unsigned char c;          for (i = 0; i < bytes; i++) { -            RAND_pseudo_bytes(&c, 1); +            if (RAND_pseudo_bytes(&c, 1) < 0) +                goto err;              if (c >= 128 && i > 0)                  buf[i] = buf[i - 1];              else if (c < 42) @@ -168,7 +174,7 @@ static int bnrand(int pseudorand, BIGNUM *rnd, int bits, int top, int bottom)      }  #endif -    if (top != -1) { +    if (top >= 0) {          if (top) {              if (bit == 0) {                  buf[0] = 1; diff --git a/openssl/crypto/bn/bn_shift.c b/openssl/crypto/bn/bn_shift.c index 4f3e8ffed..9673d9a30 100644 --- a/openssl/crypto/bn/bn_shift.c +++ b/openssl/crypto/bn/bn_shift.c @@ -137,6 +137,11 @@ int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)      bn_check_top(r);      bn_check_top(a); +    if (n < 0) { +        BNerr(BN_F_BN_LSHIFT, BN_R_INVALID_SHIFT); +        return 0; +    } +      r->neg = a->neg;      nw = n / BN_BITS2;      if (bn_wexpand(r, a->top + nw + 1) == NULL) @@ -174,6 +179,11 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)      bn_check_top(r);      bn_check_top(a); +    if (n < 0) { +        BNerr(BN_F_BN_RSHIFT, BN_R_INVALID_SHIFT); +        return 0; +    } +      nw = n / BN_BITS2;      rb = n % BN_BITS2;      lb = BN_BITS2 - rb; diff --git a/openssl/crypto/buffer/Makefile b/openssl/crypto/buffer/Makefile index 2efba47f0..352efb841 100644 --- a/openssl/crypto/buffer/Makefile +++ b/openssl/crypto/buffer/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/buffer/buffer.c b/openssl/crypto/buffer/buffer.c index d287e340a..eff3e0815 100644 --- a/openssl/crypto/buffer/buffer.c +++ b/openssl/crypto/buffer/buffer.c @@ -88,7 +88,7 @@ void BUF_MEM_free(BUF_MEM *a)          return;      if (a->data != NULL) { -        memset(a->data, 0, (unsigned int)a->max); +        OPENSSL_cleanse(a->data, a->max);          OPENSSL_free(a->data);      }      OPENSSL_free(a); diff --git a/openssl/crypto/camellia/Makefile b/openssl/crypto/camellia/Makefile index 6ce6fc99c..228f1dc71 100644 --- a/openssl/crypto/camellia/Makefile +++ b/openssl/crypto/camellia/Makefile @@ -73,6 +73,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/cast/Makefile b/openssl/crypto/cast/Makefile index f3f485988..4c4b5e9ba 100644 --- a/openssl/crypto/cast/Makefile +++ b/openssl/crypto/cast/Makefile @@ -69,6 +69,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/cmac/Makefile b/openssl/crypto/cmac/Makefile index 54e7cc39d..6a2840867 100644 --- a/openssl/crypto/cmac/Makefile +++ b/openssl/crypto/cmac/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/cmac/cmac.c b/openssl/crypto/cmac/cmac.c index c5597a3f7..774e6dc91 100644 --- a/openssl/crypto/cmac/cmac.c +++ b/openssl/crypto/cmac/cmac.c @@ -126,6 +126,8 @@ EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx)  void CMAC_CTX_free(CMAC_CTX *ctx)  { +    if (!ctx) +        return;      CMAC_CTX_cleanup(ctx);      OPENSSL_free(ctx);  } diff --git a/openssl/crypto/cms/Makefile b/openssl/crypto/cms/Makefile index 9820adb21..b124b5dbf 100644 --- a/openssl/crypto/cms/Makefile +++ b/openssl/crypto/cms/Makefile @@ -67,6 +67,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/cms/cms_pwri.c b/openssl/crypto/cms/cms_pwri.c index 076b54578..a8322dcdf 100644 --- a/openssl/crypto/cms/cms_pwri.c +++ b/openssl/crypto/cms/cms_pwri.c @@ -231,7 +231,7 @@ static int kek_unwrap_key(unsigned char *out, size_t *outlen,          return 0;      }      tmp = OPENSSL_malloc(inlen); -    if(!tmp) +    if (!tmp)          return 0;      /* setup IV by decrypting last two blocks */      EVP_DecryptUpdate(ctx, tmp + inlen - 2 * blocklen, &outl, @@ -297,8 +297,9 @@ static int kek_wrap_key(unsigned char *out, size_t *outlen,          out[3] = in[2] ^ 0xFF;          memcpy(out + 4, in, inlen);          /* Add random padding to end */ -        if (olen > inlen + 4) -            RAND_pseudo_bytes(out + 4 + inlen, olen - 4 - inlen); +        if (olen > inlen + 4 +            && RAND_pseudo_bytes(out + 4 + inlen, olen - 4 - inlen) < 0) +            return 0;          /* Encrypt twice */          EVP_EncryptUpdate(ctx, out, &dummy, out, olen);          EVP_EncryptUpdate(ctx, out, &dummy, out, olen); diff --git a/openssl/crypto/cms/cms_smime.c b/openssl/crypto/cms/cms_smime.c index 8851603f6..8b3756082 100644 --- a/openssl/crypto/cms/cms_smime.c +++ b/openssl/crypto/cms/cms_smime.c @@ -131,7 +131,7 @@ static void do_free_upto(BIO *f, BIO *upto)              BIO_free(f);              f = tbio;          } -        while (f != upto); +        while (f && f != upto);      } else          BIO_free_all(f);  } diff --git a/openssl/crypto/comp/Makefile b/openssl/crypto/comp/Makefile index efda832dc..a1e9464a1 100644 --- a/openssl/crypto/comp/Makefile +++ b/openssl/crypto/comp/Makefile @@ -64,6 +64,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/conf/Makefile b/openssl/crypto/conf/Makefile index 78bb32410..d5f5c5824 100644 --- a/openssl/crypto/conf/Makefile +++ b/openssl/crypto/conf/Makefile @@ -64,6 +64,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/cryptlib.c b/openssl/crypto/cryptlib.c index 7f1fd6804..7fd858e21 100644 --- a/openssl/crypto/cryptlib.c +++ b/openssl/crypto/cryptlib.c @@ -806,8 +806,6 @@ int OPENSSL_isservice(void)      if (_OPENSSL_isservice.p != (void *)-1)          return (*_OPENSSL_isservice.f) (); -    (void)GetDesktopWindow();   /* return value is ignored */ -      h = GetProcessWindowStation();      if (h == NULL)          return -1; diff --git a/openssl/crypto/des/Makefile b/openssl/crypto/des/Makefile index a6e100132..fbc77c163 100644 --- a/openssl/crypto/des/Makefile +++ b/openssl/crypto/des/Makefile @@ -94,6 +94,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/des/des.c b/openssl/crypto/des/des.c index 2bff28125..586aed723 100644 --- a/openssl/crypto/des/des.c +++ b/openssl/crypto/des/des.c @@ -455,8 +455,10 @@ void doencryption(void)              rem = l % 8;              len = l - rem;              if (feof(DES_IN)) { -                for (i = 7 - rem; i > 0; i--) -                    RAND_pseudo_bytes(buf + l++, 1); +                for (i = 7 - rem; i > 0; i--) { +                    if (RAND_pseudo_bytes(buf + l++, 1) < 0) +                        goto problems; +                }                  buf[l++] = rem;                  ex = 1;                  len += rem; diff --git a/openssl/crypto/des/enc_writ.c b/openssl/crypto/des/enc_writ.c index b4eecc381..bfaabde51 100644 --- a/openssl/crypto/des/enc_writ.c +++ b/openssl/crypto/des/enc_writ.c @@ -96,6 +96,9 @@ int DES_enc_write(int fd, const void *_buf, int len,      const unsigned char *cp;      static int start = 1; +    if (len < 0) +        return -1; +      if (outbuf == NULL) {          outbuf = OPENSSL_malloc(BSIZE + HDRSIZE);          if (outbuf == NULL) @@ -132,7 +135,9 @@ int DES_enc_write(int fd, const void *_buf, int len,      if (len < 8) {          cp = shortbuf;          memcpy(shortbuf, buf, len); -        RAND_pseudo_bytes(shortbuf + len, 8 - len); +        if (RAND_pseudo_bytes(shortbuf + len, 8 - len) < 0) { +            return -1; +        }          rnum = 8;      } else {          cp = buf; diff --git a/openssl/crypto/dh/Makefile b/openssl/crypto/dh/Makefile index f23b4f7fd..6d574f407 100644 --- a/openssl/crypto/dh/Makefile +++ b/openssl/crypto/dh/Makefile @@ -63,6 +63,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/dh/dh_ameth.c b/openssl/crypto/dh/dh_ameth.c index 1dec10983..873eb2e22 100644 --- a/openssl/crypto/dh/dh_ameth.c +++ b/openssl/crypto/dh/dh_ameth.c @@ -135,7 +135,7 @@ static int dh_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)      dh = pkey->pkey.dh;      str = ASN1_STRING_new(); -    if(!str) { +    if (!str) {          DHerr(DH_F_DH_PUB_ENCODE, ERR_R_MALLOC_FAILURE);          goto err;      } diff --git a/openssl/crypto/dsa/Makefile b/openssl/crypto/dsa/Makefile index 5fef4ca5a..810920137 100644 --- a/openssl/crypto/dsa/Makefile +++ b/openssl/crypto/dsa/Makefile @@ -63,6 +63,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/dsa/dsa_gen.c b/openssl/crypto/dsa/dsa_gen.c index c808ab609..d686ab0af 100644 --- a/openssl/crypto/dsa/dsa_gen.c +++ b/openssl/crypto/dsa/dsa_gen.c @@ -202,7 +202,8 @@ int dsa_builtin_paramgen(DSA *ret, size_t bits, size_t qbits,                  goto err;              if (!seed_len) { -                RAND_pseudo_bytes(seed, qsize); +                if (RAND_pseudo_bytes(seed, qsize) < 0) +                    goto err;                  seed_is_random = 1;              } else {                  seed_is_random = 0; diff --git a/openssl/crypto/dsa/dsa_ossl.c b/openssl/crypto/dsa/dsa_ossl.c index b30eab031..6edb26d97 100644 --- a/openssl/crypto/dsa/dsa_ossl.c +++ b/openssl/crypto/dsa/dsa_ossl.c @@ -106,23 +106,23 @@ static DSA_METHOD openssl_dsa_meth = {  #define DSA_MOD_EXP(err_instr,dsa,rr,a1,p1,a2,p2,m,ctx,in_mont) \          do { \          int _tmp_res53; \ -        if((dsa)->meth->dsa_mod_exp) \ +        if ((dsa)->meth->dsa_mod_exp) \                  _tmp_res53 = (dsa)->meth->dsa_mod_exp((dsa), (rr), (a1), (p1), \                                  (a2), (p2), (m), (ctx), (in_mont)); \          else \                  _tmp_res53 = BN_mod_exp2_mont((rr), (a1), (p1), (a2), (p2), \                                  (m), (ctx), (in_mont)); \ -        if(!_tmp_res53) err_instr; \ +        if (!_tmp_res53) err_instr; \          } while(0)  #define DSA_BN_MOD_EXP(err_instr,dsa,r,a,p,m,ctx,m_ctx) \          do { \          int _tmp_res53; \ -        if((dsa)->meth->bn_mod_exp) \ +        if ((dsa)->meth->bn_mod_exp) \                  _tmp_res53 = (dsa)->meth->bn_mod_exp((dsa), (r), (a), (p), \                                  (m), (ctx), (m_ctx)); \          else \                  _tmp_res53 = BN_mod_exp_mont((r), (a), (p), (m), (ctx), (m_ctx)); \ -        if(!_tmp_res53) err_instr; \ +        if (!_tmp_res53) err_instr; \          } while(0)  const DSA_METHOD *DSA_OpenSSL(void) diff --git a/openssl/crypto/dso/Makefile b/openssl/crypto/dso/Makefile index fb2709ed6..36b8ead04 100644 --- a/openssl/crypto/dso/Makefile +++ b/openssl/crypto/dso/Makefile @@ -63,6 +63,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/dso/dso_lib.c b/openssl/crypto/dso/dso_lib.c index d2a48bb66..09b8eafcc 100644 --- a/openssl/crypto/dso/dso_lib.c +++ b/openssl/crypto/dso/dso_lib.c @@ -285,7 +285,7 @@ DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname)   * honest. For one thing, I think I have to return a negative value for any   * error because possible DSO_ctrl() commands may return values such as   * "size"s that can legitimately be zero (making the standard - * "if(DSO_cmd(...))" form that works almost everywhere else fail at odd + * "if (DSO_cmd(...))" form that works almost everywhere else fail at odd   * times. I'd prefer "output" values to be passed by reference and the return   * value as success/failure like usual ... but we conform when we must... :-)   */ diff --git a/openssl/crypto/dso/dso_vms.c b/openssl/crypto/dso/dso_vms.c index 0eff96ec2..d0794b8fb 100644 --- a/openssl/crypto/dso/dso_vms.c +++ b/openssl/crypto/dso/dso_vms.c @@ -539,7 +539,7 @@ static char *vms_name_converter(DSO *dso, const char *filename)  {      int len = strlen(filename);      char *not_translated = OPENSSL_malloc(len + 1); -    if(not_translated) +    if (not_translated)          strcpy(not_translated, filename);      return (not_translated);  } diff --git a/openssl/crypto/ec/Makefile b/openssl/crypto/ec/Makefile index f85fc845c..2753b28be 100644 --- a/openssl/crypto/ec/Makefile +++ b/openssl/crypto/ec/Makefile @@ -70,6 +70,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/ec/ec2_oct.c b/openssl/crypto/ec/ec2_oct.c index c245d886d..0d04cc692 100644 --- a/openssl/crypto/ec/ec2_oct.c +++ b/openssl/crypto/ec/ec2_oct.c @@ -387,7 +387,7 @@ int ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,      }      /* test required by X9.62 */ -    if (!EC_POINT_is_on_curve(group, point, ctx)) { +    if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {          ECerr(EC_F_EC_GF2M_SIMPLE_OCT2POINT, EC_R_POINT_IS_NOT_ON_CURVE);          goto err;      } diff --git a/openssl/crypto/ec/ec_asn1.c b/openssl/crypto/ec/ec_asn1.c index b4b0e9f3b..4ad849498 100644 --- a/openssl/crypto/ec/ec_asn1.c +++ b/openssl/crypto/ec/ec_asn1.c @@ -1114,7 +1114,7 @@ int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out)  {      int ret = 0, ok = 0;      unsigned char *buffer = NULL; -    size_t buf_len = 0, tmp_len; +    size_t buf_len = 0, tmp_len, bn_len;      EC_PRIVATEKEY *priv_key = NULL;      if (a == NULL || a->group == NULL || a->priv_key == NULL || @@ -1130,18 +1130,32 @@ int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out)      priv_key->version = a->version; -    buf_len = (size_t)BN_num_bytes(a->priv_key); +    bn_len = (size_t)BN_num_bytes(a->priv_key); + +    /* Octetstring may need leading zeros if BN is to short */ + +    buf_len = (EC_GROUP_get_degree(a->group) + 7) / 8; + +    if (bn_len > buf_len) { +        ECerr(EC_F_I2D_ECPRIVATEKEY, EC_R_BUFFER_TOO_SMALL); +        goto err; +    } +      buffer = OPENSSL_malloc(buf_len);      if (buffer == NULL) {          ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE);          goto err;      } -    if (!BN_bn2bin(a->priv_key, buffer)) { +    if (!BN_bn2bin(a->priv_key, buffer + buf_len - bn_len)) {          ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_BN_LIB);          goto err;      } +    if (buf_len - bn_len > 0) { +        memset(buffer, 0, buf_len - bn_len); +    } +      if (!M_ASN1_OCTET_STRING_set(priv_key->privateKey, buffer, buf_len)) {          ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB);          goto err; diff --git a/openssl/crypto/ec/ec_check.c b/openssl/crypto/ec/ec_check.c index d3f534999..dd6f0ac40 100644 --- a/openssl/crypto/ec/ec_check.c +++ b/openssl/crypto/ec/ec_check.c @@ -85,7 +85,7 @@ int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx)          ECerr(EC_F_EC_GROUP_CHECK, EC_R_UNDEFINED_GENERATOR);          goto err;      } -    if (!EC_POINT_is_on_curve(group, group->generator, ctx)) { +    if (EC_POINT_is_on_curve(group, group->generator, ctx) <= 0) {          ECerr(EC_F_EC_GROUP_CHECK, EC_R_POINT_IS_NOT_ON_CURVE);          goto err;      } diff --git a/openssl/crypto/ec/ec_key.c b/openssl/crypto/ec/ec_key.c index ebdffc821..55ce3fe9b 100644 --- a/openssl/crypto/ec/ec_key.c +++ b/openssl/crypto/ec/ec_key.c @@ -314,7 +314,7 @@ int EC_KEY_check_key(const EC_KEY *eckey)          goto err;      /* testing whether the pub_key is on the elliptic curve */ -    if (!EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx)) { +    if (EC_POINT_is_on_curve(eckey->group, eckey->pub_key, ctx) <= 0) {          ECerr(EC_F_EC_KEY_CHECK_KEY, EC_R_POINT_IS_NOT_ON_CURVE);          goto err;      } diff --git a/openssl/crypto/ec/ec_lcl.h b/openssl/crypto/ec/ec_lcl.h index 319e651f6..d79ed1e4d 100644 --- a/openssl/crypto/ec/ec_lcl.h +++ b/openssl/crypto/ec/ec_lcl.h @@ -451,14 +451,6 @@ int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r,  int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);  int ec_GF2m_have_precompute_mult(const EC_GROUP *group); -/* method functions in ec2_mult.c */ -int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, -                       const BIGNUM *scalar, size_t num, -                       const EC_POINT *points[], const BIGNUM *scalars[], -                       BN_CTX *); -int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx); -int ec_GF2m_have_precompute_mult(const EC_GROUP *group); -  #ifndef OPENSSL_NO_EC_NISTP_64_GCC_128  /* method functions in ecp_nistp224.c */  int ec_GFp_nistp224_group_init(EC_GROUP *group); diff --git a/openssl/crypto/ec/ec_lib.c b/openssl/crypto/ec/ec_lib.c index 9a54f41e4..e2275207e 100644 --- a/openssl/crypto/ec/ec_lib.c +++ b/openssl/crypto/ec/ec_lib.c @@ -934,6 +934,13 @@ int EC_POINT_is_at_infinity(const EC_GROUP *group, const EC_POINT *point)      return group->meth->is_at_infinity(group, point);  } +/* + * Check whether an EC_POINT is on the curve or not. Note that the return + * value for this function should NOT be treated as a boolean. Return values: + *  1: The point is on the curve + *  0: The point is not on the curve + * -1: An error occurred + */  int EC_POINT_is_on_curve(const EC_GROUP *group, const EC_POINT *point,                           BN_CTX *ctx)  { diff --git a/openssl/crypto/ec/eck_prn.c b/openssl/crypto/ec/eck_prn.c index a911a0ac4..5ef12ec02 100644 --- a/openssl/crypto/ec/eck_prn.c +++ b/openssl/crypto/ec/eck_prn.c @@ -338,12 +338,14 @@ static int print_bin(BIO *fp, const char *name, const unsigned char *buf,      if (buf == NULL)          return 1; -    if (off) { +    if (off > 0) {          if (off > 128)              off = 128;          memset(str, ' ', off);          if (BIO_write(fp, str, off) <= 0)              return 0; +    } else { +        off = 0;      }      if (BIO_printf(fp, "%s", name) <= 0) diff --git a/openssl/crypto/ec/ecp_oct.c b/openssl/crypto/ec/ecp_oct.c index e5cec8be8..1bc3f39ad 100644 --- a/openssl/crypto/ec/ecp_oct.c +++ b/openssl/crypto/ec/ecp_oct.c @@ -413,7 +413,7 @@ int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,      }      /* test required by X9.62 */ -    if (!EC_POINT_is_on_curve(group, point, ctx)) { +    if (EC_POINT_is_on_curve(group, point, ctx) <= 0) {          ECerr(EC_F_EC_GFP_SIMPLE_OCT2POINT, EC_R_POINT_IS_NOT_ON_CURVE);          goto err;      } diff --git a/openssl/crypto/ec/ectest.c b/openssl/crypto/ec/ectest.c index a18b32761..fede530bc 100644 --- a/openssl/crypto/ec/ectest.c +++ b/openssl/crypto/ec/ectest.c @@ -412,7 +412,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, Q, x, 1, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, Q, ctx)) { +    if (EC_POINT_is_on_curve(group, Q, ctx) <= 0) {          if (!EC_POINT_get_affine_coordinates_GFp(group, Q, x, y, ctx))              ABORT;          fprintf(stderr, "Point is not on curve: x = 0x"); @@ -544,7 +544,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn(&z, "0100000000000000000001F4C8F927AED3CA752257"))          ABORT; @@ -593,7 +593,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"))          ABORT; @@ -646,7 +646,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn          (&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D")) @@ -705,7 +705,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn(&z, "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E"                     "84F3B9CAC2FC632551")) @@ -761,7 +761,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 1, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn(&z, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"                     "FFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973")) @@ -820,7 +820,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, 0, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!BN_hex2bn(&z, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"                     "FFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5" @@ -864,7 +864,7 @@ static void prime_field_tests(void)          ABORT;      if (!EC_POINT_dbl(group, P, P, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!EC_POINT_invert(group, Q, ctx))          ABORT;                  /* P = -2Q */ @@ -1008,7 +1008,7 @@ static void prime_field_tests(void)  #  define CHAR2_CURVE_TEST_INTERNAL(_name, _p, _a, _b, _x, _y, _y_bit, _order, _cof, _degree, _variable) \          if (!BN_hex2bn(&x, _x)) ABORT; \          if (!EC_POINT_set_compressed_coordinates_GF2m(group, P, x, _y_bit, ctx)) ABORT; \ -        if (!EC_POINT_is_on_curve(group, P, ctx)) ABORT; \ +        if (EC_POINT_is_on_curve(group, P, ctx) <= 0) ABORT; \          if (!BN_hex2bn(&z, _order)) ABORT; \          if (!BN_hex2bn(&cof, _cof)) ABORT; \          if (!EC_GROUP_set_generator(group, P, z, cof)) ABORT; \ @@ -1026,7 +1026,7 @@ static void prime_field_tests(void)          if (!BN_hex2bn(&x, _x)) ABORT; \          if (!BN_hex2bn(&y, _y)) ABORT; \          if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) ABORT; \ -        if (!EC_POINT_is_on_curve(group, P, ctx)) ABORT; \ +        if (EC_POINT_is_on_curve(group, P, ctx) <= 0) ABORT; \          if (!BN_hex2bn(&z, _order)) ABORT; \          if (!BN_hex2bn(&cof, _cof)) ABORT; \          if (!EC_GROUP_set_generator(group, P, z, cof)) ABORT; \ @@ -1157,7 +1157,7 @@ static void char2_field_tests(void)      if (!EC_POINT_set_affine_coordinates_GF2m(group, Q, x, y, ctx))          ABORT;  #  endif -    if (!EC_POINT_is_on_curve(group, Q, ctx)) { +    if (EC_POINT_is_on_curve(group, Q, ctx) <= 0) {  /* Change test based on whether binary point compression is enabled or not. */  #  ifdef OPENSSL_EC_BIN_PT_COMP          if (!EC_POINT_get_affine_coordinates_GF2m(group, Q, x, y, ctx)) @@ -1378,7 +1378,7 @@ static void char2_field_tests(void)          ABORT;      if (!EC_POINT_dbl(group, P, P, ctx))          ABORT; -    if (!EC_POINT_is_on_curve(group, P, ctx)) +    if (EC_POINT_is_on_curve(group, P, ctx) <= 0)          ABORT;      if (!EC_POINT_invert(group, Q, ctx))          ABORT;                  /* P = -2Q */ diff --git a/openssl/crypto/ecdh/Makefile b/openssl/crypto/ecdh/Makefile index ba05fea05..f0766356a 100644 --- a/openssl/crypto/ecdh/Makefile +++ b/openssl/crypto/ecdh/Makefile @@ -62,6 +62,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/ecdsa/Makefile b/openssl/crypto/ecdsa/Makefile index e89e0c010..4ce00e8f9 100644 --- a/openssl/crypto/ecdsa/Makefile +++ b/openssl/crypto/ecdsa/Makefile @@ -62,6 +62,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/ecdsa/ecdsatest.c b/openssl/crypto/ecdsa/ecdsatest.c index b2d78f3d5..0f301f86d 100644 --- a/openssl/crypto/ecdsa/ecdsatest.c +++ b/openssl/crypto/ecdsa/ecdsatest.c @@ -296,8 +296,8 @@ int test_builtin(BIO *out)      int nid, ret = 0;      /* fill digest values with some random data */ -    if (!RAND_pseudo_bytes(digest, 20) || -        !RAND_pseudo_bytes(wrong_digest, 20)) { +    if (RAND_pseudo_bytes(digest, 20) <= 0 || +        RAND_pseudo_bytes(wrong_digest, 20) <= 0) {          BIO_printf(out, "ERROR: unable to get random data\n");          goto builtin_err;      } diff --git a/openssl/crypto/engine/Makefile b/openssl/crypto/engine/Makefile index d29bdd09a..8ceb747fa 100644 --- a/openssl/crypto/engine/Makefile +++ b/openssl/crypto/engine/Makefile @@ -71,6 +71,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/engine/eng_table.c b/openssl/crypto/engine/eng_table.c index 2e1a7e855..27d31f70c 100644 --- a/openssl/crypto/engine/eng_table.c +++ b/openssl/crypto/engine/eng_table.c @@ -351,6 +351,8 @@ void engine_table_doall(ENGINE_TABLE *table, engine_table_doall_cb *cb,      ENGINE_PILE_DOALL dall;      dall.cb = cb;      dall.arg = arg; -    lh_ENGINE_PILE_doall_arg(&table->piles, LHASH_DOALL_ARG_FN(int_cb), -                             ENGINE_PILE_DOALL, &dall); +    if (table) +        lh_ENGINE_PILE_doall_arg(&table->piles, +                                 LHASH_DOALL_ARG_FN(int_cb), +                                 ENGINE_PILE_DOALL, &dall);  } diff --git a/openssl/crypto/err/Makefile b/openssl/crypto/err/Makefile index 862b23ba1..b6f3ef177 100644 --- a/openssl/crypto/err/Makefile +++ b/openssl/crypto/err/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/evp/Makefile b/openssl/crypto/evp/Makefile index ef75678ad..ed1502d3a 100644 --- a/openssl/crypto/evp/Makefile +++ b/openssl/crypto/evp/Makefile @@ -86,6 +86,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/evp/bio_ok.c b/openssl/crypto/evp/bio_ok.c index a4550349b..5c32e35e1 100644 --- a/openssl/crypto/evp/bio_ok.c +++ b/openssl/crypto/evp/bio_ok.c @@ -491,7 +491,8 @@ static int sig_out(BIO *b)       * FIXME: there's absolutely no guarantee this makes any sense at all,       * particularly now EVP_MD_CTX has been restructured.       */ -    RAND_pseudo_bytes(md->md_data, md->digest->md_size); +    if (RAND_pseudo_bytes(md->md_data, md->digest->md_size) < 0) +        goto berr;      memcpy(&(ctx->buf[ctx->buf_len]), md->md_data, md->digest->md_size);      longswap(&(ctx->buf[ctx->buf_len]), md->digest->md_size);      ctx->buf_len += md->digest->md_size; diff --git a/openssl/crypto/evp/e_aes.c b/openssl/crypto/evp/e_aes.c index 245c18a69..1ede7bd39 100644 --- a/openssl/crypto/evp/e_aes.c +++ b/openssl/crypto/evp/e_aes.c @@ -50,6 +50,7 @@  #include <openssl/opensslconf.h>  #ifndef OPENSSL_NO_AES +#include <openssl/crypto.h>  # include <openssl/evp.h>  # include <openssl/err.h>  # include <string.h> @@ -753,7 +754,7 @@ static int aes_gcm_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)      case EVP_CTRL_AEAD_TLS1_AAD:          /* Save the AAD for later use */ -        if (arg != 13) +        if (arg != EVP_AEAD_TLS1_AAD_LEN)              return 0;          memcpy(c->buf, ptr, arg);          gctx->tls_aad_len = arg; @@ -914,7 +915,7 @@ static int aes_gcm_tls_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,          /* Retrieve tag */          CRYPTO_gcm128_tag(&gctx->gcm, ctx->buf, EVP_GCM_TLS_TAG_LEN);          /* If tag mismatch wipe buffer */ -        if (memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) { +        if (CRYPTO_memcmp(ctx->buf, in + len, EVP_GCM_TLS_TAG_LEN)) {              OPENSSL_cleanse(out, len);              goto err;          } @@ -1259,7 +1260,7 @@ static int aes_ccm_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,              !CRYPTO_ccm128_decrypt(ccm, in, out, len)) {              unsigned char tag[16];              if (CRYPTO_ccm128_tag(ccm, tag, cctx->M)) { -                if (!memcmp(tag, ctx->buf, cctx->M)) +                if (!CRYPTO_memcmp(tag, ctx->buf, cctx->M))                      rv = len;              }          } diff --git a/openssl/crypto/evp/e_aes_cbc_hmac_sha1.c b/openssl/crypto/evp/e_aes_cbc_hmac_sha1.c index 3f8a5ae39..d1f5928f6 100644 --- a/openssl/crypto/evp/e_aes_cbc_hmac_sha1.c +++ b/openssl/crypto/evp/e_aes_cbc_hmac_sha1.c @@ -503,7 +503,12 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,      case EVP_CTRL_AEAD_TLS1_AAD:          {              unsigned char *p = ptr; -            unsigned int len = p[arg - 2] << 8 | p[arg - 1]; +            unsigned int len; + +            if (arg != EVP_AEAD_TLS1_AAD_LEN) +                return -1; +  +            len = p[arg - 2] << 8 | p[arg - 1];              if (ctx->encrypt) {                  key->payload_length = len; @@ -520,8 +525,6 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,                                 AES_BLOCK_SIZE) & -AES_BLOCK_SIZE)                               - len);              } else { -                if (arg > 13) -                    arg = 13;                  memcpy(key->aux.tls_aad, ptr, arg);                  key->payload_length = arg; diff --git a/openssl/crypto/evp/e_rc4_hmac_md5.c b/openssl/crypto/evp/e_rc4_hmac_md5.c index 80735d345..2da111782 100644 --- a/openssl/crypto/evp/e_rc4_hmac_md5.c +++ b/openssl/crypto/evp/e_rc4_hmac_md5.c @@ -54,6 +54,7 @@  #if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_MD5) +# include <openssl/crypto.h>  # include <openssl/evp.h>  # include <openssl/objects.h>  # include <openssl/rc4.h> @@ -210,7 +211,7 @@ static int rc4_hmac_md5_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,              MD5_Update(&key->md, mac, MD5_DIGEST_LENGTH);              MD5_Final(mac, &key->md); -            if (memcmp(out + plen, mac, MD5_DIGEST_LENGTH)) +            if (CRYPTO_memcmp(out + plen, mac, MD5_DIGEST_LENGTH))                  return 0;          } else {              MD5_Update(&key->md, out + md5_off, len - md5_off); @@ -258,7 +259,12 @@ static int rc4_hmac_md5_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg,      case EVP_CTRL_AEAD_TLS1_AAD:          {              unsigned char *p = ptr; -            unsigned int len = p[arg - 2] << 8 | p[arg - 1]; +            unsigned int len; + +            if (arg != EVP_AEAD_TLS1_AAD_LEN) +                return -1; + +            len = p[arg - 2] << 8 | p[arg - 1];              if (!ctx->encrypt) {                  len -= MD5_DIGEST_LENGTH; diff --git a/openssl/crypto/evp/encode.c b/openssl/crypto/evp/encode.c index d1d8a07c1..5c5988fc4 100644 --- a/openssl/crypto/evp/encode.c +++ b/openssl/crypto/evp/encode.c @@ -137,7 +137,7 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *outl,      unsigned int total = 0;      *outl = 0; -    if (inl == 0) +    if (inl <= 0)          return;      OPENSSL_assert(ctx->length <= (int)sizeof(ctx->enc_data));      if ((ctx->num + inl) < ctx->length) { diff --git a/openssl/crypto/evp/evp.h b/openssl/crypto/evp/evp.h index b00997b14..6cf98acc0 100644 --- a/openssl/crypto/evp/evp.h +++ b/openssl/crypto/evp/evp.h @@ -103,7 +103,6 @@  # define EVP_PKS_RSA     0x0100  # define EVP_PKS_DSA     0x0200  # define EVP_PKS_EC      0x0400 -# define EVP_PKT_EXP     0x1000 /* <= 512 bit key */  # define EVP_PKEY_NONE   NID_undef  # define EVP_PKEY_RSA    NID_rsaEncryption @@ -409,6 +408,9 @@ struct evp_cipher_st {  /* Set the GCM invocation field, decrypt only */  # define         EVP_CTRL_GCM_SET_IV_INV         0x18 +/* RFC 5246 defines additional data to be 13 bytes in length */ +# define         EVP_AEAD_TLS1_AAD_LEN           13 +  /* GCM TLS constants */  /* Length of fixed part of IV derived from PRF */  # define EVP_GCM_TLS_FIXED_IV_LEN                        4 diff --git a/openssl/crypto/evp/p_seal.c b/openssl/crypto/evp/p_seal.c index caabbf406..ba9dfff21 100644 --- a/openssl/crypto/evp/p_seal.c +++ b/openssl/crypto/evp/p_seal.c @@ -82,8 +82,9 @@ int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,          return 1;      if (EVP_CIPHER_CTX_rand_key(ctx, key) <= 0)          return 0; -    if (EVP_CIPHER_CTX_iv_length(ctx)) -        RAND_pseudo_bytes(iv, EVP_CIPHER_CTX_iv_length(ctx)); +    if (EVP_CIPHER_CTX_iv_length(ctx) +        && RAND_bytes(iv, EVP_CIPHER_CTX_iv_length(ctx)) <= 0) +        return 0;      if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))          return 0; diff --git a/openssl/crypto/hmac/Makefile b/openssl/crypto/hmac/Makefile index 0e91709f6..52e39e586 100644 --- a/openssl/crypto/hmac/Makefile +++ b/openssl/crypto/hmac/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/hmac/hmac.c b/openssl/crypto/hmac/hmac.c index 547781655..33d88be11 100644 --- a/openssl/crypto/hmac/hmac.c +++ b/openssl/crypto/hmac/hmac.c @@ -87,12 +87,18 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,              return FIPS_hmac_init_ex(ctx, key, len, md, NULL);      }  #endif +    /* If we are changing MD then we must have a key */ +    if (md != NULL && md != ctx->md && (key == NULL || len < 0)) +        return 0;      if (md != NULL) {          reset = 1;          ctx->md = md; -    } else +    } else if (ctx->md) {          md = ctx->md; +    } else { +        return 0; +    }      if (key != NULL) {          reset = 1; @@ -107,7 +113,8 @@ int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,                                      &ctx->key_length))                  goto err;          } else { -            OPENSSL_assert(len >= 0 && len <= (int)sizeof(ctx->key)); +            if (len < 0 || len > (int)sizeof(ctx->key)) +                return 0;              memcpy(ctx->key, key, len);              ctx->key_length = len;          } @@ -151,6 +158,9 @@ int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len)      if (FIPS_mode() && !ctx->i_ctx.engine)          return FIPS_hmac_update(ctx, data, len);  #endif +    if (!ctx->md) +        return 0; +      return EVP_DigestUpdate(&ctx->md_ctx, data, len);  } @@ -163,6 +173,9 @@ int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len)          return FIPS_hmac_final(ctx, md, len);  #endif +    if (!ctx->md) +        goto err; +      if (!EVP_DigestFinal_ex(&ctx->md_ctx, buf, &i))          goto err;      if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx, &ctx->o_ctx)) @@ -181,6 +194,7 @@ void HMAC_CTX_init(HMAC_CTX *ctx)      EVP_MD_CTX_init(&ctx->i_ctx);      EVP_MD_CTX_init(&ctx->o_ctx);      EVP_MD_CTX_init(&ctx->md_ctx); +    ctx->md = NULL;  }  int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx) @@ -232,6 +246,7 @@ unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,      HMAC_CTX_cleanup(&c);      return md;   err: +    HMAC_CTX_cleanup(&c);      return NULL;  } diff --git a/openssl/crypto/hmac/hmactest.c b/openssl/crypto/hmac/hmactest.c index 3d130a03e..271d0ebf2 100644 --- a/openssl/crypto/hmac/hmactest.c +++ b/openssl/crypto/hmac/hmactest.c @@ -85,7 +85,7 @@ static struct test_st {      unsigned char data[64];      int data_len;      unsigned char *digest; -} test[4] = { +} test[8] = {      {          "", 0, "More text test vectors to stuff up EBCDIC machines :-)", 54,          (unsigned char *)"e9139d1e6ee064ef8cf514fc7dc83e86", @@ -113,10 +113,27 @@ static struct test_st {              0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd          }, 50, (unsigned char *)"56be34521d144c88dbb8c733f0e8b3f6",      }, +    { +        "", 0, "My test data", 12, +        (unsigned char *)"61afdecb95429ef494d61fdee15990cabf0826fc" +    }, +    { +        "", 0, "My test data", 12, +        (unsigned char *)"2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776" +    }, +    { +        "123456", 6, "My test data", 12, +        (unsigned char *)"bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd" +    }, +    { +        "12345", 5, "My test data again", 12, +        (unsigned char *)"7dbe8c764c068e3bcd6e6b0fbcd5e6fc197b15bb" +    }  };  # endif -static char *pt(unsigned char *md); +static char *pt(unsigned char *md, unsigned int len); +  int main(int argc, char *argv[])  {  # ifndef OPENSSL_NO_MD5 @@ -124,6 +141,9 @@ int main(int argc, char *argv[])      char *p;  # endif      int err = 0; +    HMAC_CTX ctx, ctx2; +    unsigned char buf[EVP_MAX_MD_SIZE]; +    unsigned int len;  # ifdef OPENSSL_NO_MD5      printf("test skipped: MD5 disabled\n"); @@ -139,27 +159,172 @@ int main(int argc, char *argv[])      for (i = 0; i < 4; i++) {          p = pt(HMAC(EVP_md5(),                      test[i].key, test[i].key_len, -                    test[i].data, test[i].data_len, NULL, NULL)); +                    test[i].data, test[i].data_len, NULL, NULL), +                    MD5_DIGEST_LENGTH);          if (strcmp(p, (char *)test[i].digest) != 0) { -            printf("error calculating HMAC on %d entry'\n", i); +            printf("Error calculating HMAC on %d entry'\n", i);              printf("got %s instead of %s\n", p, test[i].digest);              err++;          } else              printf("test %d ok\n", i);      }  # endif                         /* OPENSSL_NO_MD5 */ + +/* test4 */ +    HMAC_CTX_init(&ctx); +    if (HMAC_Init_ex(&ctx, NULL, 0, NULL, NULL)) { +        printf("Should fail to initialise HMAC with empty MD and key (test 4)\n"); +        err++; +        goto test5; +    } +    if (HMAC_Update(&ctx, test[4].data, test[4].data_len)) { +        printf("Should fail HMAC_Update with ctx not set up (test 4)\n"); +        err++; +        goto test5; +    } +    if (HMAC_Init_ex(&ctx, NULL, 0, EVP_sha1(), NULL)) { +        printf("Should fail to initialise HMAC with empty key (test 4)\n"); +        err++; +        goto test5; +    } +    if (HMAC_Update(&ctx, test[4].data, test[4].data_len)) { +        printf("Should fail HMAC_Update with ctx not set up (test 4)\n"); +        err++; +        goto test5; +    } +    printf("test 4 ok\n"); +test5: +    HMAC_CTX_init(&ctx); +    if (HMAC_Init_ex(&ctx, test[4].key, test[4].key_len, NULL, NULL)) { +        printf("Should fail to initialise HMAC with empty MD (test 5)\n"); +        err++; +        goto test6; +    } +    if (HMAC_Update(&ctx, test[4].data, test[4].data_len)) { +        printf("Should fail HMAC_Update with ctx not set up (test 5)\n"); +        err++; +        goto test6; +    } +    if (HMAC_Init_ex(&ctx, test[4].key, -1, EVP_sha1(), NULL)) { +        printf("Should fail to initialise HMAC with invalid key len(test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Init_ex(&ctx, test[4].key, test[4].key_len, EVP_sha1(), NULL)) { +        printf("Failed to initialise HMAC (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Update(&ctx, test[4].data, test[4].data_len)) { +        printf("Error updating HMAC with data (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Final(&ctx, buf, &len)) { +        printf("Error finalising data (test 5)\n"); +        err++; +        goto test6; +    } +    p = pt(buf, len); +    if (strcmp(p, (char *)test[4].digest) != 0) { +        printf("Error calculating interim HMAC on test 5\n"); +        printf("got %s instead of %s\n", p, test[4].digest); +        err++; +        goto test6; +    } +    if (HMAC_Init_ex(&ctx, NULL, 0, EVP_sha256(), NULL)) { +        printf("Should disallow changing MD without a new key (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Init_ex(&ctx, test[4].key, test[4].key_len, EVP_sha256(), NULL)) { +        printf("Failed to reinitialise HMAC (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Update(&ctx, test[5].data, test[5].data_len)) { +        printf("Error updating HMAC with data (sha256) (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Final(&ctx, buf, &len)) { +        printf("Error finalising data (sha256) (test 5)\n"); +        err++; +        goto test6; +    } +    p = pt(buf, len); +    if (strcmp(p, (char *)test[5].digest) != 0) { +        printf("Error calculating 2nd interim HMAC on test 5\n"); +        printf("got %s instead of %s\n", p, test[5].digest); +        err++; +        goto test6; +    } +    if (!HMAC_Init_ex(&ctx, test[6].key, test[6].key_len, NULL, NULL)) { +        printf("Failed to reinitialise HMAC with key (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Update(&ctx, test[6].data, test[6].data_len)) { +        printf("Error updating HMAC with data (new key) (test 5)\n"); +        err++; +        goto test6; +    } +    if (!HMAC_Final(&ctx, buf, &len)) { +        printf("Error finalising data (new key) (test 5)\n"); +        err++; +        goto test6; +    } +    p = pt(buf, len); +    if (strcmp(p, (char *)test[6].digest) != 0) { +        printf("error calculating HMAC on test 5\n"); +        printf("got %s instead of %s\n", p, test[6].digest); +        err++; +    } else { +        printf("test 5 ok\n"); +    } +test6: +    HMAC_CTX_init(&ctx); +    if (!HMAC_Init_ex(&ctx, test[7].key, test[7].key_len, EVP_sha1(), NULL)) { +        printf("Failed to initialise HMAC (test 6)\n"); +        err++; +        goto end; +    } +    if (!HMAC_Update(&ctx, test[7].data, test[7].data_len)) { +        printf("Error updating HMAC with data (test 6)\n"); +        err++; +        goto end; +    } +    if (!HMAC_CTX_copy(&ctx2, &ctx)) { +        printf("Failed to copy HMAC_CTX (test 6)\n"); +        err++; +        goto end; +    } +    if (!HMAC_Final(&ctx2, buf, &len)) { +        printf("Error finalising data (test 6)\n"); +        err++; +        goto end; +    } +    p = pt(buf, len); +    if (strcmp(p, (char *)test[7].digest) != 0) { +        printf("Error calculating HMAC on test 6\n"); +        printf("got %s instead of %s\n", p, test[7].digest); +        err++; +    } else { +        printf("test 6 ok\n"); +    } +end:      EXIT(err);      return (0);  }  # ifndef OPENSSL_NO_MD5 -static char *pt(unsigned char *md) +static char *pt(unsigned char *md, unsigned int len)  { -    int i; +    unsigned int i;      static char buf[80]; -    for (i = 0; i < MD5_DIGEST_LENGTH; i++) +    for (i = 0; i < len; i++)          sprintf(&(buf[i * 2]), "%02x", md[i]);      return (buf);  } diff --git a/openssl/crypto/idea/Makefile b/openssl/crypto/idea/Makefile index 8af0acdad..3dc23e48d 100644 --- a/openssl/crypto/idea/Makefile +++ b/openssl/crypto/idea/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/jpake/Makefile b/openssl/crypto/jpake/Makefile index 110c49ce0..5193fd983 100644 --- a/openssl/crypto/jpake/Makefile +++ b/openssl/crypto/jpake/Makefile @@ -32,6 +32,8 @@ install:  	chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \  	done; +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/krb5/Makefile b/openssl/crypto/krb5/Makefile index 14077390d..8b9a01a29 100644 --- a/openssl/crypto/krb5/Makefile +++ b/openssl/crypto/krb5/Makefile @@ -62,6 +62,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/lhash/Makefile b/openssl/crypto/lhash/Makefile index 82bddac47..c7f4365f0 100644 --- a/openssl/crypto/lhash/Makefile +++ b/openssl/crypto/lhash/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/md2/Makefile b/openssl/crypto/md2/Makefile index 17f878aeb..b63011085 100644 --- a/openssl/crypto/md2/Makefile +++ b/openssl/crypto/md2/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/md32_common.h b/openssl/crypto/md32_common.h index c1efb45f1..182383341 100644 --- a/openssl/crypto/md32_common.h +++ b/openssl/crypto/md32_common.h @@ -142,8 +142,10 @@   */  #undef ROTATE  #ifndef PEDANTIC -# if defined(_MSC_VER) || defined(__ICC) +# if defined(_MSC_VER)  #  define ROTATE(a,n)   _lrotl(a,n) +# elif defined(__ICC) +#  define ROTATE(a,n)   _rotl(a,n)  # elif defined(__MWERKS__)  #  if defined(__POWERPC__)  #   define ROTATE(a,n)  __rlwinm(a,n,0,31) diff --git a/openssl/crypto/md4/Makefile b/openssl/crypto/md4/Makefile index e6f1e4478..3ee436176 100644 --- a/openssl/crypto/md4/Makefile +++ b/openssl/crypto/md4/Makefile @@ -62,6 +62,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/md5/Makefile b/openssl/crypto/md5/Makefile index b9e2ce9a3..0f87dbd54 100644 --- a/openssl/crypto/md5/Makefile +++ b/openssl/crypto/md5/Makefile @@ -76,6 +76,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/mdc2/Makefile b/openssl/crypto/mdc2/Makefile index 141553149..c2d0c5b7c 100644 --- a/openssl/crypto/mdc2/Makefile +++ b/openssl/crypto/mdc2/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/mem.c b/openssl/crypto/mem.c index 2ce3e8948..fdad49b76 100644 --- a/openssl/crypto/mem.c +++ b/openssl/crypto/mem.c @@ -365,6 +365,9 @@ char *CRYPTO_strdup(const char *str, const char *file, int line)  {      char *ret = CRYPTO_malloc(strlen(str) + 1, file, line); +    if (ret == NULL) +        return NULL; +      strcpy(ret, str);      return ret;  } diff --git a/openssl/crypto/modes/Makefile b/openssl/crypto/modes/Makefile index 3d8bafd57..e278fa6a2 100644 --- a/openssl/crypto/modes/Makefile +++ b/openssl/crypto/modes/Makefile @@ -89,6 +89,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/modes/gcm128.c b/openssl/crypto/modes/gcm128.c index f69f2c9db..0ee569fb7 100644 --- a/openssl/crypto/modes/gcm128.c +++ b/openssl/crypto/modes/gcm128.c @@ -1622,7 +1622,7 @@ int CRYPTO_gcm128_finish(GCM128_CONTEXT *ctx, const unsigned char *tag,      ctx->Xi.u[1] ^= ctx->EK0.u[1];      if (tag && len <= sizeof(ctx->Xi)) -        return memcmp(ctx->Xi.c, tag, len); +        return CRYPTO_memcmp(ctx->Xi.c, tag, len);      else          return -1;  } diff --git a/openssl/crypto/objects/Makefile b/openssl/crypto/objects/Makefile index a8aedbd42..f93d2f9d2 100644 --- a/openssl/crypto/objects/Makefile +++ b/openssl/crypto/objects/Makefile @@ -74,6 +74,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: obj_dat.h obj_mac.h obj_xref.h depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/objects/o_names.c b/openssl/crypto/objects/o_names.c index c6774f457..24859926a 100644 --- a/openssl/crypto/objects/o_names.c +++ b/openssl/crypto/objects/o_names.c @@ -313,7 +313,7 @@ void OBJ_NAME_do_all_sorted(int type,      d.names =          OPENSSL_malloc(lh_OBJ_NAME_num_items(names_lh) * sizeof *d.names);      /* Really should return an error if !d.names...but its a void function! */ -    if(d.names) { +    if (d.names) {          d.n = 0;          OBJ_NAME_do_all(type, do_all_sorted_fn, &d); diff --git a/openssl/crypto/objects/obj_dat.c b/openssl/crypto/objects/obj_dat.c index e42a1c147..aca382a6e 100644 --- a/openssl/crypto/objects/obj_dat.c +++ b/openssl/crypto/objects/obj_dat.c @@ -142,7 +142,7 @@ static unsigned long added_obj_hash(const ADDED_OBJ *ca)          return 0;      }      ret &= 0x3fffffffL; -    ret |= ca->type << 30L; +    ret |= ((unsigned long)ca->type) << 30L;      return (ret);  } @@ -400,6 +400,8 @@ static int obj_cmp(const ASN1_OBJECT *const *ap, const unsigned int *bp)      j = (a->length - b->length);      if (j)          return (j); +    if (a->length == 0) +        return 0;      return (memcmp(a->data, b->data, a->length));  } @@ -415,6 +417,9 @@ int OBJ_obj2nid(const ASN1_OBJECT *a)      if (a->nid != 0)          return (a->nid); +    if (a->length == 0) +        return NID_undef; +      if (added != NULL) {          ad.type = ADDED_DATA;          ad.obj = (ASN1_OBJECT *)a; /* XXX: ugly but harmless */ diff --git a/openssl/crypto/objects/objects.README b/openssl/crypto/objects/objects.README index 4d745508d..cb1d216ce 100644 --- a/openssl/crypto/objects/objects.README +++ b/openssl/crypto/objects/objects.README @@ -8,9 +8,9 @@ The basic syntax for adding an object is as follows:  	1 2 3 4		: shortName	: Long Name -		If the long name doesn't contain spaces, or no short name -		exists, the long name is used as basis for the base name -		in C.  Otherwise, the short name is used. +		If Long Name contains only word characters and hyphen-minus +		(0x2D) or full stop (0x2E) then Long Name is used as basis +		for the base name in C. Otherwise, the shortName is used.  		The base name (let's call it 'base') will then be used to  		create the C macros SN_base, LN_base, NID_base and OBJ_base. @@ -22,7 +22,7 @@ Then there are some extra commands:  	!Alias foo 1 2 3 4 -		This juts makes a name foo for an OID.  The C macro +		This just makes a name foo for an OID.  The C macro  		OBJ_foo will be created as a result.  	!Cname foo diff --git a/openssl/crypto/objects/objects.pl b/openssl/crypto/objects/objects.pl index d0ed459d3..389dc3483 100644 --- a/openssl/crypto/objects/objects.pl +++ b/openssl/crypto/objects/objects.pl @@ -67,7 +67,7 @@ while (<IN>)  		$myoid = &process_oid($myoid);  		} -	if ($Cname eq "" && !($myln =~ / /)) +	if ($Cname eq "" && ($myln =~ /^[_A-Za-z][\w.-]*$/ ))  		{  		$Cname = $myln;  		$Cname =~ s/\./_/g; diff --git a/openssl/crypto/ocsp/Makefile b/openssl/crypto/ocsp/Makefile index 60c414cf4..96a1b156b 100644 --- a/openssl/crypto/ocsp/Makefile +++ b/openssl/crypto/ocsp/Makefile @@ -64,6 +64,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/ocsp/ocsp_ext.c b/openssl/crypto/ocsp/ocsp_ext.c index 849cb2f76..c19648c73 100644 --- a/openssl/crypto/ocsp/ocsp_ext.c +++ b/openssl/crypto/ocsp/ocsp_ext.c @@ -361,8 +361,8 @@ static int ocsp_add1_nonce(STACK_OF(X509_EXTENSION) **exts,      ASN1_put_object(&tmpval, 0, len, V_ASN1_OCTET_STRING, V_ASN1_UNIVERSAL);      if (val)          memcpy(tmpval, val, len); -    else -        RAND_pseudo_bytes(tmpval, len); +    else if (RAND_pseudo_bytes(tmpval, len) < 0) +        goto err;      if (!X509V3_add1_i2d(exts, NID_id_pkix_OCSP_Nonce,                           &os, 0, X509V3_ADD_REPLACE))          goto err; diff --git a/openssl/crypto/ocsp/ocsp_vfy.c b/openssl/crypto/ocsp/ocsp_vfy.c index 6c0ccb565..d4a257c33 100644 --- a/openssl/crypto/ocsp/ocsp_vfy.c +++ b/openssl/crypto/ocsp/ocsp_vfy.c @@ -83,6 +83,7 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,  {      X509 *signer, *x;      STACK_OF(X509) *chain = NULL; +    STACK_OF(X509) *untrusted = NULL;      X509_STORE_CTX ctx;      int i, ret = 0;      ret = ocsp_find_signer(&signer, bs, certs, st, flags); @@ -107,10 +108,20 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,      }      if (!(flags & OCSP_NOVERIFY)) {          int init_res; -        if (flags & OCSP_NOCHAIN) -            init_res = X509_STORE_CTX_init(&ctx, st, signer, NULL); -        else -            init_res = X509_STORE_CTX_init(&ctx, st, signer, bs->certs); +        if (flags & OCSP_NOCHAIN) { +            untrusted = NULL; +        } else if (bs->certs && certs) { +            untrusted = sk_X509_dup(bs->certs); +            for (i = 0; i < sk_X509_num(certs); i++) { +                if (!sk_X509_push(untrusted, sk_X509_value(certs, i))) { +                    OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, ERR_R_MALLOC_FAILURE); +                    goto end; +                } +            } +        } else { +            untrusted = bs->certs; +        } +        init_res = X509_STORE_CTX_init(&ctx, st, signer, untrusted);          if (!init_res) {              ret = -1;              OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, ERR_R_X509_LIB); @@ -161,6 +172,8 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,   end:      if (chain)          sk_X509_pop_free(chain, X509_free); +    if (bs->certs && certs) +        sk_X509_free(untrusted);      return ret;  } diff --git a/openssl/crypto/opensslv.h b/openssl/crypto/opensslv.h index daf3905df..84d0bf9d1 100644 --- a/openssl/crypto/opensslv.h +++ b/openssl/crypto/opensslv.h @@ -30,11 +30,11 @@ extern "C" {   * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for   *  major minor fix final patch/beta)   */ -# define OPENSSL_VERSION_NUMBER  0x100010dfL +# define OPENSSL_VERSION_NUMBER  0x100010ffL  # ifdef OPENSSL_FIPS -#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1m-fips 19 Mar 2015" +#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1o-fips 12 Jun 2015"  # else -#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1m 19 Mar 2015" +#  define OPENSSL_VERSION_TEXT    "OpenSSL 1.0.1o 12 Jun 2015"  # endif  # define OPENSSL_VERSION_PTEXT   " part of " OPENSSL_VERSION_TEXT diff --git a/openssl/crypto/pem/Makefile b/openssl/crypto/pem/Makefile index 2cc780152..7a930eeae 100644 --- a/openssl/crypto/pem/Makefile +++ b/openssl/crypto/pem/Makefile @@ -64,6 +64,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/pem/pem_lib.c b/openssl/crypto/pem/pem_lib.c index febb53ed0..55071616e 100644 --- a/openssl/crypto/pem/pem_lib.c +++ b/openssl/crypto/pem/pem_lib.c @@ -435,7 +435,7 @@ int PEM_ASN1_write_bio(i2d_of_void *i2d, const char *name, BIO *bp,  int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,                    pem_password_cb *callback, void *u)  { -    int i, j, o, klen; +    int i = 0, j, o, klen;      long len;      EVP_CIPHER_CTX ctx;      unsigned char key[EVP_MAX_KEY_LENGTH]; diff --git a/openssl/crypto/pem/pem_pk8.c b/openssl/crypto/pem/pem_pk8.c index b98c76c4a..5747c7366 100644 --- a/openssl/crypto/pem/pem_pk8.c +++ b/openssl/crypto/pem/pem_pk8.c @@ -138,6 +138,8 @@ static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid,          if (kstr == buf)              OPENSSL_cleanse(buf, klen);          PKCS8_PRIV_KEY_INFO_free(p8inf); +        if (p8 == NULL) +            return 0;          if (isder)              ret = i2d_PKCS8_bio(bp, p8);          else diff --git a/openssl/crypto/pkcs12/Makefile b/openssl/crypto/pkcs12/Makefile index 3a7498fe7..be5f8c5d2 100644 --- a/openssl/crypto/pkcs12/Makefile +++ b/openssl/crypto/pkcs12/Makefile @@ -67,6 +67,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/pkcs12/p12_mutl.c b/openssl/crypto/pkcs12/p12_mutl.c index 256b210cc..5ab4bf290 100644 --- a/openssl/crypto/pkcs12/p12_mutl.c +++ b/openssl/crypto/pkcs12/p12_mutl.c @@ -60,6 +60,7 @@  #ifndef OPENSSL_NO_HMAC  # include <stdio.h>  # include "cryptlib.h" +# include <openssl/crypto.h>  # include <openssl/hmac.h>  # include <openssl/rand.h>  # include <openssl/pkcs12.h> @@ -123,7 +124,7 @@ int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen)          return 0;      }      if ((maclen != (unsigned int)p12->mac->dinfo->digest->length) -        || memcmp(mac, p12->mac->dinfo->digest->data, maclen)) +        || CRYPTO_memcmp(mac, p12->mac->dinfo->digest->data, maclen))          return 0;      return 1;  } diff --git a/openssl/crypto/pkcs7/Makefile b/openssl/crypto/pkcs7/Makefile index effe05fc0..decf5e020 100644 --- a/openssl/crypto/pkcs7/Makefile +++ b/openssl/crypto/pkcs7/Makefile @@ -68,6 +68,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/pkcs7/pk7_doit.c b/openssl/crypto/pkcs7/pk7_doit.c index 31a1b983f..c8d7db01b 100644 --- a/openssl/crypto/pkcs7/pk7_doit.c +++ b/openssl/crypto/pkcs7/pk7_doit.c @@ -445,6 +445,12 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)      switch (i) {      case NID_pkcs7_signed: +        /* +         * p7->d.sign->contents is a PKCS7 structure consisting of a contentType +         * field and optional content. +         * data_body is NULL if that structure has no (=detached) content +         * or if the contentType is wrong (i.e., not "data"). +         */          data_body = PKCS7_get_octet_string(p7->d.sign->contents);          if (!PKCS7_is_detached(p7) && data_body == NULL) {              PKCS7err(PKCS7_F_PKCS7_DATADECODE, @@ -456,6 +462,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)      case NID_pkcs7_signedAndEnveloped:          rsk = p7->d.signed_and_enveloped->recipientinfo;          md_sk = p7->d.signed_and_enveloped->md_algs; +        /* data_body is NULL if the optional EncryptedContent is missing. */          data_body = p7->d.signed_and_enveloped->enc_data->enc_data;          enc_alg = p7->d.signed_and_enveloped->enc_data->algorithm;          evp_cipher = EVP_get_cipherbyobj(enc_alg->algorithm); @@ -468,6 +475,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)      case NID_pkcs7_enveloped:          rsk = p7->d.enveloped->recipientinfo;          enc_alg = p7->d.enveloped->enc_data->algorithm; +        /* data_body is NULL if the optional EncryptedContent is missing. */          data_body = p7->d.enveloped->enc_data->enc_data;          evp_cipher = EVP_get_cipherbyobj(enc_alg->algorithm);          if (evp_cipher == NULL) { @@ -481,6 +489,12 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)          goto err;      } +    /* Detached content must be supplied via in_bio instead. */ +    if (data_body == NULL && in_bio == NULL) { +        PKCS7err(PKCS7_F_PKCS7_DATADECODE, PKCS7_R_NO_CONTENT); +        goto err; +    } +      /* We will be checking the signature */      if (md_sk != NULL) {          for (i = 0; i < sk_X509_ALGOR_num(md_sk); i++) { @@ -623,7 +637,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)          etmp = NULL;      }  #if 1 -    if (PKCS7_is_detached(p7) || (in_bio != NULL)) { +    if (in_bio != NULL) {          bio = in_bio;      } else {  # if 0 diff --git a/openssl/crypto/pqueue/Makefile b/openssl/crypto/pqueue/Makefile index fb36a0c87..a59b5a939 100644 --- a/openssl/crypto/pqueue/Makefile +++ b/openssl/crypto/pqueue/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rand/Makefile b/openssl/crypto/rand/Makefile index 27694aa66..df44369a0 100644 --- a/openssl/crypto/rand/Makefile +++ b/openssl/crypto/rand/Makefile @@ -63,6 +63,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rand/rand_os2.c b/openssl/crypto/rand/rand_os2.c index 02148d5bf..706ab1e81 100644 --- a/openssl/crypto/rand/rand_os2.c +++ b/openssl/crypto/rand/rand_os2.c @@ -149,7 +149,7 @@ int RAND_poll(void)      if (DosQuerySysState) {          char *buffer = OPENSSL_malloc(256 * 1024); -        if(!buffer) +        if (!buffer)              return 0;          if (DosQuerySysState(0x1F, 0, 0, 0, buffer, 256 * 1024) == 0) { diff --git a/openssl/crypto/rc2/Makefile b/openssl/crypto/rc2/Makefile index 8a9d49ab5..b3727a4a6 100644 --- a/openssl/crypto/rc2/Makefile +++ b/openssl/crypto/rc2/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rc4/Makefile b/openssl/crypto/rc4/Makefile index 1614d4796..f3d6e0dc0 100644 --- a/openssl/crypto/rc4/Makefile +++ b/openssl/crypto/rc4/Makefile @@ -89,6 +89,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rc5/Makefile b/openssl/crypto/rc5/Makefile index 8a8b00eb8..6ca0037c6 100644 --- a/openssl/crypto/rc5/Makefile +++ b/openssl/crypto/rc5/Makefile @@ -69,6 +69,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/ripemd/Makefile b/openssl/crypto/ripemd/Makefile index 25140b2a7..1c3f094bb 100644 --- a/openssl/crypto/ripemd/Makefile +++ b/openssl/crypto/ripemd/Makefile @@ -69,6 +69,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rsa/Makefile b/openssl/crypto/rsa/Makefile index e8121a496..79c7c421b 100644 --- a/openssl/crypto/rsa/Makefile +++ b/openssl/crypto/rsa/Makefile @@ -67,6 +67,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/rsa/rsa_pmeth.c b/openssl/crypto/rsa/rsa_pmeth.c index d61d6e8b6..6a7c67cdb 100644 --- a/openssl/crypto/rsa/rsa_pmeth.c +++ b/openssl/crypto/rsa/rsa_pmeth.c @@ -228,8 +228,14 @@ static int pkey_rsa_sign(EVP_PKEY_CTX *ctx, unsigned char *sig,                  return ret;              ret = sltmp;          } else if (rctx->pad_mode == RSA_X931_PADDING) { -            if (!setup_tbuf(rctx, ctx)) +            if ((size_t)EVP_PKEY_size(ctx->pkey) < tbslen + 1) { +                RSAerr(RSA_F_PKEY_RSA_SIGN, RSA_R_KEY_SIZE_TOO_SMALL); +                return -1; +            } +            if (!setup_tbuf(rctx, ctx)) { +                RSAerr(RSA_F_PKEY_RSA_SIGN, ERR_R_MALLOC_FAILURE);                  return -1; +            }              memcpy(rctx->tbuf, tbs, tbslen);              rctx->tbuf[tbslen] = RSA_X931_hash_id(EVP_MD_type(rctx->md));              ret = RSA_private_encrypt(tbslen + 1, rctx->tbuf, diff --git a/openssl/crypto/seed/Makefile b/openssl/crypto/seed/Makefile index 4bc55e491..70d3d45a2 100644 --- a/openssl/crypto/seed/Makefile +++ b/openssl/crypto/seed/Makefile @@ -62,6 +62,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/sha/Makefile b/openssl/crypto/sha/Makefile index 2eb2b7af9..ceb8094b0 100644 --- a/openssl/crypto/sha/Makefile +++ b/openssl/crypto/sha/Makefile @@ -117,6 +117,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/srp/Makefile b/openssl/crypto/srp/Makefile index 41859d46f..763953384 100644 --- a/openssl/crypto/srp/Makefile +++ b/openssl/crypto/srp/Makefile @@ -61,6 +61,8 @@ srptest: top srptest.c $(LIB)  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/srp/srp_vfy.c b/openssl/crypto/srp/srp_vfy.c index 701b5cd01..50f75d7e4 100644 --- a/openssl/crypto/srp/srp_vfy.c +++ b/openssl/crypto/srp/srp_vfy.c @@ -497,7 +497,8 @@ SRP_user_pwd *SRP_VBASE_get_by_user(SRP_VBASE *vb, char *username)      if (!SRP_user_pwd_set_ids(user, username, NULL))          goto err; -    RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH); +    if (RAND_pseudo_bytes(digv, SHA_DIGEST_LENGTH) < 0) +        goto err;      EVP_MD_CTX_init(&ctxt);      EVP_DigestInit_ex(&ctxt, EVP_sha1(), NULL);      EVP_DigestUpdate(&ctxt, vb->seed_key, strlen(vb->seed_key)); @@ -549,7 +550,8 @@ char *SRP_create_verifier(const char *user, const char *pass, char **salt,      }      if (*salt == NULL) { -        RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); +        if (RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN) < 0) +            goto err;          s = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);      } else { @@ -609,7 +611,8 @@ int SRP_create_verifier_BN(const char *user, const char *pass, BIGNUM **salt,      srp_bn_print(g);      if (*salt == NULL) { -        RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN); +        if (RAND_pseudo_bytes(tmp2, SRP_RANDOM_SALT_LEN) < 0) +            goto err;          *salt = BN_bin2bn(tmp2, SRP_RANDOM_SALT_LEN, NULL);      } diff --git a/openssl/crypto/stack/Makefile b/openssl/crypto/stack/Makefile index 5327692ac..b069c9323 100644 --- a/openssl/crypto/stack/Makefile +++ b/openssl/crypto/stack/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/store/Makefile b/openssl/crypto/store/Makefile index 0dcfd7857..5bc7ca71f 100644 --- a/openssl/crypto/store/Makefile +++ b/openssl/crypto/store/Makefile @@ -63,6 +63,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/threads/th-lock.c b/openssl/crypto/threads/th-lock.c index 28884c2d4..cc8cf2581 100644 --- a/openssl/crypto/threads/th-lock.c +++ b/openssl/crypto/threads/th-lock.c @@ -117,7 +117,7 @@ void CRYPTO_thread_setup(void)      int i;      lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(HANDLE)); -    if(!lock_cs) { +    if (!lock_cs) {          /* Nothing we can do about this...void function! */          return;      } @@ -172,7 +172,7 @@ void CRYPTO_thread_setup(void)  # else      lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(rwlock_t));  # endif -    if(!lock_cs) { +    if (!lock_cs) {          /* Nothing we can do about this...void function! */          return;      } @@ -260,7 +260,7 @@ void CRYPTO_thread_setup(void)      char filename[20];      lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(usema_t *)); -    if(!lock_cs) { +    if (!lock_cs) {          /* Nothing we can do about this...void function! */          return;      } @@ -328,11 +328,11 @@ void CRYPTO_thread_setup(void)      lock_cs = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));      lock_count = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(long)); -    if(!lock_cs || !lock_count) { +    if (!lock_cs || !lock_count) {          /* Nothing we can do about this...void function! */ -        if(lock_cs) +        if (lock_cs)              OPENSSL_free(lock_cs); -        if(lock_count) +        if (lock_count)              OPENSSL_free(lock_count);          return;      } diff --git a/openssl/crypto/ts/Makefile b/openssl/crypto/ts/Makefile index c18234555..cf991efe4 100644 --- a/openssl/crypto/ts/Makefile +++ b/openssl/crypto/ts/Makefile @@ -73,6 +73,8 @@ tags:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(LIBSRC) diff --git a/openssl/crypto/txt_db/Makefile b/openssl/crypto/txt_db/Makefile index e6f30331d..4f70b199a 100644 --- a/openssl/crypto/txt_db/Makefile +++ b/openssl/crypto/txt_db/Makefile @@ -61,6 +61,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by top Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/ui/Makefile b/openssl/crypto/ui/Makefile index a685659fb..b28fcca6d 100644 --- a/openssl/crypto/ui/Makefile +++ b/openssl/crypto/ui/Makefile @@ -65,6 +65,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/whrlpool/Makefile b/openssl/crypto/whrlpool/Makefile index f4d46e4d1..befd6d6f3 100644 --- a/openssl/crypto/whrlpool/Makefile +++ b/openssl/crypto/whrlpool/Makefile @@ -74,6 +74,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/x509/Makefile b/openssl/crypto/x509/Makefile index 72c82278f..af3c25514 100644 --- a/openssl/crypto/x509/Makefile +++ b/openssl/crypto/x509/Makefile @@ -71,6 +71,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/x509/x509_lu.c b/openssl/crypto/x509/x509_lu.c index a910636f8..8415d1d8b 100644 --- a/openssl/crypto/x509/x509_lu.c +++ b/openssl/crypto/x509/x509_lu.c @@ -216,6 +216,8 @@ X509_STORE *X509_STORE_new(void)  static void cleanup(X509_OBJECT *a)  { +    if (!a) +        return;      if (a->type == X509_LU_X509) {          X509_free(a->data.x509);      } else if (a->type == X509_LU_CRL) { diff --git a/openssl/crypto/x509/x509_vfy.c b/openssl/crypto/x509/x509_vfy.c index 136bfbda6..16db4c025 100644 --- a/openssl/crypto/x509/x509_vfy.c +++ b/openssl/crypto/x509/x509_vfy.c @@ -151,11 +151,11 @@ static int x509_subject_cmp(X509 **a, X509 **b)  int X509_verify_cert(X509_STORE_CTX *ctx)  { -    X509 *x, *xtmp, *chain_ss = NULL; +    X509 *x, *xtmp, *xtmp2, *chain_ss = NULL;      int bad_chain = 0;      X509_VERIFY_PARAM *param = ctx->param;      int depth, i, ok = 0; -    int num; +    int num, j, retry;      int (*cb) (int xok, X509_STORE_CTX *xctx);      STACK_OF(X509) *sktmp = NULL;      if (ctx->cert == NULL) { @@ -224,85 +224,118 @@ int X509_verify_cert(X509_STORE_CTX *ctx)          break;      } +    /* Remember how many untrusted certs we have */ +    j = num;      /*       * at this point, chain should contain a list of untrusted certificates.       * We now need to add at least one trusted one, if possible, otherwise we       * complain.       */ -    /* -     * Examine last certificate in chain and see if it is self signed. -     */ - -    i = sk_X509_num(ctx->chain); -    x = sk_X509_value(ctx->chain, i - 1); -    if (ctx->check_issued(ctx, x, x)) { -        /* we have a self signed certificate */ -        if (sk_X509_num(ctx->chain) == 1) { -            /* -             * We have a single self signed certificate: see if we can find -             * it in the store. We must have an exact match to avoid possible -             * impersonation. -             */ -            ok = ctx->get_issuer(&xtmp, ctx, x); -            if ((ok <= 0) || X509_cmp(x, xtmp)) { -                ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; -                ctx->current_cert = x; -                ctx->error_depth = i - 1; -                if (ok == 1) -                    X509_free(xtmp); -                bad_chain = 1; -                ok = cb(0, ctx); -                if (!ok) -                    goto end; +    do { +        /* +         * Examine last certificate in chain and see if it is self signed. +         */ +        i = sk_X509_num(ctx->chain); +        x = sk_X509_value(ctx->chain, i - 1); +        if (ctx->check_issued(ctx, x, x)) { +            /* we have a self signed certificate */ +            if (sk_X509_num(ctx->chain) == 1) { +                /* +                 * We have a single self signed certificate: see if we can +                 * find it in the store. We must have an exact match to avoid +                 * possible impersonation. +                 */ +                ok = ctx->get_issuer(&xtmp, ctx, x); +                if ((ok <= 0) || X509_cmp(x, xtmp)) { +                    ctx->error = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; +                    ctx->current_cert = x; +                    ctx->error_depth = i - 1; +                    if (ok == 1) +                        X509_free(xtmp); +                    bad_chain = 1; +                    ok = cb(0, ctx); +                    if (!ok) +                        goto end; +                } else { +                    /* +                     * We have a match: replace certificate with store +                     * version so we get any trust settings. +                     */ +                    X509_free(x); +                    x = xtmp; +                    (void)sk_X509_set(ctx->chain, i - 1, x); +                    ctx->last_untrusted = 0; +                }              } else {                  /* -                 * We have a match: replace certificate with store version so -                 * we get any trust settings. +                 * extract and save self signed certificate for later use                   */ -                X509_free(x); -                x = xtmp; -                (void)sk_X509_set(ctx->chain, i - 1, x); -                ctx->last_untrusted = 0; +                chain_ss = sk_X509_pop(ctx->chain); +                ctx->last_untrusted--; +                num--; +                j--; +                x = sk_X509_value(ctx->chain, num - 1);              } -        } else { -            /* -             * extract and save self signed certificate for later use -             */ -            chain_ss = sk_X509_pop(ctx->chain); -            ctx->last_untrusted--; -            num--; -            x = sk_X509_value(ctx->chain, num - 1);          } -    } - -    /* We now lookup certs from the certificate store */ -    for (;;) { -        /* If we have enough, we break */ -        if (depth < num) -            break; - -        /* If we are self signed, we break */ -        if (ctx->check_issued(ctx, x, x)) -            break; - -        ok = ctx->get_issuer(&xtmp, ctx, x); +        /* We now lookup certs from the certificate store */ +        for (;;) { +            /* If we have enough, we break */ +            if (depth < num) +                break; +            /* If we are self signed, we break */ +            if (ctx->check_issued(ctx, x, x)) +                break; +            ok = ctx->get_issuer(&xtmp, ctx, x); +            if (ok < 0) +                return ok; +            if (ok == 0) +                break; +            x = xtmp; +            if (!sk_X509_push(ctx->chain, x)) { +                X509_free(xtmp); +                X509err(X509_F_X509_VERIFY_CERT, ERR_R_MALLOC_FAILURE); +                return 0; +            } +            num++; +        } -        if (ok < 0) -            return ok; -        if (ok == 0) -            break; +        /* +         * If we haven't got a least one certificate from our store then check +         * if there is an alternative chain that could be used.  We only do this +         * if the user hasn't switched off alternate chain checking +         */ +        retry = 0; +        if (j == ctx->last_untrusted && +            !(ctx->param->flags & X509_V_FLAG_NO_ALT_CHAINS)) { +            while (j-- > 1) { +                xtmp2 = sk_X509_value(ctx->chain, j - 1); +                ok = ctx->get_issuer(&xtmp, ctx, xtmp2); +                if (ok < 0) +                    goto end; +                /* Check if we found an alternate chain */ +                if (ok > 0) { +                    /* +                     * Free up the found cert we'll add it again later +                     */ +                    X509_free(xtmp); -        x = xtmp; -        if (!sk_X509_push(ctx->chain, x)) { -            X509_free(xtmp); -            X509err(X509_F_X509_VERIFY_CERT, ERR_R_MALLOC_FAILURE); -            return 0; +                    /* +                     * Dump all the certs above this point - we've found an +                     * alternate chain +                     */ +                    while (num > j) { +                        xtmp = sk_X509_pop(ctx->chain); +                        X509_free(xtmp); +                        num--; +                        ctx->last_untrusted--; +                    } +                    retry = 1; +                    break; +                } +            }          } -        num++; -    } - -    /* we now have our chain, lets check it... */ +    } while (retry);      /* Is last certificate looked up self signed? */      if (!ctx->check_issued(ctx, x, x)) { @@ -1604,47 +1637,84 @@ int X509_cmp_time(const ASN1_TIME *ctm, time_t *cmp_time)      ASN1_TIME atm;      long offset;      char buff1[24], buff2[24], *p; -    int i, j; +    int i, j, remaining;      p = buff1; -    i = ctm->length; +    remaining = ctm->length;      str = (char *)ctm->data; +    /* +     * Note that the following (historical) code allows much more slack in the +     * time format than RFC5280. In RFC5280, the representation is fixed: +     * UTCTime: YYMMDDHHMMSSZ +     * GeneralizedTime: YYYYMMDDHHMMSSZ +     */      if (ctm->type == V_ASN1_UTCTIME) { -        if ((i < 11) || (i > 17)) +        /* YYMMDDHHMM[SS]Z or YYMMDDHHMM[SS](+-)hhmm */ +        int min_length = sizeof("YYMMDDHHMMZ") - 1; +        int max_length = sizeof("YYMMDDHHMMSS+hhmm") - 1; +        if (remaining < min_length || remaining > max_length)              return 0;          memcpy(p, str, 10);          p += 10;          str += 10; +        remaining -= 10;      } else { -        if (i < 13) +        /* YYYYMMDDHHMM[SS[.fff]]Z or YYYYMMDDHHMM[SS[.f[f[f]]]](+-)hhmm */ +        int min_length = sizeof("YYYYMMDDHHMMZ") - 1; +        int max_length = sizeof("YYYYMMDDHHMMSS.fff+hhmm") - 1; +        if (remaining < min_length || remaining > max_length)              return 0;          memcpy(p, str, 12);          p += 12;          str += 12; +        remaining -= 12;      }      if ((*str == 'Z') || (*str == '-') || (*str == '+')) {          *(p++) = '0';          *(p++) = '0';      } else { +        /* SS (seconds) */ +        if (remaining < 2) +            return 0;          *(p++) = *(str++);          *(p++) = *(str++); -        /* Skip any fractional seconds... */ -        if (*str == '.') { +        remaining -= 2; +        /* +         * Skip any (up to three) fractional seconds... +         * TODO(emilia): in RFC5280, fractional seconds are forbidden. +         * Can we just kill them altogether? +         */ +        if (remaining && *str == '.') {              str++; -            while ((*str >= '0') && (*str <= '9')) -                str++; +            remaining--; +            for (i = 0; i < 3 && remaining; i++, str++, remaining--) { +                if (*str < '0' || *str > '9') +                    break; +            }          }      }      *(p++) = 'Z';      *(p++) = '\0'; -    if (*str == 'Z') +    /* We now need either a terminating 'Z' or an offset. */ +    if (!remaining) +        return 0; +    if (*str == 'Z') { +        if (remaining != 1) +            return 0;          offset = 0; -    else { +    } else { +        /* (+-)HHMM */          if ((*str != '+') && (*str != '-'))              return 0; +        /* Historical behaviour: the (+-)hhmm offset is forbidden in RFC5280. */ +        if (remaining != 5) +            return 0; +        if (str[1] < '0' || str[1] > '9' || str[2] < '0' || str[2] > '9' || +            str[3] < '0' || str[3] > '9' || str[4] < '0' || str[4] > '9') +            return 0;          offset = ((str[1] - '0') * 10 + (str[2] - '0')) * 60;          offset += (str[3] - '0') * 10 + (str[4] - '0');          if (*str == '-') @@ -1921,6 +1991,8 @@ X509_STORE_CTX *X509_STORE_CTX_new(void)  void X509_STORE_CTX_free(X509_STORE_CTX *ctx)  { +    if (!ctx) +        return;      X509_STORE_CTX_cleanup(ctx);      OPENSSL_free(ctx);  } diff --git a/openssl/crypto/x509/x509_vfy.h b/openssl/crypto/x509/x509_vfy.h index 1f8c0eccb..aacdf55aa 100644 --- a/openssl/crypto/x509/x509_vfy.h +++ b/openssl/crypto/x509/x509_vfy.h @@ -405,6 +405,12 @@ void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth);  # define X509_V_FLAG_USE_DELTAS                  0x2000  /* Check selfsigned CA signature */  # define X509_V_FLAG_CHECK_SS_SIGNATURE          0x4000 +/* + * If the initial chain is not trusted, do not attempt to build an alternative + * chain. Alternate chain checking was introduced in 1.0.1n/1.0.2b. Setting + * this flag will force the behaviour to match that of previous versions. + */ +# define X509_V_FLAG_NO_ALT_CHAINS               0x100000  # define X509_VP_FLAG_DEFAULT                    0x1  # define X509_VP_FLAG_OVERWRITE                  0x2 diff --git a/openssl/crypto/x509/x509_vpm.c b/openssl/crypto/x509/x509_vpm.c index d0543662c..6b0bf8a6e 100644 --- a/openssl/crypto/x509/x509_vpm.c +++ b/openssl/crypto/x509/x509_vpm.c @@ -100,6 +100,8 @@ X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void)  void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)  { +    if (param == NULL) +        return;      x509_verify_param_zero(param);      OPENSSL_free(param);  } diff --git a/openssl/crypto/x509/x509type.c b/openssl/crypto/x509/x509type.c index 033175257..9219f753b 100644 --- a/openssl/crypto/x509/x509type.c +++ b/openssl/crypto/x509/x509type.c @@ -121,9 +121,6 @@ int X509_certificate_type(X509 *x, EVP_PKEY *pkey)          }      } -    /* /8 because it's 1024 bits we look for, not bytes */ -    if (EVP_PKEY_size(pk) <= 1024 / 8) -        ret |= EVP_PKT_EXP;      if (pkey == NULL)          EVP_PKEY_free(pk);      return (ret); diff --git a/openssl/crypto/x509v3/Makefile b/openssl/crypto/x509v3/Makefile index 556ef351b..05125aba2 100644 --- a/openssl/crypto/x509v3/Makefile +++ b/openssl/crypto/x509v3/Makefile @@ -71,6 +71,8 @@ tests:  lint:  	lint -DLINT $(INCLUDES) $(SRC)>fluff +update: depend +  depend:  	@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...  	$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC) diff --git a/openssl/crypto/x509v3/v3_alt.c b/openssl/crypto/x509v3/v3_alt.c index 807867b91..22ec20284 100644 --- a/openssl/crypto/x509v3/v3_alt.c +++ b/openssl/crypto/x509v3/v3_alt.c @@ -584,24 +584,26 @@ static int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)  static int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)  { -    int ret; -    STACK_OF(CONF_VALUE) *sk; -    X509_NAME *nm; +    int ret = 0; +    STACK_OF(CONF_VALUE) *sk = NULL; +    X509_NAME *nm = NULL;      if (!(nm = X509_NAME_new())) -        return 0; +        goto err;      sk = X509V3_get_section(ctx, value);      if (!sk) {          X509V3err(X509V3_F_DO_DIRNAME, X509V3_R_SECTION_NOT_FOUND);          ERR_add_error_data(2, "section=", value); -        X509_NAME_free(nm); -        return 0; +        goto err;      }      /* FIXME: should allow other character types... */      ret = X509V3_NAME_from_section(nm, sk, MBSTRING_ASC);      if (!ret) -        X509_NAME_free(nm); +        goto err;      gen->d.dirn = nm; -    X509V3_section_free(ctx, sk); +err: +    if (ret == 0) +        X509_NAME_free(nm); +    X509V3_section_free(ctx, sk);      return ret;  } diff --git a/openssl/crypto/x509v3/v3_cpols.c b/openssl/crypto/x509v3/v3_cpols.c index dca6ab2ec..0febc1b3e 100644 --- a/openssl/crypto/x509v3/v3_cpols.c +++ b/openssl/crypto/x509v3/v3_cpols.c @@ -230,11 +230,11 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx,                  goto merr;              if (!sk_POLICYQUALINFO_push(pol->qualifiers, qual))                  goto merr; -            if(!(qual->pqualid = OBJ_nid2obj(NID_id_qt_cps))) { +            if (!(qual->pqualid = OBJ_nid2obj(NID_id_qt_cps))) {                  X509V3err(X509V3_F_POLICY_SECTION, ERR_R_INTERNAL_ERROR);                  goto err;              } -            if(!(qual->d.cpsuri = M_ASN1_IA5STRING_new())) +            if (!(qual->d.cpsuri = M_ASN1_IA5STRING_new()))                  goto merr;              if (!ASN1_STRING_set(qual->d.cpsuri, cnf->value,                                   strlen(cnf->value))) @@ -294,7 +294,7 @@ static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,      POLICYQUALINFO *qual;      if (!(qual = POLICYQUALINFO_new()))          goto merr; -    if(!(qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice))) { +    if (!(qual->pqualid = OBJ_nid2obj(NID_id_qt_unotice))) {          X509V3err(X509V3_F_NOTICE_SECTION, ERR_R_INTERNAL_ERROR);          goto err;      } @@ -304,7 +304,7 @@ static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,      for (i = 0; i < sk_CONF_VALUE_num(unot); i++) {          cnf = sk_CONF_VALUE_value(unot, i);          if (!strcmp(cnf->name, "explicitText")) { -            if(!(not->exptext = M_ASN1_VISIBLESTRING_new())) +            if (!(not->exptext = M_ASN1_VISIBLESTRING_new()))                  goto merr;              if (!ASN1_STRING_set(not->exptext, cnf->value,                                   strlen(cnf->value))) diff --git a/openssl/crypto/x509v3/v3_utl.c b/openssl/crypto/x509v3/v3_utl.c index 65dd1e2fb..94aaebba3 100644 --- a/openssl/crypto/x509v3/v3_utl.c +++ b/openssl/crypto/x509v3/v3_utl.c @@ -285,6 +285,10 @@ STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line)      int state;      /* We are going to modify the line so copy it first */      linebuf = BUF_strdup(line); +    if (linebuf == NULL) { +        X509V3err(X509V3_F_X509V3_PARSE_LIST, ERR_R_MALLOC_FAILURE); +        goto err; +    }      state = HDR_NAME;      ntmp = NULL;      /* Go through all characters */ | 
