unittests: Restructure the BIT STRING tests

This commit is contained in:
Jakub Jelen 2019-11-05 17:10:25 +01:00
parent 71e45bb5a7
commit 1e2b0fe45f
1 changed files with 45 additions and 49 deletions

View File

@ -264,56 +264,47 @@ static void torture_negative_int(void **state)
assert_int_equal(value, -224); assert_int_equal(value, -224);
} }
/* #define TORTURE_BIT_FIELD(name, asn1_data, int_value) \
* Test undefined behavior of too-large bit field (BIT STRING as an integer) static void torture_asn1_bit_field_## name (void **state) \
* https://oss-fuzz.com/testcase-detail/5764460018401280 { \
* u8 data[] = asn1_data; \
* In this example, invalid "unused bytes" value was used size_t datalen = sizeof(data) - 1; \
*/ unsigned int value = 0; \
static void torture_bit_field(void **state) size_t value_len = sizeof(value); \
{ int rv; \
/* Without the Tag and Length {0x03, 0x02} */ \
u8 data0[] = {0x07, 0x80}; rv = decode_bit_field(data, datalen, &value, value_len); \
/* Without the Tag and Length {0x03, 0x05} */ assert_int_equal(rv, SC_SUCCESS); \
/* u8 data1[] = {0x20, 0x20, 0xff, 0xff, 0xff}; original data */ assert_int_equal(value, int_value); \
u8 data1[] = {0x20, 0xff, 0xff, 0xff, 0xff}; }
u8 data2[] = {0x00, 0xff, 0xff, 0xff, 0xff}; #define TORTURE_BIT_FIELD_ERROR(name, asn1_data, error) \
/* Without the Tag and Length {0x03, 0x06} */ static void torture_asn1_bit_field_## name (void **state) \
u8 data3[] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff}; { \
/* Without the Tag and Length {0x03, 0x02} */ u8 data[] = asn1_data; \
u8 padding[] = {0x01, 0xfe}; size_t datalen = sizeof(data) - 1; \
u8 invalid_padding[] = {0x01, 0xff}; unsigned int value = 0; \
unsigned int value; size_t value_len = sizeof(value); \
size_t value_len = sizeof(value); int rv; \
int rv = 0; \
rv = decode_bit_field(data, datalen, &value, value_len); \
assert_int_equal(rv, error); \
}
/* Without the Tag (0x03) and Length */
/* Simple value 1 */
TORTURE_BIT_FIELD(one, "\x07\x80", 1)
/* This is the last value that can be represented in the unsigned int */
TORTURE_BIT_FIELD(uint_max, "\x00\xff\xff\xff\xff", UINT_MAX)
/* Valid padding */
TORTURE_BIT_FIELD(padding, "\x01\xfe", 127)
/* Simple value 1 */ /* Negative test cases */
rv = decode_bit_field(data0, sizeof(data0), (unsigned int *)&value, value_len); /* Too large unused bits field */
assert_int_equal(rv, SC_SUCCESS); TORTURE_BIT_FIELD_ERROR(large_unused_bits, "\x20\xff\xff\xff\xff", SC_ERROR_INVALID_ASN1_OBJECT)
assert_int_equal(value, 1); /* Too large to represent in the unsigned int type */
TORTURE_BIT_FIELD_ERROR(too_large, "\x00\xff\xff\xff\xff\xff", SC_ERROR_BUFFER_TOO_SMALL)
/* Invalid (non-zero bits) padding */
TORTURE_BIT_FIELD_ERROR(invalid_padding, "\x01\xff", SC_ERROR_INVALID_ASN1_OBJECT)
/* Too large unused bits field */
rv = decode_bit_field(data1, sizeof(data1), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
/* This is the last value that can be represented in the unsigned int */
rv = decode_bit_field(data2, sizeof(data2), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, UINT_MAX);
/* Too large to represent in the unsigned int type */
rv = decode_bit_field(data3, sizeof(data3), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_ERROR_BUFFER_TOO_SMALL);
/* Valid padding */
rv = decode_bit_field(padding, sizeof(padding), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_SUCCESS);
assert_int_equal(value, 127);
/* Invalid (non-zero bits) padding */
rv = decode_bit_field(invalid_padding, sizeof(invalid_padding), (unsigned int *)&value, value_len);
assert_int_equal(rv, SC_ERROR_INVALID_ASN1_OBJECT);
}
int main(void) int main(void)
{ {
@ -336,7 +327,12 @@ int main(void)
cmocka_unit_test(torture_negative_int), cmocka_unit_test(torture_negative_int),
cmocka_unit_test(torture_large_oid), cmocka_unit_test(torture_large_oid),
cmocka_unit_test(torture_oid), cmocka_unit_test(torture_oid),
cmocka_unit_test(torture_bit_field), cmocka_unit_test(torture_asn1_bit_field_one),
cmocka_unit_test(torture_asn1_bit_field_uint_max),
cmocka_unit_test(torture_asn1_bit_field_padding),
cmocka_unit_test(torture_asn1_bit_field_large_unused_bits),
cmocka_unit_test(torture_asn1_bit_field_too_large),
cmocka_unit_test(torture_asn1_bit_field_invalid_padding),
}; };
rc = cmocka_run_group_tests(tests, NULL, NULL); rc = cmocka_run_group_tests(tests, NULL, NULL);