-= 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:
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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;
|
||||||
|
@@ -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");
|
||||||
|
@@ -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); }
|
||||||
%%
|
%%
|
||||||
|
@@ -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); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user