From b6f1d52a01f322f07f34ccff3cb0bf996810b120 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Thu, 27 Sep 2001 16:20:35 +0000 Subject: [PATCH] add decode_oid git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10749 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/asn1/der.h | 3 +++ lib/asn1/der_get.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/asn1/der.h b/lib/asn1/der.h index 5a82037f0..cd2a40a73 100644 --- a/lib/asn1/der.h +++ b/lib/asn1/der.h @@ -95,6 +95,8 @@ 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_oid (const unsigned char *p, size_t len, + oid *k, size_t *size); 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*); @@ -138,6 +140,7 @@ 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_oid (const oid *k); size_t length_generalized_time (const time_t *t); int copy_general_string (const general_string *from, general_string *to); diff --git a/lib/asn1/der_get.c b/lib/asn1/der_get.c index d81100fa2..65fa69754 100644 --- a/lib/asn1/der_get.c +++ b/lib/asn1/der_get.c @@ -143,6 +143,7 @@ der_get_oid (const unsigned char *p, size_t len, oid *data, size_t *size) { int n; + size_t oldlen = len; if (len < 1) return ASN1_OVERRUN; @@ -167,6 +168,8 @@ der_get_oid (const unsigned char *p, size_t len, free_oid (data); return ASN1_OVERRUN; } + if (size) + *size = oldlen; return 0; } @@ -374,6 +377,38 @@ decode_octet_string (const unsigned char *p, size_t len, return 0; } +int +decode_oid (const unsigned char *p, size_t len, + oid *k, size_t *size) +{ + size_t ret = 0; + size_t l; + int e; + size_t slen; + + e = der_match_tag (p, len, UNIV, PRIM, UT_OID, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + + e = der_get_length (p, len, &slen, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + if (len < slen) + return ASN1_OVERRUN; + + e = der_get_oid (p, slen, k, &l); + if (e) return e; + p += l; + len -= l; + ret += l; + if(size) *size = ret; + return 0; +} + static void generalizedtime2time (const char *s, time_t *t) {