Introduce limits to prevent malicious keys being able to
cause a denial of service. (CVE-2006-2940) [Steve Henson, Bodo Moeller] Fix ASN.1 parsing of certain invalid structures that can result in a denial of service. (CVE-2006-2937) [Steve Henson] Fix buffer overflow in SSL_get_shared_ciphers() function. (CVE-2006-3738) [Tavis Ormandy and Will Drewry, Google Security Team] Fix SSL client code which could crash if connecting to a malicious SSLv2 server. (CVE-2006-4343) [Tavis Ormandy and Will Drewry, Google Security Team]
This commit is contained in:
parent
81780a3b62
commit
951dfbb13a
14
CHANGES
14
CHANGES
@ -4,6 +4,20 @@
|
|||||||
|
|
||||||
Changes between 0.9.8c and 0.9.8d [xx XXX xxxx]
|
Changes between 0.9.8c and 0.9.8d [xx XXX xxxx]
|
||||||
|
|
||||||
|
*) Introduce limits to prevent malicious keys being able to
|
||||||
|
cause a denial of service. (CVE-2006-2940)
|
||||||
|
[Steve Henson, Bodo Moeller]
|
||||||
|
|
||||||
|
*) Fix ASN.1 parsing of certain invalid structures that can result
|
||||||
|
in a denial of service. (CVE-2006-2937) [Steve Henson]
|
||||||
|
|
||||||
|
*) Fix buffer overflow in SSL_get_shared_ciphers() function.
|
||||||
|
(CVE-2006-3738) [Tavis Ormandy and Will Drewry, Google Security Team]
|
||||||
|
|
||||||
|
*) Fix SSL client code which could crash if connecting to a
|
||||||
|
malicious SSLv2 server. (CVE-2006-4343)
|
||||||
|
[Tavis Ormandy and Will Drewry, Google Security Team]
|
||||||
|
|
||||||
*) Since 0.9.8b, ciphersuite strings naming explicit ciphersuites
|
*) Since 0.9.8b, ciphersuite strings naming explicit ciphersuites
|
||||||
match only those. Before that, "AES256-SHA" would be interpreted
|
match only those. Before that, "AES256-SHA" would be interpreted
|
||||||
as a pattern and match "AES128-SHA" too (since AES128-SHA got
|
as a pattern and match "AES128-SHA" too (since AES128-SHA got
|
||||||
|
6
NEWS
6
NEWS
@ -5,6 +5,12 @@
|
|||||||
This file gives a brief overview of the major changes between each OpenSSL
|
This file gives a brief overview of the major changes between each OpenSSL
|
||||||
release. For more details please read the CHANGES file.
|
release. For more details please read the CHANGES file.
|
||||||
|
|
||||||
|
Major changes between OpenSSL 0.9.7c and OpenSSL 0.9.8d:
|
||||||
|
|
||||||
|
o Introduce limits to prevent malicious key DoS (CVE-2006-2940)
|
||||||
|
o Fix security issues (CVE-2006-2937, CVE-2006-3737, CVE-2006-4343)
|
||||||
|
o Changes to ciphersuite selection algorithm
|
||||||
|
|
||||||
Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c:
|
Major changes between OpenSSL 0.9.8b and OpenSSL 0.9.8c:
|
||||||
|
|
||||||
o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
|
o Fix Daniel Bleichenbacher forged signature attack, CVE-2006-4339
|
||||||
|
@ -832,6 +832,7 @@ static int asn1_d2i_ex_primitive(ASN1_VALUE **pval,
|
|||||||
}
|
}
|
||||||
else if (ret == -1)
|
else if (ret == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
ret = 0;
|
||||||
/* SEQUENCE, SET and "OTHER" are left in encoded form */
|
/* SEQUENCE, SET and "OTHER" are left in encoded form */
|
||||||
if ((utype == V_ASN1_SEQUENCE)
|
if ((utype == V_ASN1_SEQUENCE)
|
||||||
|| (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER))
|
|| (utype == V_ASN1_SET) || (utype == V_ASN1_OTHER))
|
||||||
|
@ -73,6 +73,10 @@
|
|||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef OPENSSL_DH_MAX_MODULUS_BITS
|
||||||
|
# define OPENSSL_DH_MAX_MODULUS_BITS 10000
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DH_FLAG_CACHE_MONT_P 0x01
|
#define DH_FLAG_CACHE_MONT_P 0x01
|
||||||
#define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
|
#define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
|
||||||
* implementation now uses constant time
|
* implementation now uses constant time
|
||||||
@ -221,6 +225,7 @@ void ERR_load_DH_strings(void);
|
|||||||
/* Reason codes. */
|
/* Reason codes. */
|
||||||
#define DH_R_BAD_GENERATOR 101
|
#define DH_R_BAD_GENERATOR 101
|
||||||
#define DH_R_INVALID_PUBKEY 102
|
#define DH_R_INVALID_PUBKEY 102
|
||||||
|
#define DH_R_MODULUS_TOO_LARGE 103
|
||||||
#define DH_R_NO_PRIVATE_VALUE 100
|
#define DH_R_NO_PRIVATE_VALUE 100
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -84,6 +84,7 @@ static ERR_STRING_DATA DH_str_reasons[]=
|
|||||||
{
|
{
|
||||||
{ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"},
|
{ERR_REASON(DH_R_BAD_GENERATOR) ,"bad generator"},
|
||||||
{ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"},
|
{ERR_REASON(DH_R_INVALID_PUBKEY) ,"invalid public key"},
|
||||||
|
{ERR_REASON(DH_R_MODULUS_TOO_LARGE) ,"modulus too large"},
|
||||||
{ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"},
|
{ERR_REASON(DH_R_NO_PRIVATE_VALUE) ,"no private value"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
};
|
};
|
||||||
|
@ -179,6 +179,12 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
|
|||||||
int ret= -1;
|
int ret= -1;
|
||||||
int check_result;
|
int check_result;
|
||||||
|
|
||||||
|
if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
DHerr(DH_F_COMPUTE_KEY,DH_R_MODULUS_TOO_LARGE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
ctx = BN_CTX_new();
|
ctx = BN_CTX_new();
|
||||||
if (ctx == NULL) goto err;
|
if (ctx == NULL) goto err;
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
|
@ -84,6 +84,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef OPENSSL_DSA_MAX_MODULUS_BITS
|
||||||
|
# define OPENSSL_DSA_MAX_MODULUS_BITS 10000
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DSA_FLAG_CACHE_MONT_P 0x01
|
#define DSA_FLAG_CACHE_MONT_P 0x01
|
||||||
#define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA
|
#define DSA_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DSA
|
||||||
* implementation now uses constant time
|
* implementation now uses constant time
|
||||||
@ -270,8 +274,10 @@ void ERR_load_DSA_strings(void);
|
|||||||
#define DSA_F_SIG_CB 114
|
#define DSA_F_SIG_CB 114
|
||||||
|
|
||||||
/* Reason codes. */
|
/* Reason codes. */
|
||||||
|
#define DSA_R_BAD_Q_VALUE 102
|
||||||
#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100
|
#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 100
|
||||||
#define DSA_R_MISSING_PARAMETERS 101
|
#define DSA_R_MISSING_PARAMETERS 101
|
||||||
|
#define DSA_R_MODULUS_TOO_LARGE 103
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -89,8 +89,10 @@ static ERR_STRING_DATA DSA_str_functs[]=
|
|||||||
|
|
||||||
static ERR_STRING_DATA DSA_str_reasons[]=
|
static ERR_STRING_DATA DSA_str_reasons[]=
|
||||||
{
|
{
|
||||||
|
{ERR_REASON(DSA_R_BAD_Q_VALUE) ,"bad q value"},
|
||||||
{ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"},
|
{ERR_REASON(DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE),"data too large for key size"},
|
||||||
{ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"},
|
{ERR_REASON(DSA_R_MISSING_PARAMETERS) ,"missing parameters"},
|
||||||
|
{ERR_REASON(DSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
|
||||||
{0,NULL}
|
{0,NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -304,6 +304,18 @@ static int dsa_do_verify(const unsigned char *dgst, int dgst_len, DSA_SIG *sig,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BN_num_bits(dsa->q) != 160)
|
||||||
|
{
|
||||||
|
DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_BAD_Q_VALUE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BN_num_bits(dsa->p) > OPENSSL_DSA_MAX_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
DSAerr(DSA_F_DSA_DO_VERIFY,DSA_R_MODULUS_TOO_LARGE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
BN_init(&u1);
|
BN_init(&u1);
|
||||||
BN_init(&u2);
|
BN_init(&u2);
|
||||||
BN_init(&t1);
|
BN_init(&t1);
|
||||||
|
@ -93,6 +93,10 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef OPENSSL_ECC_MAX_FIELD_BITS
|
||||||
|
# define OPENSSL_ECC_MAX_FIELD_BITS 661
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* values as defined in X9.62 (ECDSA) and elsewhere */
|
/* values as defined in X9.62 (ECDSA) and elsewhere */
|
||||||
POINT_CONVERSION_COMPRESSED = 2,
|
POINT_CONVERSION_COMPRESSED = 2,
|
||||||
@ -482,6 +486,7 @@ void ERR_load_EC_strings(void);
|
|||||||
#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117
|
#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117
|
||||||
#define EC_R_DISCRIMINANT_IS_ZERO 118
|
#define EC_R_DISCRIMINANT_IS_ZERO 118
|
||||||
#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119
|
#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119
|
||||||
|
#define EC_R_FIELD_TOO_LARGE 138
|
||||||
#define EC_R_GROUP2PKPARAMETERS_FAILURE 120
|
#define EC_R_GROUP2PKPARAMETERS_FAILURE 120
|
||||||
#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121
|
#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121
|
||||||
#define EC_R_INCOMPATIBLE_OBJECTS 101
|
#define EC_R_INCOMPATIBLE_OBJECTS 101
|
||||||
@ -492,7 +497,9 @@ void ERR_load_EC_strings(void);
|
|||||||
#define EC_R_INVALID_FIELD 103
|
#define EC_R_INVALID_FIELD 103
|
||||||
#define EC_R_INVALID_FORM 104
|
#define EC_R_INVALID_FORM 104
|
||||||
#define EC_R_INVALID_GROUP_ORDER 122
|
#define EC_R_INVALID_GROUP_ORDER 122
|
||||||
|
#define EC_R_INVALID_PENTANOMIAL_BASIS 132
|
||||||
#define EC_R_INVALID_PRIVATE_KEY 123
|
#define EC_R_INVALID_PRIVATE_KEY 123
|
||||||
|
#define EC_R_INVALID_TRINOMIAL_BASIS 137
|
||||||
#define EC_R_MISSING_PARAMETERS 124
|
#define EC_R_MISSING_PARAMETERS 124
|
||||||
#define EC_R_MISSING_PRIVATE_KEY 125
|
#define EC_R_MISSING_PRIVATE_KEY 125
|
||||||
#define EC_R_NOT_A_NIST_PRIME 135
|
#define EC_R_NOT_A_NIST_PRIME 135
|
||||||
|
@ -741,6 +741,7 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
EC_GROUP *ret = NULL;
|
EC_GROUP *ret = NULL;
|
||||||
BIGNUM *p = NULL, *a = NULL, *b = NULL;
|
BIGNUM *p = NULL, *a = NULL, *b = NULL;
|
||||||
EC_POINT *point=NULL;
|
EC_POINT *point=NULL;
|
||||||
|
long field_bits;
|
||||||
|
|
||||||
if (!params->fieldID || !params->fieldID->fieldType ||
|
if (!params->fieldID || !params->fieldID->fieldType ||
|
||||||
!params->fieldID->p.ptr)
|
!params->fieldID->p.ptr)
|
||||||
@ -779,6 +780,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
|
|
||||||
char_two = params->fieldID->p.char_two;
|
char_two = params->fieldID->p.char_two;
|
||||||
|
|
||||||
|
field_bits = char_two->m;
|
||||||
|
if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
if ((p = BN_new()) == NULL)
|
if ((p = BN_new()) == NULL)
|
||||||
{
|
{
|
||||||
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE);
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE);
|
||||||
@ -799,6 +807,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis);
|
tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis);
|
||||||
|
|
||||||
|
if (!(char_two->m > tmp_long && tmp_long > 0))
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* create the polynomial */
|
/* create the polynomial */
|
||||||
if (!BN_set_bit(p, (int)char_two->m))
|
if (!BN_set_bit(p, (int)char_two->m))
|
||||||
goto err;
|
goto err;
|
||||||
@ -817,6 +832,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0))
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* create the polynomial */
|
/* create the polynomial */
|
||||||
if (!BN_set_bit(p, (int)char_two->m)) goto err;
|
if (!BN_set_bit(p, (int)char_two->m)) goto err;
|
||||||
if (!BN_set_bit(p, (int)penta->k1)) goto err;
|
if (!BN_set_bit(p, (int)penta->k1)) goto err;
|
||||||
@ -853,6 +875,20 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BN_is_negative(p) || BN_is_zero(p))
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
field_bits = BN_num_bits(p);
|
||||||
|
if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* create the EC_GROUP structure */
|
/* create the EC_GROUP structure */
|
||||||
ret = EC_GROUP_new_curve_GFp(p, a, b, NULL);
|
ret = EC_GROUP_new_curve_GFp(p, a, b, NULL);
|
||||||
}
|
}
|
||||||
@ -910,6 +946,16 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
|
|||||||
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
if (BN_is_negative(a) || BN_is_zero(a))
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */
|
||||||
|
{
|
||||||
|
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* extract the cofactor (optional) */
|
/* extract the cofactor (optional) */
|
||||||
if (params->cofactor == NULL)
|
if (params->cofactor == NULL)
|
||||||
|
@ -188,6 +188,7 @@ static ERR_STRING_DATA EC_str_reasons[]=
|
|||||||
{ERR_REASON(EC_R_D2I_ECPKPARAMETERS_FAILURE),"d2i ecpkparameters failure"},
|
{ERR_REASON(EC_R_D2I_ECPKPARAMETERS_FAILURE),"d2i ecpkparameters failure"},
|
||||||
{ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"},
|
{ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"},
|
||||||
{ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name failure"},
|
{ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name failure"},
|
||||||
|
{ERR_REASON(EC_R_FIELD_TOO_LARGE) ,"field too large"},
|
||||||
{ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"},
|
{ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"},
|
||||||
{ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"},
|
{ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"},
|
||||||
{ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"},
|
{ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"},
|
||||||
@ -198,7 +199,9 @@ static ERR_STRING_DATA EC_str_reasons[]=
|
|||||||
{ERR_REASON(EC_R_INVALID_FIELD) ,"invalid field"},
|
{ERR_REASON(EC_R_INVALID_FIELD) ,"invalid field"},
|
||||||
{ERR_REASON(EC_R_INVALID_FORM) ,"invalid form"},
|
{ERR_REASON(EC_R_INVALID_FORM) ,"invalid form"},
|
||||||
{ERR_REASON(EC_R_INVALID_GROUP_ORDER) ,"invalid group order"},
|
{ERR_REASON(EC_R_INVALID_GROUP_ORDER) ,"invalid group order"},
|
||||||
|
{ERR_REASON(EC_R_INVALID_PENTANOMIAL_BASIS),"invalid pentanomial basis"},
|
||||||
{ERR_REASON(EC_R_INVALID_PRIVATE_KEY) ,"invalid private key"},
|
{ERR_REASON(EC_R_INVALID_PRIVATE_KEY) ,"invalid private key"},
|
||||||
|
{ERR_REASON(EC_R_INVALID_TRINOMIAL_BASIS),"invalid trinomial basis"},
|
||||||
{ERR_REASON(EC_R_MISSING_PARAMETERS) ,"missing parameters"},
|
{ERR_REASON(EC_R_MISSING_PARAMETERS) ,"missing parameters"},
|
||||||
{ERR_REASON(EC_R_MISSING_PRIVATE_KEY) ,"missing private key"},
|
{ERR_REASON(EC_R_MISSING_PRIVATE_KEY) ,"missing private key"},
|
||||||
{ERR_REASON(EC_R_NOT_A_NIST_PRIME) ,"not a NIST prime"},
|
{ERR_REASON(EC_R_NOT_A_NIST_PRIME) ,"not a NIST prime"},
|
||||||
|
@ -159,6 +159,17 @@ struct rsa_st
|
|||||||
BN_BLINDING *mt_blinding;
|
BN_BLINDING *mt_blinding;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef OPENSSL_RSA_MAX_MODULUS_BITS
|
||||||
|
# define OPENSSL_RSA_MAX_MODULUS_BITS 16384
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS
|
||||||
|
# define OPENSSL_RSA_SMALL_MODULUS_BITS 3072
|
||||||
|
#endif
|
||||||
|
#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS
|
||||||
|
# define OPENSSL_RSA_MAX_PUBEXP_BITS 64 /* exponent limit enforced for "large" modulus only */
|
||||||
|
#endif
|
||||||
|
|
||||||
#define RSA_3 0x3L
|
#define RSA_3 0x3L
|
||||||
#define RSA_F4 0x10001L
|
#define RSA_F4 0x10001L
|
||||||
|
|
||||||
@ -407,6 +418,7 @@ void ERR_load_RSA_strings(void);
|
|||||||
#define RSA_R_IQMP_NOT_INVERSE_OF_Q 126
|
#define RSA_R_IQMP_NOT_INVERSE_OF_Q 126
|
||||||
#define RSA_R_KEY_SIZE_TOO_SMALL 120
|
#define RSA_R_KEY_SIZE_TOO_SMALL 120
|
||||||
#define RSA_R_LAST_OCTET_INVALID 134
|
#define RSA_R_LAST_OCTET_INVALID 134
|
||||||
|
#define RSA_R_MODULUS_TOO_LARGE 105
|
||||||
#define RSA_R_NO_PUBLIC_EXPONENT 140
|
#define RSA_R_NO_PUBLIC_EXPONENT 140
|
||||||
#define RSA_R_NULL_BEFORE_BLOCK_MISSING 113
|
#define RSA_R_NULL_BEFORE_BLOCK_MISSING 113
|
||||||
#define RSA_R_N_DOES_NOT_EQUAL_P_Q 127
|
#define RSA_R_N_DOES_NOT_EQUAL_P_Q 127
|
||||||
|
@ -168,6 +168,28 @@ static int RSA_eay_public_encrypt(int flen, const unsigned char *from,
|
|||||||
unsigned char *buf=NULL;
|
unsigned char *buf=NULL;
|
||||||
BN_CTX *ctx=NULL;
|
BN_CTX *ctx=NULL;
|
||||||
|
|
||||||
|
if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_MODULUS_TOO_LARGE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BN_ucmp(rsa->n, rsa->e) <= 0)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for large moduli, enforce exponent limit */
|
||||||
|
if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_ENCRYPT, RSA_R_BAD_E_VALUE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((ctx=BN_CTX_new()) == NULL) goto err;
|
if ((ctx=BN_CTX_new()) == NULL) goto err;
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
f = BN_CTX_get(ctx);
|
f = BN_CTX_get(ctx);
|
||||||
@ -597,6 +619,28 @@ static int RSA_eay_public_decrypt(int flen, const unsigned char *from,
|
|||||||
unsigned char *buf=NULL;
|
unsigned char *buf=NULL;
|
||||||
BN_CTX *ctx=NULL;
|
BN_CTX *ctx=NULL;
|
||||||
|
|
||||||
|
if (BN_num_bits(rsa->n) > OPENSSL_RSA_MAX_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_MODULUS_TOO_LARGE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BN_ucmp(rsa->n, rsa->e) <= 0)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for large moduli, enforce exponent limit */
|
||||||
|
if (BN_num_bits(rsa->n) > OPENSSL_RSA_SMALL_MODULUS_BITS)
|
||||||
|
{
|
||||||
|
if (BN_num_bits(rsa->e) > OPENSSL_RSA_MAX_PUBEXP_BITS)
|
||||||
|
{
|
||||||
|
RSAerr(RSA_F_RSA_EAY_PUBLIC_DECRYPT, RSA_R_BAD_E_VALUE);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if((ctx = BN_CTX_new()) == NULL) goto err;
|
if((ctx = BN_CTX_new()) == NULL) goto err;
|
||||||
BN_CTX_start(ctx);
|
BN_CTX_start(ctx);
|
||||||
f = BN_CTX_get(ctx);
|
f = BN_CTX_get(ctx);
|
||||||
|
@ -137,6 +137,7 @@ static ERR_STRING_DATA RSA_str_reasons[]=
|
|||||||
{ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"},
|
{ERR_REASON(RSA_R_IQMP_NOT_INVERSE_OF_Q) ,"iqmp not inverse of q"},
|
||||||
{ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"},
|
{ERR_REASON(RSA_R_KEY_SIZE_TOO_SMALL) ,"key size too small"},
|
||||||
{ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"},
|
{ERR_REASON(RSA_R_LAST_OCTET_INVALID) ,"last octet invalid"},
|
||||||
|
{ERR_REASON(RSA_R_MODULUS_TOO_LARGE) ,"modulus too large"},
|
||||||
{ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"},
|
{ERR_REASON(RSA_R_NO_PUBLIC_EXPONENT) ,"no public exponent"},
|
||||||
{ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"},
|
{ERR_REASON(RSA_R_NULL_BEFORE_BLOCK_MISSING),"null before block missing"},
|
||||||
{ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"},
|
{ERR_REASON(RSA_R_N_DOES_NOT_EQUAL_P_Q) ,"n does not equal p q"},
|
||||||
|
@ -520,7 +520,8 @@ static int get_server_hello(SSL *s)
|
|||||||
CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
|
CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->session->peer != s->session->sess_cert->peer_key->x509)
|
if (s->session->sess_cert == NULL
|
||||||
|
|| s->session->peer != s->session->sess_cert->peer_key->x509)
|
||||||
/* can't happen */
|
/* can't happen */
|
||||||
{
|
{
|
||||||
ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
|
ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
|
||||||
|
@ -2003,7 +2003,7 @@ int ssl3_get_client_key_exchange(SSL *s)
|
|||||||
|
|
||||||
if (kssl_ctx->client_princ)
|
if (kssl_ctx->client_princ)
|
||||||
{
|
{
|
||||||
int len = strlen(kssl_ctx->client_princ);
|
size_t len = strlen(kssl_ctx->client_princ);
|
||||||
if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
|
if ( len < SSL_MAX_KRB5_PRINCIPAL_LENGTH )
|
||||||
{
|
{
|
||||||
s->session->krb5_client_princ_len = len;
|
s->session->krb5_client_princ_len = len;
|
||||||
|
@ -1219,7 +1219,7 @@ char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)
|
|||||||
c=sk_SSL_CIPHER_value(sk,i);
|
c=sk_SSL_CIPHER_value(sk,i);
|
||||||
for (cp=c->name; *cp; )
|
for (cp=c->name; *cp; )
|
||||||
{
|
{
|
||||||
if (len-- == 0)
|
if (len-- <= 0)
|
||||||
{
|
{
|
||||||
*p='\0';
|
*p='\0';
|
||||||
return(buf);
|
return(buf);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user