| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829 | 
							- /*
 
-  *  Copyright 2014-2023 The GmSSL Project. All Rights Reserved.
 
-  *
 
-  *  Licensed under the Apache License, Version 2.0 (the License); you may
 
-  *  not use this file except in compliance with the License.
 
-  *
 
-  *  http://www.apache.org/licenses/LICENSE-2.0
 
-  */
 
- #include <stdio.h>
 
- #include <stdlib.h>
 
- #include <string.h>
 
- #include <limits.h>
 
- #include <assert.h>
 
- #include <gmssl/asn1.h>
 
- #include <gmssl/error.h>
 
- static void print_buf(const uint8_t *a, size_t len)
 
- {
 
- 	size_t i;
 
- 	for (i = 0; i < len; i++) {
 
- 		printf("%02x ", a[i]);
 
- 	}
 
- 	printf("\n");
 
- }
 
- static void print_integer(const uint8_t *a, size_t alen)
 
- {
 
- 	size_t i;
 
- 	printf("integer = ");
 
- 	for (i = 0; i < alen; i++) {
 
- 		printf("%02x", a[i]);
 
- 	}
 
- 	printf("\n");
 
- }
 
- static void print_bits(const uint8_t *bits, size_t nbits)
 
- {
 
- 	size_t i;
 
- 	printf("bits (%zu) = ", nbits);
 
- 	for (i = 0; i < (nbits + 7)/8; i++) {
 
- 		printf("%02x", bits[i]);
 
- 	}
 
- 	printf("\n");
 
- }
 
- static void print_octets(const uint8_t *o, size_t olen)
 
- {
 
- 	size_t i;
 
- 	printf("octets (%zu) = ", olen);
 
- 	for (i = 0; i < olen; i++) {
 
- 		printf("%02x", o[i]);
 
- 	}
 
- 	printf("\n");
 
- }
 
- static int test_asn1_tag(void)
 
