blob: a97a910a2a3fb6bcb92144455eeb2b749510695f [file] [log] [blame]
vlmfa67ddc2004-06-03 03:38:44 +00001#include "../RELATIVE-OID.c"
2#include "../OBJECT_IDENTIFIER.c"
3#include "../INTEGER.c"
4#include "../ber_decoder.c"
5#include "../ber_tlv_length.c"
6#include "../ber_tlv_tag.c"
7#include "../der_encoder.c"
8#include "../constraints.c"
9
10static int
11_print(const void *buffer, size_t size, void *app_key) {
12 fwrite(buffer, size, 1, stdout);
13 return 0;
14}
15
16static void
17check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
18 OBJECT_IDENTIFIER_t *oid;
19 ber_dec_rval_t rval;
20 unsigned long arcs[10];
21 int alen;
22 int i;
23
24 printf("Checking {");
25 for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
26 printf("} against {");
27 for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
28 printf("}\n");
29
30 oid = NULL;
31 rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len);
32 assert(rval.code == RC_OK);
33
34 assert(oid->size == len - 2);
35
36 /*
37 * Print the contents for visual debugging.
38 */
39 printf("OBJECT_IDENTIFIER_print() => ");
40 OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0);
41 printf("\n");
42
43 alen = OBJECT_IDENTIFIER_get_arcs_l(oid,
44 arcs, sizeof(arcs)/sizeof(arcs[0]));
45 assert(alen > 0);
46 assert(alen == ck_len);
47
48 /*
49 * Make sure they are equivalent.
50 */
51 printf("OBJECT_IDENTIFIER_get_arcs() => {");
52 for(i = 0; i < alen; i++) {
53 printf(" %lu", arcs[i]);
54 assert(arcs[i] == ck_buf[i]);
55 }
56 printf(" }\n");
57}
58
59static void
60check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
61 RELATIVE_OID_t *oid;
62 ber_dec_rval_t rval;
63 unsigned long arcs[10];
64 int alen;
65 int i;
66
67 printf("Checking {");
68 for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
69 printf("} against {");
70 for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
71 printf("}\n");
72
73 oid = NULL;
74 rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len);
75 assert(rval.code == RC_OK);
76
77 assert(oid->size == len - 2);
78
79 /*
80 * Print the contents for visual debugging.
81 */
82 printf("RELATIVE_OID_print() => ");
83 RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0);
84 printf("\n");
85
86 alen = RELATIVE_OID_get_arcs_l(oid,
87 arcs, sizeof(arcs)/sizeof(arcs[0]));
88 assert(alen > 0);
89 assert(alen == ck_len);
90
91 /*
92 * Make sure they are equivalent.
93 */
94 printf("RELATIVE_OID_get_arcs() => {");
95 for(i = 0; i < alen; i++) {
96 printf(" %lu", (unsigned long)arcs[i]);
97 assert(arcs[i] == ck_buf[i]);
98 }
99 printf(" }\n");
100}
101
102/*
103 * Encode the specified array of arcs as RELATIVE-OID, decode it and compare.
104 */
105static void
106check_REGEN(int *arcs, int acount) {
107 static RELATIVE_OID_t oid;
108 unsigned long tmp_arcs[10];
109 int tmp_alen = 10;
110 int alen;
111 int ret;
112 int i;
113
114 printf("Encoding {");
115 for(i = 0; i < acount; i++) {
116 printf(" %u", arcs[i]);
117 }
118 printf(" }\n");
119
120 ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount);
121 assert(ret == 0);
122
123 alen = RELATIVE_OID_get_arcs_l(&oid, tmp_arcs, tmp_alen);
124 assert(alen >= 0);
125 assert(alen < tmp_alen);
126
127 printf("Encoded {");
128 for(i = 0; i < alen; i++) {
129 printf(" %lu", tmp_arcs[i]);
130 assert(arcs[i] == tmp_arcs[i]);
131 }
132 printf(" }\n");
133}
134
135/*
136 * Encode the specified array of arcs as OBJECT IDENTIFIER,
137 * decode it and compare.
138 */
139static void
140check_REGEN_OID(int *arcs, int acount) {
141 static OBJECT_IDENTIFIER_t oid;
142 unsigned long tmp_arcs[10];
143 int tmp_alen = 10;
144 int alen;
145 int ret;
146 int i;
147
148 printf("Encoding {");
149 for(i = 0; i < acount; i++) {
150 printf(" %u", arcs[i]);
151 }
152 printf(" }\n");
153
154 ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount);
155 assert(ret == 0);
156
157 alen = OBJECT_IDENTIFIER_get_arcs_l(&oid, tmp_arcs, tmp_alen);
158 assert(alen >= 0);
159 assert(alen < tmp_alen);
160
161 printf("Encoded {");
162 for(i = 0; i < alen; i++) {
163 printf(" %lu", tmp_arcs[i]);
164 assert(arcs[i] == tmp_arcs[i]);
165 }
166 printf(" }\n");
167}
168
169#define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \
170 buf ## n ## _check, \
171 sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
172#define CHECK_ROID(n) check_ROID(buf ## n, sizeof(buf ## n), \
173 buf ## n ## _check, \
174 sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
175#define CHECK_REGEN(n) check_REGEN(buf ## n ## _check, \
176 sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
177#define CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check, \
178 sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
179
180int
181main(int ac, char **av) {
182 /* {joint-iso-itu-t 100 3} */
183 uint8_t buf1[] = {
184 0x06, /* OBJECT IDENTIFIER */
185 0x03, /* Length */
186 0x81, 0x34, 0x03
187 };
188 int buf1_check[] = { 2, 100, 3 };
189
190 /* {8571 3 2} */
191 uint8_t buf2[] = {
192 0x0D, /* RELATIVE-OID */
193 0x04, /* Length */
194 0xC2, 0x7B, 0x03, 0x02
195 };
196 int buf2_check[] = { 8571, 3, 2 };
197
198 int buf3_check[] = { 0 };
199 int buf4_check[] = { 1 };
200 int buf5_check[] = { 80, 40 };
201 int buf6_check[] = { 127 };
202 int buf7_check[] = { 128 };
203 int buf8_check[] = { 65535, 65536 };
204 int buf9_check[] = { 100000, 0x20000, 1234, 256, 127, 128 };
205 int buf10_check[] = { 0, 0xffffffff, 0xff00ff00, 0 };
206 int buf11_check[] = { 0, 1, 2 };
207 int buf12_check[] = { 1, 38, 3 };
208 int buf13_check[] = { 0, 0, 0xf000 };
209
210
211 CHECK_OID(1); /* buf1, buf1_check */
212 CHECK_ROID(2); /* buf2, buf2_check */
213
214 CHECK_REGEN(3); /* Regenerate RELATIVE-OID */
215 CHECK_REGEN(4);
216 CHECK_REGEN(5);
217 CHECK_REGEN(6);
218 CHECK_REGEN(7);
219 CHECK_REGEN(8);
220 CHECK_REGEN(9);
221 CHECK_REGEN(10);
222 CHECK_REGEN_OID(1); /* Regenerate OBJECT IDENTIFIER */
223 CHECK_REGEN_OID(11);
224 CHECK_REGEN_OID(12);
225 CHECK_REGEN_OID(13);
226
227 return 0;
228}