mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
bpf: Return hashes of maps in BPF_OBJ_GET_INFO_BY_FD
Currently only array maps are supported, but the implementation can be extended for other maps and objects. The hash is memoized only for exclusive and frozen maps as their content is stable until the exclusive program modifies the map. This is required for BPF signing, enabling a trusted loader program to verify a map's integrity. The loader retrieves the map's runtime hash from the kernel and compares it against an expected hash computed at build time. Signed-off-by: KP Singh <kpsingh@kernel.org> Link: https://lore.kernel.org/r/20250914215141.15144-7-kpsingh@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
6c850cbca8
commit
ea2e6467ac
@@ -12,6 +12,7 @@
|
||||
#include <uapi/linux/btf.h>
|
||||
#include <linux/rcupdate_trace.h>
|
||||
#include <linux/btf_ids.h>
|
||||
#include <crypto/sha2.h>
|
||||
|
||||
#include "map_in_map.h"
|
||||
|
||||
@@ -174,6 +175,17 @@ static void *array_map_lookup_elem(struct bpf_map *map, void *key)
|
||||
return array->value + (u64)array->elem_size * (index & array->index_mask);
|
||||
}
|
||||
|
||||
static int array_map_get_hash(struct bpf_map *map, u32 hash_buf_size,
|
||||
void *hash_buf)
|
||||
{
|
||||
struct bpf_array *array = container_of(map, struct bpf_array, map);
|
||||
|
||||
sha256(array->value, (u64)array->elem_size * array->map.max_entries,
|
||||
hash_buf);
|
||||
memcpy(array->map.sha, hash_buf, sizeof(array->map.sha));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int array_map_direct_value_addr(const struct bpf_map *map, u64 *imm,
|
||||
u32 off)
|
||||
{
|
||||
@@ -800,6 +812,7 @@ const struct bpf_map_ops array_map_ops = {
|
||||
.map_mem_usage = array_map_mem_usage,
|
||||
.map_btf_id = &array_map_btf_ids[0],
|
||||
.iter_seq_info = &iter_seq_info,
|
||||
.map_get_hash = &array_map_get_hash,
|
||||
};
|
||||
|
||||
const struct bpf_map_ops percpu_array_map_ops = {
|
||||
|
||||
Reference in New Issue
Block a user