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