diff options
author | Lev Walkin <vlm@lionet.info> | 2004-08-13 12:38:42 +0000 |
---|---|---|
committer | Lev Walkin <vlm@lionet.info> | 2004-08-13 12:38:42 +0000 |
commit | 22b81a8fd2c4b5b8a7e804514991225b2a072c54 (patch) | |
tree | 52aced2359f28168e26f1b409e1791659d4a3b3e | |
parent | edefed0d35fc2caea6ed0f502735985f6c930146 (diff) |
indefinite length check
-rw-r--r-- | asn1c/tests/check-30.c | 119 |
1 files changed, 113 insertions, 6 deletions
diff --git a/asn1c/tests/check-30.c b/asn1c/tests/check-30.c index 4ac52120..20dc007d 100644 --- a/asn1c/tests/check-30.c +++ b/asn1c/tests/check-30.c @@ -7,6 +7,10 @@ #include <T.h> + +/* + * Test that the optional member (c) is really optional. + */ uint8_t buf1[] = { 32 | 17, /* [UNIVERSAL 17], constructed */ 8, /* L */ @@ -42,17 +46,114 @@ uint8_t buf2[] = { 97, }; +/* + * This buffer checks that an unexpected member may be properly ignored. + */ +uint8_t buf3[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 14, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected INTEGER */ + 64 | 4, /* [APPLICATION 4] */ + 1, /* L */ + 96, + + /* c [2] BOOLEAN */ + ((2 << 6) + 2), /* [2] */ + 1, /* L */ + 0xff +}; + +/* + * This buffer checks that an unexpected member may be properly ignored. + * This time, with indefinite length encoding. + */ +uint8_t buf4[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 16, /* L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected data structure */ + 32 | 64 | 4, /* [APPLICATION 4] */ + 0x80, /* indefinite L */ + 64 | 1, /* [APPLICATION 1] */ + 2, /* L */ + 'a', 'b', + + 0x00, + 0x00 +}; + +/* + * This buffer checks that an unexpected member may be properly ignored. + * This time, with indefinite length encoding at the outer level too. + */ +uint8_t buf5[] = { + 32 | 17, /* [UNIVERSAL 17], constructed */ + 0x80, /* indefinite L */ + + /* a INTEGER */ + 64 | 3, /* [APPLICATION 3] */ + 1, /* L */ + 96, + + /* b IA5String */ + 22, /* [UNIVERSAL 22] */ + 3, /* L */ + 'x', + 'y', + 'z', + + /* unexpected data structure */ + 32 | 64 | 4, /* [APPLICATION 4] */ + 0x80, /* indefinite L */ + 64 | 1, /* [APPLICATION 1] */ + 2, /* L */ + 'a', 'b', + + 0x00, + 0x00, + + 0x00, + 0x00 +}; + static void check(int is_ok, uint8_t *buf, int size, size_t consumed) { T_t t, *tp; ber_dec_rval_t rval; + fprintf(stderr, "\nMust %s:\n", is_ok?"suceed":"fail"); + tp = memset(&t, 0, sizeof(t)); fprintf(stderr, "Buf %p\n", buf); rval = ber_decode(&asn1_DEF_T, (void **)&tp, buf, size); - fprintf(stderr, "Returned code %d, consumed %d\n", - (int)rval.code, (int)rval.consumed); + fprintf(stderr, "Returned code %d, consumed %d (out of %d)\n", + (int)rval.code, (int)rval.consumed, size); if(is_ok) { assert(rval.code == RC_OK); @@ -61,8 +162,12 @@ check(int is_ok, uint8_t *buf, int size, size_t consumed) { assert(t.a.size == 1); assert(t.a.buf[0] == 96); assert(t.b.size == 3); - assert(t.c == 0); assert(strcmp(t.b.buf, "xyz") == 0); + if(buf == buf3) { + assert(t.c->value); + } else { + assert(t.c == 0); + } } else { if(rval.code == RC_OK) { assert(t.a.size != 1 @@ -106,11 +211,13 @@ main(int ac, char **av) { (void)ac; /* Unused argument */ (void)av; /* Unused argument */ - fprintf(stderr, "Must succeed:\n"); check(1, buf1, sizeof(buf1) + 20, sizeof(buf1)); - - fprintf(stderr, "\nMust fail:\n"); check(0, buf2, sizeof(buf2) + 1, 5); + check(1, buf3, sizeof(buf3) + 1, sizeof(buf3)); + check(1, buf4, sizeof(buf4), sizeof(buf4)); + check(1, buf5, sizeof(buf5), sizeof(buf5)); + check(1, buf5, sizeof(buf5) + 1, sizeof(buf5)); + check(0, buf5, sizeof(buf5) - 1, sizeof(buf5)); fprintf(stderr, "\nPseudo-random buffer corruptions must fail\n"); try_corrupt(buf1, sizeof(buf1)); |