diff options
| -rw-r--r-- | lib/util/asn1.c | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/util/asn1.c b/lib/util/asn1.c index 61fb9555a7..0d08027a07 100644 --- a/lib/util/asn1.c +++ b/lib/util/asn1.c @@ -578,6 +578,46 @@ int asn1_tag_remaining(struct asn1_data *data)  	return remaining;  } +/** + * Internal implementation for reading binary OIDs + * Reading is done as far in the buffer as valid OID + * till buffer ends or not valid sub-identifier is found. + */ +static bool _ber_read_OID_String_impl(TALLOC_CTX *mem_ctx, DATA_BLOB blob, +					const char **OID, size_t *bytes_eaten) +{ +	int i; +	uint8_t *b; +	uint_t v; +	char *tmp_oid = NULL; + +	if (blob.length < 2) return false; + +	b = blob.data; + +	tmp_oid = talloc_asprintf(mem_ctx, "%u",  b[0]/40); +	if (!tmp_oid) goto nomem; +	tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u",  b[0]%40); +	if (!tmp_oid) goto nomem; + +	for(i = 1, v = 0; i < blob.length; i++) { +		v = (v<<7) | (b[i]&0x7f); +		if ( ! (b[i] & 0x80)) { +			tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u",  v); +			v = 0; +			if (bytes_eaten) +				*bytes_eaten = i+1; +		} +		if (!tmp_oid) goto nomem; +	} + +	*OID = tmp_oid; +	return true; + +nomem: +	return false; +} +  /* read an object ID from a data blob */  bool ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID)  {  | 
