Lev Walkin | 4eceeba | 2007-07-23 06:48:26 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <assert.h> |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 3 | #include <errno.h> |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 4 | #include <sys/time.h> |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 5 | |
Lev Walkin | 4eceeba | 2007-07-23 06:48:26 +0000 | [diff] [blame] | 6 | #include <OBJECT_IDENTIFIER.h> |
| 7 | #include <RELATIVE-OID.h> |
| 8 | |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 9 | static int |
| 10 | _print(const void *buffer, size_t size, void *app_key) { |
Lev Walkin | 46bf935 | 2004-06-14 07:40:17 +0000 | [diff] [blame] | 11 | (void)app_key; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 12 | fwrite(buffer, size, 1, stdout); |
| 13 | return 0; |
| 14 | } |
| 15 | |
| 16 | static void |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 17 | check_OID(int lineno, uint8_t *buf, size_t len, unsigned *ck_buf, int ck_len) { |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 18 | OBJECT_IDENTIFIER_t *oid; |
Lev Walkin | dc06f6b | 2004-10-20 15:50:55 +0000 | [diff] [blame] | 19 | asn_dec_rval_t rval; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 20 | uint32_t arcs[10]; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 21 | int alen; |
| 22 | int i; |
| 23 | |
Lev Walkin | 0995f35 | 2017-09-17 23:16:38 -0700 | [diff] [blame] | 24 | printf("%03d: Checking {", lineno); |
Lev Walkin | 46bf935 | 2004-06-14 07:40:17 +0000 | [diff] [blame] | 25 | for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 26 | printf("} against {"); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 27 | for(i = 0; i < ck_len; i++) { printf("%s%u", i?" ":"", ck_buf[i]); } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 28 | printf("}\n"); |
| 29 | |
| 30 | oid = NULL; |
Lev Walkin | 5e03376 | 2004-09-29 13:26:15 +0000 | [diff] [blame] | 31 | rval = ber_decode(0, &asn_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 32 | assert(rval.code == RC_OK); |
| 33 | |
Lev Walkin | 494fb70 | 2017-08-07 20:07:00 -0700 | [diff] [blame] | 34 | assert((ssize_t)oid->size == (ssize_t)len - 2); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 35 | |
| 36 | /* |
| 37 | * Print the contents for visual debugging. |
| 38 | */ |
| 39 | printf("OBJECT_IDENTIFIER_print() => "); |
Lev Walkin | 5e03376 | 2004-09-29 13:26:15 +0000 | [diff] [blame] | 40 | OBJECT_IDENTIFIER_print(&asn_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 41 | printf("\n"); |
| 42 | |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 43 | memset(arcs, 'A', sizeof(arcs)); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 44 | alen = |
| 45 | OBJECT_IDENTIFIER_get_arcs(oid, arcs, sizeof(arcs) / sizeof(arcs[0])); |
| 46 | assert(alen > 0); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 47 | |
Lev Walkin | 6c9e071 | 2004-08-22 03:01:37 +0000 | [diff] [blame] | 48 | printf("OBJECT_IDENTIFIER_get_arcs() => {"); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 49 | /* |
| 50 | * Make sure they are equivalent. |
| 51 | */ |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 52 | for(i = 0; i < alen; i++) { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 53 | printf(" %" PRIu32, arcs[i]); |
| 54 | if(alen == ck_len) { |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 55 | assert(arcs[i] == ck_buf[i]); |
Lev Walkin | 6c9e071 | 2004-08-22 03:01:37 +0000 | [diff] [blame] | 56 | } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 57 | } |
| 58 | printf(" }\n"); |
Lev Walkin | 6c9e071 | 2004-08-22 03:01:37 +0000 | [diff] [blame] | 59 | assert(alen == ck_len); |
| 60 | |
Lev Walkin | 229ad00 | 2017-09-18 20:13:49 -0700 | [diff] [blame] | 61 | ASN_STRUCT_FREE(asn_DEF_OBJECT_IDENTIFIER, oid); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 62 | } |
| 63 | |
| 64 | static void |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 65 | check_ROID(int lineno, uint8_t *buf, size_t len, unsigned *ck_buf, |
| 66 | size_t ck_len) { |
| 67 | RELATIVE_OID_t *oid; |
Lev Walkin | dc06f6b | 2004-10-20 15:50:55 +0000 | [diff] [blame] | 68 | asn_dec_rval_t rval; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 69 | uint32_t arcs[10]; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 70 | int alen; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 71 | size_t i; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 72 | |
Lev Walkin | 0995f35 | 2017-09-17 23:16:38 -0700 | [diff] [blame] | 73 | printf("%03d: Checking {", lineno); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 74 | for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 75 | printf("} against {"); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 76 | for(i = 0; i < ck_len; i++) { printf("%s%u", i?" ":"", ck_buf[i]); } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 77 | printf("}\n"); |
| 78 | |
| 79 | oid = NULL; |
Lev Walkin | 5e03376 | 2004-09-29 13:26:15 +0000 | [diff] [blame] | 80 | rval = ber_decode(0, &asn_DEF_RELATIVE_OID, (void *)&oid, buf, len); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 81 | assert(rval.code == RC_OK); |
| 82 | |
Lev Walkin | 494fb70 | 2017-08-07 20:07:00 -0700 | [diff] [blame] | 83 | assert((ssize_t)oid->size == (ssize_t)len - 2); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 84 | |
| 85 | /* |
| 86 | * Print the contents for visual debugging. |
| 87 | */ |
| 88 | printf("RELATIVE_OID_print() => "); |
Lev Walkin | 5e03376 | 2004-09-29 13:26:15 +0000 | [diff] [blame] | 89 | RELATIVE_OID_print(&asn_DEF_RELATIVE_OID, oid, 0, _print, 0); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 90 | printf("\n"); |
| 91 | |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 92 | memset(arcs, 'A', sizeof(arcs)); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 93 | alen = RELATIVE_OID_get_arcs(oid, arcs, sizeof(arcs) / sizeof(arcs[0])); |
| 94 | assert(alen > 0); |
Vasil Velichkov | 72b1044 | 2017-10-19 04:38:38 +0300 | [diff] [blame] | 95 | assert((size_t)alen == ck_len); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 96 | |
| 97 | /* |
| 98 | * Make sure they are equivalent. |
| 99 | */ |
| 100 | printf("RELATIVE_OID_get_arcs() => {"); |
Vasil Velichkov | 72b1044 | 2017-10-19 04:38:38 +0300 | [diff] [blame] | 101 | for(i = 0; i < (size_t)alen; i++) { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 102 | printf(" %" PRIu32, arcs[i]); |
| 103 | assert(arcs[i] == ck_buf[i]); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 104 | } |
| 105 | printf(" }\n"); |
Lev Walkin | 229ad00 | 2017-09-18 20:13:49 -0700 | [diff] [blame] | 106 | ASN_STRUCT_FREE(asn_DEF_RELATIVE_OID, oid); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 107 | } |
| 108 | |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 109 | static int |
| 110 | check_speed() { |
| 111 | uint8_t buf[] = { 0x80 | 7, 0x80 | 2, 0x80 | 3, 0x80 | 4, 13 }; |
| 112 | int ret = 0; |
| 113 | int cycles = 100000000; |
| 114 | double a, b, c; |
| 115 | struct timeval tv; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 116 | uint32_t value; |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 117 | int i; |
| 118 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 119 | ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), &value); |
| 120 | assert(ret == 0); |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 121 | assert(value == 0x7040c20d); |
| 122 | |
| 123 | gettimeofday(&tv, 0); |
| 124 | a = tv.tv_sec + tv.tv_usec / 1000000.0; |
| 125 | for(i = 0; i < cycles; i++) { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 126 | ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), &value); |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 127 | } |
| 128 | assert(ret == 0); |
| 129 | assert(value == 0x7040c20d); |
| 130 | gettimeofday(&tv, 0); |
| 131 | b = tv.tv_sec + tv.tv_usec / 1000000.0; |
| 132 | for(i = 0; i < cycles; i++) { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 133 | ret = OBJECT_IDENTIFIER_get_single_arc(buf, sizeof(buf), &value); |
| 134 | } |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 135 | assert(ret == 0); |
| 136 | assert(value == 0x7040c20d); |
| 137 | gettimeofday(&tv, 0); |
| 138 | c = tv.tv_sec + tv.tv_usec / 1000000.0; |
| 139 | |
| 140 | a = b - a; |
| 141 | b = c - b; |
| 142 | printf("Time for single_arc(): %f\n", a); |
| 143 | printf("Time for get_arc_l(): %f\n", b); |
| 144 | |
| 145 | return 0; |
| 146 | } |
| 147 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 148 | #define CHECK_PARSE(a, b) check_parse(__LINE__, a, b) |
| 149 | static void check_parse(int lineno, const char *oid_txt, int retval) { |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 150 | int ret; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 151 | uint32_t arcs[2]; |
Lev Walkin | cad560a | 2013-03-16 07:00:58 -0700 | [diff] [blame] | 152 | const char *p = oid_txt - 13; |
| 153 | assert(p < oid_txt); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 154 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 155 | ret = OBJECT_IDENTIFIER_parse_arcs(oid_txt, -1, arcs, 2, &p); |
| 156 | printf("%03d: [%s] => %d == %d\n", lineno, oid_txt, ret, retval); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 157 | assert(ret == retval); |
| 158 | assert(p >= oid_txt); |
| 159 | } |
| 160 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 161 | static void |
| 162 | check_xer(int lineno, asn_TYPE_descriptor_t *td, ssize_t expect_arcs, char *xer, |
| 163 | const asn_oid_arc_t *expected_arcs) { |
| 164 | asn_dec_rval_t rc; |
| 165 | void *st = 0; |
| 166 | uint32_t arcs[10]; |
| 167 | ssize_t got_arcs; |
| 168 | ssize_t i; |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 169 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 170 | printf("%03d: [%s] => ", lineno, xer); |
| 171 | fflush(stdout); |
| 172 | rc = td->op->xer_decoder(0, td, (void **)&st, "t", xer, strlen(xer)); |
| 173 | if(expect_arcs == -1) { |
Lev Walkin | f592711 | 2012-09-03 00:48:45 -0700 | [diff] [blame] | 174 | if(rc.code != RC_OK) { |
| 175 | printf("-1\n"); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 176 | ASN_STRUCT_FREE(*td, st); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 177 | return; |
Lev Walkin | f592711 | 2012-09-03 00:48:45 -0700 | [diff] [blame] | 178 | } |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 179 | } |
| 180 | assert(rc.code == RC_OK); |
| 181 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 182 | if(td == &asn_DEF_OBJECT_IDENTIFIER) { |
| 183 | got_arcs = OBJECT_IDENTIFIER_get_arcs(st, arcs, |
| 184 | sizeof(arcs) / sizeof(arcs[0])); |
| 185 | } else if(td == &asn_DEF_RELATIVE_OID) { |
| 186 | got_arcs = |
| 187 | RELATIVE_OID_get_arcs(st, arcs, sizeof(arcs) / sizeof(arcs[0])); |
| 188 | } else { |
| 189 | assert(!"Unreachable"); |
| 190 | } |
| 191 | assert(got_arcs < 10); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 192 | if(expect_arcs == -1) { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 193 | assert(got_arcs == -1); |
| 194 | ASN_STRUCT_FREE(*td, st); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 195 | return; |
| 196 | } |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 197 | for(i = 0; i < got_arcs; i++) { |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 198 | if(i) printf("."); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 199 | printf("%" PRIu32, arcs[i]); |
| 200 | if(arcs[i] != expected_arcs[i]) { |
| 201 | printf(" != %" PRIu32 "\n", expected_arcs[i]); |
| 202 | } |
| 203 | assert(arcs[i] == expected_arcs[i]); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 204 | } |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 205 | printf(": %zd == %zd\n", got_arcs, expect_arcs); |
| 206 | assert(got_arcs == expect_arcs); |
| 207 | ASN_STRUCT_FREE(*td, st); |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 208 | } |
| 209 | |
Lev Walkin | 0995f35 | 2017-09-17 23:16:38 -0700 | [diff] [blame] | 210 | #define CHECK_OID(n) \ |
| 211 | check_OID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \ |
| 212 | sizeof(buf##n##_check) / sizeof(buf##n##_check[0])) |
| 213 | #define CHECK_ROID(n) \ |
| 214 | check_ROID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \ |
| 215 | sizeof(buf##n##_check) / sizeof(buf##n##_check[0])) |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 216 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 217 | static void |
| 218 | check_binary_parsing() { |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 219 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 220 | /* {0 0} */ |
| 221 | uint8_t buf0[] = { |
| 222 | 0x06, /* OBJECT IDENTIFIER */ |
| 223 | 0x01, /* Length */ |
| 224 | 0x00 |
| 225 | }; |
| 226 | uint32_t buf0_check[] = { 0, 0 }; |
| 227 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 228 | /* {joint-iso-itu-t 230 3} */ |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 229 | uint8_t buf1[] = { |
| 230 | 0x06, /* OBJECT IDENTIFIER */ |
| 231 | 0x03, /* Length */ |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 232 | 0x82, 0x36, 0x03 |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 233 | }; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 234 | uint32_t buf1_check[] = { 2, 230, 3 }; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 235 | |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 236 | /* {joint-iso-itu-t 42 } */ |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 237 | uint8_t buf2[] = { |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 238 | 0x06, /* OBJECT IDENTIFIER */ |
| 239 | 0x01, /* Length */ |
| 240 | 0x7A |
| 241 | }; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 242 | uint32_t buf2_check[] = { 2, 42 }; |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 243 | |
| 244 | /* {joint-iso-itu-t 25957 } */ |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 245 | uint8_t buf3[] = { |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 246 | 0x06, /* OBJECT IDENTIFIER */ |
| 247 | 0x03, /* Length */ |
| 248 | 0x81, 0x80 + 0x4B, 0x35 |
| 249 | }; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 250 | uint32_t buf3_check[] = { 2, 25957 }; |
Lev Walkin | 0787ff0 | 2004-06-17 23:43:39 +0000 | [diff] [blame] | 251 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 252 | /* { jounsigned-iso-itu-t 2 1 1 } */ |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 253 | uint8_t buf4[] = { |
Lev Walkin | 6c9e071 | 2004-08-22 03:01:37 +0000 | [diff] [blame] | 254 | 0x06, /* OBJECT IDENTIFIER */ |
| 255 | 0x03, /* Length */ |
| 256 | 0x52, 0x01, 0x01 |
| 257 | }; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 258 | uint32_t buf4_check[] = { 2, 2, 1, 1 }; |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 259 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 260 | /* { jounsigned-iso-itu-t 2 1 0 1 } */ |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 261 | uint8_t buf5[] = { |
Lev Walkin | 3251b8e | 2004-08-23 09:23:02 +0000 | [diff] [blame] | 262 | 0x06, /* OBJECT IDENTIFIER */ |
| 263 | 0x04, /* Length */ |
| 264 | 0x52, 0x01, 0x00, 0x01 |
| 265 | }; |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 266 | uint32_t buf5_check[] = { 2, 2, 1, 0, 1 }; |
Lev Walkin | 3251b8e | 2004-08-23 09:23:02 +0000 | [diff] [blame] | 267 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 268 | /* {0 0} */ |
| 269 | uint8_t buf10[] = { |
| 270 | 0x0D, /* RELATIVE-OID */ |
| 271 | 0x01, /* Length */ |
| 272 | 0x00 |
| 273 | }; |
| 274 | uint32_t buf10_check[] = { 0 }; |
| 275 | |
| 276 | /* {0 0} */ |
| 277 | uint8_t buf11[] = { |
| 278 | 0x0D, /* RELATIVE-OID */ |
| 279 | 0x02, /* Length */ |
| 280 | 0x00, 0x00 |
| 281 | }; |
| 282 | uint32_t buf11_check[] = { 0, 0 }; |
| 283 | |
| 284 | /* {8571 3 2} */ |
| 285 | uint8_t buf12[] = { |
| 286 | 0x0D, /* RELATIVE-OID */ |
| 287 | 0x04, /* Length */ |
| 288 | 0xC2, 0x7B, 0x03, 0x02 |
| 289 | }; |
| 290 | uint32_t buf12_check[] = { 8571, 3, 2 }; |
| 291 | |
| 292 | CHECK_OID(0); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 293 | CHECK_OID(1); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 294 | CHECK_OID(2); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 295 | CHECK_OID(3); |
| 296 | CHECK_OID(4); |
| 297 | CHECK_OID(5); |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 298 | |
| 299 | CHECK_ROID(10); |
| 300 | CHECK_ROID(11); |
| 301 | CHECK_ROID(12); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 302 | } |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 303 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 304 | static void |
| 305 | check_text_parsing() { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 306 | CHECK_PARSE("", 0); |
| 307 | CHECK_PARSE(" ", 0); |
| 308 | CHECK_PARSE(".", -1); |
| 309 | CHECK_PARSE(" .", -1); |
| 310 | CHECK_PARSE(".1", -1); |
| 311 | CHECK_PARSE("1.", -1); |
| 312 | CHECK_PARSE("1. ", -1); |
| 313 | CHECK_PARSE(".1. ", -1); |
| 314 | CHECK_PARSE(" .1. ", -1); |
| 315 | CHECK_PARSE(" 1", 1); |
| 316 | CHECK_PARSE(" 1.2", 2); |
| 317 | CHECK_PARSE(" 1.", -1); |
| 318 | CHECK_PARSE(" 1. ", -1); |
| 319 | CHECK_PARSE("1. ", -1); |
| 320 | CHECK_PARSE("1.2", 2); |
| 321 | CHECK_PARSE("1.2 ", 2); |
| 322 | CHECK_PARSE("1.2 ", 2); |
| 323 | CHECK_PARSE(" 1.2 ", 2); |
| 324 | CHECK_PARSE("1. 2", -1); |
| 325 | CHECK_PARSE("1 .2", -1); |
| 326 | CHECK_PARSE(" 1 .2", -1); |
| 327 | CHECK_PARSE(" 1 .2 ", -1); |
| 328 | CHECK_PARSE("1 .2 ", -1); |
| 329 | CHECK_PARSE("1.+1", -1); |
| 330 | CHECK_PARSE("2.0", 2); |
| 331 | CHECK_PARSE("2.1", 2); |
| 332 | CHECK_PARSE("10.30.234.234", 4); |
| 333 | CHECK_PARSE("10.30.234.234 ", 4); |
| 334 | CHECK_PARSE("10.30.234. 234 ", -1); |
| 335 | CHECK_PARSE("10.30.234.234.", -1); |
| 336 | CHECK_PARSE("1.2000000000.3", 3); |
| 337 | CHECK_PARSE("1.2147483647.3", 3); |
| 338 | CHECK_PARSE("1.4294967295.3", 3); |
| 339 | CHECK_PARSE("1.4294967296.3", -1); /* overflow on ILP32 */ |
| 340 | CHECK_PARSE("1.3000000000.3", 3); |
| 341 | CHECK_PARSE("1.4000000000.3", 3); |
| 342 | CHECK_PARSE("1.5000000000.3", -1); |
| 343 | CHECK_PARSE("1.6000000000.3", -1); |
| 344 | CHECK_PARSE("1.9000000000.3", -1); |
| 345 | CHECK_PARSE("1.900a0000000.3", -1); |
| 346 | CHECK_PARSE("1.900a.3", -1); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 347 | } |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 348 | |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 349 | #define CHECK_XER(a, b, c, data) check_xer(__LINE__, &asn_DEF_##a, b, c, data) |
| 350 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 351 | static void |
| 352 | check_xer_parsing() { |
Lev Walkin | 588bf0f | 2017-10-13 23:51:16 -0700 | [diff] [blame] | 353 | asn_oid_arc_t zero_zero[] = {0, 0}; |
| 354 | asn_oid_arc_t zero_one[] = {0, 1}; |
| 355 | asn_oid_arc_t one_zero[] = {1, 0}; |
| 356 | asn_oid_arc_t one_one[] = {1, 1}; |
| 357 | asn_oid_arc_t one_two[] = {1, 2}; |
| 358 | asn_oid_arc_t two_one[] = {2, 1}; |
| 359 | asn_oid_arc_t one_two_three[] = {1, 2,3}; |
| 360 | |
| 361 | CHECK_XER(RELATIVE_OID, -1, "<t></t>", 0); |
| 362 | CHECK_XER(RELATIVE_OID, -1, "<t>1.</t>", 0); |
| 363 | CHECK_XER(RELATIVE_OID, -1, "<t>2.1.</t>", 0); |
| 364 | CHECK_XER(RELATIVE_OID, 2, "<t>0.0</t>", zero_zero); |
| 365 | CHECK_XER(RELATIVE_OID, 2, "<t>0.1</t>", zero_one); |
| 366 | CHECK_XER(RELATIVE_OID, 2, "<t>1.0</t>", one_zero); |
| 367 | CHECK_XER(RELATIVE_OID, 2, "<t>1.2</t>", one_two); |
| 368 | CHECK_XER(RELATIVE_OID, -1, "<t>1.-2</t>", 0); |
| 369 | CHECK_XER(RELATIVE_OID, -1, "<t>1.+2</t>", 0); |
| 370 | CHECK_XER(RELATIVE_OID, 3, "<t>1.2.3</t>", one_two_three); |
| 371 | CHECK_XER(RELATIVE_OID, 3, "<t> 1.2.3 </t>", one_two_three); |
| 372 | CHECK_XER(RELATIVE_OID, -1, "<t>1.2.3 1</t>", 0); |
| 373 | CHECK_XER(RELATIVE_OID, 2, "<t>2.1</t>", two_one); |
| 374 | |
| 375 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t></t>", 0); |
| 376 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>1</t>", 0); |
| 377 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>1.</t>", 0); |
| 378 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>2.1.</t>", 0); |
| 379 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t>0.0</t>", zero_zero); |
| 380 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t>0.1</t>", zero_one); |
| 381 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t>1.0</t>", one_zero); |
| 382 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t>1.1</t>", one_one); |
| 383 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t>1.2</t>", one_two); |
| 384 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>1.-2</t>", 0); |
| 385 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>1.+2</t>", 0); |
| 386 | CHECK_XER(OBJECT_IDENTIFIER, 3, "<t>1.2.3</t>", one_two_three); |
| 387 | CHECK_XER(OBJECT_IDENTIFIER, 3, "<t> 1.2.3 </t>", one_two_three); |
| 388 | CHECK_XER(OBJECT_IDENTIFIER, -1, "<t>1.2.3 1</t>", 0); |
| 389 | CHECK_XER(OBJECT_IDENTIFIER, 2, "<t> 2.1 </t>", two_one); |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 390 | } |
Lev Walkin | 9230225 | 2004-10-23 10:16:51 +0000 | [diff] [blame] | 391 | |
Lev Walkin | 6cbed3d | 2017-10-07 16:42:41 -0700 | [diff] [blame] | 392 | int |
| 393 | main() { |
| 394 | check_binary_parsing(); |
| 395 | check_text_parsing(); |
| 396 | check_xer_parsing(); |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 397 | |
Lev Walkin | c4c6196 | 2004-06-14 08:17:27 +0000 | [diff] [blame] | 398 | if(getenv("CHECK_SPEED")) { |
| 399 | /* Useful for developers only */ |
| 400 | check_speed(); |
| 401 | } |
Lev Walkin | 29a044b | 2004-06-14 07:24:36 +0000 | [diff] [blame] | 402 | |
Lev Walkin | f15320b | 2004-06-03 03:38:44 +0000 | [diff] [blame] | 403 | return 0; |
| 404 | } |
Lev Walkin | 725883b | 2006-10-09 12:07:58 +0000 | [diff] [blame] | 405 | |