/* HEADER Testing ASN.1 encoding and decoding */

int i;

#if 0
snmp_set_do_debugging(TRUE);
debug_register_tokens("dumpv_recv,dumpv_send,asn");
#endif

{
    const long intval[] = {
        -0x80000000L,
        -0x7fffffffL,
        -0xffffL,
        -3,
        -1,
        0,
        1,
        3,
        0xffff,
        0x7fffffff,
    };
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	long decoded_value = 0;
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_int(encoded, &encoded_length, ASN_INTEGER,
				     &intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_int(%ld)", intval[i]));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_int(encoded, &decoded_length, &decoded_type,
				     &decoded_value, sizeof(decoded_value));
	OKF(parse_result == build_result && decoded_type == ASN_INTEGER
	    && decoded_value == intval[i],
	    ("asn_parse_int(asn_build_int(%ld)) %s; decoded type %d <> %d;"
	     " decoded value %ld",
	     intval[i], parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_INTEGER, decoded_value));

        OKF(asn_realloc_rbuild_int(&rbuild_result, &rbuild_len, &offset, 1,
                                   ASN_INTEGER, &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_int(%ld)", intval[i]));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_int(%ld) != asn_realloc_rbuild_int(%ld)",
             intval[i], intval[i]));
        free (rbuild_result);
    }
}

{
    const unsigned long intval[] = {
	0, 1, 3, 0xffff, 0x7fffffff, 0x80000000U, 0xffffffffU
    };
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	unsigned long decoded_value = 0;
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_unsigned_int(encoded, &encoded_length,
					      ASN_UINTEGER,
					      &intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_unsigned_int(%lu)", intval[i]));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_unsigned_int(encoded, &decoded_length,
					      &decoded_type, &decoded_value,
					      sizeof(decoded_value));
	OKF(parse_result && decoded_type == ASN_UINTEGER
	    && decoded_value == intval[i],
	    ("asn_parse_unsigned_int(asn_build_unsigned_int(%lu)) %s;"
	     " decoded type %d <> %d; decoded value %lu",
	     intval[i], parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_UINTEGER, decoded_value));

        OKF(asn_realloc_rbuild_unsigned_int(&rbuild_result, &rbuild_len,
                                            &offset, 1, ASN_UINTEGER,
                                            &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_unsigned_int(%lud)", intval[i]));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_unsigned_int(%ld) != "
             "asn_realloc_rbuild_unsigned_int(%ld)",
             intval[i], intval[i]));
        free (rbuild_result);
    }
}

#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES

#define TOINT64(c) ((long long)(long)(c).high << 32 | (c).low)

{
    const struct counter64 intval[] = {
	{ 0x80000000U,          0U },
	{ 0x80000000U, 0xffffffffU },
	{ 0xffffffffU,           0 },
	{ 0xffffffffU, 0xffff0000U },
	{ 0xffffffffU, 0xfffffffcU },
	{ 0xffffffffU, 0xffffffffU },
	{           0,           0 },
	{           0,           1 },
	{           0,           3 },
	{           0,      0xffff },
	{           0,  0x7fffffff },
	{           1,           0 },
	{           1,  0xffffffff },
	{  0x7fffffff,           0 },
	{  0x7fffffff,  0xdeadbeef },
	{  0x7fffffff,  0xffffffff },
    };
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	struct counter64 decoded_value = { 0 };
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_signed_int64(encoded, &encoded_length,
					      ASN_OPAQUE_I64,
					      &intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_signed_int64(%lld)", TOINT64(intval[i])));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_signed_int64(encoded, &decoded_length,
					      &decoded_type, &decoded_value,
					      sizeof(decoded_value));
	OKF(parse_result == build_result && decoded_type == ASN_OPAQUE_I64
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
	    ("asn_parse_signed_int64(asn_build_signed_int64(%lld)) %s;"
	     " decoded type %d <> %d; decoded value %lld",
	     TOINT64(intval[i]),
	     parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_OPAQUE_I64, TOINT64(decoded_value)));

        OKF(asn_realloc_rbuild_signed_int64(&rbuild_result, &rbuild_len,
                                            &offset, 1, ASN_OPAQUE_I64,
                                            &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_signed_int64(%lld)", TOINT64(intval[i])));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_signed_int64(%lld) != "
             "asn_realloc_rbuild_signed_int64(%lld)",
             TOINT64(intval[i]), TOINT64(intval[i])));
        free (rbuild_result);
    }
}

