diff options
author | pvalchev <> | 2006-10-04 07:10:32 +0000 |
---|---|---|
committer | pvalchev <> | 2006-10-04 07:10:32 +0000 |
commit | 2ae4a931445dd6121f260bcc0af2dde32a871cd0 (patch) | |
tree | 79c58b0010b91a2778efdc406095e24c85a41ae1 | |
parent | c2d940ce6f2c3ef66262b7c1953e6286cf68b267 (diff) | |
download | openbsd-2ae4a931445dd6121f260bcc0af2dde32a871cd0.tar.gz openbsd-2ae4a931445dd6121f260bcc0af2dde32a871cd0.tar.bz2 openbsd-2ae4a931445dd6121f260bcc0af2dde32a871cd0.zip |
openssl security fixes, diff from markus@, ok & "commit it" djm@
http://www.openssl.org/news/secadv_20060928.txt for more
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); |