Blame testing/fulltests/unit-tests/T008asn1_clib.c

Packit fcad23
/* HEADER Testing ASN.1 encoding and decoding */
Packit fcad23
Packit fcad23
int i;
Packit fcad23
Packit fcad23
#if 0
Packit fcad23
snmp_set_do_debugging(TRUE);
Packit fcad23
debug_register_tokens("dumpv_recv,dumpv_send,asn");
Packit fcad23
#endif
Packit fcad23
Packit fcad23
{
Packit fcad23
    const long intval[] = {
Packit fcad23
        -0x80000000L,
Packit fcad23
        -0x7fffffffL,
Packit fcad23
        -0xffffL,
Packit fcad23
        -3,
Packit fcad23
        -1,
Packit fcad23
        0,
Packit fcad23
        1,
Packit fcad23
        3,
Packit fcad23
        0xffff,
Packit fcad23
        0x7fffffff,
Packit fcad23
    };
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	long decoded_value = 0;
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_int(encoded, &encoded_length, ASN_INTEGER,
Packit fcad23
				     &intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_int(%ld)", intval[i]));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_int(encoded, &decoded_length, &decoded_type,
Packit fcad23
				     &decoded_value, sizeof(decoded_value));
Packit fcad23
	OKF(parse_result == build_result && decoded_type == ASN_INTEGER
Packit fcad23
	    && decoded_value == intval[i],
Packit fcad23
	    ("asn_parse_int(asn_build_int(%ld)) %s; decoded type %d <> %d;"
Packit fcad23
	     " decoded value %ld",
Packit fcad23
	     intval[i], parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_INTEGER, decoded_value));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_int(&rbuild_result, &rbuild_len, &offset, 1,
Packit fcad23
                                   ASN_INTEGER, &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_int(%ld)", intval[i]));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_int(%ld) != asn_realloc_rbuild_int(%ld)",
Packit fcad23
             intval[i], intval[i]));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
{
Packit fcad23
    const unsigned long intval[] = {
Packit fcad23
	0, 1, 3, 0xffff, 0x7fffffff, 0x80000000U, 0xffffffffU
Packit fcad23
    };
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	unsigned long decoded_value = 0;
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_unsigned_int(encoded, &encoded_length,
Packit fcad23
					      ASN_UINTEGER,
Packit fcad23
					      &intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_unsigned_int(%lu)", intval[i]));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_unsigned_int(encoded, &decoded_length,
Packit fcad23
					      &decoded_type, &decoded_value,
Packit fcad23
					      sizeof(decoded_value));
Packit fcad23
	OKF(parse_result && decoded_type == ASN_UINTEGER
Packit fcad23
	    && decoded_value == intval[i],
Packit fcad23
	    ("asn_parse_unsigned_int(asn_build_unsigned_int(%lu)) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded value %lu",
Packit fcad23
	     intval[i], parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_UINTEGER, decoded_value));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_unsigned_int(&rbuild_result, &rbuild_len,
Packit fcad23
                                            &offset, 1, ASN_UINTEGER,
Packit fcad23
                                            &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_unsigned_int(%lud)", intval[i]));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_unsigned_int(%ld) != "
Packit fcad23
             "asn_realloc_rbuild_unsigned_int(%ld)",
Packit fcad23
             intval[i], intval[i]));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
{
Packit fcad23
    static struct {
Packit fcad23
        unsigned char encoded[8];
Packit fcad23
        unsigned encoded_len;
Packit fcad23
        unsigned long decoded;
Packit fcad23
    } data[] = {
Packit fcad23
        { { ASN_UINTEGER, 1, 0x80			}, 3, 0x80 },
Packit fcad23
        { { ASN_UINTEGER, 2, 0x80, 0x00			}, 4, 0x8000 },
Packit fcad23
        { { ASN_UINTEGER, 3, 0x80, 0x00, 0x00		}, 5, 0x800000 },
Packit fcad23
        { { ASN_UINTEGER, 4, 0x80, 0x00, 0x00, 0x00	}, 6, 0x80000000 },
Packit fcad23
    };
Packit fcad23
    for (i = 0; i < sizeof(data)/sizeof(data[0]); i++) {
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	unsigned long decoded_value = 0;
Packit fcad23
	u_char *parse_result;
Packit fcad23
Packit fcad23
	decoded_length = data[i].encoded_len;
Packit fcad23
	parse_result = asn_parse_unsigned_int(data[i].encoded,
Packit fcad23
                                              &decoded_length,
Packit fcad23
					      &decoded_type, &decoded_value,
Packit fcad23
					      sizeof(decoded_value));
Packit fcad23
	OKF(parse_result && decoded_type == ASN_UINTEGER
Packit fcad23
	    && decoded_value == data[i].decoded,
Packit fcad23
	    ("asn_parse_unsigned_int(%02x %02x %02x %02x %02x %02x %02x %02x, %d) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded length %d; decoded value %lu",
Packit fcad23
	     data[i].encoded[0], data[i].encoded[1], data[i].encoded[2],
Packit fcad23
             data[i].encoded[3], data[i].encoded[4], data[i].encoded[5],
Packit fcad23
             data[i].encoded[6], data[i].encoded[7], data[i].encoded_len,
Packit fcad23
             parse_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_UINTEGER, (int)decoded_length, decoded_value));
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
Packit fcad23
Packit fcad23
#define TOINT64(c) ((long long)(long)(c).high << 32 | (c).low)
Packit fcad23
Packit fcad23
{
Packit fcad23
    const struct counter64 intval[] = {
Packit fcad23
	{ 0x80000000U,          0U },
Packit fcad23
	{ 0x80000000U, 0xffffffffU },
Packit fcad23
	{ 0xffffffffU,           0 },
Packit fcad23
	{ 0xffffffffU, 0xffff0000U },
Packit fcad23
	{ 0xffffffffU, 0xfffffffcU },
Packit fcad23
	{ 0xffffffffU, 0xffffffffU },
Packit fcad23
	{           0,           0 },
Packit fcad23
	{           0,           1 },
Packit fcad23
	{           0,           3 },
Packit fcad23
	{           0,      0xffff },
Packit fcad23
	{           0,  0x7fffffff },
Packit fcad23
	{           1,           0 },
Packit fcad23
	{           1,  0xffffffff },
Packit fcad23
	{  0x7fffffff,           0 },
Packit fcad23
	{  0x7fffffff,  0xdeadbeef },
Packit fcad23
	{  0x7fffffff,  0xffffffff },
Packit fcad23
    };
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	struct counter64 decoded_value = { 0 };
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_signed_int64(encoded, &encoded_length,
Packit fcad23
					      ASN_OPAQUE_I64,
Packit fcad23
					      &intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_signed_int64(%lld)", TOINT64(intval[i])));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_signed_int64(encoded, &decoded_length,
Packit fcad23
					      &decoded_type, &decoded_value,
Packit fcad23
					      sizeof(decoded_value));
Packit fcad23
	OKF(parse_result == build_result && decoded_type == ASN_OPAQUE_I64
Packit fcad23
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
Packit fcad23
	    ("asn_parse_signed_int64(asn_build_signed_int64(%lld)) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded value %lld",
Packit fcad23
	     TOINT64(intval[i]),
Packit fcad23
	     parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_OPAQUE_I64, TOINT64(decoded_value)));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_signed_int64(&rbuild_result, &rbuild_len,
Packit fcad23
                                            &offset, 1, ASN_OPAQUE_I64,
Packit fcad23
                                            &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_signed_int64(%lld)", TOINT64(intval[i])));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_signed_int64(%lld) != "
Packit fcad23
             "asn_realloc_rbuild_signed_int64(%lld)",
Packit fcad23
             TOINT64(intval[i]), TOINT64(intval[i])));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#define TOUINT64(c) ((unsigned long long)(c).high << 32 | (c).low)
Packit fcad23
Packit fcad23
{
Packit fcad23
    const struct counter64 intval[] = {
Packit fcad23
	{          0,          0 },
Packit fcad23
	{          0,          1 },
Packit fcad23
	{          0,          3 },
Packit fcad23
	{          0,     0xffff },
Packit fcad23
	{          0, 0x7fffffff },
Packit fcad23
	{          0, 0x80000000 },
Packit fcad23
	{          0, 0xffffffff },
Packit fcad23
	{          1,          0 },
Packit fcad23
	{          1, 0xffffffff },
Packit fcad23
	{ 0x7fffffff,          0 },
Packit fcad23
	{ 0x7fffffff, 0xdeadbeef },
Packit fcad23
	{ 0x7fffffff, 0xffffffff },
Packit fcad23
	{ 0xffffffff,          0 },
Packit fcad23
	{ 0xffffffff, 0xdeadbeef },
Packit fcad23
	{ 0xffffffff, 0xffffffff },
Packit fcad23
    };
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	struct counter64 decoded_value = { 0 };
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
Packit fcad23
						ASN_COUNTER64,
Packit fcad23
						&intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
Packit fcad23
						&decoded_type, &decoded_value,
Packit fcad23
						sizeof(decoded_value));
Packit fcad23
	OKF(parse_result && decoded_type == ASN_COUNTER64
Packit fcad23
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
Packit fcad23
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded value %llu",
Packit fcad23
	     TOUINT64(intval[i]),
Packit fcad23
	     parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_COUNTER64, TOUINT64(decoded_value)));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
Packit fcad23
                                              &offset, 1, ASN_COUNTER64,
Packit fcad23
                                              &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_unsigned_int64(%lld) != "
Packit fcad23
             "asn_realloc_rbuild_unsigned_int64(%lld)",
Packit fcad23
             TOUINT64(intval[i]), TOUINT64(intval[i])));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
