blob: 8fe42a4578a9b2850d339d70f35431372941ee8c [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);
Vasil Velichkovcef21e02017-10-09 23:40:17 +030082 ASN_STRUCT_RESET(asn_DEF_T1, tp);
Lev Walkinf15320b2004-06-03 03:38:44 +000083 return;
84 }
85
86 fprintf(stderr, "=> Re-creating using DER encoder <=\n");
87
88 /*
89 * Try to re-create using DER encoding.
90 */
91 buf2_pos = 0;
Lev Walkinc7400c52004-09-29 13:14:36 +000092 erval = der_encode(&asn_DEF_T1, tp, buf2_fill, 0);
Lev Walkinf15320b2004-06-03 03:38:44 +000093 assert(erval.encoded != -1);
94 if(erval.encoded != sizeof(buf1)) {
95 printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1));
96 }
Lev Walkin5b63acf2014-01-14 01:48:37 -080097 assert(erval.encoded == (ssize_t)sizeof(buf1));
Lev Walkind9bd7752004-06-05 08:17:50 +000098 for(i = 0; i < (ssize_t)sizeof(buf1); i++) {
Lev Walkinf15320b2004-06-03 03:38:44 +000099 if(buf1[i] != buf2[i]) {
100 fprintf(stderr, "Recreated buffer content mismatch:\n");
101 fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n",
102 i,
103 buf1[i], buf2[i],
104 buf1[i], buf2[i]
105 );
106 }
107 assert(buf1[i] == buf2[i]);
108 }
109
Lev Walkina9cc46e2004-09-22 16:06:28 +0000110 fprintf(stderr, "=== asn_fprint() ===\n");
Lev Walkinc7400c52004-09-29 13:14:36 +0000111 ret = asn_fprint(stderr, &asn_DEF_T1, tp);
Lev Walkina9cc46e2004-09-22 16:06:28 +0000112 assert(ret == 0);
113 fprintf(stderr, "=== xer_fprint() ===\n");
Lev Walkinc7400c52004-09-29 13:14:36 +0000114 ret = xer_fprint(stderr, &asn_DEF_T1, tp);
Lev Walkina9cc46e2004-09-22 16:06:28 +0000115 assert(ret == 0);
Lev Walkinf15320b2004-06-03 03:38:44 +0000116 fprintf(stderr, "=== EOF ===\n");
Vasil Velichkovcef21e02017-10-09 23:40:17 +0300117
118 ASN_STRUCT_RESET(asn_DEF_T1, tp);
Lev Walkinf15320b2004-06-03 03:38:44 +0000119}
120
121static void
Lev Walkin1715b322013-03-28 04:02:13 -0700122try_corrupt(uint8_t *buf, size_t size) {
Lev Walkina4f8e942017-10-08 19:28:20 -0700123 uint8_t tmp[size];
Lev Walkinf15320b2004-06-03 03:38:44 +0000124
125 fprintf(stderr, "\nCorrupting...\n");
126
Lev Walkina4f8e942017-10-08 19:28:20 -0700127 for(int i = 0; i < 1000; i++) {
Lev Walkinf15320b2004-06-03 03:38:44 +0000128 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}