Skip to content

Commit fda4f71

Browse files
vvfedorenkoMartin KaFai Lau
authored andcommitted
bpf: crypto: add skcipher to bpf crypto
Implement skcipher crypto in BPF crypto framework. Signed-off-by: Vadim Fedorenko <[email protected]> Acked-by: Herbert Xu <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Martin KaFai Lau <[email protected]>
1 parent 3e1c6f3 commit fda4f71

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
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");

0 commit comments

Comments
 (0)