- {
 
- 	int i;
 
- 	format_print(stderr, 0, 0, "Tags:\n");
 
- 	for (i = 1; i <= 13; i++) {
 
- 		format_print(stderr, 0, 4, "%s (0x%02x)\n", asn1_tag_name(i), i);
 
- 	}
 
- 	for (i = 18; i <= 30; i++) {
 
- 		format_print(stderr, 0, 4, "%s (0x%02x)\n", asn1_tag_name(i), i);
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_length(void)
 
- {
 
- 	size_t tests[] = {
 
- 		0,
 
- 		5,
 
- 		127,
 
- 		128,
 
- 		256,
 
- 		344,
 
- 		65537,
 
- 		1<<23,
 
- 		INT_MAX, // INT_MAX = 2^31 - 1
 
- 		//(size_t)1<<31, // default int value of (1<<31) is -2^31, 2^31 is larger than the INT_MAX limit
 
- 	};
 
- 	size_t length;
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "Length:\n");
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_length_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		int ret;
 
- 		ret = asn1_length_from_der(&length, &cp, &len);
 
- 		if (ret != 1 && ret != -2) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		if (length != tests[i]) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%zd\n", length);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_boolean(void)
 
- {
 
- 	int tests[] = {0, 1};
 
- 	int val;
 
- 	uint8_t buf[128] = {0};
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_BOOLEAN));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_boolean_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_boolean_from_der(&val, &cp, &len) != 1
 
- 			|| asn1_check(val == tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%s\n", val ? "true" : "false");
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_int(void)
 
- {
 
- 	int tests[] = {
 
- 		0,
 
- 		1,
 
- 		127,
 
- 		128,
 
- 		65535,
 
- 		65537,
 
- 		1<<23,
 
- 		1<<30,
 
- 	};
 
- 	int val;
 
- 	uint8_t buf[256] = {0};
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_INTEGER));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_int_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	// 测试 -1 表示默认不编码
 
- 	if (asn1_int_to_der(-1, &p, &len) != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_int_from_der(&val, &cp, &len) != 1
 
- 			|| asn1_check(val == tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%d\n", val);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	// 测试返回0时是否对val值做初始化
 
- 	if (asn1_int_from_der(&val, &cp, &len) != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (val != -1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_bits(void)
 
- {
 
- 	int tests[] = {
 
- 		0x01,
 
- 		0x02,
 
- 		0x03,
 
- 		0x7f,
 
- 		0xfe,
 
- 		0xff,
 
- 		0xffff,
 
- 		0xfffff,
 
- 	};
 
- 	uint8_t der[] = {
 
- 		0x03,0x02,0x07,0x80,
 
- 		0x03,0x02,0x06,0x40,
 
- 		0x03,0x02,0x06,0xC0,
 
- 		0x03,0x02,0x01,0xFE,
 
- 		0x03,0x02,0x00,0x7F,
 
- 		0x03,0x02,0x00,0xFF,
 
- 		0x03,0x03,0x00,0xFF,0xFF,
 
- 		0x03,0x04,0x04,0xFF,0xFF,0xF0,
 
- 	};
 
- 	int bits;
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_BIT_STRING));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_bits_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	if (sizeof(der) != len
 
- 		|| memcmp(der, buf, len) != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_bits_from_der(&bits, &cp, &len) != 1
 
- 			|| asn1_check(bits == tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%x\n", bits);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_null(void)
 
- {
 
- 	uint8_t buf[256] = {0};
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "NULL\n");
 
- 	for (i = 0; i < 3; i++) {
 
- 		if (asn1_null_to_der(&p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < 3; i++) {
 
- 		if (asn1_null_from_der(&cp, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%s\n", asn1_tag_name(ASN1_TAG_NULL));
 
- 	}
 
- 	if (asn1_length_is_zero(len) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_object_identifier(void)
 
- {
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_OBJECT_IDENTIFIER));
 
- 	// test 1
 
- 	{
 
- 		char *name = "sm2";
 
- 		uint32_t oid[] = { 1,2,156,10197,1,301 };
 
- 		uint8_t der[] = { 0x06, 0x08, 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x82, 0x2D };
 
- 		uint32_t nodes[32];
 
- 		size_t nodes_cnt;
 
- 		uint8_t buf[128];
 
- 		uint8_t *p = buf;
 
- 		const uint8_t *cp = buf;
 
- 		size_t len = 0;
 
- 		format_print(stderr, 0 ,4, "%s ", name);
 
- 		if (asn1_object_identifier_to_der(oid, sizeof(oid)/sizeof(int), &p, &len) != 1
 
- 			|| asn1_check(len == sizeof(der)) != 1
 
- 			|| asn1_check(memcmp(buf, der, sizeof(der)) == 0) != 1
 
- 			|| asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 1
 
- 			|| asn1_length_is_zero(len) != 1
 
- 			|| asn1_object_identifier_equ(nodes, nodes_cnt, oid, sizeof(oid)/sizeof(int)) != 1) {
 
- 			fprintf(stderr, "failed\n");
 
- 			error_print();
 
- 			return -1;
 
- 		} else {
 
- 			printf("ok\n");
 
- 		}
 
- 	}
 
- 	// test 2
 
- 	{
 
- 		char *name = "x9.62-ecPublicKey";
 
- 		uint32_t oid[] = { 1,2,840,10045,2,1 };
 
- 		uint8_t der[] = { 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01 };
 
- 		uint8_t buf[128];
 
- 		uint32_t nodes[32];
 
- 		size_t nodes_cnt;
 
- 		uint8_t *p = buf;
 
- 		const uint8_t *cp = buf;
 
- 		size_t len = 0;
 
- 		format_print(stderr, 0 ,4, "%s ", name);
 
- 		if (asn1_object_identifier_to_der(oid, sizeof(oid)/sizeof(int), &p, &len) != 1
 
- 			|| asn1_check(len == sizeof(der)) != 1
 
- 			|| asn1_check(memcmp(buf, der, sizeof(der)) == 0) != 1
 
- 			|| asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 1
 
- 			|| asn1_length_is_zero(len) != 1
 
- 			|| asn1_object_identifier_equ(nodes, nodes_cnt, oid, sizeof(oid)/sizeof(int)) != 1) {
 
- 			fprintf(stderr, "failed\n");
 
- 			error_print();
 
- 			return -1;
 
- 		} else {
 
- 			printf("ok\n");
 
- 		}
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_printable_string(void)
 
- {
 
- 	char *tests[] = {
 
- 		"hello",
 
- 		"world",
 
- 		"Just do it", // string "Just do it!" include invalid '!'
 
- 	};
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_PrintableString));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_printable_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		const char *d;
 
- 		size_t dlen;
 
- 		if (asn1_printable_string_from_der(&d, &dlen, &cp, &len) != 1
 
- 			|| strlen(tests[i]) != dlen
 
- 			|| memcmp(tests[i], d, dlen) != 0) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_printable_string_check(void)
 
- {
 
- 	char *printable_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '()+,-./:=?";
 
- 	if (asn1_string_is_printable_string(printable_str, strlen(printable_str)) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_string_is_printable_string("a*b", 3) == 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_printable_string_case_ignore_match(void)
 
- {
 
- 	if (asn1_printable_string_case_ignore_match("HELLO", 5, "WORLD", 5) == 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match("HELLO", 5, "HELLO", 5) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match("HELLO", 5, "hello", 5) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match("  HELLO", 7, "hello", 5) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match("  HELLO", 7, "hello   ", 8) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match(" A2b ", 5, "  a2B  ", 7) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_printable_string_case_ignore_match("     ", 5, "       ", 7) != 1) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_utf8_string(void)
 
- {
 
- 	char *tests[] = {
 
- 		"hello",
 
- 		"world",
 
- 		"Just do it!",
 
- 	};
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_UTF8String));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_utf8_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		const char *d;
 
- 		size_t dlen;
 
- 		if (asn1_utf8_string_from_der(&d, &dlen, &cp, &len) != 1
 
- 			|| strlen(tests[i]) != dlen
 
- 			|| memcmp(tests[i], d, dlen) != 0) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_ia5_string(void)
 
- {
 
- 	char *tests[] = {
 
- 		"hello",
 
- 		"world",
 
- 		"Just do it!",
 
- 	};
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_IA5String));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_ia5_string_to_der(tests[i], strlen(tests[i]), &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		const char *d;
 
- 		size_t dlen;
 
- 		if (asn1_ia5_string_from_der(&d, &dlen, &cp, &len) != 1
 
- 			|| strlen(tests[i]) != dlen
 
- 			|| memcmp(tests[i], d, dlen) != 0) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_string(stderr, 0, 4, "", (uint8_t *)d, dlen);
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_time(void)
 
- {
 
- 	time_t tval = 0;
 
- 	printf("%s", ctime(&tval));
 
- 	time(&tval);
 
- 	printf("%s", ctime(&tval));
 
- 	printf("%08x%08x\n", (uint32_t)(tval >> 32), (uint32_t)tval);
 
- 	return 1;
 
- }
 
- static int test_asn1_time(void)
 
- {
 
- 	time_t tests[] = {
 
- 		0,
 
- 		31*86400,
 
- 		(31+28)*86400,
 
- 	 };
 
- 	char *utc_time[] = {
 
- 		"700101000000Z",
 
- 		"700201000000Z",
 
- 		"700301000000Z",
 
- 	};
 
- 	char *gen_time[] = {
 
- 		"19700101000000Z",
 
- 		"19700201000000Z",
 
- 		"19700301000000Z",
 
- 	};
 
- 	time_t cur = time(NULL);
 
- 	time_t ts;
 
- 	char str[16] = {0};
 
- 	int i;
 
- 	if (asn1_time_to_str(0, cur, str) != 1
 
- 		|| asn1_time_from_str(0, &ts, str) != 1
 
- 		|| ts != cur) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	if (asn1_time_to_str(1, cur, str) != 1
 
- 		|| asn1_time_from_str(1, &ts, str) != 1
 
- 		|| ts != cur) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		memset(str, 0, sizeof(str));
 
- 		if (asn1_time_to_str(1, tests[i], str) != 1
 
- 			|| strcmp(str, utc_time[i]) != 0) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		memset(str, 0, sizeof(str));
 
- 		if (asn1_time_to_str(0, tests[i], str) != 1
 
- 			|| strcmp(str, gen_time[i]) != 0) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_time_limits(void)
 
- {
 
- 	char *tests[] = {
 
- 		"20491231235959Z",
 
- 		"20500101000000Z",
 
- 		"99991231235959Z",
 
- 	};
 
- 	size_t i;
 
- 	time_t tv[sizeof(tests)/sizeof(tests[0])];
 
- 	char str[16] = {0};
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_time_from_str(0, &tv[i], tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		fprintf(stderr, "    %s: %lld\n", tests[i], (long long)tv[i]);
 
- 	}
 
- 	if (tv[0] + 1 != tv[1]) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_utc_time(void)
 
- {
 
- 	time_t tests[] = {
 
- 		0,
 
- 		0,
 
- 		1<<30,
 
- 	};
 
- 	time_t tv;
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	time(&tests[1]);
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_UTCTime));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_utc_time_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_utc_time_from_der(&tv, &cp, &len) != 1
 
- 			|| asn1_check(tv == tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%s", ctime(&tv));
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_generalized_time(void)
 
- {
 
- 	time_t tests[] = {
 
- 		0,
 
- 		1<<30,
 
- 	};
 
- 	uint8_t buf[256];
 
- 	uint8_t *p = buf;
 
- 	const uint8_t *cp = buf;
 
- 	size_t len = 0;
 
- 	size_t i;
 
- 	time(&tests[0]);
 
- 	format_print(stderr, 0, 0, "%s\n", asn1_tag_name(ASN1_TAG_GeneralizedTime));
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		if (asn1_generalized_time_to_der(tests[i], &p, &len) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_bytes(stderr, 0, 4, "", buf, len);
 
- 	}
 
- 	for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) {
 
- 		time_t tv;
 
- 		if (asn1_generalized_time_from_der(&tv, &cp, &len) != 1
 
- 			|| asn1_check(tv == tests[i]) != 1) {
 
- 			error_print();
 
- 			return -1;
 
- 		}
 
- 		format_print(stderr, 0, 4, "%s", ctime(&tv));
 
- 	}
 
- 	if (len != 0) {
 
- 		error_print();
 
- 		return -1;
 
- 	}
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- static int test_asn1_from_der_null_args(void)
 
- {
 
- 	uint8_t buf[100];
 
- 	const uint8_t *cp = NULL;
 
- 	size_t len = 100;
 
- 	int val;
 
- 	const char *str;
 
- 	size_t dlen;
 
- 	time_t t;
 
- 	uint32_t nodes[32];
 
- 	size_t nodes_cnt;
 
- 	fprintf(stderr, "%s: *inlen = 0\n", __FUNCTION__);
 
- 	cp = buf;
 
- 	len = 0;
 
- 	if (asn1_boolean_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_int_from_der(&val, &cp, &len)  != 0) { error_print(); return -1; }
 
- 	if (asn1_bits_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_null_from_der(&cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_utf8_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_printable_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_ia5_string_from_der(&str, &dlen, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_utc_time_from_der(&t, &cp, &len) != 0) { error_print(); return -1; }
 
- 	if (asn1_generalized_time_from_der(&t, &cp, &len) != 0) { error_print(); return -1; }
 
- 	fprintf(stderr, "%s: result = NULL\n", __FUNCTION__);
 
- 	cp = NULL;
 
- 	len = 100;
 
- 	if (asn1_boolean_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_int_from_der(NULL, &cp, &len)  != -1) { error_print(); return -1; }
 
- 	if (asn1_bits_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
 
- 	//if (asn1_null_from_der(&cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_object_identifier_from_der(NULL, &nodes_cnt, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utf8_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_printable_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_ia5_string_from_der(NULL, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utc_time_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_generalized_time_from_der(NULL, &cp, &len) != -1) { error_print(); return -1; }
 
- 	fprintf(stderr, "%s: *inlen = 0\n", __FUNCTION__);
 
- 	cp = buf;
 
- 	len = 0;
 
- 	if (asn1_boolean_from_der(&val, &cp, &len) != 0) { error_print(); return -1; }
 
- 	fprintf(stderr, "%s: in = NULL\n", __FUNCTION__);
 
- 	len = 100;
 
- 	if (asn1_boolean_from_der(&val, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_int_from_der(&val, NULL, &len)  != -1) { error_print(); return -1; }
 
- 	if (asn1_bits_from_der(&val, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_null_from_der(NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_object_identifier_from_der(nodes, &nodes_cnt, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utf8_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_printable_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_ia5_string_from_der(&str, &dlen, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utc_time_from_der(&t, NULL, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_generalized_time_from_der(&t, NULL, &len) != -1) { error_print(); return -1; }
 
- 	fprintf(stderr, "%s: inlen = NULL\n", __FUNCTION__);
 
- 	cp = buf;
 
- 	if (asn1_boolean_from_der(&val, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_int_from_der(&val, &cp, NULL)  != -1) { error_print(); return -1; }
 
- 	if (asn1_bits_from_der(&val, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_null_from_der(&cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_utf8_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_printable_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_ia5_string_from_der(&str, &dlen, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_utc_time_from_der(&t, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	if (asn1_generalized_time_from_der(&t, &cp, NULL) != -1) { error_print(); return -1; }
 
- 	fprintf(stderr, "%s: *in = NULL\n", __FUNCTION__);
 
- 	cp = NULL;
 
- 	len = 100;
 
- 	if (asn1_boolean_from_der(&val, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_int_from_der(&val, &cp, &len)  != -1) { error_print(); return -1; }
 
- 	if (asn1_bits_from_der(&val, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_null_from_der(&cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_object_identifier_from_der(nodes, &nodes_cnt, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utf8_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_printable_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_ia5_string_from_der(&str, &dlen, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_utc_time_from_der(&t, &cp, &len) != -1) { error_print(); return -1; }
 
- 	if (asn1_generalized_time_from_der(&t, &cp, &len) != -1) { error_print(); return -1; }
 
- 	printf("%s() ok\n", __FUNCTION__);
 
- 	return 1;
 
- }
 
- int main(void)
 
- {
 
- 	if (test_asn1_tag() != 1) goto err;
 
- 	if (test_asn1_length() != 1) goto err;
 
- 	if (test_asn1_boolean() != 1) goto err;
 
- 	if (test_asn1_int() != 1) goto err;
 
- 	if (test_asn1_bits() != 1) goto err;
 
- 	if (test_asn1_null() != 1) goto err;
 
- 	if (test_asn1_object_identifier() != 1) goto err;
 
- 	if (test_asn1_printable_string() != 1) goto err;
 
- 	if (test_asn1_printable_string_case_ignore_match() != 1) goto err;
 
- 	if (test_asn1_utf8_string() != 1) goto err;
 
- 	if (test_asn1_ia5_string() != 1) goto err;
 
- 	if (test_asn1_time() != 1) goto err;
 
- 	if (test_asn1_time_limits() != 1) goto err;
 
- 	if (test_asn1_utc_time() != 1) goto err;
 
- 	if (test_asn1_generalized_time() != 1) goto err;
 
- 	if (test_asn1_from_der_null_args() != 1) goto err;
 
- 	printf("%s all tests passed\n", __FILE__);
 
- 	return 0;
 
- err:
 
- 	error_print();
 
- 	return -1;
 
- }
 
 
  |