blob: b94714adbebaad83a5a9e65547d690fb08645617 [file] [log] [blame]
/* 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
}