-= add parser/generate glue for UTF8String and NULL

(DER primitive encode/decode functions missing)
- handle parsing of DEFAULT and, ...


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12311 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2003-05-20 18:42:10 +00:00
parent 37502b25c3
commit bd85856ef6
11 changed files with 106 additions and 10 deletions

View File

@@ -12,6 +12,7 @@ typedef struct octet_string {
} octet_string; } octet_string;
typedef char *general_string; typedef char *general_string;
typedef char *utf8_string;
typedef struct oid { typedef struct oid {
size_t length; size_t length;

View File

@@ -52,6 +52,7 @@ enum {
UT_Null = 5, UT_Null = 5,
UT_OID = 6, UT_OID = 6,
UT_Enumerated = 10, UT_Enumerated = 10,
UT_UTF8String = 12,
UT_Sequence = 16, UT_Sequence = 16,
UT_Set = 17, UT_Set = 17,
UT_PrintableString = 19, UT_PrintableString = 19,
@@ -99,6 +100,8 @@ int decode_oid (const unsigned char *p, size_t len,
oid *k, size_t *size); oid *k, size_t *size);
int decode_octet_string (const unsigned char*, size_t, octet_string*, size_t*); int decode_octet_string (const unsigned char*, size_t, octet_string*, size_t*);
int decode_generalized_time (const unsigned char*, size_t, time_t*, size_t*); int decode_generalized_time (const unsigned char*, size_t, time_t*, size_t*);
int decode_nulltype (const unsigned char*, size_t, size_t*);
int decode_utf8string (const unsigned char*, size_t, utf8_string*, size_t*);
int der_put_int (unsigned char *p, size_t len, int val, size_t*); int der_put_int (unsigned char *p, size_t len, int val, size_t*);
int der_put_length (unsigned char *p, size_t len, size_t val, size_t*); int der_put_length (unsigned char *p, size_t len, size_t val, size_t*);
@@ -127,12 +130,15 @@ int encode_oid (unsigned char *p, size_t len,
const oid *k, size_t*); const oid *k, size_t*);
int encode_generalized_time (unsigned char *p, size_t len, int encode_generalized_time (unsigned char *p, size_t len,
const time_t *t, size_t*); const time_t *t, size_t*);
int encode_nulltype (unsigned char*, size_t, size_t*);
int encode_utf8string (unsigned char*, size_t, utf8_string*, size_t*);
void free_integer (int *num); void free_integer (int *num);
void free_general_string (general_string *str); void free_general_string (general_string *str);
void free_octet_string (octet_string *k); void free_octet_string (octet_string *k);
void free_oid (oid *k); void free_oid (oid *k);
void free_generalized_time (time_t *t); void free_generalized_time (time_t *t);
void free_utf8string (utf8_string*);
size_t length_len (size_t len); size_t length_len (size_t len);
size_t length_integer (const int *data); size_t length_integer (const int *data);
@@ -142,10 +148,14 @@ size_t length_general_string (const general_string *data);
size_t length_octet_string (const octet_string *k); size_t length_octet_string (const octet_string *k);
size_t length_oid (const oid *k); size_t length_oid (const oid *k);
size_t length_generalized_time (const time_t *t); size_t length_generalized_time (const time_t *t);
size_t length_nulltype (void);
size_t length_utf8string (const utf8_string*);
int copy_general_string (const general_string *from, general_string *to); int copy_general_string (const general_string *from, general_string *to);
int copy_octet_string (const octet_string *from, octet_string *to); int copy_octet_string (const octet_string *from, octet_string *to);
int copy_oid (const oid *from, oid *to); int copy_oid (const oid *from, oid *to);
int copy_nulltype (void *, void *);
int copy_utf8string (const utf8_string*, utf8_string*);
int fix_dce(size_t reallen, size_t *len); int fix_dce(size_t reallen, size_t *len);

View File

@@ -104,6 +104,9 @@ init_generate (const char *filename, const char *base)
fprintf (headerfile, fprintf (headerfile,
"typedef char *general_string;\n\n" "typedef char *general_string;\n\n"
); );
fprintf (headerfile,
"typedef char *utf8_string;\n\n"
);
fprintf (headerfile, fprintf (headerfile,
"typedef struct oid {\n" "typedef struct oid {\n"
" size_t length;\n" " size_t length;\n"
@@ -267,6 +270,14 @@ define_asn1 (int level, Type *t)
fprintf (headerfile, "[APPLICATION %d] ", t->application); fprintf (headerfile, "[APPLICATION %d] ", t->application);
define_asn1 (level, t->subtype); define_asn1 (level, t->subtype);
break; break;
case TUTF8String:
space(level);
fprintf (headerfile, "UTF8String");
break;
case TNull:
space(level);
fprintf (headerfile, "NULL");
break;
default: default:
abort (); abort ();
} }
@@ -392,6 +403,14 @@ define_type (int level, char *name, Type *t, int typedefp)
space(level); space(level);
fprintf (headerfile, "general_string %s;\n", name); fprintf (headerfile, "general_string %s;\n", name);
break; break;
case TUTF8String:
space(level);
fprintf (headerfile, "UTF8String %s;\n", name);
break;
case TNull:
space(level);
fprintf (headerfile, "NULL %s;\n", name);
break;
case TApplication: case TApplication:
define_type (level, name, t->subtype, FALSE); define_type (level, name, t->subtype, FALSE);
break; break;

View File

@@ -125,6 +125,11 @@ copy_type (const char *from, const char *to, const Type *t)
case TGeneralString: case TGeneralString:
copy_primitive ("general_string", from, to); copy_primitive ("general_string", from, to);
break; break;
case TUTF8String:
copy_primitive ("utf8string", from, to);
break;
case TNull:
break;
case TApplication: case TApplication:
copy_type (from, to, t->subtype); copy_type (from, to, t->subtype);
break; break;

View File

@@ -253,6 +253,14 @@ decode_type (const char *name, const Type *t)
case TGeneralString: case TGeneralString:
decode_primitive ("general_string", name); decode_primitive ("general_string", name);
break; break;
case TUTF8String:
decode_primitive ("utf8string", name);
break;
case TNull:
fprintf (codefile,
"e = decode_nulltype(p, len, &l);\n"
"FORW;\n");
break;
case TApplication: case TApplication:
fprintf (codefile, fprintf (codefile,
"e = der_match_tag_and_length (p, len, APPL, CONS, %d, " "e = der_match_tag_and_length (p, len, APPL, CONS, %d, "
@@ -306,6 +314,9 @@ generate_type_decode (const Symbol *s)
case TOID: case TOID:
case TGeneralizedTime: case TGeneralizedTime:
case TGeneralString: case TGeneralString:
case TUTF8String:
case TNull:
case TEnumerated:
case TBitString: case TBitString:
case TSequence: case TSequence:
case TSequenceOf: case TSequenceOf:

View File

@@ -205,6 +205,14 @@ encode_type (const char *name, const Type *t)
case TGeneralString: case TGeneralString:
encode_primitive ("general_string", name); encode_primitive ("general_string", name);
break; break;
case TUTF8String:
encode_primitive ("utf8string", name);
break;
case TNull:
fprintf (codefile,
"e = encode_nulltype(p, len, &l);\n"
"BACK;\n");
break;
case TApplication: case TApplication:
encode_type (name, t->subtype); encode_type (name, t->subtype);
fprintf (codefile, fprintf (codefile,
@@ -240,6 +248,8 @@ generate_type_encode (const Symbol *s)
case TOctetString: case TOctetString:
case TGeneralizedTime: case TGeneralizedTime:
case TGeneralString: case TGeneralString:
case TUTF8String:
case TNull:
case TBitString: case TBitString:
case TEnumerated: case TEnumerated:
case TOID: case TOID:

View File

@@ -109,6 +109,11 @@ free_type (const char *name, const Type *t)
case TGeneralString: case TGeneralString:
free_primitive ("general_string", name); free_primitive ("general_string", name);
break; break;
case TUTF8String:
free_primitive ("utf8string", name);
break;
case TNull:
break;
case TApplication: case TApplication:
free_type (name, t->subtype); free_type (name, t->subtype);
break; break;

View File

@@ -142,6 +142,12 @@ length_type (const char *name, const Type *t, const char *variable)
case TGeneralString: case TGeneralString:
length_primitive ("general_string", name, variable); length_primitive ("general_string", name, variable);
break; break;
case TUTF8String:
length_primitive ("utf8string", name, variable);
break;
case TNull:
fprintf (codefile, "%s += length_nulltype();\n", variable);
break;
case TApplication: case TApplication:
length_type (name, t->subtype, variable); length_type (name, t->subtype, variable);
fprintf (codefile, "ret += 1 + length_len (ret);\n"); fprintf (codefile, "ret += 1 + length_len (ret);\n");

View File

@@ -69,17 +69,20 @@ OCTET { return OCTET; }
STRING { return STRING; } STRING { return STRING; }
GeneralizedTime { return GeneralizedTime; } GeneralizedTime { return GeneralizedTime; }
GeneralString { return GeneralString; } GeneralString { return GeneralString; }
UTF8String { return UTF8String; }
NULL { return NULLTYPE; }
BIT { return BIT; } BIT { return BIT; }
APPLICATION { return APPLICATION; } APPLICATION { return APPLICATION; }
OPTIONAL { return OPTIONAL; } OPTIONAL { return OPTIONAL; }
BEGIN { return TBEGIN; } BEGIN { return TBEGIN; }
END { return END; } END { return END; }
DEFAULT { return DEFAULT; }
DEFINITIONS { return DEFINITIONS; } DEFINITIONS { return DEFINITIONS; }
ENUMERATED { return ENUMERATED; } ENUMERATED { return ENUMERATED; }
EXTERNAL { return EXTERNAL; } EXTERNAL { return EXTERNAL; }
OBJECT { return OBJECT; } OBJECT { return OBJECT; }
IDENTIFIER { return IDENTIFIER; } IDENTIFIER { return IDENTIFIER; }
[,;{}()|] { return *yytext; } [,;{}()|\"] { return *yytext; }
"[" { return *yytext; } "[" { return *yytext; }
"]" { return *yytext; } "]" { return *yytext; }
::= { return EEQUAL; } ::= { return EEQUAL; }
@@ -98,6 +101,7 @@ IDENTIFIER { return IDENTIFIER; }
} }
[ \t] ; [ \t] ;
\n { ++lineno; } \n { ++lineno; }
\.\.\. { return DOTDOTDOT; }
\.\. { return DOTDOT; } \.\. { return DOTDOT; }
. { error_message("Ignoring char(%c)\n", *yytext); } . { error_message("Ignoring char(%c)\n", *yytext); }
%% %%

View File

@@ -58,12 +58,14 @@ static void append (Member *l, Member *r);
char *name; char *name;
Type *type; Type *type;
Member *member; Member *member;
char *defval;
} }
%token INTEGER SEQUENCE OF OCTET STRING GeneralizedTime GeneralString %token INTEGER SEQUENCE OF OCTET STRING GeneralizedTime GeneralString
%token BIT APPLICATION OPTIONAL EEQUAL TBEGIN END DEFINITIONS ENUMERATED %token BIT APPLICATION OPTIONAL EEQUAL TBEGIN END DEFINITIONS ENUMERATED
%token EXTERNAL %token UTF8String NULLTYPE
%token DOTDOT %token EXTERNAL DEFAULT
%token DOTDOT DOTDOTDOT
%token IMPORTS FROM %token IMPORTS FROM
%token OBJECT IDENTIFIER %token OBJECT IDENTIFIER
%token <name> IDENT %token <name> IDENT
@@ -71,7 +73,9 @@ static void append (Member *l, Member *r);
%type <constant> constant optional2 %type <constant> constant optional2
%type <type> type %type <type> type
%type <member> memberdecls memberdecl bitdecls bitdecl %type <member> memberdecls memberdecl memberdeclstart bitdecls bitdecl
%type <defval> defvalue
%start envelope %start envelope
@@ -145,6 +149,8 @@ type : INTEGER { $$ = new_type(TInteger); }
} }
| OCTET STRING { $$ = new_type(TOctetString); } | OCTET STRING { $$ = new_type(TOctetString); }
| GeneralString { $$ = new_type(TGeneralString); } | GeneralString { $$ = new_type(TGeneralString); }
| UTF8String { $$ = new_type(TUTF8String); }
| NULLTYPE { $$ = new_type(TNull); }
| GeneralizedTime { $$ = new_type(TGeneralizedTime); } | GeneralizedTime { $$ = new_type(TGeneralizedTime); }
| SEQUENCE OF type | SEQUENCE OF type
{ {
@@ -180,28 +186,46 @@ type : INTEGER { $$ = new_type(TInteger); }
memberdecls : { $$ = NULL; } memberdecls : { $$ = NULL; }
| memberdecl { $$ = $1; } | memberdecl { $$ = $1; }
| memberdecls ',' DOTDOTDOT { $$ = $1; }
| memberdecls ',' memberdecl { $$ = $1; append($$, $3); } | memberdecls ',' memberdecl { $$ = $1; append($$, $3); }
; ;
memberdecl : IDENT '[' constant ']' type optional2 memberdeclstart : IDENT '[' constant ']' type
{ {
$$ = malloc(sizeof(*$$)); $$ = malloc(sizeof(*$$));
$$->name = $1; $$->name = $1;
$$->gen_name = strdup($1); $$->gen_name = strdup($1);
output_name ($$->gen_name); output_name ($$->gen_name);
$$->val = $3; $$->val = $3;
$$->optional = $6; $$->optional = 0;
$$->defval = NULL;
$$->type = $5; $$->type = $5;
$$->next = $$->prev = $$; $$->next = $$->prev = $$;
} }
; ;
optional2 : { $$ = 0; }
| OPTIONAL { $$ = 1; } memberdecl : memberdeclstart optional2
{ $1->optional = $2 ; $$ = $1; }
| memberdeclstart defvalue
{ $1->defval = $2 ; $$ = $1; }
| memberdeclstart
{ $$ = $1; }
;
optional2 : OPTIONAL { $$ = 1; }
;
defvalue : DEFAULT constant
{ asprintf(&$$, "%d", $2); }
| DEFAULT '"' IDENT '"'
{ $$ = strdup ($3); }
; ;
bitdecls : { $$ = NULL; } bitdecls : { $$ = NULL; }
| bitdecl { $$ = $1; } | bitdecl { $$ = $1; }
| bitdecls ',' DOTDOTDOT { $$ = $1; }
| bitdecls ',' bitdecl { $$ = $1; append($$, $3); } | bitdecls ',' bitdecl { $$ = $1; append($$, $3); }
; ;

View File

@@ -38,7 +38,7 @@
enum typetype { TInteger, TOctetString, TBitString, TSequence, TSequenceOf, enum typetype { TInteger, TOctetString, TBitString, TSequence, TSequenceOf,
TGeneralizedTime, TGeneralString, TApplication, TType, TGeneralizedTime, TGeneralString, TApplication, TType,
TUInteger, TEnumerated, TOID }; TUInteger, TEnumerated, TOID, TUTF8String, TNull, TChoice };
typedef enum typetype Typetype; typedef enum typetype Typetype;
@@ -51,6 +51,7 @@ struct member {
int optional; int optional;
struct type *type; struct type *type;
struct member *next, *prev; struct member *next, *prev;
char *defval;
}; };
typedef struct member Member; typedef struct member Member;