#include "../OBJECT_IDENTIFIER.c"
#include "../RELATIVE-OID.c"
#include "../INTEGER.c"
#include "../ber_decoder.c"
#include "../ber_tlv_length.c"
#include "../ber_tlv_tag.c"
#include "../der_encoder.c"
#include "../constraints.c"
#include <sys/time.h>

static int
_print(const void *buffer, size_t size, void *app_key) {
	(void)app_key;
	fwrite(buffer, size, 1, stdout);
	return 0;
}

static void
check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
	OBJECT_IDENTIFIER_t *oid;
	ber_dec_rval_t rval;
	unsigned long arcs[10];
	int alen;
	int i;

	printf("Checking {");
	for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
	printf("} against {");
	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
	printf("}\n");

	oid = NULL;
	rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len);
	assert(rval.code == RC_OK);

	assert(oid->size == (ssize_t)len - 2);

	/*
	 * Print the contents for visual debugging.
	 */
	printf("OBJECT_IDENTIFIER_print() => ");
	OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0);
	printf("\n");

	memset(arcs, 'A', sizeof(arcs));
	alen = OBJECT_IDENTIFIER_get_arcs(oid,
		arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0]));
	assert(alen > 0);
	assert(alen == ck_len);

	/*
	 * Make sure they are equivalent.
	 */
	printf("OBJECT_IDENTIFIER_get_arcs() => {");
	for(i = 0; i < alen; i++) {
		printf(" %lu", arcs[i]);
		assert(arcs[i] == (unsigned long)ck_buf[i]);
	}
	printf(" }\n");
}

static void
check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
	RELATIVE_OID_t *oid;
	ber_dec_rval_t rval;
	unsigned long arcs[10];
	int alen;
	int i;

	printf("Checking {");
	for(i = 0; i < (ssize_t)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
	printf("} against {");
	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
	printf("}\n");

	oid = NULL;
	rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len);
	assert(rval.code == RC_OK);

	assert(oid->size == (ssize_t)len - 2);

	/*
	 * Print the contents for visual debugging.
	 */
	printf("RELATIVE_OID_print() => ");
	RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0);
	printf("\n");

	memset(arcs, 'A', sizeof(arcs));
	alen = RELATIVE_OID_get_arcs(oid,
		arcs, sizeof(arcs[0]), sizeof(arcs)/sizeof(arcs[0]));
	assert(alen > 0);
	assert(alen == ck_len);

	/*
	 * Make sure they are equivalent.
	 */
	printf("RELATIVE_OID_get_arcs() => {");
	for(i = 0; i < alen; i++) {
		printf(" %lu", (unsigned long)arcs[i]);
		assert(arcs[i] == (unsigned long)ck_buf[i]);
	}
	printf(" }\n");
}

/*
 * Encode the specified array of arcs as RELATIVE-OID, decode it and compare.
 */
static void
check_REGEN(int *arcs, int acount) {
	static RELATIVE_OID_t oid;
	unsigned long tmp_arcs[10];
	int tmp_alen = 10;
	int alen;
	int ret;
	int i;

	printf("Encoding (R) {");
	for(i = 0; i < acount; i++) {
		printf(" %u", arcs[i]);
	}
	printf(" }\n");

	ret = RELATIVE_OID_set_arcs(&oid, arcs, sizeof(arcs[0]), acount);
	assert(ret == 0);

	memset(tmp_arcs, 'A', sizeof(tmp_arcs));
	alen = RELATIVE_OID_get_arcs(&oid, tmp_arcs,
		sizeof(tmp_arcs[0]), tmp_alen);
	assert(alen >= 0);
	assert(alen <= tmp_alen);
	assert(alen == acount);

	printf("Encoded  (R) {");
	for(i = 0; i < alen; i++) {
		printf(" %lu", tmp_arcs[i]);
		assert((unsigned long)arcs[i] == tmp_arcs[i]);
	}
	printf(" }\n");
}

/*
 * Encode the specified array of arcs as OBJECT IDENTIFIER,
 * decode it and compare.
 */
static void
check_REGEN_OID(int *arcs, int acount) {
	static OBJECT_IDENTIFIER_t oid;
	unsigned long tmp_arcs[10];
	int tmp_alen = 10;
	int alen;
	int ret;
	int i;

	printf("Encoding (O) {");
	for(i = 0; i < acount; i++) {
		printf(" %u", arcs[i]);
	}
	printf(" }\n");

	ret = OBJECT_IDENTIFIER_set_arcs(&oid, arcs, sizeof(arcs[0]), acount);
	assert(ret == 0);

	memset(tmp_arcs, 'A', sizeof(tmp_arcs));
	alen = OBJECT_IDENTIFIER_get_arcs(&oid,
		tmp_arcs, sizeof(tmp_arcs[0]), tmp_alen);
	assert(alen >= 0);
	assert(alen <= tmp_alen);
	assert(alen == acount);

	printf("Encoded  (O) { ");
	for(i = 0; i < alen; i++) {
		printf("%lu ", tmp_arcs[i]); fflush(stdout);
		assert((unsigned long)arcs[i] == tmp_arcs[i]);
	}
	printf("}\n");
}

