diff options
23 files changed, 166 insertions, 3 deletions
diff --git a/src/lib/libcrypto/asn1/tasn_dec.c b/src/lib/libcrypto/asn1/tasn_dec.c index c22501fc63..b7e916ef36 100644 --- a/src/lib/libcrypto/asn1/tasn_dec.c +++ b/src/lib/libcrypto/asn1/tasn_dec.c | |||
| @@ -629,6 +629,8 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, unsigned char **in, long inl | |||
| 629 | ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_NESTED_ASN1_ERROR); | 629 | ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_NESTED_ASN1_ERROR); |
| 630 | return 0; | 630 | return 0; |
| 631 | } else if(ret == -1) return -1; | 631 | } else if(ret == -1) return -1; |
| 632 | |||
| 633 | ret = 0; | ||
| 632 | /* SEQUENCE, SET and "OTHER" are left in encoded form */ | 634 | /* SEQUENCE, SET and "OTHER" are left in encoded form */ |
| 633 | if((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) { | 635 | if((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) { |
| 634 | /* Clear context cache for type OTHER because the auto clear when | 636 | /* Clear context cache for type OTHER because the auto clear when |
diff --git a/src/lib/libcrypto/dh/dh.h b/src/lib/libcrypto/dh/dh.h index 8562d16fb7..582b34329f 100644 --- a/src/lib/libcrypto/dh/dh.h +++ b/src/lib/libcrypto/dh/dh.h | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | #include <openssl/crypto.h> | 70 | #include <openssl/crypto.h> |
| 71 | #include <openssl/ossl_typ.h> | 71 | #include <openssl/ossl_typ.h> |
| 72 | 72 | ||
| 73 | #define OPENSSL_DH_MAX_MODULUS_BITS 10000 | ||
| 74 | |||
| 73 | #define DH_FLAG_CACHE_MONT_P 0x01 | 75 | #define DH_FLAG_CACHE_MONT_P 0x01 |
| 74 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH | 76 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH |
| 75 | * implementation now uses constant time | 77 | * implementation now uses constant time |
| @@ -213,6 +215,7 @@ void ERR_load_DH_strings(void); | |||
| 213 | #define DH_R_BAD_GENERATOR 101 | 215 | #define DH_R_BAD_GENERATOR 101 |
| 214 | #define DH_R_NO_PRIVATE_VALUE 100 | 216 | #define DH_R_NO_PRIVATE_VALUE 100 |
| 215 | #define DH_R_INVALID_PUBKEY 102 | 217 | #define DH_R_INVALID_PUBKEY 102 |
| 218 | #define DH_R_MODULUS_TOO_LARGE 103 | ||
| 216 | 219 | ||
| 217 | #ifdef __cplusplus | 220 | #ifdef __cplusplus |
| 218 | } | 221 | } |
diff --git a/src/lib/libcrypto/dh/dh_err.c b/src/lib/libcrypto/dh/dh_err.c index 9336bfce6b..611067ef4a 100644 --- a/src/lib/libcrypto/dh/dh_err.c +++ b/src/lib/libcrypto/dh/dh_err.c | |||
| @@ -84,6 +84,7 @@ static ERR_STRING_DATA DH_str_reasons[]= | |||
| 84 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, | 84 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, |
| 85 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, | 85 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, |
| 86 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, | 86 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, |
| 87 | {ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 87 | {0,NULL} | 88 | {0,NULL} |
| 88 | }; | 89 | }; |
| 89 | 90 | ||
diff --git a/src/lib/libcrypto/dh/dh_key.c b/src/lib/libcrypto/dh/dh_key.c index e3641ec468..74de589204 100644 --- a/src/lib/libcrypto/dh/dh_key.c +++ b/src/lib/libcrypto/dh/dh_key.c | |||
| @@ -181,6 +181,12 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) | |||
| 181 | int ret= -1; | 181 | int ret= -1; |
| 182 | int check_result; | 182 | int check_result; |
| 183 | 183 | ||
| 184 | if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) | ||
| 185 | { | ||
| 186 | DHerr(DH_F_DH_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE); | ||
| 187 | return -1; | ||
| 188 | } | ||
| 189 | |||
| 184 | ctx = BN_CTX_new(); | 190 | ctx = BN_CTX_new(); |
| 185 | if (ctx == NULL) goto err; | 191 | if (ctx == NULL) goto err; |
| 186 | BN_CTX_start(ctx); | 192 | BN_CTX_start(ctx); |
diff --git a/src/lib/libcrypto/dsa/dsa.h b/src/lib/libcrypto/dsa/dsa.h index 851e3f0445..aa0669eb7a 100644 --- a/src/lib/libcrypto/dsa/dsa.h +++ b/src/lib/libcrypto/dsa/dsa.h | |||
| @@ -79,6 +79,8 @@ | |||
| 79 | # include <openssl/dh.h> | 79 | # include <openssl/dh.h> |
| 80 | #endif | 80 | #endif |
| 81 | 81 | ||
| 82 | #define OPENSSL_DSA_MAX_MODULUS_BITS 3072 | ||
| 83 | |||
| 82 | #define DSA_FLAG_CACHE_MONT_P 0x01 | 84 | #define DSA_FLAG_CACHE_MONT_P 0x01 |
| 83 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA | 85 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA |
| 84 | * implementation now uses constant time | 86 | * implementation now uses constant time |
| @@ -259,8 +261,10 @@ void ERR_load_DSA_strings(void); | |||
| 259 | #define DSA_F_SIG_CB 114 | 261 | #define DSA_F_SIG_CB 114 |
| 260 | 262 | ||
| 261 | /* Reason codes. */ | 263 | /* Reason codes. */ |
| 264 | #define DSA_R_BAD_Q_VALUE 102 | ||
| 262 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 | 265 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 |
| 263 | #define DSA_R_MISSING_PARAMETERS 101 | 266 | #define DSA_R_MISSING_PARAMETERS 101 |
| 267 | #define DSA_R_MODULUS_TOO_LARGE 103 | ||
| 264 | 268 | ||
| 265 | #ifdef __cplusplus | 269 | #ifdef __cplusplus |
| 266 | } | 270 | } |
diff --git a/src/lib/libcrypto/dsa/dsa_err.c b/src/lib/libcrypto/dsa/dsa_err.c index fd42053572..d7fac69154 100644 --- a/src/lib/libcrypto/dsa/dsa_err.c +++ b/src/lib/libcrypto/dsa/dsa_err.c | |||
| @@ -89,8 +89,10 @@ static ERR_STRING_DATA DSA_str_functs[]= | |||
| 89 | 89 | ||
| 90 | static ERR_STRING_DATA DSA_str_reasons[]= | 90 | static ERR_STRING_DATA DSA_str_reasons[]= |
| 91 | { | 91 | { |
| 92 | {ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"}, | ||
| 92 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, | 93 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, |
| 93 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, | 94 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, |
| 95 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 94 | {0,NULL} | 96 | {0,NULL} |
| 95 | }; | 97 | }; |
| 96 | 98 | ||
diff --git a/src/lib/libcrypto/dsa/dsa_ossl.c b/src/lib/libcrypto/dsa/dsa_ossl.c index 12509a7083..5de5fc7e91 100644 --- a/src/lib/libcrypto/dsa/dsa_ossl.c +++ b/src/lib/libcrypto/dsa/dsa_ossl.c | |||
| @@ -274,6 +274,18 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | |||
| 274 | return -1; | 274 | return -1; |
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | if (BN_num_bits(dsa->q) != 160) | ||
| 278 | { | ||
| 279 | DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_BAD_Q_VALUE); | ||
| 280 | return -1; | ||
| 281 | } | ||
| 282 | |||
| 283 | if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) | ||
| 284 | { | ||
| 285 | DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_MODULUS_TOO_LARGE); | ||
| 286 | return -1; | ||
| 287 | } | ||
| 288 | |||
| 277 | BN_init(&u1); | 289 | BN_init(&u1); |
| 278 | BN_init(&u2); | 290 | BN_init(&u2); |
| 279 | BN_init(&t1); | 291 | BN_init(&t1); |
diff --git a/src/lib/libcrypto/rsa/rsa.h b/src/lib/libcrypto/rsa/rsa.h index 0b639cd37f..dbed701e89 100644 --- a/src/lib/libcrypto/rsa/rsa.h +++ b/src/lib/libcrypto/rsa/rsa.h | |||
| @@ -154,6 +154,11 @@ struct rsa_st | |||
| 154 | BN_BLINDING *blinding; | 154 | BN_BLINDING *blinding; |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | #define OPENSSL_RSA_MAX_MODULUS_BITS 16384 | ||
| 158 | |||
| 159 | #define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 | ||
| 160 | #define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "small" modulus only */ | ||
| 161 | |||
| 157 | #define RSA_3 0x3L | 162 | #define RSA_3 0x3L |
| 158 | #define RSA_F4 0x10001L | 163 | #define RSA_F4 0x10001L |
| 159 | 164 | ||
| @@ -386,6 +391,7 @@ void ERR_load_RSA_strings(void); | |||
| 386 | #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 | 391 | #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 |
| 387 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 | 392 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 |
| 388 | #define RSA_R_LAST_OCTET_INVALID 134 | 393 | #define RSA_R_LAST_OCTET_INVALID 134 |
| 394 | #define RSA_R_MODULUS_TOO_LARGE 105 | ||
| 389 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 | 395 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 |
| 390 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 | 396 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 |
| 391 | #define RSA_R_OAEP_DECODING_ERROR 121 | 397 | #define RSA_R_OAEP_DECODING_ERROR 121 |
diff --git a/src/lib/libcrypto/rsa/rsa_eay.c b/src/lib/libcrypto/rsa/rsa_eay.c index be4ac96ce3..610889dc80 100644 --- a/src/lib/libcrypto/rsa/rsa_eay.c +++ b/src/lib/libcrypto/rsa/rsa_eay.c | |||
| @@ -295,6 +295,28 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, | |||
| 295 | BN_init(&f); | 295 | BN_init(&f); |
| 296 | BN_init(&ret); | 296 | BN_init(&ret); |
| 297 | 297 | ||
| 298 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) | ||
| 299 | { | ||
| 300 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE); | ||
| 301 | return -1; | ||
| 302 | } | ||
| 303 | |||
| 304 | if (BN_ucmp(rsa->n, rsa->e) <= 0) | ||
| 305 | { | ||
| 306 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); | ||
| 307 | return -1; | ||
| 308 | } | ||
| 309 | |||
| 310 | /* for large moduli, enforce exponent limit */ | ||
| 311 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) | ||
| 312 | { | ||
| 313 | if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) | ||
| 314 | { | ||
| 315 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); | ||
| 316 | return -1; | ||
| 317 | } | ||
| 318 | } | ||
| 319 | |||
| 298 | if ((ctx=BN_CTX_new()) == NULL) goto err; | 320 | if ((ctx=BN_CTX_new()) == NULL) goto err; |
| 299 | num=BN_num_bytes(rsa->n); | 321 | num=BN_num_bytes(rsa->n); |
| 300 | if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL) | 322 | if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL) |
| @@ -576,6 +598,28 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, | |||
| 576 | unsigned char *buf=NULL; | 598 | unsigned char *buf=NULL; |
| 577 | BN_CTX *ctx=NULL; | 599 | BN_CTX *ctx=NULL; |
| 578 | 600 | ||
| 601 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) | ||
| 602 | { | ||
| 603 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE); | ||
| 604 | return -1; | ||
| 605 | } | ||
| 606 | |||
| 607 | if (BN_ucmp(rsa->n, rsa->e) <= 0) | ||
| 608 | { | ||
| 609 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); | ||
| 610 | return -1; | ||
| 611 | } | ||
| 612 | |||
| 613 | /* for large moduli, enforce exponent limit */ | ||
| 614 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) | ||
| 615 | { | ||
| 616 | if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) | ||
| 617 | { | ||
| 618 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); | ||
| 619 | return -1; | ||
| 620 | } | ||
| 621 | } | ||
| 622 | |||
| 579 | BN_init(&f); | 623 | BN_init(&f); |
| 580 | BN_init(&ret); | 624 | BN_init(&ret); |
| 581 | ctx=BN_CTX_new(); | 625 | ctx=BN_CTX_new(); |
diff --git a/src/lib/libcrypto/rsa/rsa_err.c b/src/lib/libcrypto/rsa/rsa_err.c index 2ec4b30ff7..ddcb28e663 100644 --- a/src/lib/libcrypto/rsa/rsa_err.c +++ b/src/lib/libcrypto/rsa/rsa_err.c | |||
| @@ -129,6 +129,7 @@ static ERR_STRING_DATA RSA_str_reasons[]= | |||
| 129 | {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"}, | 129 | {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"}, |
| 130 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, | 130 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, |
| 131 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, | 131 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, |
| 132 | {ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 132 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, | 133 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, |
| 133 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, | 134 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, |
| 134 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, | 135 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, |
diff --git a/src/lib/libssl/src/crypto/asn1/tasn_dec.c b/src/lib/libssl/src/crypto/asn1/tasn_dec.c index c22501fc63..b7e916ef36 100644 --- a/src/lib/libssl/src/crypto/asn1/tasn_dec.c +++ b/src/lib/libssl/src/crypto/asn1/tasn_dec.c | |||
| @@ -629,6 +629,8 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval, unsigned char **in, long inl | |||
| 629 | ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_NESTED_ASN1_ERROR); | 629 | ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_NESTED_ASN1_ERROR); |
| 630 | return 0; | 630 | return 0; |
| 631 | } else if(ret == -1) return -1; | 631 | } else if(ret == -1) return -1; |
| 632 | |||
| 633 | ret = 0; | ||
| 632 | /* SEQUENCE, SET and "OTHER" are left in encoded form */ | 634 | /* SEQUENCE, SET and "OTHER" are left in encoded form */ |
| 633 | if((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) { | 635 | if((utype == V_ASN1_SEQUENCE) || (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER)) { |
| 634 | /* Clear context cache for type OTHER because the auto clear when | 636 | /* Clear context cache for type OTHER because the auto clear when |
diff --git a/src/lib/libssl/src/crypto/dh/dh.h b/src/lib/libssl/src/crypto/dh/dh.h index 8562d16fb7..582b34329f 100644 --- a/src/lib/libssl/src/crypto/dh/dh.h +++ b/src/lib/libssl/src/crypto/dh/dh.h | |||
| @@ -70,6 +70,8 @@ | |||
| 70 | #include <openssl/crypto.h> | 70 | #include <openssl/crypto.h> |
| 71 | #include <openssl/ossl_typ.h> | 71 | #include <openssl/ossl_typ.h> |
| 72 | 72 | ||
| 73 | #define OPENSSL_DH_MAX_MODULUS_BITS 10000 | ||
| 74 | |||
| 73 | #define DH_FLAG_CACHE_MONT_P 0x01 | 75 | #define DH_FLAG_CACHE_MONT_P 0x01 |
| 74 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH | 76 | #define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH |
| 75 | * implementation now uses constant time | 77 | * implementation now uses constant time |
| @@ -213,6 +215,7 @@ void ERR_load_DH_strings(void); | |||
| 213 | #define DH_R_BAD_GENERATOR 101 | 215 | #define DH_R_BAD_GENERATOR 101 |
| 214 | #define DH_R_NO_PRIVATE_VALUE 100 | 216 | #define DH_R_NO_PRIVATE_VALUE 100 |
| 215 | #define DH_R_INVALID_PUBKEY 102 | 217 | #define DH_R_INVALID_PUBKEY 102 |
| 218 | #define DH_R_MODULUS_TOO_LARGE 103 | ||
| 216 | 219 | ||
| 217 | #ifdef __cplusplus | 220 | #ifdef __cplusplus |
| 218 | } | 221 | } |
diff --git a/src/lib/libssl/src/crypto/dh/dh_err.c b/src/lib/libssl/src/crypto/dh/dh_err.c index 9336bfce6b..611067ef4a 100644 --- a/src/lib/libssl/src/crypto/dh/dh_err.c +++ b/src/lib/libssl/src/crypto/dh/dh_err.c | |||
| @@ -84,6 +84,7 @@ static ERR_STRING_DATA DH_str_reasons[]= | |||
| 84 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, | 84 | {ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"}, |
| 85 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, | 85 | {ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"}, |
| 86 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, | 86 | {ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"}, |
| 87 | {ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 87 | {0,NULL} | 88 | {0,NULL} |
| 88 | }; | 89 | }; |
| 89 | 90 | ||
diff --git a/src/lib/libssl/src/crypto/dh/dh_key.c b/src/lib/libssl/src/crypto/dh/dh_key.c index e3641ec468..74de589204 100644 --- a/src/lib/libssl/src/crypto/dh/dh_key.c +++ b/src/lib/libssl/src/crypto/dh/dh_key.c | |||
| @@ -181,6 +181,12 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) | |||
| 181 | int ret= -1; | 181 | int ret= -1; |
| 182 | int check_result; | 182 | int check_result; |
| 183 | 183 | ||
| 184 | if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) | ||
| 185 | { | ||
| 186 | DHerr(DH_F_DH_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE); | ||
| 187 | return -1; | ||
| 188 | } | ||
| 189 | |||
| 184 | ctx = BN_CTX_new(); | 190 | ctx = BN_CTX_new(); |
| 185 | if (ctx == NULL) goto err; | 191 | if (ctx == NULL) goto err; |
| 186 | BN_CTX_start(ctx); | 192 | BN_CTX_start(ctx); |
diff --git a/src/lib/libssl/src/crypto/dsa/dsa.h b/src/lib/libssl/src/crypto/dsa/dsa.h index 851e3f0445..aa0669eb7a 100644 --- a/src/lib/libssl/src/crypto/dsa/dsa.h +++ b/src/lib/libssl/src/crypto/dsa/dsa.h | |||
| @@ -79,6 +79,8 @@ | |||
| 79 | # include <openssl/dh.h> | 79 | # include <openssl/dh.h> |
| 80 | #endif | 80 | #endif |
| 81 | 81 | ||
| 82 | #define OPENSSL_DSA_MAX_MODULUS_BITS 3072 | ||
| 83 | |||
| 82 | #define DSA_FLAG_CACHE_MONT_P 0x01 | 84 | #define DSA_FLAG_CACHE_MONT_P 0x01 |
| 83 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA | 85 | #define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA |
| 84 | * implementation now uses constant time | 86 | * implementation now uses constant time |
| @@ -259,8 +261,10 @@ void ERR_load_DSA_strings(void); | |||
| 259 | #define DSA_F_SIG_CB 114 | 261 | #define DSA_F_SIG_CB 114 |
| 260 | 262 | ||
| 261 | /* Reason codes. */ | 263 | /* Reason codes. */ |
| 264 | #define DSA_R_BAD_Q_VALUE 102 | ||
| 262 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 | 265 | #define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100 |
| 263 | #define DSA_R_MISSING_PARAMETERS 101 | 266 | #define DSA_R_MISSING_PARAMETERS 101 |
| 267 | #define DSA_R_MODULUS_TOO_LARGE 103 | ||
| 264 | 268 | ||
| 265 | #ifdef __cplusplus | 269 | #ifdef __cplusplus |
| 266 | } | 270 | } |
diff --git a/src/lib/libssl/src/crypto/dsa/dsa_err.c b/src/lib/libssl/src/crypto/dsa/dsa_err.c index fd42053572..d7fac69154 100644 --- a/src/lib/libssl/src/crypto/dsa/dsa_err.c +++ b/src/lib/libssl/src/crypto/dsa/dsa_err.c | |||
| @@ -89,8 +89,10 @@ static ERR_STRING_DATA DSA_str_functs[]= | |||
| 89 | 89 | ||
| 90 | static ERR_STRING_DATA DSA_str_reasons[]= | 90 | static ERR_STRING_DATA DSA_str_reasons[]= |
| 91 | { | 91 | { |
| 92 | {ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"}, | ||
| 92 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, | 93 | {ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"}, |
| 93 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, | 94 | {ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"}, |
| 95 | {ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 94 | {0,NULL} | 96 | {0,NULL} |
| 95 | }; | 97 | }; |
| 96 | 98 | ||
diff --git a/src/lib/libssl/src/crypto/dsa/dsa_ossl.c b/src/lib/libssl/src/crypto/dsa/dsa_ossl.c index 12509a7083..5de5fc7e91 100644 --- a/src/lib/libssl/src/crypto/dsa/dsa_ossl.c +++ b/src/lib/libssl/src/crypto/dsa/dsa_ossl.c | |||
| @@ -274,6 +274,18 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig, | |||
| 274 | return -1; | 274 | return -1; |
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | if (BN_num_bits(dsa->q) != 160) | ||
| 278 | { | ||
| 279 | DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_BAD_Q_VALUE); | ||
| 280 | return -1; | ||
| 281 | } | ||
| 282 | |||
| 283 | if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS) | ||
| 284 | { | ||
| 285 | DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_MODULUS_TOO_LARGE); | ||
| 286 | return -1; | ||
| 287 | } | ||
| 288 | |||
| 277 | BN_init(&u1); | 289 | BN_init(&u1); |
| 278 | BN_init(&u2); | 290 | BN_init(&u2); |
| 279 | BN_init(&t1); | 291 | BN_init(&t1); |
diff --git a/src/lib/libssl/src/crypto/rsa/rsa.h b/src/lib/libssl/src/crypto/rsa/rsa.h index 0b639cd37f..dbed701e89 100644 --- a/src/lib/libssl/src/crypto/rsa/rsa.h +++ b/src/lib/libssl/src/crypto/rsa/rsa.h | |||
| @@ -154,6 +154,11 @@ struct rsa_st | |||
| 154 | BN_BLINDING *blinding; | 154 | BN_BLINDING *blinding; |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | #define OPENSSL_RSA_MAX_MODULUS_BITS 16384 | ||
| 158 | |||
| 159 | #define OPENSSL_RSA_SMALL_MODULUS_BITS 3072 | ||
| 160 | #define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "small" modulus only */ | ||
| 161 | |||
| 157 | #define RSA_3 0x3L | 162 | #define RSA_3 0x3L |
| 158 | #define RSA_F4 0x10001L | 163 | #define RSA_F4 0x10001L |
| 159 | 164 | ||
| @@ -386,6 +391,7 @@ void ERR_load_RSA_strings(void); | |||
| 386 | #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 | 391 | #define RSA_R_IQMP_NOT_INVERSE_OF_Q 126 |
| 387 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 | 392 | #define RSA_R_KEY_SIZE_TOO_SMALL 120 |
| 388 | #define RSA_R_LAST_OCTET_INVALID 134 | 393 | #define RSA_R_LAST_OCTET_INVALID 134 |
| 394 | #define RSA_R_MODULUS_TOO_LARGE 105 | ||
| 389 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 | 395 | #define RSA_R_NULL_BEFORE_BLOCK_MISSING 113 |
| 390 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 | 396 | #define RSA_R_N_DOES_NOT_EQUAL_P_Q 127 |
| 391 | #define RSA_R_OAEP_DECODING_ERROR 121 | 397 | #define RSA_R_OAEP_DECODING_ERROR 121 |
diff --git a/src/lib/libssl/src/crypto/rsa/rsa_eay.c b/src/lib/libssl/src/crypto/rsa/rsa_eay.c index be4ac96ce3..610889dc80 100644 --- a/src/lib/libssl/src/crypto/rsa/rsa_eay.c +++ b/src/lib/libssl/src/crypto/rsa/rsa_eay.c | |||
| @@ -295,6 +295,28 @@ static int RSA_eay_private_encrypt(int flen, const unsigned char *from, | |||
| 295 | BN_init(&f); | 295 | BN_init(&f); |
| 296 | BN_init(&ret); | 296 | BN_init(&ret); |
| 297 | 297 | ||
| 298 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) | ||
| 299 | { | ||
| 300 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE); | ||
| 301 | return -1; | ||
| 302 | } | ||
| 303 | |||
| 304 | if (BN_ucmp(rsa->n, rsa->e) <= 0) | ||
| 305 | { | ||
| 306 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); | ||
| 307 | return -1; | ||
| 308 | } | ||
| 309 | |||
| 310 | /* for large moduli, enforce exponent limit */ | ||
| 311 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) | ||
| 312 | { | ||
| 313 | if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) | ||
| 314 | { | ||
| 315 | RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE); | ||
| 316 | return -1; | ||
| 317 | } | ||
| 318 | } | ||
| 319 | |||
| 298 | if ((ctx=BN_CTX_new()) == NULL) goto err; | 320 | if ((ctx=BN_CTX_new()) == NULL) goto err; |
| 299 | num=BN_num_bytes(rsa->n); | 321 | num=BN_num_bytes(rsa->n); |
| 300 | if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL) | 322 | if ((buf=(unsigned char *)OPENSSL_malloc(num)) == NULL) |
| @@ -576,6 +598,28 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from, | |||
| 576 | unsigned char *buf=NULL; | 598 | unsigned char *buf=NULL; |
| 577 | BN_CTX *ctx=NULL; | 599 | BN_CTX *ctx=NULL; |
| 578 | 600 | ||
| 601 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS) | ||
| 602 | { | ||
| 603 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE); | ||
| 604 | return -1; | ||
| 605 | } | ||
| 606 | |||
| 607 | if (BN_ucmp(rsa->n, rsa->e) <= 0) | ||
| 608 | { | ||
| 609 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); | ||
| 610 | return -1; | ||
| 611 | } | ||
| 612 | |||
| 613 | /* for large moduli, enforce exponent limit */ | ||
| 614 | if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS) | ||
| 615 | { | ||
| 616 | if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS) | ||
| 617 | { | ||
| 618 | RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE); | ||
| 619 | return -1; | ||
| 620 | } | ||
| 621 | } | ||
| 622 | |||
| 579 | BN_init(&f); | 623 | BN_init(&f); |
| 580 | BN_init(&ret); | 624 | BN_init(&ret); |
| 581 | ctx=BN_CTX_new(); | 625 | ctx=BN_CTX_new(); |
diff --git a/src/lib/libssl/src/crypto/rsa/rsa_err.c b/src/lib/libssl/src/crypto/rsa/rsa_err.c index 2ec4b30ff7..ddcb28e663 100644 --- a/src/lib/libssl/src/crypto/rsa/rsa_err.c +++ b/src/lib/libssl/src/crypto/rsa/rsa_err.c | |||
| @@ -129,6 +129,7 @@ static ERR_STRING_DATA RSA_str_reasons[]= | |||
| 129 | {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"}, | 129 | {ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"}, |
| 130 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, | 130 | {ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"}, |
| 131 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, | 131 | {ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"}, |
| 132 | {ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"}, | ||
| 132 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, | 133 | {ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"}, |
| 133 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, | 134 | {ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"}, |
| 134 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, | 135 | {ERR_REASON(RSA_R_OAEP_DECODING_ERROR) ,"oaep decoding error"}, |
diff --git a/src/lib/libssl/src/ssl/s2_clnt.c b/src/lib/libssl/src/ssl/s2_clnt.c index eba04c715b..003809271b 100644 --- a/src/lib/libssl/src/ssl/s2_clnt.c +++ b/src/lib/libssl/src/ssl/s2_clnt.c | |||
| @@ -538,7 +538,8 @@ static int get_server_hello(SSL *s) | |||
| 538 | CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509); | 538 | CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509); |
| 539 | } | 539 | } |
| 540 | 540 | ||
| 541 | if (s->session->peer != s->session->sess_cert->peer_key->x509) | 541 | if (s->session->sess_cert == NULL || |
| 542 | s->session->peer != s->session->sess_cert->peer_key->x509) | ||
| 542 | /* can't happen */ | 543 | /* can't happen */ |
| 543 | { | 544 | { |
| 544 | ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); | 545 | ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); |
diff --git a/src/lib/libssl/src/ssl/ssl_lib.c b/src/lib/libssl/src/ssl/ssl_lib.c index 2bd9a5af86..4e8f302a5e 100644 --- a/src/lib/libssl/src/ssl/ssl_lib.c +++ b/src/lib/libssl/src/ssl/ssl_lib.c | |||
| @@ -1187,7 +1187,7 @@ char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) | |||
| 1187 | c=sk_SSL_CIPHER_value(sk,i); | 1187 | c=sk_SSL_CIPHER_value(sk,i); |
| 1188 | for (cp=c->name; *cp; ) | 1188 | for (cp=c->name; *cp; ) |
| 1189 | { | 1189 | { |
| 1190 | if (len-- == 0) | 1190 | if (len-- <= 0) |
| 1191 | { | 1191 | { |
| 1192 | *p='\0'; | 1192 | *p='\0'; |
| 1193 | return(buf); | 1193 | return(buf); |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 2bd9a5af86..4e8f302a5e 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
| @@ -1187,7 +1187,7 @@ char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len) | |||
| 1187 | c=sk_SSL_CIPHER_value(sk,i); | 1187 | c=sk_SSL_CIPHER_value(sk,i); |
| 1188 | for (cp=c->name; *cp; ) | 1188 | for (cp=c->name; *cp; ) |
| 1189 | { | 1189 | { |
| 1190 | if (len-- == 0) | 1190 | if (len-- <= 0) |
| 1191 | { | 1191 | { |
| 1192 | *p='\0'; | 1192 | *p='\0'; |
| 1193 | return(buf); | 1193 | return(buf); |
