UTF8String randomized fuzz-test

This commit is contained in:
Lev Walkin 2017-10-14 00:23:09 -07:00
parent 588bf0f7dc
commit 349b340767
5 changed files with 90 additions and 73 deletions

View File

@ -1862,6 +1862,66 @@ OCTET_STRING__random_char(unsigned long lb, unsigned long ub) {
}
}
size_t
OCTET_STRING_random_length_constrained(
const asn_TYPE_descriptor_t *td,
const asn_encoding_constraints_t *constraints, size_t max_length) {
const unsigned lengths[] = {0, 1, 2, 3, 4, 8,
126, 127, 128, 16383, 16384, 16385,
65534, 65535, 65536, 65537};
size_t rnd_len;
/* Figure out how far we should go */
rnd_len = lengths[asn_random_between(
0, sizeof(lengths) / sizeof(lengths[0]) - 1)];
if(!constraints) constraints = &td->encoding_constraints;
if(constraints->per_constraints) {
const asn_per_constraint_t *pc =
&td->encoding_constraints.per_constraints->size;
if(pc->flags & APC_CONSTRAINED) {
long suggested_upper_bound = pc->upper_bound < (ssize_t)max_length
? pc->upper_bound
: max_length;
if(max_length <= (size_t)pc->lower_bound) {
return pc->lower_bound;
}
if(pc->flags & APC_EXTENSIBLE) {
switch(asn_random_between(0, 5)) {
case 0:
if(pc->lower_bound > 0) {
rnd_len = pc->lower_bound - 1;
break;
}
/* Fall through */
case 1:
rnd_len = pc->upper_bound + 1;
break;
case 2:
/* Keep rnd_len from the table */
if(rnd_len <= max_length) {
break;
}
/* Fall through */
default:
rnd_len = asn_random_between(pc->lower_bound,
suggested_upper_bound);
}
} else {
rnd_len =
asn_random_between(pc->lower_bound, suggested_upper_bound);
}
} else {
rnd_len = asn_random_between(0, max_length);
}
} else if(rnd_len > max_length) {
rnd_len = asn_random_between(0, max_length);
}
return rnd_len;
}
asn_random_fill_result_t
OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
const asn_encoding_constraints_t *constraints,
@ -1872,9 +1932,6 @@ OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
asn_random_fill_result_t result_ok = {ARFILL_OK, 1};
asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
static unsigned lengths[] = {0, 1, 2, 3, 4, 8,
126, 127, 128, 16383, 16384, 16385,
65534, 65535, 65536, 65537};
unsigned int unit_bytes = 1;
unsigned long clb = 0; /* Lower bound on char */
unsigned long cub = 255; /* Higher bound on char value */
@ -1884,7 +1941,7 @@ OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
size_t rnd_len;
OCTET_STRING_t *st;
if(max_length == 0) return result_skipped;
if(max_length == 0 && !*sptr) return result_skipped;
switch(specs->subvariant) {
default:
@ -1922,50 +1979,8 @@ OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
}
}
/* Figure out how far we should go */
rnd_len = lengths[asn_random_between(
0, sizeof(lengths) / sizeof(lengths[0]) - 1)];
if(constraints->per_constraints) {
const asn_per_constraint_t *pc =
&td->encoding_constraints.per_constraints->size;
if(pc->flags & APC_CONSTRAINED) {
long suggested_upper_bound = pc->upper_bound < (ssize_t)max_length
? pc->upper_bound
: max_length;
if(max_length < (size_t)pc->lower_bound) {
return result_skipped;
}
if(pc->flags & APC_EXTENSIBLE) {
switch(asn_random_between(0, 5)) {
case 0:
if(pc->lower_bound > 0) {
rnd_len = pc->lower_bound - 1;
break;
}
/* Fall through */
case 1:
rnd_len = pc->upper_bound + 1;
break;
case 2:
/* Keep rnd_len from the table */
if(rnd_len < max_length) {
break;
}
/* Fall through */
default:
rnd_len = asn_random_between(pc->lower_bound,
suggested_upper_bound);
}
} else {
rnd_len =
asn_random_between(pc->lower_bound, suggested_upper_bound);
}
} else {
rnd_len = asn_random_between(0, max_length - 1);
}
} else if(rnd_len >= max_length) {
rnd_len = asn_random_between(0, max_length - 1);
}
rnd_len =
OCTET_STRING_random_length_constrained(td, constraints, max_length);
buf = CALLOC(unit_bytes, rnd_len + 1);
if(!buf) return result_failed;

