X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=crypto%2Fx509v3%2Fv3_genn.c;h=bd126033ac87e80cd6e825e81cbc5aacee93e93d;hb=ea5e7bcf632bba51618ab9407409b24cc4df8fa0;hp=af716232f8bb0fc038fa7d6eefc8d950f17c7502;hpb=a9be3af5ad4836f7e50f0546311ca90c717b861e;p=oweals%2Fopenssl.git diff --git a/crypto/x509v3/v3_genn.c b/crypto/x509v3/v3_genn.c index af716232f8..bd126033ac 100644 --- a/crypto/x509v3/v3_genn.c +++ b/crypto/x509v3/v3_genn.c @@ -88,12 +88,15 @@ int i2d_GENERAL_NAME(GENERAL_NAME *a, unsigned char **pp) switch(a->type) { - case GEN_OTHERNAME: case GEN_X400: case GEN_EDIPARTY: ret = i2d_ASN1_TYPE(a->d.other, pp); break; + case GEN_OTHERNAME: + ret = i2d_OTHERNAME(a->d.otherName, pp); + break; + case GEN_EMAIL: case GEN_DNS: case GEN_URI: @@ -137,12 +140,15 @@ GENERAL_NAME *d2i_GENERAL_NAME(GENERAL_NAME **a, unsigned char **pp, switch(ret->type) { /* Just put these in a "blob" for now */ - case GEN_OTHERNAME: case GEN_X400: case GEN_EDIPARTY: M_ASN1_D2I_get_imp(ret->d.other, d2i_ASN1_TYPE,V_ASN1_SEQUENCE); break; + case GEN_OTHERNAME: + M_ASN1_D2I_get_imp(ret->d.otherName, d2i_OTHERNAME,V_ASN1_SEQUENCE); + break; + case GEN_EMAIL: case GEN_DNS: case GEN_URI: @@ -176,17 +182,20 @@ void GENERAL_NAME_free(GENERAL_NAME *a) { if (a == NULL) return; switch(a->type) { - case GEN_OTHERNAME: case GEN_X400: case GEN_EDIPARTY: ASN1_TYPE_free(a->d.other); break; + case GEN_OTHERNAME: + OTHERNAME_free(a->d.otherName); + break; + case GEN_EMAIL: case GEN_DNS: case GEN_URI: - ASN1_IA5STRING_free(a->d.ia5); + M_ASN1_IA5STRING_free(a->d.ia5); break; case GEN_DIRNAME: @@ -194,7 +203,7 @@ void GENERAL_NAME_free(GENERAL_NAME *a) break; case GEN_IPADD: - ASN1_OCTET_STRING_free(a->d.ip); + M_ASN1_OCTET_STRING_free(a->d.ip); break; case GEN_RID: @@ -205,8 +214,8 @@ void GENERAL_NAME_free(GENERAL_NAME *a) Free ((char *)a); } -/* Now the GeneralNames versions: a SEQUENCE OF GeneralName These are needed as - * an explicit functions. +/* Now the GeneralNames versions: a SEQUENCE OF GeneralName. These are needed as + * explicit functions. */ STACK_OF(GENERAL_NAME) *GENERAL_NAMES_new() @@ -235,3 +244,48 @@ return i2d_ASN1_SET_OF_GENERAL_NAME(a, pp, i2d_GENERAL_NAME, V_ASN1_SEQUENCE, IMPLEMENT_STACK_OF(GENERAL_NAME) IMPLEMENT_ASN1_SET_OF(GENERAL_NAME) +int i2d_OTHERNAME(OTHERNAME *a, unsigned char **pp) +{ + int v = 0; + M_ASN1_I2D_vars(a); + + M_ASN1_I2D_len(a->type_id, i2d_ASN1_OBJECT); + M_ASN1_I2D_len_EXP_opt(a->value, i2d_ASN1_TYPE, 0, v); + + M_ASN1_I2D_seq_total(); + + M_ASN1_I2D_put(a->type_id, i2d_ASN1_OBJECT); + M_ASN1_I2D_put_EXP_opt(a->value, i2d_ASN1_TYPE, 0, v); + + M_ASN1_I2D_finish(); +} + +OTHERNAME *OTHERNAME_new(void) +{ + OTHERNAME *ret=NULL; + ASN1_CTX c; + M_ASN1_New_Malloc(ret, OTHERNAME); + ret->type_id = OBJ_nid2obj(NID_undef); + M_ASN1_New(ret->value, ASN1_TYPE_new); + return (ret); + M_ASN1_New_Error(ASN1_F_OTHERNAME_NEW); +} + +OTHERNAME *d2i_OTHERNAME(OTHERNAME **a, unsigned char **pp, long length) +{ + M_ASN1_D2I_vars(a,OTHERNAME *,OTHERNAME_new); + M_ASN1_D2I_Init(); + M_ASN1_D2I_start_sequence(); + M_ASN1_D2I_get(ret->type_id, d2i_ASN1_OBJECT); + M_ASN1_D2I_get_EXP_opt(ret->value, d2i_ASN1_TYPE, 0); + M_ASN1_D2I_Finish(a, OTHERNAME_free, ASN1_F_D2I_OTHERNAME); +} + +void OTHERNAME_free(OTHERNAME *a) +{ + if (a == NULL) return; + ASN1_OBJECT_free(a->type_id); + ASN1_TYPE_free(a->value); + Free ((char *)a); +} +