Skip to content

Commit 52578f7

Browse files
author
Martin KaFai Lau
committed
Merge branch 'BPF crypto API framework'
Vadim Fedorenko says: ==================== This series introduces crypto kfuncs to make BPF programs able to utilize kernel crypto subsystem. Crypto operations made pluggable to avoid extensive growth of kernel when it's not needed. Only skcipher is added within this series, but it can be easily extended to other types of operations. No hardware offload supported as it needs sleepable context which is not available for TX or XDP programs. At the same time crypto context initialization kfunc can only run in sleepable context, that's why it should be run separately and store the result in the map. Selftests show the common way to implement crypto actions in BPF programs. Benchmark is also added to have a baseline. ==================== Signed-off-by: Martin KaFai Lau <[email protected]>
2 parents 95c07d5 + 8000e62 commit 52578f7

File tree

18 files changed

+1315
-1
lines changed

18 files changed

+1315
-1
lines changed

MAINTAINERS

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3822,6 +3822,14 @@ F: kernel/bpf/tnum.c
38223822
F: kernel/bpf/trampoline.c
38233823
F: kernel/bpf/verifier.c
38243824

3825+
BPF [CRYPTO]
3826+
M: Vadim Fedorenko <[email protected]>
3827+
3828+
S: Maintained
3829+
F: crypto/bpf_crypto_skcipher.c
3830+
F: include/linux/bpf_crypto.h
3831+
F: kernel/bpf/crypto.c
3832+
38253833
BPF [DOCUMENTATION] (Related to Standardization)
38263834
R: David Vernet <[email protected]>
38273835

crypto/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ crypto_skcipher-y += lskcipher.o
2020
crypto_skcipher-y += skcipher.o
2121

2222
obj-$(CONFIG_CRYPTO_SKCIPHER2) += crypto_skcipher.o
23+
ifeq ($(CONFIG_BPF_SYSCALL),y)
24+
obj-$(CONFIG_CRYPTO_SKCIPHER2) += bpf_crypto_skcipher.o
25+
endif
2326

2427
obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o
2528
obj-$(CONFIG_CRYPTO_ECHAINIV) += echainiv.o

crypto/bpf_crypto_skcipher.c

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/* Copyright (c) 2024 Meta, Inc */
3+
#include <linux/types.h>
4+
#include <linux/module.h>
5+
#include <linux/bpf_crypto.h>
6+
#include <crypto/skcipher.h>
7+
8+
static void *bpf_crypto_lskcipher_alloc_tfm(const char *algo)
9+
{
10+
return crypto_alloc_lskcipher(algo, 0, 0);
11+
}
12+
13+
static void bpf_crypto_lskcipher_free_tfm(void *tfm)
14+
{
15+
crypto_free_lskcipher(tfm);
16+
}
17+
18+
static int bpf_crypto_lskcipher_has_algo(const char *algo)
19+
{
20+
return crypto_has_skcipher(algo, CRYPTO_ALG_TYPE_LSKCIPHER, CRYPTO_ALG_TYPE_MASK);
21+
}
22+
23+
static int bpf_crypto_lskcipher_setkey(void *tfm, const u8 *key, unsigned int keylen)
24+
{
25+
return crypto_lskcipher_setkey(tfm, key, keylen);
26+
}
27+
28+
static u32 bpf_crypto_lskcipher_get_flags(void *tfm)
29+
{
30+
return crypto_lskcipher_get_flags(tfm);
31+
}
32+
33+
static unsigned int bpf_crypto_lskcipher_ivsize(void *tfm)
34+
{
35+
return crypto_lskcipher_ivsize(tfm);
36+
}
37+
38+
static unsigned int bpf_crypto_lskcipher_statesize(void *tfm)
39+
{
40+
return crypto_lskcipher_statesize(tfm);
41+
}
42+
43+
static int bpf_crypto_lskcipher_encrypt(void *tfm, const u8 *src, u8 *dst,
44+
unsigned int len, u8 *siv)
45+
{
46+
return crypto_lskcipher_encrypt(tfm, src, dst, len, siv);
47+
}
48+
49+
static int bpf_crypto_lskcipher_decrypt(void *tfm, const u8 *src, u8 *dst,
50+
unsigned int len, u8 *siv)
51+
{
52+
return crypto_lskcipher_decrypt(tfm, src, dst, len, siv);
53+
}
54+
55+
static const struct bpf_crypto_type bpf_crypto_lskcipher_type = {
56+
.alloc_tfm = bpf_crypto_lskcipher_alloc_tfm,
57+
.free_tfm = bpf_crypto_lskcipher_free_tfm,
58+
.has_algo = bpf_crypto_lskcipher_has_algo,
59+
.setkey = bpf_crypto_lskcipher_setkey,
60+
.encrypt = bpf_crypto_lskcipher_encrypt,
61+
.decrypt = bpf_crypto_lskcipher_decrypt,
62+
.ivsize = bpf_crypto_lskcipher_ivsize,
63+
.statesize = bpf_crypto_lskcipher_statesize,
64+
.get_flags = bpf_crypto_lskcipher_get_flags,
65+
.owner = THIS_MODULE,
66+
.name = "skcipher",
67+
};
68+
69+
static int __init bpf_crypto_skcipher_init(void)
70+
{
71+
return bpf_crypto_register_type(&bpf_crypto_lskcipher_type);
72+
}
73+
74+
static void __exit bpf_crypto_skcipher_exit(void)
75+
{
76+
int err = bpf_crypto_unregister_type(&bpf_crypto_lskcipher_type);
77+
WARN_ON_ONCE(err);
78+
}
79+
80+
module_init(bpf_crypto_skcipher_init);
81+
module_exit(bpf_crypto_skcipher_exit);
82+
MODULE_LICENSE("GPL");

