blob: 991f262653a762e17883e6e02bc38b12396fb414 [file] [log] [blame]
Lev Walkinf15320b2004-06-03 03:38:44 +00001#undef NDEBUG
2#include <stdio.h>
3#include <stdlib.h>
4#include <sys/types.h>
5#include <string.h>
6#include <assert.h>
7
8#include <T1.h>
9
10uint8_t buf1[] = {
11 32 | 16, /* [UNIVERSAL 16], constructed */
12 12, /* L */
13 /* INTEGER a */
14 ((2 << 6) + 0), /* [0], primitive */
15 2, /* L */
16 150,
17 70,
18 /* b [1] EXPLICIT CHOICE */
19 32 | ((2 << 6) + 1), /* [1] */
20 3, /* L */
21 ((2 << 6) + 1), /* [1] */
22 1,
23 'i',
24 /* UTF8String c */
25 ((2 << 6) + 2), /* [2], primitive */
26 1, /* L */
27 'x'
28};
29
30uint8_t buf2[128];
31int buf2_pos;
32
33static int
34buf2_fill(const void *buffer, size_t size, void *app_key) {
Lev Walkind9bd7752004-06-05 08:17:50 +000035
36 (void)app_key;
37
Lev Walkinf15320b2004-06-03 03:38:44 +000038 if(buf2_pos + size > sizeof(buf2))
39 return -1;
40
41 memcpy(buf2 + buf2_pos, buffer, size);
42 buf2_pos += size;
43
44 return 0;
45}
46
47static void
Lev Walkin1715b322013-03-28 04:02:13 -070048check(int is_ok, uint8_t *buf, size_t size, size_t consumed) {
Lev Walkinf15320b2004-06-03 03:38:44 +000049 T1_t t, *tp;
Lev Walkinc46b7cb2006-08-18 02:27:55 +000050 void *tpp = &tp;
Lev Walkin90bf7ae2004-10-20 15:46:56 +000051 asn_dec_rval_t rval;
Lev Walkina9cc46e2004-09-22 16:06:28 +000052 asn_enc_rval_t erval;
53 int ret;
Lev Walkinf15320b2004-06-03 03:38:44 +000054 int i;
55
56 tp = memset(&t, 0, sizeof(t));
57
58 fprintf(stderr, "Buf %p\n", buf);
Lev Walkinc46b7cb2006-08-18 02:27:55 +000059 rval = ber_decode(0, &asn_DEF_T1, (void **)tpp, buf, size);
Lev Walkinf15320b2004-06-03 03:38:44 +000060 fprintf(stderr, "Returned code %d, consumed %d\n",
61 (int)rval.code, (int)rval.consumed);
62
63 if(is_ok) {
64 assert(rval.code == RC_OK);
Lev Walkind9bd7752004-06-05 08:17:50 +000065 assert(rval.consumed == (size_t)consumed);
Lev Walkinf15320b2004-06-03 03:38:44 +000066 assert(t.a.size == 2);
67 assert(t.b.present == b_PR_n);
68 assert(t.b.choice.n.size == 1);
69 assert(t.b.choice.n.buf[0] == 'i');
70 assert(t.c.size == 1);
71 assert(t.c.buf[0] == 'x');
72
73 } else {
74 if(rval.code == RC_OK) {
75 assert(t.a.size != 2
76 || t.b.present != b_PR_n
77 || t.b.choice.n.size != 1
78 || t.c.size != 1
79 );
80 }
Lev Walkind9bd7752004-06-05 08:17:50 +000081 assert(rval.consumed <= (size_t)consumed);
Lev Walkinf15320b2004-06-03 03:38:44 +000082 return;
83 }
84
85 fprintf(stderr, "=> Re-creating using DER encoder <=\n");
86
87 /*
88 * Try to re-create using DER encoding.
89 */
90 buf2_pos = 0;
Lev Walkinc7400c52004-09-29 13:14:36 +000091 erval = der_encode(&asn_DEF_T1, tp, buf2_fill, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +000092 assert(erval.encoded != -1);
93 if(erval.encoded != sizeof(buf1)) {
94 printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1));
95 }
Lev Walkin5b63acf2014-01-14 01:48:37 -080096 assert(erval.encoded == (ssize_t)sizeof(buf1));
Lev Walkind9bd7752004-06-05 08:17:50 +000097 for(i = 0; i < (ssize_t)sizeof(buf1); i++) {
Lev Walkinf15320b2004-06-03 03:38:44 +000098 if(buf1[i] != buf2[i]) {
99 fprintf(stderr, "Recreated buffer content mismatch:\n");
100 fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n",
101 i,
102 buf1[i], buf2[i],
103 buf1[i], buf2[i]
104 );
105 }
106 assert(buf1[i] == buf2[i]);
107 }
108
Lev Walkina9cc46e2004-09-22 16:06:28 +0000109 fprintf(stderr, "=== asn_fprint() ===\n");
Lev Walkinc7400c52004-09-29 13:14:36 +0000110 ret = asn_fprint(stderr, &asn_DEF_T1, tp);
Lev Walkina9cc46e2004-09-22 16:06:28 +0000111 assert(ret == 0);
112 fprintf(stderr, "=== xer_fprint() ===\n");
Lev Walkinc7400c52004-09-29 13:14:36 +0000113 ret = xer_fprint(stderr, &asn_DEF_T1, tp);
Lev Walkina9cc46e2004-09-22 16:06:28 +0000114 assert(ret == 0);
Lev Walkinf15320b2004-06-03 03:38:44 +0000115 fprintf(stderr, "=== EOF ===\n");
116}
117
118static void
Lev Walkin1715b322013-03-28 04:02:13 -0700119try_corrupt(uint8_t *buf, size_t size) {
Lev Walkinf15320b2004-06-03 03:38:44 +0000120 uint8_t *tmp;
121 int i;
122
123 fprintf(stderr, "\nCorrupting...\n");
124
125 tmp = alloca(size);
126
127 for(i = 0; i < 1000; i++) {
128 int loc;
129 memcpy(tmp, buf, size);
130
131 /* Corrupt random _non-value_ location. */
132 do { loc = random() % size; } while(tmp[loc] >= 70);
133 do { tmp[loc] ^= random(); } while(tmp[loc] == buf[loc]);
134
135 fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n",
136 i, loc, buf[loc], tmp[loc]);
137
138 check(0, tmp, size, size);
139 }
140}
141
142int
143main(int ac, char **av) {
144
Lev Walkind9bd7752004-06-05 08:17:50 +0000145 (void)ac; /* Unused argument */
146 (void)av; /* Unused argument */
147
Lev Walkinf15320b2004-06-03 03:38:44 +0000148 check(1, buf1, sizeof(buf1), sizeof(buf1));
149 try_corrupt(buf1, sizeof(buf1));
150 check(1, buf1, sizeof(buf1) + 10, sizeof(buf1));
151
152 return 0;
153}