diff --git a/lib/asn1/asn1-common.h b/lib/asn1/asn1-common.h index 41e20d1b1..4c6af8b45 100644 --- a/lib/asn1/asn1-common.h +++ b/lib/asn1/asn1-common.h @@ -32,6 +32,7 @@ typedef struct heim_universal_string { uint32_t *data; } heim_universal_string; +typedef char *heim_visible_string; typedef struct heim_oid { size_t length; diff --git a/lib/asn1/asn1_print.c b/lib/asn1/asn1_print.c index 8b9f0a8a4..3828be0f4 100644 --- a/lib/asn1/asn1_print.c +++ b/lib/asn1/asn1_print.c @@ -180,7 +180,9 @@ loop (unsigned char *buf, size_t len, int indent) break; } case UT_GeneralizedTime : - case UT_GeneralString : { + case UT_GeneralString : + case UT_PrintableString : + case UT_VisibleString : { heim_general_string str; ret = der_get_general_string (buf, length, &str, NULL); diff --git a/lib/asn1/der_copy.c b/lib/asn1/der_copy.c index 10f945fda..ba1aa36c0 100644 --- a/lib/asn1/der_copy.c +++ b/lib/asn1/der_copy.c @@ -88,6 +88,13 @@ der_copy_universal_string (const heim_universal_string *from, return 0; } +int +der_copy_visible_string (const heim_visible_string *from, + heim_visible_string *to) +{ + return der_copy_general_string(from, to); +} + int der_copy_octet_string (const heim_octet_string *from, heim_octet_string *to) { diff --git a/lib/asn1/der_free.c b/lib/asn1/der_free.c index c144061e3..8658dc7d1 100644 --- a/lib/asn1/der_free.c +++ b/lib/asn1/der_free.c @@ -79,6 +79,13 @@ der_free_universal_string (heim_universal_string *k) k->length = 0; } +void +der_free_visible_string (heim_visible_string *str) +{ + free(*str); + *str = NULL; +} + void der_free_octet_string (heim_octet_string *k) { diff --git a/lib/asn1/der_get.c b/lib/asn1/der_get.c index c6a7567eb..1dbaa6919 100644 --- a/lib/asn1/der_get.c +++ b/lib/asn1/der_get.c @@ -214,6 +214,13 @@ der_get_universal_string (const unsigned char *p, size_t len, return 0; } +int +der_get_visible_string (const unsigned char *p, size_t len, + heim_visible_string *str, size_t *size) +{ + return der_get_general_string(p, len, str, size); +} + int der_get_octet_string (const unsigned char *p, size_t len, heim_octet_string *data, size_t *size) diff --git a/lib/asn1/der_length.c b/lib/asn1/der_length.c index 0603c9c38..f0091bd50 100644 --- a/lib/asn1/der_length.c +++ b/lib/asn1/der_length.c @@ -166,6 +166,12 @@ der_length_universal_string (const heim_universal_string *data) return data->length * 4; } +size_t +der_length_visible_string (const heim_visible_string *data) +{ + return strlen(*data); +} + size_t der_length_octet_string (const heim_octet_string *k) { diff --git a/lib/asn1/der_put.c b/lib/asn1/der_put.c index 16af8f161..54fc0cb5f 100644 --- a/lib/asn1/der_put.c +++ b/lib/asn1/der_put.c @@ -230,6 +230,13 @@ der_put_universal_string (unsigned char *p, size_t len, return 0; } +int +der_put_visible_string (unsigned char *p, size_t len, + const heim_visible_string *str, size_t *size) +{ + return der_put_general_string(p, len, str, size); +} + int der_put_octet_string (unsigned char *p, size_t len, const heim_octet_string *data, size_t *size) diff --git a/lib/asn1/gen.c b/lib/asn1/gen.c index 7c7dcf4e8..3fd4ffc64 100644 --- a/lib/asn1/gen.c +++ b/lib/asn1/gen.c @@ -135,6 +135,9 @@ init_generate (const char *filename, const char *base) " size_t length;\n" " uint32_t *data;\n" "} heim_universal_string;\n\n"); + fprintf (headerfile, + "typedef char *heim_visible_string;\n\n" + ); fprintf (headerfile, "typedef struct heim_oid {\n" " size_t length;\n" @@ -504,6 +507,10 @@ define_asn1 (int level, Type *t) space(level); fprintf (headerfile, "UniversalString"); break; + case TVisibleString: + space(level); + fprintf (headerfile, "VisibleString"); + break; case TOID : space(level); fprintf(headerfile, "OBJECT IDENTIFIER"); @@ -736,6 +743,10 @@ define_type (int level, const char *name, Type *t, int typedefp, int preservep) space(level); fprintf (headerfile, "heim_universal_string %s;\n", name); break; + case TVisibleString: + space(level); + fprintf (headerfile, "heim_visible_string %s;\n", name); + break; case TOID : space(level); fprintf (headerfile, "heim_oid %s;\n", name); diff --git a/lib/asn1/gen_copy.c b/lib/asn1/gen_copy.c index d8a1f1b9d..8d41e704c 100644 --- a/lib/asn1/gen_copy.c +++ b/lib/asn1/gen_copy.c @@ -202,6 +202,9 @@ copy_type (const char *from, const char *to, const Type *t, int preserve) case TUniversalString: copy_primitive ("universal_string", from, to); break; + case TVisibleString: + copy_primitive ("visible_string", from, to); + break; case TTag: copy_type (from, to, t->subtype, preserve); break; diff --git a/lib/asn1/gen_decode.c b/lib/asn1/gen_decode.c index 05d3c5e12..c13e0e532 100644 --- a/lib/asn1/gen_decode.c +++ b/lib/asn1/gen_decode.c @@ -74,6 +74,7 @@ is_primitive_type(int type) case TIA5String: case TBMPString: case TUniversalString: + case TVisibleString: case TNull: return 1; default: @@ -191,6 +192,11 @@ find_tag (const Type *t, *ty = PRIM; *tag = UT_UniversalString; break; + case TVisibleString: + *cl = ASN1_C_UNIV; + *ty = PRIM; + *tag = UT_VisibleString; + break; default: abort(); } @@ -580,6 +586,9 @@ decode_type (const char *name, const Type *t, int optional, case TUniversalString: decode_primitive ("universal_string", name, forwstr); break; + case TVisibleString: + decode_primitive ("visible_string", name, forwstr); + break; case TNull: fprintf (codefile, "/* NULL */\n"); break; @@ -620,6 +629,7 @@ generate_type_decode (const Symbol *s) case TIA5String: case TBMPString: case TUniversalString: + case TVisibleString: case TUTCTime: case TNull: case TEnumerated: diff --git a/lib/asn1/gen_encode.c b/lib/asn1/gen_encode.c index 73645b8df..5cc917bea 100644 --- a/lib/asn1/gen_encode.c +++ b/lib/asn1/gen_encode.c @@ -467,6 +467,10 @@ encode_type (const char *name, const Type *t, const char *tmpstr) encode_primitive ("universal_string", name); constructed = 0; break; + case TVisibleString: + encode_primitive ("visible_string", name); + constructed = 0; + break; case TNull: fprintf (codefile, "/* NULL */\n"); constructed = 0; @@ -503,6 +507,7 @@ generate_type_encode (const Symbol *s) case TIA5String: case TBMPString: case TUniversalString: + case TVisibleString: case TNull: case TBitString: case TEnumerated: diff --git a/lib/asn1/gen_free.c b/lib/asn1/gen_free.c index 78004c4e8..1cec79a91 100644 --- a/lib/asn1/gen_free.c +++ b/lib/asn1/gen_free.c @@ -160,6 +160,9 @@ free_type (const char *name, const Type *t, int preserve) case TUniversalString: free_primitive ("universal_string", name); break; + case TVisibleString: + free_primitive ("visible_string", name); + break; case TTag: free_type (name, t->subtype, preserve); break; diff --git a/lib/asn1/gen_length.c b/lib/asn1/gen_length.c index 8e04ea821..cb57d7fc1 100644 --- a/lib/asn1/gen_length.c +++ b/lib/asn1/gen_length.c @@ -238,6 +238,9 @@ length_type (const char *name, const Type *t, case TUniversalString: length_primitive ("universal_string", name, variable); break; + case TVisibleString: + length_primitive ("visible_string", name, variable); + break; case TNull: fprintf (codefile, "/* NULL */\n"); break; diff --git a/lib/asn1/parse.y b/lib/asn1/parse.y index 004a87248..b05192dc5 100644 --- a/lib/asn1/parse.y +++ b/lib/asn1/parse.y @@ -659,6 +659,11 @@ RestrictedCharactedStringType: kw_GeneralString $$ = new_tag(ASN1_C_UNIV, UT_PrintableString, TE_EXPLICIT, new_type(TPrintableString)); } + | kw_VisibleString + { + $$ = new_tag(ASN1_C_UNIV, UT_VisibleString, + TE_EXPLICIT, new_type(TVisibleString)); + } | kw_IA5String { $$ = new_tag(ASN1_C_UNIV, UT_IA5String, diff --git a/lib/asn1/symbol.h b/lib/asn1/symbol.h index c856cb839..8282e700b 100644 --- a/lib/asn1/symbol.h +++ b/lib/asn1/symbol.h @@ -60,7 +60,8 @@ enum typetype { TUTCTime, TUTF8String, TBMPString, - TUniversalString + TUniversalString, + TVisibleString }; typedef enum typetype Typetype;