From 540759ec4d0ea432ad0cd3eb10ed2f977f7b6d29 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Fri, 25 Sep 2009 17:29:05 +0300 Subject: [PATCH] s4/drsuapi: ber_read_partial_OID_String() implementation --- lib/util/asn1.c | 36 ++++++++++++++++++++++++++++++++++++ lib/util/asn1.h | 1 + 2 files changed, 37 insertions(+) diff --git a/lib/util/asn1.c b/lib/util/asn1.c index 0d08027a070..93d96c2bdfe 100644 --- a/lib/util/asn1.c +++ b/lib/util/asn1.c @@ -656,6 +656,42 @@ nomem: return false; } +/** + * Deserialize partial OID string. + * Partial OIDs are in the form: + * 1:2.5.6:0x81 + * 1:2.5.6:0x8182 + */ +bool ber_read_partial_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **partial_oid) +{ + size_t bytes_left; + size_t bytes_eaten; + char *identifier = NULL; + char *tmp_oid = NULL; + + if (!_ber_read_OID_String_impl(mem_ctx, blob, (const char **)&tmp_oid, &bytes_eaten)) + return false; + + if (bytes_eaten < blob.length) { + bytes_left = blob.length - bytes_eaten; + identifier = hex_encode_talloc(mem_ctx, &blob.data[bytes_eaten], bytes_left); + if (!identifier) goto nomem; + + *partial_oid = talloc_asprintf_append_buffer(tmp_oid, ":0x%s", identifier); + if (!*partial_oid) goto nomem; + TALLOC_FREE(identifier); + } else { + *partial_oid = tmp_oid; + } + + return true; + +nomem: + TALLOC_FREE(identifier); + TALLOC_FREE(tmp_oid); + return false; +} + /* read an object ID from a ASN1 buffer */ bool asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID) { diff --git a/lib/util/asn1.h b/lib/util/asn1.h index cd93195870f..3d8e37b8ab8 100644 --- a/lib/util/asn1.h +++ b/lib/util/asn1.h @@ -84,6 +84,7 @@ bool asn1_start_tag(struct asn1_data *data, uint8_t tag); bool asn1_end_tag(struct asn1_data *data); int asn1_tag_remaining(struct asn1_data *data); bool ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID); +bool ber_read_partial_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **partial_oid); bool asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID); bool asn1_check_OID(struct asn1_data *data, const char *OID); bool asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s); -- 2.11.4.GIT