Fixes to various ASN1_INTEGER routines for negative case.
Enhance s2i_ASN1_INTEGER().
This commit is contained in:
parent
57108f0ad5
commit
8e8972bb68
8
CHANGES
8
CHANGES
@ -3,6 +3,14 @@
|
||||
|
||||
Changes between 0.9.6 and 0.9.7 [xx XXX 2000]
|
||||
|
||||
*) Fixes to BN_to_ASN1_INTEGER when bn is zero. This would previously
|
||||
result in a zero length in the ASN1_INTEGER structure which was
|
||||
not consistent with the structure when d2i_ASN1_INTEGER() was used
|
||||
and would cause ASN1_INTEGER_cmp() to fail. Enhance s2i_ASN1_INTEGER()
|
||||
to cope with hex and negative integers. Fix bug in i2a_ASN1_INTEGER()
|
||||
where it did not print out a minus for negative ASN1_INTEGER.
|
||||
[Steve Henson]
|
||||
|
||||
*) Fix 'openssl passwd -1'.
|
||||
[Bodo Moeller]
|
||||
|
||||
|
@ -585,7 +585,7 @@ static int print_ocsp_summary(BIO *out, OCSP_BASICRESP *bs, OCSP_REQUEST *req,
|
||||
if (status != V_OCSP_CERTSTATUS_REVOKED)
|
||||
continue;
|
||||
|
||||
if (reason > 0)
|
||||
if (reason != -1)
|
||||
BIO_printf(out, "\tReason: %s\n",
|
||||
OCSP_crl_reason_str(reason));
|
||||
|
||||
|
@ -399,6 +399,12 @@ ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai)
|
||||
len=((j == 0)?0:((j/8)+1));
|
||||
ret->data=(unsigned char *)OPENSSL_malloc(len+4);
|
||||
ret->length=BN_bn2bin(bn,ret->data);
|
||||
/* Correct zero case */
|
||||
if(!ret->length)
|
||||
{
|
||||
ret->data[0] = 0;
|
||||
ret->length = 1;
|
||||
}
|
||||
return(ret);
|
||||
err:
|
||||
if (ret != ai) M_ASN1_INTEGER_free(ret);
|
||||
|
@ -69,10 +69,16 @@ int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a)
|
||||
|
||||
if (a == NULL) return(0);
|
||||
|
||||
if (a->type & V_ASN1_NEG)
|
||||
{
|
||||
if (BIO_write(bp, "-", 1) != 1) goto err;
|
||||
n = 1;
|
||||
}
|
||||
|
||||
if (a->length == 0)
|
||||
{
|
||||
if (BIO_write(bp,"00",2) != 2) goto err;
|
||||
n=2;
|
||||
n += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -154,21 +154,40 @@ ASN1_INTEGER *s2i_ASN1_INTEGER(X509V3_EXT_METHOD *method, char *value)
|
||||
{
|
||||
BIGNUM *bn = NULL;
|
||||
ASN1_INTEGER *aint;
|
||||
int isneg, ishex;
|
||||
int ret;
|
||||
bn = BN_new();
|
||||
if(!value) {
|
||||
if (!value) {
|
||||
X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_INVALID_NULL_VALUE);
|
||||
return 0;
|
||||
}
|
||||
if(!BN_dec2bn(&bn, value)) {
|
||||
if (value[0] == '-') {
|
||||
value++;
|
||||
isneg = 1;
|
||||
} else isneg = 0;
|
||||
|
||||
if (value[0] == '0' && ((value[1] == 'x') || (value[1] == 'X'))) {
|
||||
value += 2;
|
||||
ishex = 1;
|
||||
} else ishex = 0;
|
||||
|
||||
if (ishex) ret = BN_hex2bn(&bn, value);
|
||||
else ret = BN_dec2bn(&bn, value);
|
||||
|
||||
if (!ret) {
|
||||
X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_DEC2BN_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!(aint = BN_to_ASN1_INTEGER(bn, NULL))) {
|
||||
if (isneg && BN_is_zero(bn)) isneg = 0;
|
||||
|
||||
aint = BN_to_ASN1_INTEGER(bn, NULL);
|
||||
BN_free(bn);
|
||||
if (!aint) {
|
||||
X509V3err(X509V3_F_S2I_ASN1_INTEGER,X509V3_R_BN_TO_ASN1_INTEGER_ERROR);
|
||||
return 0;
|
||||
}
|
||||
BN_free(bn);
|
||||
if (isneg) aint->type |= V_ASN1_NEG;
|
||||
return aint;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user