11 32 | ((2 << 6) + 5), /* [5], constructed */
13 32 | 16, /* [UNIVERSAL 16], constructed */
16 2, /* [UNIVERSAL 2] */
21 ((2 << 6) + 0), /* [0] */
25 ((2 << 6) + 1), /* [1] */
29 32 | ((2 << 6) + 5), /* [5], constructed */
37 check(int is_ok, uint8_t *buf, size_t size, size_t consumed) {
41 tp = memset(&t, 0, sizeof(t));
43 fprintf(stderr, "Buf %p\n", buf);
44 rval = ber_decode(0, &asn_DEF_T, (void **)&tp, buf, size);
45 fprintf(stderr, "Returned code %d, consumed %zd\n",
46 (int)rval.code, rval.consumed);
49 assert(rval.code == RC_OK);
50 assert(rval.consumed == consumed);
52 if(rval.code == RC_OK) {
54 || (!t.b || t.b->size != 1)
55 || (!t.c || t.c->size != 1)
59 assert(rval.consumed <= consumed);
62 ASN_STRUCT_RESET(asn_DEF_T, tp);
66 try_corrupt(uint8_t *buf, size_t size) {
69 fprintf(stderr, "\nCorrupting...\n");
71 for(int i = 0; i < 1000; i++) {
73 memcpy(tmp, buf, size);
75 /* Corrupt random _non-value_ location. */
76 do { loc = random() % size; } while(tmp[loc] >= 70);
77 do { tmp[loc] ^= random(); } while(tmp[loc] == buf[loc]);
79 fprintf(stderr, "\nTry %d: corrupting byte %d (%d->%d)\n",
80 i, loc, buf[loc], tmp[loc]);
82 check(0, tmp, size, size);
87 main(int ac, char **av) {
89 (void)ac; /* Unused argument */
90 (void)av; /* Unused argument */
92 check(1, buf1, sizeof(buf1), sizeof(buf1));
93 try_corrupt(buf1, sizeof(buf1));