From 8b8bcb8c9b4ae2eab0b64474b49aa2430144bf90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Fri, 3 Oct 2003 00:28:29 +0000 Subject: [PATCH] add boolan support git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12944 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der.h | 7 +++++++ lib/asn1/der_get.c | 40 ++++++++++++++++++++++++++++++++++++++++ lib/asn1/der_length.c | 6 ++++++ lib/asn1/der_put.c | 37 +++++++++++++++++++++++++++++++++++++ lib/asn1/gen.c | 8 ++++++++ lib/asn1/gen_copy.c | 1 + lib/asn1/gen_decode.c | 4 ++++ lib/asn1/gen_encode.c | 4 ++++ lib/asn1/gen_free.c | 1 + lib/asn1/gen_length.c | 3 +++ lib/asn1/symbol.h | 1 + 11 files changed, 112 insertions(+) diff --git a/lib/asn1/der.h b/lib/asn1/der.h index 7c73f5b5c..9b61a3645 100644 --- a/lib/asn1/der.h +++ b/lib/asn1/der.h @@ -74,6 +74,8 @@ int time2generalizedtime (time_t t, heim_octet_string *s); int der_get_int (const unsigned char *p, size_t len, int *ret, size_t *size); int der_get_length (const unsigned char *p, size_t len, size_t *val, size_t *size); +int der_get_boolean (const unsigned char *p, size_t len, + int *data, size_t *size); int der_get_general_string (const unsigned char *p, size_t len, heim_general_string *str, size_t *size); int der_get_octet_string (const unsigned char *p, size_t len, @@ -91,6 +93,7 @@ int der_match_tag_and_length (const unsigned char *p, size_t len, Der_class class, Der_type type, int tag, size_t *length_ret, size_t *size); +int decode_boolean (const unsigned char*, size_t, int*, size_t*); 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*); @@ -107,6 +110,7 @@ int decode_utf8string (const unsigned char*, 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_boolean (unsigned char *p, size_t len, const int *data, size_t*); int der_put_general_string (unsigned char *p, size_t len, const heim_general_string *str, size_t*); int der_put_octet_string (unsigned char *p, size_t len, @@ -118,6 +122,8 @@ int der_put_tag (unsigned char *p, size_t len, Der_class class, Der_type type, int der_put_length_and_tag (unsigned char*, size_t, size_t, Der_class, Der_type, int, size_t*); +int encode_boolean (unsigned char *p, size_t len, + const int *data, size_t*); int encode_integer (unsigned char *p, size_t len, const int *data, size_t*); int encode_unsigned (unsigned char *p, size_t len, @@ -143,6 +149,7 @@ void free_generalized_time (time_t *t); void free_utf8string (heim_utf8_string*); size_t length_len (size_t len); +size_t length_boolean (const int *data); size_t length_integer (const int *data); size_t length_unsigned (const unsigned *data); size_t length_enumerated (const unsigned *data); diff --git a/lib/asn1/der_get.c b/lib/asn1/der_get.c index 0afe9c298..427a857bd 100644 --- a/lib/asn1/der_get.c +++ b/lib/asn1/der_get.c @@ -76,6 +76,19 @@ der_get_int (const unsigned char *p, size_t len, return 0; } +int +der_get_boolean(const unsigned char *p, size_t len, int *data, size_t *size) +{ + if(len < 1) + return ASN1_OVERRUN; + if(*p != 0) + *data = 1; + else + *data = 0; + *size = 1; + return 0; +} + int der_get_length (const unsigned char *p, size_t len, size_t *val, size_t *size) @@ -234,6 +247,33 @@ der_match_tag_and_length (const unsigned char *p, size_t len, return 0; } +int +decode_boolean (const unsigned char *p, size_t len, + int *num, size_t *size) +{ + size_t ret = 0; + size_t l, reallen; + int e; + + e = der_match_tag (p, len, UNIV, PRIM, UT_Boolean, &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_boolean (p, reallen, num, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + if(size) *size = ret; + return 0; +} + int decode_integer (const unsigned char *p, size_t len, int *num, size_t *size) diff --git a/lib/asn1/der_length.c b/lib/asn1/der_length.c index d166da5df..88d652786 100644 --- a/lib/asn1/der_length.c +++ b/lib/asn1/der_length.c @@ -95,6 +95,12 @@ length_len (size_t len) return len_unsigned (len) + 1; } +size_t +length_boolean (const int *data) +{ + return 1 + length_len(1) + 1; +} + size_t length_integer (const int *data) { diff --git a/lib/asn1/der_put.c b/lib/asn1/der_put.c index 463549bb7..507cc519f 100644 --- a/lib/asn1/der_put.c +++ b/lib/asn1/der_put.c @@ -132,6 +132,19 @@ der_put_length (unsigned char *p, size_t len, size_t val, size_t *size) } } +int +der_put_boolean(unsigned char *p, size_t len, const int *data, size_t *size) +{ + if(len < 1) + return ASN1_OVERFLOW; + if(*data != 0) + *p = 0xff; + else + *p = 0; + *size = 1; + return 0; +} + int der_put_general_string (unsigned char *p, size_t len, const heim_general_string *str, size_t *size) @@ -225,6 +238,30 @@ der_put_length_and_tag (unsigned char *p, size_t len, size_t len_val, return 0; } +int +encode_boolean (unsigned char *p, size_t len, const int *data, + size_t *size) +{ + size_t ret = 0; + size_t l; + int e; + + e = der_put_boolean (p, len, data, &l); + if(e) + return e; + p -= l; + len -= l; + ret += l; + e = der_put_length_and_tag (p, len, l, UNIV, PRIM, UT_Boolean, &l); + if (e) + return e; + p -= l; + len -= l; + ret += l; + *size = ret; + return 0; +} + int encode_integer (unsigned char *p, size_t len, const int *data, size_t *size) { diff --git a/lib/asn1/gen.c b/lib/asn1/gen.c index 6e8069d8e..1c1fd88f2 100644 --- a/lib/asn1/gen.c +++ b/lib/asn1/gen.c @@ -270,6 +270,10 @@ define_asn1 (int level, Type *t) fprintf (headerfile, "[APPLICATION %d] ", t->application); define_asn1 (level, t->subtype); break; + case TBoolean: + space(level); + fprintf (headerfile, "BOOLEAN"); + break; case TUTF8String: space(level); fprintf (headerfile, "UTF8String"); @@ -407,6 +411,10 @@ define_type (int level, char *name, Type *t, int typedefp) space(level); fprintf (headerfile, "heim_utf8_string %s;\n", name); break; + case TBoolean: + space(level); + fprintf (headerfile, "int %s;\n", name); + break; case TNull: space(level); fprintf (headerfile, "NULL %s;\n", name); diff --git a/lib/asn1/gen_copy.c b/lib/asn1/gen_copy.c index 99f9f846e..eb733e48e 100644 --- a/lib/asn1/gen_copy.c +++ b/lib/asn1/gen_copy.c @@ -55,6 +55,7 @@ copy_type (const char *from, const char *to, const Type *t) break; case TInteger: case TUInteger: + case TBoolean: case TEnumerated : fprintf(codefile, "*(%s) = *(%s);\n", to, from); break; diff --git a/lib/asn1/gen_decode.c b/lib/asn1/gen_decode.c index 0df6dfbcc..75c22d767 100644 --- a/lib/asn1/gen_decode.c +++ b/lib/asn1/gen_decode.c @@ -280,6 +280,9 @@ decode_type (const char *name, const Type *t) "}\n" "}\n"); + break; + case TBoolean: + decode_primitive ("boolean", name); break; default : abort (); @@ -310,6 +313,7 @@ generate_type_decode (const Symbol *s) switch (s->type->type) { case TInteger: case TUInteger: + case TBoolean: case TOctetString: case TOID: case TGeneralizedTime: diff --git a/lib/asn1/gen_encode.c b/lib/asn1/gen_encode.c index f9331e074..a2b19c93f 100644 --- a/lib/asn1/gen_encode.c +++ b/lib/asn1/gen_encode.c @@ -220,6 +220,9 @@ encode_type (const char *name, const Type *t) "BACK;\n", t->application); break; + case TBoolean: + encode_primitive ("boolean", name); + break; default: abort (); } @@ -245,6 +248,7 @@ generate_type_encode (const Symbol *s) switch (s->type->type) { case TInteger: case TUInteger: + case TBoolean: case TOctetString: case TGeneralizedTime: case TGeneralString: diff --git a/lib/asn1/gen_free.c b/lib/asn1/gen_free.c index da17b4612..c1c6db77e 100644 --- a/lib/asn1/gen_free.c +++ b/lib/asn1/gen_free.c @@ -53,6 +53,7 @@ free_type (const char *name, const Type *t) break; case TInteger: case TUInteger: + case TBoolean: case TEnumerated : break; case TOctetString: diff --git a/lib/asn1/gen_length.c b/lib/asn1/gen_length.c index 4fc920f4d..778997424 100644 --- a/lib/asn1/gen_length.c +++ b/lib/asn1/gen_length.c @@ -152,6 +152,9 @@ length_type (const char *name, const Type *t, const char *variable) length_type (name, t->subtype, variable); fprintf (codefile, "ret += 1 + length_len (ret);\n"); break; + case TBoolean: + length_primitive ("boolean", name, variable); + break; default : abort (); } diff --git a/lib/asn1/symbol.h b/lib/asn1/symbol.h index 3ba6a710e..770a64203 100644 --- a/lib/asn1/symbol.h +++ b/lib/asn1/symbol.h @@ -39,6 +39,7 @@ enum typetype { TApplication, TBitString, + TBoolean, TChoice, TEnumerated, TGeneralString,