static int
check_speed() {
	uint8_t buf[] = { 0x80 | 7, 0x80 | 2, 0x80 | 3, 0x80 | 4, 13 };
	int ret = 0;
	int cycles = 100000000;
	double a, b, c;
	struct timeval tv;
	unsigned long value;
	int i;

	ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0, &value, sizeof(value));
	assert(ret == 0);
	assert(value == 0x7040c20d);

	gettimeofday(&tv, 0);
	a = tv.tv_sec + tv.tv_usec / 1000000.0;
	for(i = 0; i < cycles; i++) {
		ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0,
			&value, sizeof(value));
	}
	assert(ret == 0);
	assert(value == 0x7040c20d);
	gettimeofday(&tv, 0);
	b = tv.tv_sec + tv.tv_usec / 1000000.0;
	for(i = 0; i < cycles; i++) {
		ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), 0,
			&value, sizeof(value));
	}
	assert(ret == 0);
	assert(value == 0x7040c20d);
	gettimeofday(&tv, 0);
	c = tv.tv_sec + tv.tv_usec / 1000000.0;

	a = b - a;
	b = c - b;
	printf("Time for single_arc(): %f\n", a);
	printf("Time for  get_arc_l(): %f\n", b);

	return 0;
}

#define	CHECK_OID(n)	check_OID(buf ## n, sizeof(buf ## n),		\
		buf ## n ## _check,					\
		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
#define	CHECK_ROID(n)	check_ROID(buf ## n, sizeof(buf ## n),		\
		buf ## n ## _check,					\
		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
#define	CHECK_REGEN(n) check_REGEN(buf ## n ## _check,			\
		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
#define	CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check,		\
		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))

int
main() {
	int i;

	/* {joint-iso-itu-t 230 3} */
	uint8_t buf1[] = {
		0x06,	/* OBJECT IDENTIFIER */
		0x03,	/* Length */
		0x82, 0x36, 0x03
	};
	int buf1_check[] = { 2, 230, 3 };

	/* {8571 3 2} */
	uint8_t buf2[] = {
		0x0D,	/* RELATIVE-OID */
		0x04,	/* Length */
		0xC2, 0x7B, 0x03, 0x02
	};
	int buf2_check[] = { 8571, 3, 2 };

	/* {joint-iso-itu-t 42 } */
	uint8_t buf3[] = {
		0x06,	/* OBJECT IDENTIFIER */
		0x01,	/* Length */
		0x7A
	};
	int buf3_check[] = { 2, 42 };

	/* {joint-iso-itu-t 25957 } */
	uint8_t buf4[] = {
		0x06,	/* OBJECT IDENTIFIER */
		0x03,	/* Length */
		0x81, 0x80 + 0x4B, 0x35
	};
	int buf4_check[] = { 2, 25957 };

	int buf5_check[] = { 0 };
	int buf6_check[] = { 1 };
	int buf7_check[] = { 80, 40 };
	int buf8_check[] = { 127 };
	int buf9_check[] = { 128 };
	int buf10_check[] = { 65535, 65536 };
	int buf11_check[] = { 100000, 0x20000, 1234, 256, 127, 128 };
	int buf12_check[] = { 0, 0xffffffff, 0xff00ff00, 0 };
	int buf13_check[] = { 0, 1, 2 };
	int buf14_check[] = { 1, 38, 3 };
	int buf15_check[] = { 0, 0, 0xf000 };
	int buf16_check[] = { 0, 0, 0, 1, 0 };
	int buf17_check[] = { 2, 0xffffffAf, 0xff00ff00, 0 };


	CHECK_OID(1);	/* buf1, buf1_check */
	CHECK_ROID(2);	/* buf2, buf2_check */
	CHECK_OID(3);	/* buf3, buf3_check */
	CHECK_OID(4);	/* buf4, buf4_check */

	CHECK_REGEN(5);	/* Regenerate RELATIVE-OID */
	CHECK_REGEN(6);
	CHECK_REGEN(7);
	CHECK_REGEN(8);
	CHECK_REGEN(9);
	CHECK_REGEN(10);
	CHECK_REGEN(11);
	CHECK_REGEN(12);
	CHECK_REGEN(13);
	CHECK_REGEN(14);
	CHECK_REGEN(15);
	CHECK_REGEN(16);
	CHECK_REGEN(17);
	CHECK_REGEN_OID(1);	/* Regenerate OBJECT IDENTIFIER */
	CHECK_REGEN_OID(3);	/* Regenerate OBJECT IDENTIFIER */
	CHECK_REGEN_OID(4);	/* Regenerate OBJECT IDENTIFIER */
	CHECK_REGEN_OID(13);
	CHECK_REGEN_OID(14);
	CHECK_REGEN_OID(15);
	CHECK_REGEN_OID(16);
	CHECK_REGEN_OID(17);

	for(i = 0; i < 100000; i++) {
		int bufA_check[3] = { 2, i, rand() };
		int bufB_check[2] = { rand(), i * 121 };
		CHECK_REGEN(A);
		CHECK_REGEN_OID(A);
		CHECK_REGEN(B);
		if(i > 100) i++;
		if(i > 500) i++;
		if(i > 1000) i += 3;
		if(i > 5000) i += 151;
	}

	if(getenv("CHECK_SPEED")) {
		/* Useful for developers only */
		check_speed();
	}

	return 0;
}