View File

@ -89,6 +89,10 @@ typedef struct asn_OCTET_STRING_specifics_s {
extern asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs;
size_t OCTET_STRING_random_length_constrained(
const asn_TYPE_descriptor_t *, const asn_encoding_constraints_t *,
size_t max_length);
#ifdef __cplusplus
}
#endif

View File

@ -203,22 +203,21 @@ UTF8String_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
/*
* Biased function for randomizing UTF-8 sequences.
*/
static uint32_t
static size_t
UTF8String__random_char(uint8_t *b, size_t size) {
struct rnd_value {
static const struct rnd_value {
const char *value;
size_t size;
};
static const struct rnd_value values[] = {{"\0", 1},
{"\x01", 1},
{"\x7f", 1},
{"\xc2\xa2", 2},
{"\xe2\x82\xac", 3},
{"\xf0\x90\x8d\x88", 4},
{"\xf4\x8f\xbf\xbf", 4}};
} values[] = {{"\0", 1},
{"\x01", 1},
{"\x7f", 1},
{"\xc2\xa2", 2},
{"\xe2\x82\xac", 3},
{"\xf0\x90\x8d\x88", 4},
{"\xf4\x8f\xbf\xbf", 4}};
const struct rnd_value *v;
size_t max_idx;
size_t max_idx = 0;
switch(size) {
case 0:
@ -230,8 +229,10 @@ UTF8String__random_char(uint8_t *b, size_t size) {
case 2:
max_idx = 3;
break;
default:
case 4:
return sizeof(values) / sizeof(values[0]) - 1;
max_idx = sizeof(values) / sizeof(values[0]) - 1;
break;
}
v = &values[asn_random_between(0, max_idx)];
@ -246,9 +247,6 @@ UTF8String_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
asn_random_fill_result_t result_ok = {ARFILL_OK, 1};
asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
static unsigned lengths[] = {0, 1, 2, 3, 4, 8,
126, 127, 128, 16383, 16384, 16385,
65534, 65535, 65536, 65537};
uint8_t *buf;
uint8_t *bend;
uint8_t *b;
@ -256,17 +254,11 @@ UTF8String_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
size_t idx;
UTF8String_t *st;
(void)td;
(void)constraints;
if(max_length == 0) return result_skipped;
if(max_length == 0 && !*sptr) return result_skipped;
/* Figure out how far we should go */
rnd_len = lengths[asn_random_between(
0, sizeof(lengths) / sizeof(lengths[0]) - 1)];
if(4 * rnd_len >= max_length) {
rnd_len = asn_random_between(0, (max_length - 1) / 4);
}
rnd_len = OCTET_STRING_random_length_constrained(td, constraints,
max_length / 4);
buf = CALLOC(4, rnd_len + 1);
if(!buf) return result_failed;
@ -288,10 +280,11 @@ UTF8String_random_fill(const asn_TYPE_descriptor_t *td, void **sptr,
return result_failed;
}
}
assert(UTF8String_length(st) == (ssize_t)rnd_len);
st->buf = buf;
st->size = b - buf;
assert(UTF8String_length(st) == (ssize_t)rnd_len);
return result_ok;
}

View File

@ -33,6 +33,7 @@ TESTS += bundles/06-OCTET-STRING-bundle.txt
TESTS += bundles/07-VisibleString-bundle.txt
TESTS += bundles/08-OBJECT-IDENTIFIER-bundle.txt
TESTS += bundles/09-RELATIVE-OID-bundle.txt
TESTS += bundles/10-UTF8String-bundle.txt
EXTRA_DIST = \
random-test-driver.c \

View File

@ -0,0 +1,4 @@
UTF8String
UTF8String (SIZE(3))
UTF8String (FROM("A".."Z"))
UTF8String (FROM("A".."Z") INTERSECTION SIZE(3))