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
crypto_ctx_value_lookup(void)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
crypto_ctx_insert(struct bpf_crypto_ctx * ctx)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