Latest update
This commit is contained in:
+27
-42
@@ -367,10 +367,8 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
|
||||
{
|
||||
int ok = 0, nid;
|
||||
BIGNUM *tmp_1 = NULL, *tmp_2 = NULL;
|
||||
unsigned char *buffer_1 = NULL, *buffer_2 = NULL,
|
||||
*a_buf = NULL, *b_buf = NULL;
|
||||
size_t len_1, len_2;
|
||||
unsigned char char_zero = 0;
|
||||
unsigned char *a_buf = NULL, *b_buf = NULL;
|
||||
size_t len;
|
||||
|
||||
if (!group || !curve || !curve->a || !curve->b)
|
||||
return 0;
|
||||
@@ -398,44 +396,26 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
len_1 = (size_t)BN_num_bytes(tmp_1);
|
||||
len_2 = (size_t)BN_num_bytes(tmp_2);
|
||||
|
||||
if (len_1 == 0) {
|
||||
/* len_1 == 0 => a == 0 */
|
||||
a_buf = &char_zero;
|
||||
len_1 = 1;
|
||||
} else {
|
||||
if ((buffer_1 = OPENSSL_malloc(len_1)) == NULL) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
if ((len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
a_buf = buffer_1;
|
||||
/*
|
||||
* Per SEC 1, the curve coefficients must be padded up to size. See C.2's
|
||||
* definition of Curve, C.1's definition of FieldElement, and 2.3.5's
|
||||
* definition of how to encode the field elements.
|
||||
*/
|
||||
len = ((size_t)EC_GROUP_get_degree(group) + 7) / 8;
|
||||
if ((a_buf = OPENSSL_malloc(len)) == NULL
|
||||
|| (b_buf = OPENSSL_malloc(len)) == NULL) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (len_2 == 0) {
|
||||
/* len_2 == 0 => b == 0 */
|
||||
b_buf = &char_zero;
|
||||
len_2 = 1;
|
||||
} else {
|
||||
if ((buffer_2 = OPENSSL_malloc(len_2)) == NULL) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
if ((len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
b_buf = buffer_2;
|
||||
if (BN_bn2binpad(tmp_1, a_buf, len) < 0
|
||||
|| BN_bn2binpad(tmp_2, b_buf, len) < 0) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* set a and b */
|
||||
if (!ASN1_OCTET_STRING_set(curve->a, a_buf, len_1) ||
|
||||
!ASN1_OCTET_STRING_set(curve->b, b_buf, len_2)) {
|
||||
if (!ASN1_OCTET_STRING_set(curve->a, a_buf, len)
|
||||
|| !ASN1_OCTET_STRING_set(curve->b, b_buf, len)) {
|
||||
ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB);
|
||||
goto err;
|
||||
}
|
||||
@@ -462,8 +442,8 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
|
||||
ok = 1;
|
||||
|
||||
err:
|
||||
OPENSSL_free(buffer_1);
|
||||
OPENSSL_free(buffer_2);
|
||||
OPENSSL_free(a_buf);
|
||||
OPENSSL_free(b_buf);
|
||||
BN_free(tmp_1);
|
||||
BN_free(tmp_2);
|
||||
return ok;
|
||||
@@ -611,7 +591,12 @@ EC_GROUP *EC_GROUP_new_from_ecparameters(const ECPARAMETERS *params)
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* now extract the curve parameters a and b */
|
||||
/*
|
||||
* Now extract the curve parameters a and b. Note that, although SEC 1
|
||||
* specifies the length of their encodings, historical versions of OpenSSL
|
||||
* encoded them incorrectly, so we must accept any length for backwards
|
||||
* compatibility.
|
||||
*/
|
||||
if (!params->curve || !params->curve->a ||
|
||||
!params->curve->a->data || !params->curve->b ||
|
||||
!params->curve->b->data) {
|
||||
@@ -856,7 +841,7 @@ EC_GROUP *EC_GROUP_new_from_ecpkparameters(const ECPKPARAMETERS *params)
|
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS, ERR_R_EC_LIB);
|
||||
return NULL;
|
||||
}
|
||||
EC_GROUP_set_asn1_flag(ret, 0x0);
|
||||
EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_EXPLICIT_CURVE);
|
||||
} else if (params->type == 2) { /* implicitlyCA */
|
||||
return NULL;
|
||||
} else {
|
||||
|
||||
+20
-1
@@ -101,7 +101,26 @@ int CRYPTO_THREAD_init_local(CRYPTO_THREAD_LOCAL *key, void (*cleanup)(void *))
|
||||
|
||||
void *CRYPTO_THREAD_get_local(CRYPTO_THREAD_LOCAL *key)
|
||||
{
|
||||
return TlsGetValue(*key);
|
||||
DWORD last_error;
|
||||
void *ret;
|
||||
|
||||
/*
|
||||
* TlsGetValue clears the last error even on success, so that callers may
|
||||
* distinguish it successfully returning NULL or failing. It is documented
|
||||
* to never fail if the argument is a valid index from TlsAlloc, so we do
|
||||
* not need to handle this.
|
||||
*
|
||||
* However, this error-mangling behavior interferes with the caller's use of
|
||||
* GetLastError. In particular SSL_get_error queries the error queue to
|
||||
* determine whether the caller should look at the OS's errors. To avoid
|
||||
* destroying state, save and restore the Windows error.
|
||||
*
|
||||
* https://msdn.microsoft.com/en-us/library/windows/desktop/ms686812(v=vs.85).aspx
|
||||
*/
|
||||
last_error = GetLastError();
|
||||
ret = TlsGetValue(*key);
|
||||
SetLastError(last_error);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int CRYPTO_THREAD_set_local(CRYPTO_THREAD_LOCAL *key, void *val)
|
||||
|
||||
Reference in New Issue
Block a user