Typesafety Thought Police part 5.

This commit is contained in:
Ben Laurie 2000-05-17 09:13:36 +00:00
parent 371acb22e6
commit abc9400e10
4 changed files with 25 additions and 14 deletions

View File

@ -433,3 +433,6 @@ BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai, BIGNUM *bn)
if(ai->type == V_ASN1_NEG_INTEGER) bn->neg = 1; if(ai->type == V_ASN1_NEG_INTEGER) bn->neg = 1;
return(ret); return(ret);
} }
IMPLEMENT_STACK_OF(ASN1_INTEGER)
IMPLEMENT_ASN1_SET_OF(ASN1_INTEGER)

View File

@ -293,6 +293,9 @@ typedef struct asn1_string_st ASN1_UTF8STRING;
typedef int ASN1_NULL; typedef int ASN1_NULL;
DECLARE_STACK_OF(ASN1_INTEGER)
DECLARE_ASN1_SET_OF(ASN1_INTEGER)
typedef struct asn1_type_st typedef struct asn1_type_st
{ {
int type; int type;

View File

@ -73,7 +73,7 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx,
STACK_OF(CONF_VALUE) *polstrs, int ia5org); STACK_OF(CONF_VALUE) *polstrs, int ia5org);
static POLICYQUALINFO *notice_section(X509V3_CTX *ctx, static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
STACK_OF(CONF_VALUE) *unot, int ia5org); STACK_OF(CONF_VALUE) *unot, int ia5org);
static STACK *nref_nos(STACK_OF(CONF_VALUE) *nos); static STACK_OF(ASN1_INTEGER) *nref_nos(STACK_OF(CONF_VALUE) *nos);
X509V3_EXT_METHOD v3_cpols = { X509V3_EXT_METHOD v3_cpols = {
NID_certificate_policies, 0, NID_certificate_policies, 0,
@ -282,20 +282,22 @@ static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
return NULL; return NULL;
} }
static STACK *nref_nos(STACK_OF(CONF_VALUE) *nos) static STACK_OF(ASN1_INTEGER) *nref_nos(STACK_OF(CONF_VALUE) *nos)
{ {
STACK *nnums; STACK_OF(ASN1_INTEGER) *nnums;
CONF_VALUE *cnf; CONF_VALUE *cnf;
ASN1_INTEGER *aint; ASN1_INTEGER *aint;
int i; int i;
if(!(nnums = sk_new_null())) goto merr;
if(!(nnums = sk_ASN1_INTEGER_new_null())) goto merr;
for(i = 0; i < sk_CONF_VALUE_num(nos); i++) { for(i = 0; i < sk_CONF_VALUE_num(nos); i++) {
cnf = sk_CONF_VALUE_value(nos, i); cnf = sk_CONF_VALUE_value(nos, i);
if(!(aint = s2i_ASN1_INTEGER(NULL, cnf->name))) { if(!(aint = s2i_ASN1_INTEGER(NULL, cnf->name))) {
X509V3err(X509V3_F_NREF_NOS,X509V3_R_INVALID_NUMBER); X509V3err(X509V3_F_NREF_NOS,X509V3_R_INVALID_NUMBER);
goto err; goto err;
} }
if(!sk_push(nnums, (char *)aint)) goto merr; if(!sk_ASN1_INTEGER_push(nnums, aint)) goto merr;
} }
return nnums; return nnums;
@ -303,7 +305,7 @@ static STACK *nref_nos(STACK_OF(CONF_VALUE) *nos)
X509V3err(X509V3_F_NOTICE_SECTION,ERR_R_MALLOC_FAILURE); X509V3err(X509V3_F_NOTICE_SECTION,ERR_R_MALLOC_FAILURE);
err: err:
sk_pop_free(nnums, (void(*)(void *))ASN1_STRING_free); sk_ASN1_INTEGER_pop_free(nnums, ASN1_STRING_free);
return NULL; return NULL;
} }
@ -441,11 +443,11 @@ static void print_notice(BIO *out, USERNOTICE *notice, int indent)
BIO_printf(out, "%*sOrganization: %s\n", indent, "", BIO_printf(out, "%*sOrganization: %s\n", indent, "",
ref->organization->data); ref->organization->data);
BIO_printf(out, "%*sNumber%s: ", indent, "", BIO_printf(out, "%*sNumber%s: ", indent, "",
(sk_num(ref->noticenos) > 1) ? "s" : ""); sk_ASN1_INTEGER_num(ref->noticenos) > 1 ? "s" : "");
for(i = 0; i < sk_num(ref->noticenos); i++) { for(i = 0; i < sk_ASN1_INTEGER_num(ref->noticenos); i++) {
ASN1_INTEGER *num; ASN1_INTEGER *num;
char *tmp; char *tmp;
num = (ASN1_INTEGER *)sk_value(ref->noticenos, i); num = sk_ASN1_INTEGER_value(ref->noticenos, i);
if(i) BIO_puts(out, ", "); if(i) BIO_puts(out, ", ");
tmp = i2s_ASN1_INTEGER(NULL, num); tmp = i2s_ASN1_INTEGER(NULL, num);
BIO_puts(out, tmp); BIO_puts(out, tmp);
@ -605,12 +607,14 @@ int i2d_NOTICEREF(NOTICEREF *a, unsigned char **pp)
M_ASN1_I2D_vars(a); M_ASN1_I2D_vars(a);
M_ASN1_I2D_len (a->organization, i2d_DISPLAYTEXT); M_ASN1_I2D_len (a->organization, i2d_DISPLAYTEXT);
M_ASN1_I2D_len_SEQUENCE(a->noticenos, i2d_ASN1_INTEGER); M_ASN1_I2D_len_SEQUENCE_type(ASN1_INTEGER, a->noticenos,
i2d_ASN1_INTEGER);
M_ASN1_I2D_seq_total(); M_ASN1_I2D_seq_total();
M_ASN1_I2D_put (a->organization, i2d_DISPLAYTEXT); M_ASN1_I2D_put (a->organization, i2d_DISPLAYTEXT);
M_ASN1_I2D_put_SEQUENCE(a->noticenos, i2d_ASN1_INTEGER); M_ASN1_I2D_put_SEQUENCE_type(ASN1_INTEGER, a->noticenos,
i2d_ASN1_INTEGER);
M_ASN1_I2D_finish(); M_ASN1_I2D_finish();
} }
@ -639,7 +643,8 @@ NOTICEREF *d2i_NOTICEREF(NOTICEREF **a, unsigned char **pp,long length)
if(!ret->organization) { if(!ret->organization) {
M_ASN1_D2I_get(ret->organization, d2i_DISPLAYTEXT); M_ASN1_D2I_get(ret->organization, d2i_DISPLAYTEXT);
} }
M_ASN1_D2I_get_seq(ret->noticenos, d2i_ASN1_INTEGER, ASN1_STRING_free); M_ASN1_D2I_get_seq_type(ASN1_INTEGER, ret->noticenos, d2i_ASN1_INTEGER,
ASN1_STRING_free);
M_ASN1_D2I_Finish(a, NOTICEREF_free, ASN1_F_D2I_NOTICEREF); M_ASN1_D2I_Finish(a, NOTICEREF_free, ASN1_F_D2I_NOTICEREF);
} }
@ -647,7 +652,7 @@ void NOTICEREF_free(NOTICEREF *a)
{ {
if (a == NULL) return; if (a == NULL) return;
M_DISPLAYTEXT_free(a->organization); M_DISPLAYTEXT_free(a->organization);
sk_pop_free(a->noticenos, (void(*)(void *)) ASN1_STRING_free); sk_ASN1_INTEGER_pop_free(a->noticenos, ASN1_STRING_free);
Free (a); Free (a);
} }

View File

@ -227,7 +227,7 @@ typedef struct SXNET_st {
typedef struct NOTICEREF_st { typedef struct NOTICEREF_st {
ASN1_STRING *organization; ASN1_STRING *organization;
STACK *noticenos; STACK_OF(ASN1_INTEGER) *noticenos;
} NOTICEREF; } NOTICEREF;
typedef struct USERNOTICE_st { typedef struct USERNOTICE_st {