asn1.h

DER/ASN.1 implementation \par License: GNU GPL v3.0 \par Reference: ITU-T X.690 (DER Encoding Rules)

Author

Anthony Cagliano

Enums

enum tls_asn1_tags

Values:

enumerator ASN1_RESVD

RESERVED.

enumerator ASN1_BOOLEAN

defines a BOOLEAN object

enumerator ASN1_INTEGER

defines an INTEGER object

enumerator ASN1_BITSTRING

defines a BIT STRING object

enumerator ASN1_OCTETSTRING

defines an OCTET STRING object

enumerator ASN1_NULL

defines a NULL object (0 size, no data)

enumerator ASN1_OBJECTID

defines an OBJECT IDENTIFIER

enumerator ASN1_OBJECTDESC

defines an OBJECT DESCRIPTION

enumerator ASN1_INSTANCE

defines an INSTANCE

enumerator ASN1_REAL

defines a REAL object

enumerator ASN1_ENUMERATED
enumerator ASN1_EMBEDDEDPDV
enumerator ASN1_UTF8STRING
enumerator ASN1_RELATIVEOID
enumerator ASN1_SEQUENCE

defines a SEQUENCE

enumerator ASN1_SET

defines a SET

enumerator ASN1_NUMERICSTRING
enumerator ASN1_PRINTABLESTRING
enumerator ASN1_TELETEXSTRING
enumerator ASN1_VIDEOTEXSTRING
enumerator ASN1_IA5STRING
enumerator ASN1_UTCTIME
enumerator ASN1_GENERALIZEDTIME
enumerator ASN1_GRAPHICSTRING
enumerator ASN1_VISIBLESTRING
enumerator ASN1_GENERALSTRING
enumerator ASN1_UNIVERSALSTRING
enumerator ASN1_CHARSTRING
enumerator ASN1_BMPSTRING
enum tls_asn1_classes

Values:

enumerator ASN1_UNIVERSAL

tags defined in the ASN.1 standard.

Most use cases on calc will be this.

enumerator ASN1_APPLICATION

tags unique to a particular application.

enumerator ASN1_CONTEXTSPEC

tags that need to be identified within a particular, well-definded context.

enumerator ASN1_PRIVATE

reserved for use by a specific entity for their applications.

enum tls_asn1_forms

Values:

enumerator ASN1_PRIMITIVE

this element should contain no nested elements.

enumerator ASN1_CONSTRUCTED

this element contains nested elements.

Functions

bool tls_asn1_cursor_init(struct tls_asn1_cursor *cursor, const uint8_t *data, size_t len)

Initialize a cursor over a DER buffer.

Parameters:
  • cursor – Cursor to initialize.

  • data – Pointer to first DER byte.

  • len – Number of bytes available from data.

Returns:

true on success, false on invalid arguments.

bool tls_asn1_next(struct tls_asn1_cursor *cursor, struct tls_asn1_tlv *out)

Parse the next TLV from a cursor and advance it.

Note

This API intentionally uses a single boolean return value. Callers that need strict error distinction should track expected structure while parsing (for example: required fields missing before false => parse failure).

Parameters:
  • cursor – Active cursor.

  • out – Output TLV descriptor.

Returns:

true if one TLV was parsed successfully.

Returns:

false if:

  • cursor reached end of data (normal iteration completion), or

  • input is malformed (invalid DER length/overflow/truncated TLV), or

  • arguments are invalid.

bool tls_asn1_child_cursor(const struct tls_asn1_tlv *parent, struct tls_asn1_cursor *child)

Create a cursor for a constructed parent TLV’s value bytes.

Note

Call this only when tls_asn1_tag_constructed(parent->tag) is true.

Parameters:
  • parent – Parent TLV from tls_asn1_next().

  • child – Output child cursor spanning only parent’s content.

Returns:

true on success.

Returns:

false if:

  • parent is not constructed, or

  • arguments are invalid.

uint8_t tls_asn1_tag_number(uint8_t tag)

Extract low 5-bit ASN.1 tag number from raw tag byte.

uint8_t tls_asn1_tag_class(uint8_t tag)

Extract class bits (ASN1_UNIVERSAL/APPLICATION/CONTEXTSPEC/PRIVATE).

bool tls_asn1_tag_constructed(uint8_t tag)

Return true if constructed form bit is set on raw tag byte.

struct tls_asn1_serialization
#include <asn1.h>

Public Members

char *name

field label supplied by caller/parser

uint8_t tag

tag value returned.

size_t len

length of item.

uint8_t *data

pointer to item value.

struct tls_asn1_tlv
#include <asn1.h>

One parsed DER TLV item.

This describes a single ASN.1 element in Tag-Length-Value form. Pointers reference the original input buffer; no copies are made.

Public Members

const uint8_t *tlv

Pointer to the tag byte (start of full TLV).

const uint8_t *value

Pointer to content bytes only (value payload).

size_t len

Content length in bytes (value payload size).

size_t header_len

Header size in bytes (tag + DER length bytes).

uint8_t tag

Raw one-byte ASN.1 tag (class/form/number).

struct tls_asn1_cursor
#include <asn1.h>

Forward-only iterator state over a DER byte span.

Typical usage:

  1. Call tls_asn1_cursor_init() once for a DER buffer.

  2. Repeatedly call tls_asn1_next() until it returns false.

  3. For constructed TLVs (SEQUENCE/SET/context constructed), call tls_asn1_child_cursor() to iterate nested elements.

Public Members

const uint8_t *cur

Current read position.

const uint8_t *end

One-past-end bound for this cursor span.