Packit fcad23
#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
Packit fcad23
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	struct counter64 decoded_value = { 0 };
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
Packit fcad23
						ASN_OPAQUE_COUNTER64,
Packit fcad23
						&intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
Packit fcad23
						&decoded_type, &decoded_value,
Packit fcad23
						sizeof(decoded_value));
Packit fcad23
	OKF(parse_result && decoded_type == ASN_OPAQUE_COUNTER64
Packit fcad23
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
Packit fcad23
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded value %llu",
Packit fcad23
	     TOUINT64(intval[i]),
Packit fcad23
	     parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_OPAQUE_COUNTER64, TOUINT64(decoded_value)));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
Packit fcad23
                                              &offset, 1, ASN_OPAQUE_COUNTER64,
Packit fcad23
                                              &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_unsigned_int64(%lld) != "
Packit fcad23
             "asn_realloc_rbuild_unsigned_int64(%lld)",
Packit fcad23
             TOUINT64(intval[i]), TOUINT64(intval[i])));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    for (i = 0; i < sizeof(intval)/sizeof(intval[0]); ++i) {
Packit fcad23
	u_char encoded[256];
Packit fcad23
	size_t encoded_length;
Packit fcad23
	u_char *build_result;
Packit fcad23
	size_t decoded_length;
Packit fcad23
	u_char decoded_type;
Packit fcad23
	struct counter64 decoded_value = { 0 };
Packit fcad23
	u_char *parse_result;
Packit fcad23
        u_char *rbuild_result = NULL;
Packit fcad23
        size_t rbuild_len = 0;
Packit fcad23
        size_t offset = 0;
Packit fcad23
Packit fcad23
	encoded_length = sizeof(encoded);
Packit fcad23
	build_result = asn_build_unsigned_int64(encoded, &encoded_length,
Packit fcad23
						ASN_OPAQUE_U64,
Packit fcad23
						&intval[i], sizeof(intval[i]));
Packit fcad23
	OKF(build_result + encoded_length == encoded + sizeof(encoded),
Packit fcad23
	    ("asn_build_unsigned_int64(%llu)", TOUINT64(intval[i])));
Packit fcad23
	decoded_length = sizeof(encoded) - encoded_length;
Packit fcad23
	parse_result = asn_parse_unsigned_int64(encoded, &decoded_length,
Packit fcad23
						&decoded_type, &decoded_value,
Packit fcad23
						sizeof(decoded_value));
Packit fcad23
	OKF(parse_result && decoded_type == ASN_OPAQUE_U64
Packit fcad23
	    && memcmp(&decoded_value, &intval[i], sizeof(decoded_value)) == 0,
Packit fcad23
	    ("asn_parse_unsigned_int64(asn_build_unsigned_int64(%llu)) %s;"
Packit fcad23
	     " decoded type %d <> %d; decoded value %llu",
Packit fcad23
	     TOUINT64(intval[i]),
Packit fcad23
	     parse_result == build_result ? "succeeded" : "failed",
Packit fcad23
	     decoded_type, ASN_OPAQUE_U64, TOUINT64(decoded_value)));
Packit fcad23
Packit fcad23
        OKF(asn_realloc_rbuild_unsigned_int64(&rbuild_result, &rbuild_len,
Packit fcad23
                                              &offset, 1, ASN_OPAQUE_U64,
Packit fcad23
                                              &intval[i], sizeof(intval[i])),
Packit fcad23
            ("asn_realloc_rbuild_unsigned_int64(%llud)", TOUINT64(intval[i])));
Packit fcad23
        OKF(sizeof(encoded) - encoded_length == offset &&
Packit fcad23
            memcmp(encoded, rbuild_result + rbuild_len - offset,
Packit fcad23
                   offset) == 0,
Packit fcad23
            ("asn_build_unsigned_int64(%lld) != "
Packit fcad23
             "asn_realloc_rbuild_unsigned_int64(%lld)",
Packit fcad23
             TOUINT64(intval[i]), TOUINT64(intval[i])));
Packit fcad23
        free (rbuild_result);
Packit fcad23
    }
Packit fcad23
Packit fcad23
#endif
Packit fcad23
}