-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <martin.lau@kernel.org>
- Loading branch information
Showing
18 changed files
with
1,315 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* Copyright (c) 2024 Meta, Inc */ | ||
#include <linux/types.h> | ||
#include <linux/module.h> | ||
#include <linux/bpf_crypto.h> | ||
#include <crypto/skcipher.h> | ||
|
||
static void *bpf_crypto_lskcipher_alloc_tfm(const char *algo) | ||
{ | ||
return crypto_alloc_lskcipher(algo, 0, 0); | ||
} | ||
|
||
static void bpf_crypto_lskcipher_free_tfm(void *tfm) | ||
{ | ||
crypto_free_lskcipher(tfm); | ||
} | ||
|
||
static int bpf_crypto_lskcipher_has_algo(const char *algo) | ||
{ | ||
return crypto_has_skcipher(algo, CRYPTO_ALG_TYPE_LSKCIPHER, CRYPTO_ALG_TYPE_MASK); | ||
} | ||
|
||
static int bpf_crypto_lskcipher_setkey(void *tfm, const u8 *key, unsigned int keylen) | ||
{ | ||
return crypto_lskcipher_setkey(tfm, key, keylen); | ||
} | ||
|
||
static u32 bpf_crypto_lskcipher_get_flags(void *tfm) | ||
{ | ||
return crypto_lskcipher_get_flags(tfm); | ||
} | ||
|
||
static unsigned int bpf_crypto_lskcipher_ivsize(void *tfm) | ||
{ | ||
return crypto_lskcipher_ivsize(tfm); | ||
} | ||
|
||
static unsigned int bpf_crypto_lskcipher_statesize(void *tfm) | ||
{ | ||
return crypto_lskcipher_statesize(tfm); | ||
} | ||
|
||
static int bpf_crypto_lskcipher_encrypt(void *tfm, const u8 *src, u8 *dst, | ||
unsigned int len, u8 *siv) | ||
{ | ||
return crypto_lskcipher_encrypt(tfm, src, dst, len, siv); | ||
} | ||
|
||
static int bpf_crypto_lskcipher_decrypt(void *tfm, const u8 *src, u8 *dst, | ||
unsigned int len, u8 *siv) | ||
{ | ||
return crypto_lskcipher_decrypt(tfm, src, dst, len, siv); | ||
} | ||
|
||
static const struct bpf_crypto_type bpf_crypto_lskcipher_type = { | ||
.alloc_tfm = bpf_crypto_lskcipher_alloc_tfm, | ||
.free_tfm = bpf_crypto_lskcipher_free_tfm, | ||
.has_algo = bpf_crypto_lskcipher_has_algo, | ||
.setkey = bpf_crypto_lskcipher_setkey, | ||
.encrypt = bpf_crypto_lskcipher_encrypt, | ||
.decrypt = bpf_crypto_lskcipher_decrypt, | ||
.ivsize = bpf_crypto_lskcipher_ivsize, | ||
.statesize = bpf_crypto_lskcipher_statesize, | ||
.get_flags = bpf_crypto_lskcipher_get_flags, | ||
.owner = THIS_MODULE, | ||
.name = "skcipher", | ||
}; | ||
|
||
static int __init bpf_crypto_skcipher_init(void) | ||
{ | ||
return bpf_crypto_register_type(&bpf_crypto_lskcipher_type); | ||
} | ||
|
||
static void __exit bpf_crypto_skcipher_exit(void) | ||
{ | ||
int err = bpf_crypto_unregister_type(&bpf_crypto_lskcipher_type); | ||
WARN_ON_ONCE(err); | ||
} | ||
|
||
module_init(bpf_crypto_skcipher_init); | ||
module_exit(bpf_crypto_skcipher_exit); | ||
MODULE_LICENSE("GPL"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-only */ | ||
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ | ||
#ifndef _BPF_CRYPTO_H | ||
#define _BPF_CRYPTO_H | ||
|
||
struct bpf_crypto_type { | ||
void *(*alloc_tfm)(const char *algo); | ||
void (*free_tfm)(void *tfm); | ||
int (*has_algo)(const char *algo); | ||
int (*setkey)(void *tfm, const u8 *key, unsigned int keylen); | ||
int (*setauthsize)(void *tfm, unsigned int authsize); | ||
int (*encrypt)(void *tfm, const u8 *src, u8 *dst, unsigned int len, u8 *iv); | ||
int (*decrypt)(void *tfm, const u8 *src, u8 *dst, unsigned int len, u8 *iv); | ||
unsigned int (*ivsize)(void *tfm); | ||
unsigned int (*statesize)(void *tfm); | ||
u32 (*get_flags)(void *tfm); | ||
struct module *owner; | ||
char name[14]; | ||
}; | ||
|
||
int bpf_crypto_register_type(const struct bpf_crypto_type *type); | ||
int bpf_crypto_unregister_type(const struct bpf_crypto_type *type); | ||
|
||
#endif /* _BPF_CRYPTO_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.