
/*** <<< INCLUDES [Certificate] >>> ***/

#include <OBJECT_IDENTIFIER.h>
#include <BIT_STRING.h>
#include <INTEGER.h>
#include <Name.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Certificate] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Certificate;

/*** <<< TYPE-DECLS [Certificate] >>> ***/


typedef struct Certificate {
	struct toBeSigned {
		INTEGER_t	 version;
		OBJECT_IDENTIFIER_t	 signature;
		Name_t	 issuer;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} toBeSigned;
	OBJECT_IDENTIFIER_t	 algorithm;
	BIT_STRING_t	 signature;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Certificate_t;

/*** <<< CODE [Certificate] >>> ***/

static int
memb_signature_1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
	size_t size;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	if(st->size > 0) {
		/* Size in bits */
		size = 8 * (st->size - 1) - (st->buf[0] & 0x7);
	} else {
		size = 0;
	}
	
	if((size <= 256)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [Certificate] >>> ***/

static asn_TYPE_member_t asn_MBR_toBeSigned[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct toBeSigned, version),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "version"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct toBeSigned, signature),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_OBJECT_IDENTIFIER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "signature"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct toBeSigned, issuer),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Name,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "issuer"
		},
};
static ber_tlv_tag_t asn_DEF_toBeSigned_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_toBeSigned_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* version at 21 */
    { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* signature at 22 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 } /* issuer at 24 */
};
static asn_SEQUENCE_specifics_t asn_DEF_toBeSigned_specs = {
	sizeof(struct toBeSigned),
	offsetof(struct toBeSigned, _asn_ctx),
	asn_DEF_toBeSigned_tag2el,
	3,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_toBeSigned = {
	"toBeSigned",
	"toBeSigned",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_toBeSigned_tags,
	sizeof(asn_DEF_toBeSigned_tags)
		/sizeof(asn_DEF_toBeSigned_tags[0]), /* 1 */
	asn_DEF_toBeSigned_tags,	/* Same as above */
	sizeof(asn_DEF_toBeSigned_tags)
		/sizeof(asn_DEF_toBeSigned_tags[0]), /* 1 */
	asn_MBR_toBeSigned,
	3,	/* Elements count */
	&asn_DEF_toBeSigned_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Certificate[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Certificate, toBeSigned),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_toBeSigned,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "toBeSigned"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Certificate, algorithm),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_OBJECT_IDENTIFIER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "algorithm"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Certificate, signature),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_BIT_STRING,
		.memb_constraints = memb_signature_1_constraint,
		.name = "signature"
		},
};
static ber_tlv_tag_t asn_DEF_Certificate_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Certificate_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 2, 0, 0 }, /* signature at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (6 << 2)), 1, 0, 0 }, /* algorithm at 16 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* toBeSigned at 21 */
};
static asn_SEQUENCE_specifics_t asn_DEF_Certificate_specs = {
	sizeof(struct Certificate),
	offsetof(struct Certificate, _asn_ctx),
	asn_DEF_Certificate_tag2el,
	3,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Certificate = {
	"Certificate",
	"Certificate",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Certificate_tags,
	sizeof(asn_DEF_Certificate_tags)
		/sizeof(asn_DEF_Certificate_tags[0]), /* 1 */
	asn_DEF_Certificate_tags,	/* Same as above */
	sizeof(asn_DEF_Certificate_tags)
		/sizeof(asn_DEF_Certificate_tags[0]), /* 1 */
	asn_MBR_Certificate,
	3,	/* Elements count */
	&asn_DEF_Certificate_specs	/* Additional specs */
};


/*** <<< INCLUDES [Name] >>> ***/

#include <RelativeDistinguishedName.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< DEPS [Name] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Name;

/*** <<< TYPE-DECLS [Name] >>> ***/


typedef struct Name {
	A_SEQUENCE_OF(RelativeDistinguishedName_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Name_t;

/*** <<< STAT-DEFS [Name] >>> ***/

static asn_TYPE_member_t asn_MBR_Name[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_RelativeDistinguishedName,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Name_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Name_specs = {
	sizeof(struct Name),
	offsetof(struct Name, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Name = {
	"Name",
	"Name",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Name_tags,
	sizeof(asn_DEF_Name_tags)
		/sizeof(asn_DEF_Name_tags[0]), /* 1 */
	asn_DEF_Name_tags,	/* Same as above */
	sizeof(asn_DEF_Name_tags)
		/sizeof(asn_DEF_Name_tags[0]), /* 1 */
	asn_MBR_Name,
	1,	/* Single element */
	&asn_DEF_Name_specs	/* Additional specs */
};


/*** <<< INCLUDES [RelativeDistinguishedName] >>> ***/

#include <IA5String.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [RelativeDistinguishedName] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName;

/*** <<< TYPE-DECLS [RelativeDistinguishedName] >>> ***/


typedef struct RelativeDistinguishedName {
	A_SET_OF(IA5String_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} RelativeDistinguishedName_t;

/*** <<< CTABLES [RelativeDistinguishedName] >>> ***/

static int permitted_alphabet_table_1[256] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/*                  */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,	/*                  */
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,	/*             ,-.  */
1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,	/* 0        9       */
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/*  ABCDEFGHIJKLMNO */
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,	/* PQRSTUVWXYZ      */
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,	/*  abcdefghijklmno */
1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,	/* pqrstuvwxyz      */
};

static int check_permitted_alphabet_1(const void *sptr) {
	int *table = permitted_alphabet_table_1;
	/* The underlying type is IA5String */
	const IA5String_t *st = (const IA5String_t *)sptr;
	const uint8_t *ch = st->buf;
	const uint8_t *end = ch + st->size;
	
	for(; ch < end; ch++) {
		uint8_t cv = *ch;
		if(!table[cv]) return -1;
	}
	return 0;
}


/*** <<< CODE [RelativeDistinguishedName] >>> ***/

static int
memb_IA5String_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	const IA5String_t *st = (const IA5String_t *)sptr;
	
	if(!sptr) {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(!check_permitted_alphabet_1(sptr)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		_ASN_ERRLOG(app_errlog, app_key,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}


/*** <<< STAT-DEFS [RelativeDistinguishedName] >>> ***/

static asn_TYPE_member_t asn_MBR_RelativeDistinguishedName[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (22 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_IA5String,
		.memb_constraints = memb_IA5String_2_constraint,
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_RelativeDistinguishedName_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_RelativeDistinguishedName_specs = {
	sizeof(struct RelativeDistinguishedName),
	offsetof(struct RelativeDistinguishedName, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_RelativeDistinguishedName = {
	"RelativeDistinguishedName",
	"RelativeDistinguishedName",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RelativeDistinguishedName_tags,
	sizeof(asn_DEF_RelativeDistinguishedName_tags)
		/sizeof(asn_DEF_RelativeDistinguishedName_tags[0]), /* 1 */
	asn_DEF_RelativeDistinguishedName_tags,	/* Same as above */
	sizeof(asn_DEF_RelativeDistinguishedName_tags)
		/sizeof(asn_DEF_RelativeDistinguishedName_tags[0]), /* 1 */
	asn_MBR_RelativeDistinguishedName,
	1,	/* Single element */
	&asn_DEF_RelativeDistinguishedName_specs	/* Additional specs */
};

