tmp_dir = mkdtemp(tmp_dir_template); if (!ASSERT_OK_PTR(tmp_dir, "mkdtemp")) return;
ret = _run_setup_process(tmp_dir, "setup"); if (!ASSERT_OK(ret, "_run_setup_process")) goto close_prog;
skel = test_verify_pkcs7_sig__open(); if (!ASSERT_OK_PTR(skel, "test_verify_pkcs7_sig__open")) goto close_prog;
old_print_cb = libbpf_set_print(libbpf_print_cb);
ret = test_verify_pkcs7_sig__load(skel);
libbpf_set_print(old_print_cb);
if (ret < 0 && kfunc_not_supported) {
printf( "%s:SKIP:bpf_verify_pkcs7_signature() kfunc not supported\n",
__func__);
test__skip(); goto close_prog;
}
if (!ASSERT_OK(ret, "test_verify_pkcs7_sig__load")) goto close_prog;
ret = test_verify_pkcs7_sig__attach(skel); if (!ASSERT_OK(ret, "test_verify_pkcs7_sig__attach")) goto close_prog;
map = bpf_object__find_map_by_name(skel->obj, "data_input"); if (!ASSERT_OK_PTR(map, "data_input not found")) goto close_prog;
skel->bss->monitored_pid = getpid();
/* Test without data and signature. */
skel->bss->user_keyring_serial = KEY_SPEC_SESSION_KEYRING;
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_LT(ret, 0, "bpf_map_update_elem data_input")) goto close_prog;
/* Test successful signature verification with session keyring. */
ret = populate_data_item_str(tmp_dir, &data); if (!ASSERT_OK(ret, "populate_data_item_str")) goto close_prog;
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_OK(ret, "bpf_map_update_elem data_input")) goto close_prog;
/* Test successful signature verification with testing keyring. */
skel->bss->user_keyring_serial = syscall(__NR_request_key, "keyring", "ebpf_testing_keyring", NULL,
KEY_SPEC_SESSION_KEYRING);
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_OK(ret, "bpf_map_update_elem data_input")) goto close_prog;
/* * Ensure key_task_permission() is called and rejects the keyring * (no Search permission).
*/
syscall(__NR_keyctl, KEYCTL_SETPERM, skel->bss->user_keyring_serial,
0x37373737);
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_LT(ret, 0, "bpf_map_update_elem data_input")) goto close_prog;
/* * Ensure key_validate() is called and rejects the keyring (key expired)
*/
syscall(__NR_keyctl, KEYCTL_SET_TIMEOUT,
skel->bss->user_keyring_serial, 1);
sleep(1);
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_LT(ret, 0, "bpf_map_update_elem data_input")) goto close_prog;
/* Test with corrupted data (signature verification should fail). */
data.data[0] = 'a';
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data, BPF_ANY); if (!ASSERT_LT(ret, 0, "bpf_map_update_elem data_input")) goto close_prog;
ret = populate_data_item_mod(&data); if (!ASSERT_OK(ret, "populate_data_item_mod")) goto close_prog;
/* Test signature verification with system keyrings. */ if (data.data_len) {
skel->bss->user_keyring_serial = 0;
skel->bss->system_keyring_id = 0;
ret = bpf_map_update_elem(bpf_map__fd(map), &zero, &data,
BPF_ANY); if (!ASSERT_OK(ret, "bpf_map_update_elem data_input")) goto close_prog;
ret = _run_setup_process(tmp_dir, "setup"); if (!ASSERT_OK(ret, "_run_setup_process")) goto out;
ret = _run_setup_process(tmp_dir, "fsverity-create-sign");
if (ret) {
printf("%s: SKIP: fsverity [sign|enable] doesn't work.\n" "To run this test, try enable CONFIG_FS_VERITY and enable FSVerity for the filesystem.\n",
__func__);
test__skip(); goto out;
}
skel = test_sig_in_xattr__open(); if (!ASSERT_OK_PTR(skel, "test_sig_in_xattr__open")) goto out;
ret = get_signature_size(sig_path); if (!ASSERT_GT(ret, 0, "get_signature_size")) goto out;
skel->bss->sig_size = ret;
skel->bss->user_keyring_serial = syscall(__NR_request_key, "keyring", "ebpf_testing_keyring", NULL,
KEY_SPEC_SESSION_KEYRING);
memcpy(skel->bss->digest, "FSVerity", 8);
ret = test_sig_in_xattr__load(skel); if (!ASSERT_OK(ret, "test_sig_in_xattr__load")) goto out;
ret = test_sig_in_xattr__attach(skel); if (!ASSERT_OK(ret, "test_sig_in_xattr__attach")) goto out;
pid = getpid();
/* Case 1: fsverity is not enabled, open should succeed */ if (test_open_file(skel, data_path, pid, true, "open_1")) goto out;
/* Case 2: fsverity is enabled, xattr is missing, open should * fail
*/
ret = _run_setup_process(tmp_dir, "fsverity-enable"); if (!ASSERT_OK(ret, "fsverity-enable")) goto out; if (test_open_file(skel, data_path, pid, false, "open_2")) goto out;
/* Case 3: fsverity is enabled, xattr has valid signature, open * should succeed
*/
ret = add_signature_to_xattr(data_path, sig_path); if (!ASSERT_OK(ret, "add_signature_to_xattr_1")) goto out;
if (test_open_file(skel, data_path, pid, true, "open_3")) goto out;
/* Case 4: fsverity is enabled, xattr has invalid signature, open * should fail
*/
ret = add_signature_to_xattr(data_path, NULL); if (!ASSERT_OK(ret, "add_signature_to_xattr_2")) goto out;
test_open_file(skel, data_path, pid, false, "open_4");
out:
_run_setup_process(tmp_dir, "cleanup"); if (!skel) return;
void test_verify_pkcs7_sig(void)
{ if (test__start_subtest("pkcs7_sig_from_map"))
test_verify_pkcs7_sig_from_map(); if (test__start_subtest("pkcs7_sig_fsverity"))
test_pkcs7_sig_fsverity();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.