xref: /linux/tools/testing/selftests/bpf/progs/crypto_common.h (revision 91541ab192fc7f573e6c711ba9c2ae22a299c408)
1*91541ab1SVadim Fedorenko /* SPDX-License-Identifier: GPL-2.0 */
2*91541ab1SVadim Fedorenko /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3*91541ab1SVadim Fedorenko 
4*91541ab1SVadim Fedorenko #ifndef _CRYPTO_COMMON_H
5*91541ab1SVadim Fedorenko #define _CRYPTO_COMMON_H
6*91541ab1SVadim Fedorenko 
7*91541ab1SVadim Fedorenko #include "errno.h"
8*91541ab1SVadim Fedorenko #include <stdbool.h>
9*91541ab1SVadim Fedorenko 
10*91541ab1SVadim Fedorenko struct bpf_crypto_ctx *bpf_crypto_ctx_create(const struct bpf_crypto_params *params,
11*91541ab1SVadim Fedorenko 					     u32 params__sz, int *err) __ksym;
12*91541ab1SVadim Fedorenko struct bpf_crypto_ctx *bpf_crypto_ctx_acquire(struct bpf_crypto_ctx *ctx) __ksym;
13*91541ab1SVadim Fedorenko void bpf_crypto_ctx_release(struct bpf_crypto_ctx *ctx) __ksym;
14*91541ab1SVadim Fedorenko int bpf_crypto_encrypt(struct bpf_crypto_ctx *ctx, const struct bpf_dynptr *src,
15*91541ab1SVadim Fedorenko 		       const struct bpf_dynptr *dst, const struct bpf_dynptr *iv) __ksym;
16*91541ab1SVadim Fedorenko int bpf_crypto_decrypt(struct bpf_crypto_ctx *ctx, const struct bpf_dynptr *src,
17*91541ab1SVadim Fedorenko 		       const struct bpf_dynptr *dst, const struct bpf_dynptr *iv) __ksym;
18*91541ab1SVadim Fedorenko 
19*91541ab1SVadim Fedorenko struct __crypto_ctx_value {
20*91541ab1SVadim Fedorenko 	struct bpf_crypto_ctx __kptr * ctx;
21*91541ab1SVadim Fedorenko };
22*91541ab1SVadim Fedorenko 
23*91541ab1SVadim Fedorenko struct array_map {
24*91541ab1SVadim Fedorenko 	__uint(type, BPF_MAP_TYPE_ARRAY);
25*91541ab1SVadim Fedorenko 	__type(key, int);
26*91541ab1SVadim Fedorenko 	__type(value, struct __crypto_ctx_value);
27*91541ab1SVadim Fedorenko 	__uint(max_entries, 1);
28*91541ab1SVadim Fedorenko } __crypto_ctx_map SEC(".maps");
29*91541ab1SVadim Fedorenko 
30*91541ab1SVadim Fedorenko static inline struct __crypto_ctx_value *crypto_ctx_value_lookup(void)
31*91541ab1SVadim Fedorenko {
32*91541ab1SVadim Fedorenko 	u32 key = 0;
33*91541ab1SVadim Fedorenko 
34*91541ab1SVadim Fedorenko 	return bpf_map_lookup_elem(&__crypto_ctx_map, &key);
35*91541ab1SVadim Fedorenko }
36*91541ab1SVadim Fedorenko 
37*91541ab1SVadim Fedorenko static inline int crypto_ctx_insert(struct bpf_crypto_ctx *ctx)
38*91541ab1SVadim Fedorenko {
39*91541ab1SVadim Fedorenko 	struct __crypto_ctx_value local, *v;
40*91541ab1SVadim Fedorenko 	struct bpf_crypto_ctx *old;
41*91541ab1SVadim Fedorenko 	u32 key = 0;
42*91541ab1SVadim Fedorenko 	int err;
43*91541ab1SVadim Fedorenko 
44*91541ab1SVadim Fedorenko 	local.ctx = NULL;
45*91541ab1SVadim Fedorenko 	err = bpf_map_update_elem(&__crypto_ctx_map, &key, &local, 0);
46*91541ab1SVadim Fedorenko 	if (err) {
47*91541ab1SVadim Fedorenko 		bpf_crypto_ctx_release(ctx);
48*91541ab1SVadim Fedorenko 		return err;
49*91541ab1SVadim Fedorenko 	}
50*91541ab1SVadim Fedorenko 
51*91541ab1SVadim Fedorenko 	v = bpf_map_lookup_elem(&__crypto_ctx_map, &key);
52*91541ab1SVadim Fedorenko 	if (!v) {
53*91541ab1SVadim Fedorenko 		bpf_crypto_ctx_release(ctx);
54*91541ab1SVadim Fedorenko 		return -ENOENT;
55*91541ab1SVadim Fedorenko 	}
56*91541ab1SVadim Fedorenko 
57*91541ab1SVadim Fedorenko 	old = bpf_kptr_xchg(&v->ctx, ctx);
58*91541ab1SVadim Fedorenko 	if (old) {
59*91541ab1SVadim Fedorenko 		bpf_crypto_ctx_release(old);
60*91541ab1SVadim Fedorenko 		return -EEXIST;
61*91541ab1SVadim Fedorenko 	}
62*91541ab1SVadim Fedorenko 
63*91541ab1SVadim Fedorenko 	return 0;
64*91541ab1SVadim Fedorenko }
65*91541ab1SVadim Fedorenko 
66*91541ab1SVadim Fedorenko #endif /* _CRYPTO_COMMON_H */
67