#endif

#define TOUINT64(c) ((unsigned long long)(c).high << 32 | (c).low)

{
    const struct counter64 intval[] = {
	{          0,          0 },
	{          0,          1 },
	{          0,          3 },
	{          0,     0xffff },
	{          0, 0x7fffffff },
	{          0, 0x80000000 },
	{          0, 0xffffffff },
	{          1,          0 },
	{          1, 0xffffffff },
	{ 0x7fffffff,          0 },
	{ 0x7fffffff, 0xdeadbeef },
	{ 0x7fffffff, 0xffffffff },
	{ 0xffffffff,          0 },
	{ 0xffffffff, 0xdeadbeef },
	{ 0xffffffff, 0xffffffff },
    };
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	struct counter64 decoded_value = { 0 };
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
						ASN_COUNTER64,
						&intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
						&decoded_type, &decoded_value,
						sizeof(decoded_value));
	OKF(parse_result && decoded_type == ASN_COUNTER64
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
	     " decoded type %d <> %d; decoded value %llu",
	     TOUINT64(intval[i]),
	     parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_COUNTER64, TOUINT64(decoded_value)));

        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
                                              &offset, 1, ASN_COUNTER64,
                                              &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_unsigned_int64(%lld) != "
             "asn_realloc_rbuild_unsigned_int64(%lld)",
             TOUINT64(intval[i]), TOUINT64(intval[i])));
        free (rbuild_result);
    }

#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES

    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	struct counter64 decoded_value = { 0 };
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
						ASN_OPAQUE_COUNTER64,
						&intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
						&decoded_type, &decoded_value,
						sizeof(decoded_value));
	OKF(parse_result && decoded_type == ASN_OPAQUE_COUNTER64
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
	     " decoded type %d <> %d; decoded value %llu",
	     TOUINT64(intval[i]),
	     parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_OPAQUE_COUNTER64, TOUINT64(decoded_value)));

        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
                                              &offset, 1, ASN_OPAQUE_COUNTER64,
                                              &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_unsigned_int64(%lld) != "
             "asn_realloc_rbuild_unsigned_int64(%lld)",
             TOUINT64(intval[i]), TOUINT64(intval[i])));
        free (rbuild_result);
    }

    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
	u_char encoded[256];
	size_t encoded_length;
	u_char *build_result;
	size_t decoded_length;
	u_char decoded_type;
	struct counter64 decoded_value = { 0 };
	u_char *parse_result;
        u_char *rbuild_result = NULL;
        size_t rbuild_len = 0;
        size_t offset = 0;

	encoded_length = sizeof(encoded);
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
						ASN_OPAQUE_U64,
						&intval[i], sizeof(intval[i]));
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
	decoded_length = sizeof(encoded) - encoded_length;
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
						&decoded_type, &decoded_value,
						sizeof(decoded_value));
	OKF(parse_result && decoded_type == ASN_OPAQUE_U64
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
	     " decoded type %d <> %d; decoded value %llu",
	     TOUINT64(intval[i]),
	     parse_result == build_result ? "succeeded" : "failed",
	     decoded_type, ASN_OPAQUE_U64, TOUINT64(decoded_value)));

        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
                                              &offset, 1, ASN_OPAQUE_U64,
                                              &intval[i], sizeof(intval[i])),
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
        OKF(sizeof(encoded) - encoded_length == offset &&
            memcmp(encoded, rbuild_result + rbuild_len - offset,
                   offset) == 0,
            ("asn_build_unsigned_int64(%lld) != "
             "asn_realloc_rbuild_unsigned_int64(%lld)",
             TOUINT64(intval[i]), TOUINT64(intval[i])));
        free (rbuild_result);
    }

#endif
}
