add ENUMERATED and OBJECT IDENTIFIER

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10741 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
2001-09-25 13:39:27 +00:00
parent 680399419e
commit 2bcae56ac3
18 changed files with 323 additions and 26 deletions

View File

@@ -13,4 +13,9 @@ typedef struct octet_string {
typedef char *general_string;
typedef struct oid {
size_t length;
unsigned *components;
} oid;
#endif

View File

@@ -45,11 +45,13 @@ typedef enum {PRIM = 0, CONS = 1} Der_type;
/* Universal tags */
enum {
UT_Integer = 2,
UT_Boolean = 1,
UT_Integer = 2,
UT_BitString = 3,
UT_OctetString = 4,
UT_Null = 5,
UT_ObjID = 6,
UT_OID = 6,
UT_Enumerated = 10,
UT_Sequence = 16,
UT_Set = 17,
UT_PrintableString = 19,
@@ -75,6 +77,8 @@ int der_get_general_string (const unsigned char *p, size_t len,
general_string *str, size_t *size);
int der_get_octet_string (const unsigned char *p, size_t len,
octet_string *data, size_t *size);
int der_get_oid (const unsigned char *p, size_t len,
oid *data, size_t *size);
int der_get_tag (const unsigned char *p, size_t len,
Der_class *class, Der_type *type,
int *tag, size_t *size);
@@ -88,6 +92,7 @@ int der_match_tag_and_length (const unsigned char *p, size_t len,
int decode_integer (const unsigned char*, size_t, int*, size_t*);
int decode_unsigned (const unsigned char*, size_t, unsigned*, size_t*);
int decode_enumerated (const unsigned char*, size_t, unsigned*, size_t*);
int decode_general_string (const unsigned char*, size_t,
general_string*, size_t*);
int decode_octet_string (const unsigned char*, size_t, octet_string*, size_t*);
@@ -99,6 +104,8 @@ int der_put_general_string (unsigned char *p, size_t len,
const general_string *str, size_t*);
int der_put_octet_string (unsigned char *p, size_t len,
const octet_string *data, size_t*);
int der_put_oid (unsigned char *p, size_t len,
const oid *data, size_t *size);
int der_put_tag (unsigned char *p, size_t len, Der_class class, Der_type type,
int tag, size_t*);
int der_put_length_and_tag (unsigned char*, size_t, size_t,
@@ -108,29 +115,35 @@ int encode_integer (unsigned char *p, size_t len,
const int *data, size_t*);
int encode_unsigned (unsigned char *p, size_t len,
const unsigned *data, size_t*);
int encode_enumerated (unsigned char *p, size_t len,
const unsigned *data, size_t*);
int encode_general_string (unsigned char *p, size_t len,
const general_string *data, size_t*);
int encode_octet_string (unsigned char *p, size_t len,
const octet_string *k, size_t*);
int encode_oid (unsigned char *p, size_t len,
const oid *k, size_t*);
int encode_generalized_time (unsigned char *p, size_t len,
const time_t *t, size_t*);
void free_integer (int *num);
void free_general_string (general_string *str);
void free_octet_string (octet_string *k);
void free_oid (oid *k);
void free_generalized_time (time_t *t);
size_t length_len (size_t len);
size_t length_integer (const int *data);
size_t length_unsigned (const unsigned *data);
size_t length_enumerated (const unsigned *data);
size_t length_general_string (const general_string *data);
size_t length_octet_string (const octet_string *k);
size_t length_generalized_time (const time_t *t);
int copy_general_string (const general_string *from, general_string *to);
int copy_octet_string (const octet_string *from, octet_string *to);
int copy_oid (const oid *from, oid *to);
int fix_dce(size_t reallen, size_t *len);
#endif /* __DER_H__ */

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -55,3 +55,14 @@ copy_octet_string (const octet_string *from, octet_string *to)
memcpy(to->data, from->data, to->length);
return 0;
}
int
copy_oid (const oid *from, oid *to)
{
to->length = from->length;
to->components = malloc(to->length * sizeof(*to->components));
if (to->length != 0 && to->components == NULL)
return ENOMEM;
memcpy(to->components, from->components, to->length);
return 0;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -46,3 +46,9 @@ free_octet_string (octet_string *k)
{
free(k->data);
}
void
free_oid (oid *k)
{
free(k->components);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -138,6 +138,38 @@ der_get_octet_string (const unsigned char *p, size_t len,
return 0;
}
int
der_get_oid (const unsigned char *p, size_t len,
oid *data, size_t *size)
{
int n;
if (len < 1)
return ASN1_OVERRUN;
data->components = malloc(len * sizeof(*data->components));
if (data->components == NULL && len != 0)
return ENOMEM;
data->components[0] = (*p) / 40;
data->components[1] = (*p) % 40;
--len;
++p;
for (n = 2; len > 0; ++n) {
unsigned u = 0;
do {
--len;
u = u * 128 + (*p % 128);
} while (len > 0 && p[-1] & 0x80);
data->components[n] = u;
}
if (p[-1] & 0x80) {
free_oid (data);
return ASN1_OVERRUN;
}
return 0;
}
int
der_get_tag (const unsigned char *p, size_t len,
Der_class *class, Der_type *type,
@@ -251,6 +283,33 @@ decode_unsigned (const unsigned char *p, size_t len,
return 0;
}
int
decode_enumerated (const unsigned char *p, size_t len,
unsigned *num, size_t *size)
{
size_t ret = 0;
size_t l, reallen;
int e;
e = der_match_tag (p, len, UNIV, PRIM, UT_Enumerated, &l);
if (e) return e;
p += l;
len -= l;
ret += l;
e = der_get_length (p, len, &reallen, &l);
if (e) return e;
p += l;
len -= l;
ret += l;
e = der_get_int (p, reallen, num, &l);
if (e) return e;
p += l;
len -= l;
ret += l;
if(size) *size = ret;
return 0;
}
int
decode_general_string (const unsigned char *p, size_t len,
general_string *str, size_t *size)

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -67,6 +67,25 @@ len_int (int val)
return ret;
}
static size_t
len_oid (const oid *oid)
{
size_t ret = 1;
int n;
for (n = 2; n < oid->length; ++n) {
unsigned u = oid->components[n];
++ret;
u /= 128;
while (u > 0) {
++ret;
u /= 128;
}
}
return ret;
}
size_t
length_len (size_t len)
{
@@ -92,6 +111,14 @@ length_unsigned (const unsigned *data)
return 1 + length_len(len) + len;
}
size_t
length_enumerated (const unsigned *data)
{
size_t len = len_int (*data);
return 1 + length_len(len) + len;
}
size_t
length_general_string (const general_string *data)
{
@@ -106,6 +133,14 @@ length_octet_string (const octet_string *k)
return 1 + length_len(k->length) + k->length;
}
size_t
length_oid (const oid *k)
{
size_t len = len_oid (k);
return 1 + length_len(len) + len;
}
size_t
length_generalized_time (const time_t *t)
{

View File

@@ -159,6 +159,36 @@ der_put_octet_string (unsigned char *p, size_t len,
return 0;
}
int
der_put_oid (unsigned char *p, size_t len,
const oid *data, size_t *size)
{
unsigned char *base = p;
int n;
for (n = data->length - 1; n >= 2; --n) {
unsigned u = data->components[n];
if (len < 1)
return ASN1_OVERFLOW;
*p-- = u % 128;
u /= 128;
--len;
while (u > 0) {
if (len < 1)
return ASN1_OVERFLOW;
*p-- = 128 + u % 128;
u /= 128;
--len;
}
}
if (len < 1)
return ASN1_OVERFLOW;
*p-- = 40 * data->components[0] + data->components[1];
*size = base - p;
return 0;
}
int
der_put_tag (unsigned char *p, size_t len, Der_class class, Der_type type,
int tag, size_t *size)
@@ -243,6 +273,31 @@ encode_unsigned (unsigned char *p, size_t len, const unsigned *data,
return 0;
}
int
encode_enumerated (unsigned char *p, size_t len, const unsigned *data,
size_t *size)
{
unsigned num = *data;
size_t ret = 0;
size_t l;
int e;
e = der_put_int (p, len, num, &l);
if(e)
return e;
p -= l;
len -= l;
ret += l;
e = der_put_length_and_tag (p, len, l, UNIV, PRIM, UT_Enumerated, &l);
if (e)
return e;
p -= l;
len -= l;
ret += l;
*size = ret;
return 0;
}
int
encode_general_string (unsigned char *p, size_t len,
const general_string *data, size_t *size)
@@ -291,6 +346,30 @@ encode_octet_string (unsigned char *p, size_t len,
return 0;
}
int
encode_oid(unsigned char *p, size_t len,
const oid *k, size_t *size)
{
size_t ret = 0;
size_t l;
int e;
e = der_put_oid (p, len, k, &l);
if (e)
return e;
p -= l;
len -= l;
ret += l;
e = der_put_length_and_tag (p, len, l, UNIV, PRIM, UT_OID, &l);
if (e)
return e;
p -= l;
len -= l;
ret += l;
*size = ret;
return 0;
}
int
time2generalizedtime (time_t t, octet_string *s)
{

View File

@@ -90,6 +90,11 @@ init_generate (const char *filename, const char *base)
"typedef char *general_string;\n\n"
#endif
);
fprintf (headerfile,
"typedef struct oid {\n"
" size_t length;\n"
" unsigned *components;\n"
"} oid;\n\n");
fprintf (headerfile, "#endif\n\n");
logfile = fopen(STEM "_files", "w");
if (logfile == NULL)
@@ -140,6 +145,10 @@ define_asn1 (int level, Type *t)
space(level);
fprintf (headerfile, "OCTET STRING");
break;
case TOID :
space(level);
fprintf(headerfile, "OBJECT IDENTIFIER");
break;
case TBitString: {
Member *m;
int tag = -1;
@@ -158,6 +167,24 @@ define_asn1 (int level, Type *t)
fprintf (headerfile, "}");
break;
}
case TEnumerated : {
Member *m;
int tag = -1;
space(level);
fprintf (headerfile, "ENUMERATED {\n");
for (m = t->members; m && m->val != tag; m = m->next) {
if (tag == -1)
tag = m->val;
space(level + 1);
fprintf (headerfile, "%s(%d)%s\n", m->name, m->val,
m->next->val == tag?"":",");
}
space(level);
fprintf (headerfile, "}");
break;
}
case TSequence: {
Member *m;
int tag;
@@ -249,6 +276,10 @@ define_type (int level, char *name, Type *t, int typedefp)
space(level);
fprintf (headerfile, "octet_string %s;\n", name);
break;
case TOID :
space(level);
fprintf (headerfile, "oid %s;\n", name);
break;
case TBitString: {
Member *m;
Type i;
@@ -270,6 +301,23 @@ define_type (int level, char *name, Type *t, int typedefp)
fprintf (headerfile, "} %s;\n\n", name);
break;
}
case TEnumerated: {
Member *m;
int tag = -1;
space(level);
fprintf (headerfile, "enum %s {\n", typedefp ? name : "");
for (m = t->members; m && m->val != tag; m = m->next) {
if (tag == -1)
tag = m->val;
space(level + 1);
fprintf (headerfile, "%s = %d%s\n", m->gen_name, m->val,
m->next->val == tag ? "" : ",");
}
space(level);
fprintf (headerfile, "} %s;\n\n", name);
break;
}
case TSequence: {
Member *m;
int tag = -1;

View File

@@ -55,11 +55,15 @@ copy_type (const char *from, const char *to, const Type *t)
break;
case TInteger:
case TUInteger:
case TEnumerated :
fprintf(codefile, "*(%s) = *(%s);\n", to, from);
break;
case TOctetString:
copy_primitive ("octet_string", from, to);
break;
case TOID:
copy_primitive ("oid", from, to);
break;
case TBitString: {
fprintf(codefile, "*(%s) = *(%s);\n", to, from);
break;

View File

@@ -73,9 +73,15 @@ decode_type (const char *name, const Type *t)
case TUInteger:
decode_primitive ("unsigned", name);
break;
case TEnumerated:
decode_primitive ("enumerated", name);
break;
case TOctetString:
decode_primitive ("octet_string", name);
break;
case TOID :
decode_primitive ("oid", name);
break;
case TBitString: {
Member *m;
int tag = -1;
@@ -297,6 +303,7 @@ generate_type_decode (const Symbol *s)
case TInteger:
case TUInteger:
case TOctetString:
case TOID:
case TGeneralizedTime:
case TGeneralString:
case TBitString:

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -76,6 +76,9 @@ encode_type (const char *name, const Type *t)
case TOctetString:
encode_primitive ("octet_string", name);
break;
case TOID :
encode_primitive ("oid", name);
break;
case TBitString: {
Member *m;
int pos;
@@ -128,6 +131,10 @@ encode_type (const char *name, const Type *t)
rest);
break;
}
case TEnumerated : {
encode_primitive ("enumerated", name);
break;
}
case TSequence: {
Member *m;
int tag = -1;
@@ -234,6 +241,8 @@ generate_type_encode (const Symbol *s)
case TGeneralizedTime:
case TGeneralString:
case TBitString:
case TEnumerated:
case TOID:
case TSequence:
case TSequenceOf:
case TApplication:

View File

@@ -53,10 +53,14 @@ free_type (const char *name, const Type *t)
break;
case TInteger:
case TUInteger:
case TEnumerated :
break;
case TOctetString:
free_primitive ("octet_string", name);
break;
case TOID :
free_primitive ("oid", name);
break;
case TBitString: {
break;
}

View File

@@ -69,9 +69,15 @@ length_type (const char *name, const Type *t, const char *variable)
case TUInteger:
length_primitive ("unsigned", name, variable);
break;
case TEnumerated :
length_primitive ("enumerated", name, variable);
break;
case TOctetString:
length_primitive ("octet_string", name, variable);
break;
case TOID :
length_primitive ("oid", name, variable);
break;
case TBitString: {
/*
* XXX - Hope this is correct

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 - 2000 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*

View File

@@ -75,7 +75,10 @@ OPTIONAL { return OPTIONAL; }
BEGIN { return TBEGIN; }
END { return END; }
DEFINITIONS { return DEFINITIONS; }
ENUMERATED { return ENUMERATED; }
EXTERNAL { return EXTERNAL; }
OBJECT { return OBJECT; }
IDENTIFIER { return IDENTIFIER; }
[,;{}()|] { return *yytext; }
"[" { return *yytext; }
"]" { return *yytext; }
@@ -85,7 +88,7 @@ EXTERNAL { return EXTERNAL; }
if(e == yytext)
error_message("malformed constant (%s)", yytext);
else return CONSTANT; }
[A-Za-z][-A-Za-z0-9_]* { yylval.name = strdup (yytext); return IDENTIFIER; }
[A-Za-z][-A-Za-z0-9_]* { yylval.name = strdup (yytext); return IDENT; }
[ \t] ;
\n { ++lineno; }
\.\. { return DOTDOT; }

View File

@@ -61,10 +61,12 @@ static void append (Member *l, Member *r);
}
%token INTEGER SEQUENCE OF OCTET STRING GeneralizedTime GeneralString
%token BIT APPLICATION OPTIONAL EEQUAL TBEGIN END DEFINITIONS EXTERNAL
%token BIT APPLICATION OPTIONAL EEQUAL TBEGIN END DEFINITIONS ENUMERATED
%token EXTERNAL
%token DOTDOT
%token IMPORTS FROM
%token <name> IDENTIFIER
%token OBJECT IDENTIFIER
%token <name> IDENT
%token <constant> CONSTANT
%type <constant> constant optional2
@@ -75,7 +77,7 @@ static void append (Member *l, Member *r);
%%
envelope : IDENTIFIER DEFINITIONS EEQUAL TBEGIN specification END {}
envelope : IDENT DEFINITIONS EEQUAL TBEGIN specification END {}
;
specification :
@@ -87,22 +89,22 @@ declaration : imports_decl
| constant_decl
;
referencenames : IDENTIFIER ',' referencenames
referencenames : IDENT ',' referencenames
{
Symbol *s = addsym($1);
s->stype = Stype;
}
| IDENTIFIER
| IDENT
{
Symbol *s = addsym($1);
s->stype = Stype;
}
;
imports_decl : IMPORTS referencenames FROM IDENTIFIER ';'
imports_decl : IMPORTS referencenames FROM IDENT ';'
;
type_decl : IDENTIFIER EEQUAL type
type_decl : IDENT EEQUAL type
{
Symbol *s = addsym ($1);
s->stype = Stype;
@@ -111,7 +113,7 @@ type_decl : IDENTIFIER EEQUAL type
}
;
constant_decl : IDENTIFIER type EEQUAL constant
constant_decl : IDENT type EEQUAL constant
{
Symbol *s = addsym ($1);
s->stype = SConstant;
@@ -134,6 +136,12 @@ type : INTEGER { $$ = new_type(TInteger); }
$$ = new_type(TInteger);
$$->members = $3;
}
| OBJECT IDENTIFIER { $$ = new_type(TOID); }
| ENUMERATED '{' bitdecls '}'
{
$$ = new_type(TEnumerated);
$$->members = $3;
}
| OCTET STRING { $$ = new_type(TOctetString); }
| GeneralString { $$ = new_type(TGeneralString); }
| GeneralizedTime { $$ = new_type(TGeneralizedTime); }
@@ -152,7 +160,7 @@ type : INTEGER { $$ = new_type(TInteger); }
$$ = new_type(TBitString);
$$->members = $4;
}
| IDENTIFIER
| IDENT
{
Symbol *s = addsym($1);
$$ = new_type(TType);
@@ -174,7 +182,7 @@ memberdecls : { $$ = NULL; }
| memberdecls ',' memberdecl { $$ = $1; append($$, $3); }
;
memberdecl : IDENTIFIER '[' constant ']' type optional2
memberdecl : IDENT '[' constant ']' type optional2
{
$$ = malloc(sizeof(*$$));
$$->name = $1;
@@ -196,7 +204,7 @@ bitdecls : { $$ = NULL; }
| bitdecls ',' bitdecl { $$ = $1; append($$, $3); }
;
bitdecl : IDENTIFIER '(' constant ')'
bitdecl : IDENT '(' constant ')'
{
$$ = malloc(sizeof(*$$));
$$->name = $1;
@@ -210,7 +218,7 @@ bitdecl : IDENTIFIER '(' constant ')'
;
constant : CONSTANT { $$ = $1; }
| IDENTIFIER {
| IDENT {
Symbol *s = addsym($1);
if(s->stype != SConstant)
error_message ("%s is not a constant\n",

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -55,7 +55,7 @@ hash (void *a)
}
void
initsym ()
initsym (void)
{
htab = hashtabnew (101, cmp, hash);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 1999 Kungliga Tekniska H<>gskolan
* Copyright (c) 1997 - 2001 Kungliga Tekniska H<>gskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
@@ -38,7 +38,7 @@
enum typetype { TInteger, TOctetString, TBitString, TSequence, TSequenceOf,
TGeneralizedTime, TGeneralString, TApplication, TType,
TUInteger };
TUInteger, TEnumerated, TOID };
typedef enum typetype Typetype;