mirror of https://gerrit.osmocom.org/asn1c
279 lines
6.6 KiB
C
279 lines
6.6 KiB
C
#include "../RELATIVE-OID.c"
|
|
#include "../OBJECT_IDENTIFIER.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");
|
|
|
|
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");
|
|
|
|
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 {");
|
|
for(i = 0; i < acount; i++) {
|
|
printf(" %u", arcs[i]);
|
|
}
|
|
printf(" }\n");
|
|
|
|
ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount);
|
|
assert(ret == 0);
|
|
|
|
alen = RELATIVE_OID_get_arcs(&oid, tmp_arcs,
|
|
sizeof(tmp_arcs[0]), tmp_alen);
|
|
assert(alen >= 0);
|
|
assert(alen < tmp_alen);
|
|
|
|
printf("Encoded {");
|
|
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 {");
|
|
for(i = 0; i < acount; i++) {
|
|
printf(" %u", arcs[i]);
|
|
}
|
|
printf(" }\n");
|
|
|
|
ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount);
|
|
assert(ret == 0);
|
|
|
|
alen = OBJECT_IDENTIFIER_get_arcs(&oid,
|
|
tmp_arcs, sizeof(tmp_arcs[0]), tmp_alen);
|
|
assert(alen >= 0);
|
|
assert(alen < tmp_alen);
|
|
|
|
printf("Encoded {");
|
|
for(i = 0; i < alen; i++) {
|
|
printf(" %lu", tmp_arcs[i]);
|
|
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() {
|
|
/* {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 };
|
|
|
|
int buf3_check[] = { 0 };
|
|
int buf4_check[] = { 1 };
|
|
int buf5_check[] = { 80, 40 };
|
|
int buf6_check[] = { 127 };
|
|
int buf7_check[] = { 128 };
|
|
int buf8_check[] = { 65535, 65536 };
|
|
int buf9_check[] = { 100000, 0x20000, 1234, 256, 127, 128 };
|
|
int buf10_check[] = { 0, 0xffffffff, 0xff00ff00, 0 };
|
|
int buf11_check[] = { 0, 1, 2 };
|
|
int buf12_check[] = { 1, 38, 3 };
|
|
int buf13_check[] = { 0, 0, 0xf000 };
|
|
|
|
|
|
CHECK_OID(1); /* buf1, buf1_check */
|
|
CHECK_ROID(2); /* buf2, buf2_check */
|
|
|
|
CHECK_REGEN(3); /* Regenerate RELATIVE-OID */
|
|
CHECK_REGEN(4);
|
|
CHECK_REGEN(5);
|
|
CHECK_REGEN(6);
|
|
CHECK_REGEN(7);
|
|
CHECK_REGEN(8);
|
|
CHECK_REGEN(9);
|
|
CHECK_REGEN(10);
|
|
CHECK_REGEN_OID(1); /* Regenerate OBJECT IDENTIFIER */
|
|
CHECK_REGEN_OID(11);
|
|
CHECK_REGEN_OID(12);
|
|
CHECK_REGEN_OID(13);
|
|
|
|
if(getenv("CHECK_SPEED")) {
|
|
/* Useful for developers only */
|
|
check_speed();
|
|
}
|
|
|
|
return 0;
|
|
}
|