diff options
| -rw-r--r-- | include/test.mk | 2 | ||||
| -rw-r--r-- | test-sbat.c | 395 |
2 files changed, 255 insertions, 142 deletions
diff --git a/include/test.mk b/include/test.mk index 8cdcc332..735d0dc5 100644 --- a/include/test.mk +++ b/include/test.mk @@ -34,6 +34,8 @@ test-random.h: dd if=/dev/urandom bs=512 count=17 of=random.bin xxd -i random.bin test-random.h +test-sbat_FILES = csv.c + tests := $(patsubst %.c,%,$(wildcard test-*.c)) $(tests) :: test-% : test.c test-%.c $(test-%_FILES) diff --git a/test-sbat.c b/test-sbat.c index 7a4b767a..c671f03e 100644 --- a/test-sbat.c +++ b/test-sbat.c @@ -185,208 +185,249 @@ free_mock_sbat_entries(list_t *entries) FreePool(entries); } } +#endif /* - * parse_sbat() tests + * parse_sbat_section() tests */ -void -test_parse_sbat_null_sbat_base(void) +int +test_parse_sbat_section_null_sbat_base(void) { - size_t sbat_size = 20; - struct sbat sbat = { 0, NULL }; + char *section_base = NULL; + size_t section_size = 20; + struct sbat_section_entry **entries; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(NULL, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, &n, &entries); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_zero_sbat_size(void) +int +test_parse_sbat_section_zero_sbat_size(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; - size_t sbat_size = 0; - struct sbat sbat = { 0, NULL }; + char section_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; + size_t section_size = 0; + struct sbat_section_entry **entries; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, &n, &entries); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_null_sbat(void) +int +test_parse_sbat_section_null_entries(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; - size_t sbat_size = sizeof(sbat_base); + char section_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, NULL); + status = parse_sbat_section(section_base, section_size, &n, NULL); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_no_newline(void) +int +test_parse_sbat_section_null_count(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + char section_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + struct sbat_section_entry **entries; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, NULL, &entries); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_too_few_elem(void) +int +test_parse_sbat_section_no_newline(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + char section_base[] = "test1,1,SBAT test1,acme,1,testURL"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + struct sbat_section_entry **entries; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, &n, &entries); + cleanup_sbat_section_entries(n, entries); + assert_equal_return(status, EFI_SUCCESS, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_too_many_elem(void) +int +test_parse_sbat_section_no_commas(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL,testURL2\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + char section_base[] = "test1"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + struct sbat_section_entry **entries; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, &n, &entries); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_SUCCESS); - assert(sbat.size == 1); - assert(strncmp(sbat.entries[0]->component_name, "test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->component_generation, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_name, "SBAT test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_package_name, "acme", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_version, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_url, "testURL,testURL2", MAX_SIZE) == 0); + return 0; } -void -test_parse_sbat_no_newline_multiple_entries(void) +int +test_parse_sbat_section_too_few_elem(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n" \ - "test2,2,SBAT test2,acme2,2,testURL2"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + char section_base[] = "test1,1,acme"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + struct sbat_section_entry **entries; + size_t n = 0; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + status = parse_sbat_section(section_base, section_size, &n, &entries); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_too_few_elem_multiple_entries(void) +int +test_parse_sbat_section_too_many_elem(void) +{ + char section_base[] = "test1,1,SBAT test1,acme1,1,testURL1,other1,stuff,is,here\n" + "test2,2,SBAT test2,acme2,2,testURL2,other2"; + /* intentionally not NUL terminated */ + size_t section_size = sizeof(section_base) - 1; + struct sbat_section_entry **entries; + size_t n = 0, i; + list_t *pos = NULL; + EFI_STATUS status; + struct sbat_section_entry test_section_entry1 = { + "test1", "1", "SBAT test1", "acme1", "1", "testURL1" + }; + struct sbat_section_entry test_section_entry2 = { + "test2", "2", "SBAT test2", "acme2", "2", "testURL2" + }; + struct sbat_section_entry *test_entries[] = { + &test_section_entry1, &test_section_entry2, + }; + + status = parse_sbat_section(section_base, section_size, &n, &entries); + assert_equal_return(status, EFI_SUCCESS, -1, "got %#hhx expected %#hhx\n"); + + for (i = 0; i < n; i++) { + struct sbat_section_entry *entry = entries[i]; + struct sbat_section_entry *test_entry = test_entries[i]; + +#define mkassert(a) \ + assert_equal_goto(strcmp(entry-> a, test_entry-> a), 0, fail, \ + "got %zu expected %d\n") + + mkassert(component_name); + mkassert(component_generation); + mkassert(vendor_name); + mkassert(vendor_package_name); + mkassert(vendor_version); + mkassert(vendor_url); + +#undef mkassert + } + assert_equal_goto(n, 2, fail, "got %zu expected %d\n"); + return 0; +fail: + cleanup_sbat_section_entries(n, entries); + return -1; +} + +/* + * parse_sbat_var() tests + */ +int +test_parse_sbat_var_null_list(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n" \ - "test2,2,SBAT test2,acme2,2\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var(NULL); + cleanup_sbat_var(&sbat_var); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); - assert(status == EFI_INVALID_PARAMETER); + return 0; } -void -test_parse_sbat_too_many_elem_multiple_entries(void) -{ - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n" \ - "test2,2,SBAT test2,acme2,2,testURL2,test3\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; +int +test_parse_sbat_var_data_null_list(void) +{ + char sbat_var_data[] = "test1,1,2021022400"; + /* + * intentionally including the NUL termination, because + * get_variable() will always include it. + */ + size_t sbat_var_data_size = sizeof(sbat_var_data); EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var_data(NULL, sbat_var_data, sbat_var_data_size); + cleanup_sbat_var(&sbat_var); - assert(status == EFI_SUCCESS); - assert(sbat.size == 2); - assert(strncmp(sbat.entries[0]->component_name, "test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->component_generation, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_name, "SBAT test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_package_name, "acme", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_version, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_url, "testURL", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->component_name, "test2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->component_generation, "2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_name, "SBAT test2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_package_name, "acme2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_version, "2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_url, "testURL2,test3", MAX_SIZE) == 0); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); + + return 0; } -void -test_parse_sbat_single_entry(void) +int +test_parse_sbat_var_data_null_data(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + size_t sbat_var_data_size = 4; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var_data(&sbat_var, NULL, sbat_var_data_size); + cleanup_sbat_var(&sbat_var); - assert(status == EFI_SUCCESS); - assert(sbat.size == 1); - assert(strncmp(sbat.entries[0]->component_name, "test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->component_generation, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_name, "SBAT test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_package_name, "acme", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_version, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_url, "testURL", MAX_SIZE) == 0); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); + + return 0; } -void -test_parse_sbat_multiple_entries(void) +int +test_parse_sbat_var_data_zero_size(void) { - char sbat_base[] = "test1,1,SBAT test1,acme,1,testURL\n" \ - "test2,2,SBAT test2,acme2,2,testURL2\n"; - size_t sbat_size = sizeof(sbat_base); - struct sbat sbat = { 0 }; + char sbat_var_data[] = "test1,1,2021022400"; EFI_STATUS status; - status = parse_sbat(sbat_base, sbat_size, &sbat); + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var_data(&sbat_var, sbat_var_data, 0); + cleanup_sbat_var(&sbat_var); - assert(status == EFI_SUCCESS); - assert(sbat.size == 2); - assert(strncmp(sbat.entries[0]->component_name, "test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->component_generation, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_name, "SBAT test1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_package_name, "acme", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_version, "1", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[0]->vendor_url, "testURL", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->component_name, "test2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->component_generation, "2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_name, "SBAT test2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_package_name, "acme2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_version, "2", MAX_SIZE) == 0); - assert(strncmp(sbat.entries[1]->vendor_url, "testURL2", MAX_SIZE) == 0); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); + + return 0; } -/* - * parse_sbat_var() tests - */ -void -test_parse_sbat_var_invalid_list(void) +int +test_parse_sbat_var_data(void) { + char sbat_var_data[] = "test1,1,2021022400"; EFI_STATUS status; - status = parse_sbat_var(NULL); + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var_data(&sbat_var, sbat_var_data, 0); - assert(status == EFI_INVALID_PARAMETER); + assert_equal_return(status, EFI_INVALID_PARAMETER, -1, "got %#hhx expected %#hhx\n"); + + return 0; } +#if 0 /* * verify_sbat() tests * Note: verify_sbat also frees the underlying "sbat_entries" memory. @@ -841,25 +882,94 @@ test_verify_sbat_reject_diff_name_mixed(void) #endif int +test_parse_and_verify(void) +{ + EFI_STATUS status; + char sbat_section[] = + "test1,1,SBAT test1,acme1,1,testURL1\n" + "test2,2,SBAT test2,acme2,2,testURL2\n"; + struct sbat_section_entry **section_entries = NULL; + size_t n_section_entries = 0, i; + struct sbat_section_entry test_section_entry1 = { + "test1", "1", "SBAT test1", "acme1", "1", "testURL1" + }; + struct sbat_section_entry test_section_entry2 = { + "test2", "2", "SBAT test2", "acme2", "2", "testURL2" + }; + struct sbat_section_entry *test_entries[] = { + &test_section_entry1, &test_section_entry2, + }; + + status = parse_sbat_section(sbat_section, sizeof(sbat_section)-1, + &n_section_entries, §ion_entries); + eassert(status == EFI_SUCCESS, "expected %d got %d\n", + EFI_SUCCESS, status); + eassert(section_entries != NULL, "expected non-NULL got NULL\n"); + + for (i = 0; i < n_section_entries; i++) { + struct sbat_section_entry *entry = section_entries[i]; + struct sbat_section_entry *test_entry = test_entries[i]; + +#define mkassert(a) \ + eassert(strcmp(entry-> a, test_entry-> a) == 0, \ + "expected \"%s\" got \"%s\"\n", \ + test_entry-> a, entry-> a ) + + mkassert(component_name); + mkassert(component_generation); + mkassert(vendor_name); + mkassert(vendor_package_name); + mkassert(vendor_version); + mkassert(vendor_url); + +#undef mkassert + } + + eassert(n_section_entries == 2, "expected %d got %d\n", + 2, n_section_entries); + + char sbat_var_data[] = "test1,5\nbar,2\n"; + size_t sbat_var_data_size = sizeof(sbat_var_data); + char *sbat_var_alloced = calloc(1, sbat_var_data_size); + if (!sbat_var_alloced) + return -1; + memcpy(sbat_var_alloced, sbat_var_data, sbat_var_data_size); + + INIT_LIST_HEAD(&sbat_var); + status = parse_sbat_var_data(&sbat_var, sbat_var_alloced, sbat_var_data_size); + if (status != EFI_SUCCESS || list_empty(&sbat_var)) + return -1; + + status = verify_sbat(n_section_entries, section_entries); + + assert_equal_return(status, EFI_SECURITY_VIOLATION, -1, "expected %#x got %#x\n"); + cleanup_sbat_var(&sbat_var); + cleanup_sbat_section_entries(n_section_entries, section_entries); + + return 0; +} + +int main(void) { -#if 0 - // parse_sbat tests - test_parse_sbat_null_sbat_base(); - test_parse_sbat_zero_sbat_size(); - test_parse_sbat_null_sbat(); - //test_parse_sbat_no_newline(); - test_parse_sbat_too_few_elem(); - test_parse_sbat_too_many_elem(); - //test_parse_sbat_no_newline_multiple_entries(); - test_parse_sbat_too_few_elem_multiple_entries(); - test_parse_sbat_too_many_elem_multiple_entries(); - test_parse_sbat_single_entry(); - test_parse_sbat_multiple_entries(); + int status = 0; + // parse_sbat section tests + test(test_parse_sbat_section_null_sbat_base); + test(test_parse_sbat_section_zero_sbat_size); + test(test_parse_sbat_section_null_entries); + test(test_parse_sbat_section_null_count); + test(test_parse_sbat_section_no_newline); + test(test_parse_sbat_section_no_commas); + test(test_parse_sbat_section_too_few_elem); + test(test_parse_sbat_section_too_many_elem); // parse_sbat_var tests - test_parse_sbat_var_invalid_list(); + test(test_parse_sbat_var_null_list); + test(test_parse_sbat_var_data_null_list); + test(test_parse_sbat_var_data_null_data); + test(test_parse_sbat_var_data_zero_size); +#if 0 // verify_sbat tests //test_verify_sbat_null_sbat(); test_verify_sbat_null_sbat_entries(); @@ -874,6 +984,7 @@ main(void) test_verify_sbat_match_diff_name_mixed(); test_verify_sbat_reject_diff_name_mixed(); #endif + test_parse_and_verify(); return 0; } |
