/**
 * \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,
	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__ */