]> Git Repo - J-linux.git/blob - tools/testing/selftests/bpf/progs/test_verify_pkcs7_sig.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / tools / testing / selftests / bpf / progs / test_verify_pkcs7_sig.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4  * Copyright (C) 2022 Huawei Technologies Duesseldorf GmbH
5  *
6  * Author: Roberto Sassu <[email protected]>
7  */
8
9 #include "vmlinux.h"
10 #include <errno.h>
11 #include <bpf/bpf_helpers.h>
12 #include <bpf/bpf_tracing.h>
13 #include "bpf_kfuncs.h"
14 #include "err.h"
15
16 #define MAX_DATA_SIZE (1024 * 1024)
17 #define MAX_SIG_SIZE 1024
18
19 __u32 monitored_pid;
20 __u32 user_keyring_serial;
21 __u64 system_keyring_id;
22
23 struct data {
24         __u8 data[MAX_DATA_SIZE];
25         __u32 data_len;
26         __u8 sig[MAX_SIG_SIZE];
27         __u32 sig_len;
28 };
29
30 struct {
31         __uint(type, BPF_MAP_TYPE_ARRAY);
32         __uint(max_entries, 1);
33         __type(key, __u32);
34         __type(value, struct data);
35 } data_input SEC(".maps");
36
37 char _license[] SEC("license") = "GPL";
38
39 SEC("lsm.s/bpf")
40 int BPF_PROG(bpf, int cmd, union bpf_attr *attr, unsigned int size)
41 {
42         struct bpf_dynptr data_ptr, sig_ptr;
43         struct data *data_val;
44         struct bpf_key *trusted_keyring;
45         __u32 pid;
46         __u64 value;
47         int ret, zero = 0;
48
49         pid = bpf_get_current_pid_tgid() >> 32;
50         if (pid != monitored_pid)
51                 return 0;
52
53         data_val = bpf_map_lookup_elem(&data_input, &zero);
54         if (!data_val)
55                 return 0;
56
57         ret = bpf_probe_read_kernel(&value, sizeof(value), &attr->value);
58         if (ret)
59                 goto out;
60
61         ret = bpf_copy_from_user(data_val, sizeof(struct data),
62                                  (void *)(unsigned long)value);
63         if (ret)
64                 goto out;
65
66         if (data_val->data_len > sizeof(data_val->data))
67                 return -EINVAL;
68
69         bpf_dynptr_from_mem(data_val->data, data_val->data_len, 0, &data_ptr);
70
71         if (data_val->sig_len > sizeof(data_val->sig))
72                 return -EINVAL;
73
74         bpf_dynptr_from_mem(data_val->sig, data_val->sig_len, 0, &sig_ptr);
75
76         if (user_keyring_serial)
77                 trusted_keyring = bpf_lookup_user_key(user_keyring_serial, 0);
78         else
79                 trusted_keyring = bpf_lookup_system_key(system_keyring_id);
80
81         if (!trusted_keyring)
82                 return -ENOENT;
83
84         ret = bpf_verify_pkcs7_signature(&data_ptr, &sig_ptr, trusted_keyring);
85
86         bpf_key_put(trusted_keyring);
87
88 out:
89         set_if_not_errno_or_zero(ret, -EFAULT);
90
91         return ret;
92 }
This page took 0.032562 seconds and 4 git commands to generate.