/**
 * \file asn1gen.h
 * \brief ASN.1 generator.
 * \author Dmytro Podgornyi (d.podgornyi@samsung.com)
 * \version 0.1
 * \date Created May 28, 2013
 * \par In Samsung Ukraine R&D Center (SURC) under a contract between
 * \par LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine) and
 * \par "Samsung Elecrtronics Co", Ltd (Seoul, Republic of Korea)
 * \par Copyright: (c) Samsung Electronics Co, Ltd 2012. All rights reserved.
 **/

#ifndef __ASN1GEN_H_INCLUDED__
#define __ASN1GEN_H_INCLUDED__

#include <stdint.h>

#define ASN1GEN_INIT {ASN1_TYPE_END, NULL}

typedef enum {
    ASN1_TYPE_END = 0,
    ASN1_TYPE_BOOLEAN,
    ASN1_TYPE_LONG,
    ASN1_TYPE_BIGNUM_RAW,
    ASN1_TYPE_NULL,
    ASN1_TYPE_BITSTRING,
    ASN1_TYPE_OCTETSTRING,
    ASN1_TYPE_OBJECT,
    ASN1_TYPE_UTF8STRING,
    ASN1_TYPE_IA5STRING,
    ASN1_TYPE_PRINTABLE_STRING,
    ASN1_TYPE_UTCTIME,
    ASN1_TYPE_SEQUENCE,
    ASN1_TYPE_SET,
    ASN1_TYPE_EXPL_0,
    ASN1_TYPE_IMPL_0,
    ASN1_TYPE_EXPL_1,
    ASN1_TYPE_EXPL_3,
    ASN1_TYPE_RAW,
} asn1_type_t;

struct asn1_gen_struct {
    asn1_type_t type;
    void *value;
};

struct asn1_object_struct {
    int size;
    unsigned long *content;
};

struct asn1_string_struct {
    int size;
    char *data;
    int unused;
};

typedef struct asn1_gen_struct asn1_gen_t;
typedef struct asn1_object_struct asn1_object_t;
typedef struct asn1_string_struct asn1_string_t;

int32_t asn1_gen_sequence(uint8_t *out, uint32_t *out_len,
                          const asn1_gen_t *seq);
int32_t asn1_gen_field(uint8_t *out, uint32_t out_len,
                       const asn1_gen_t *field);
uint32_t asn1_get_field_bytes(const asn1_gen_t *field);
int32_t asn1_validate(const asn1_gen_t *seq);

#endif /* __ASN1GEN_H_INCLUDED__ */
