11 32 | 16, /* [UNIVERSAL 16], constructed */
14 ((2 << 6) + 0), /* [0], primitive */
18 /* b [1] EXPLICIT CHOICE */
19 32 | ((2 << 6) + 1), /* [1] */
21 ((2 << 6) + 1), /* [1] */
25 ((2 << 6) + 2), /* [2], primitive */
34 buf2_fill(const void *buffer, size_t size, void *app_key) {
38 if(buf2_pos + size > sizeof(buf2))
41 memcpy(buf2 + buf2_pos, buffer, size);
48 check(int is_ok, uint8_t *buf, size_t size, size_t consumed) {
56 tp = memset(&t, 0, sizeof(t));
58 fprintf(stderr, "Buf %p\n", buf);
59 rval = ber_decode(0, &asn_DEF_T1, (void **)tpp, buf, size);
60 fprintf(stderr, "Returned code %d, consumed %d\n",
61 (int)rval.code, (int)rval.consumed);
64 assert(rval.code == RC_OK);
65 assert(rval.consumed == (size_t)consumed);
66 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');
74 if(rval.code == RC_OK) {
76 || t.b.present != b_PR_n
77 || t.b.choice.n.size != 1
81 assert(rval.consumed <= (size_t)consumed);
82 ASN_STRUCT_RESET(asn_DEF_T1, tp);
86 fprintf(stderr, "=> Re-creating using DER encoder <=\n");
89 * Try to re-create using DER encoding.
92 erval = der_encode(&asn_DEF_T1, tp, buf2_fill, 0);
93 assert(erval.encoded != -1);
94 if(erval.encoded != sizeof(buf1)) {
95 printf("%d != %d\n", (int)erval.encoded, (int)sizeof(buf1));
97 assert(erval.encoded == (ssize_t)sizeof(buf1));
98 for(i = 0; i < (ssize_t)sizeof(buf1); i++) {
99 if(buf1[i] != buf2[i]) {
100 fprintf(stderr, "Recreated buffer content mismatch:\n");
101 fprintf(stderr, "Byte %d, %x != %x (%d != %d)\n",
107 assert(buf1[i] == buf2[i]);
110 fprintf(stderr, "=== asn_fprint() ===\n");
111 ret = asn_fprint(stderr, &asn_DEF_T1, tp);
113 fprintf(stderr, "=== xer_fprint() ===\n");
114 ret = xer_fprint(stderr, &asn_DEF_T1, tp);
116 fprintf(stderr, "=== EOF ===\n");
118 ASN_STRUCT_RESET(asn_DEF_T1, tp);
122 try_corrupt(uint8_t *buf, size_t size) {
125 fprintf(stderr, "\nCorrupting...\n");
127 for(int i = 0; i < 1000; i++) {
129 memcpy(tmp, buf, size);
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]);
135 fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n",
136 i, loc, buf[loc], tmp[loc]);
138 check(0, tmp, size, size);
143 main(int ac, char **av) {
145 (void)ac; /* Unused argument */
146 (void)av; /* Unused argument */
148 check(1, buf1, sizeof(buf1), sizeof(buf1));
149 try_corrupt(buf1, sizeof(buf1));
150 check(1, buf1, sizeof(buf1) + 10, sizeof(buf1));