include/linux/bpf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,7 @@ int bpf_dynptr_check_size(u32 size);
12751275
u32 __bpf_dynptr_size(const struct bpf_dynptr_kern *ptr);
12761276
const void *__bpf_dynptr_data(const struct bpf_dynptr_kern *ptr, u32 len);
12771277
void *__bpf_dynptr_data_rw(const struct bpf_dynptr_kern *ptr, u32 len);
1278+
bool __bpf_dynptr_is_rdonly(const struct bpf_dynptr_kern *ptr);
12781279

12791280
#ifdef CONFIG_BPF_JIT
12801281
int bpf_trampoline_link_prog(struct bpf_tramp_link *link, struct bpf_trampoline *tr);

include/linux/bpf_crypto.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/* SPDX-License-Identifier: GPL-2.0-only */
2+
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3+
#ifndef _BPF_CRYPTO_H
4+
#define _BPF_CRYPTO_H
5+
6+
struct bpf_crypto_type {
7+
void *(*alloc_tfm)(const char *algo);
8+
void (*free_tfm)(void *tfm);
9+
int (*has_algo)(const char *algo);
10+
int (*setkey)(void *tfm, const u8 *key, unsigned int keylen);
11+
int (*setauthsize)(void *tfm, unsigned int authsize);
12+
int (*encrypt)(void *tfm, const u8 *src, u8 *dst, unsigned int len, u8 *iv);
13+
int (*decrypt)(void *tfm, const u8 *src, u8 *dst, unsigned int len, u8 *iv);
14+
unsigned int (*ivsize)(void *tfm);
15+
unsigned int (*statesize)(void *tfm);
16+
u32 (*get_flags)(void *tfm);
17+
struct module *owner;
18+
char name[14];
19+
};
20+
21+
int bpf_crypto_register_type(const struct bpf_crypto_type *type);
22+
int bpf_crypto_unregister_type(const struct bpf_crypto_type *type);
23+
24+
#endif /* _BPF_CRYPTO_H */

kernel/bpf/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ obj-$(CONFIG_BPF_SYSCALL) += bpf_struct_ops.o
4444
obj-$(CONFIG_BPF_SYSCALL) += cpumask.o
4545
obj-${CONFIG_BPF_LSM} += bpf_lsm.o
4646
endif
47+
ifeq ($(CONFIG_CRYPTO),y)
48+
obj-$(CONFIG_BPF_SYSCALL) += crypto.o
49+
endif
4750
obj-$(CONFIG_BPF_PRELOAD) += preload/
4851

4952
obj-$(CONFIG_BPF_SYSCALL) += relo_core.o

0 commit comments

Comments
 (0)