xref: /linux/tools/testing/selftests/bpf/progs/crypto_bench.c (revision 8000e627dc98efc44658af6150fd81c62d936b1b)
1*8000e627SVadim Fedorenko // SPDX-License-Identifier: GPL-2.0
2*8000e627SVadim Fedorenko /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3*8000e627SVadim Fedorenko 
4*8000e627SVadim Fedorenko #include "vmlinux.h"
5*8000e627SVadim Fedorenko #include "bpf_tracing_net.h"
6*8000e627SVadim Fedorenko #include <bpf/bpf_helpers.h>
7*8000e627SVadim Fedorenko #include <bpf/bpf_endian.h>
8*8000e627SVadim Fedorenko #include <bpf/bpf_tracing.h>
9*8000e627SVadim Fedorenko #include "bpf_misc.h"
10*8000e627SVadim Fedorenko #include "bpf_kfuncs.h"
11*8000e627SVadim Fedorenko #include "crypto_common.h"
12*8000e627SVadim Fedorenko 
13*8000e627SVadim Fedorenko const volatile unsigned int len = 16;
14*8000e627SVadim Fedorenko char cipher[128] = {};
15*8000e627SVadim Fedorenko u32 key_len, authsize;
16*8000e627SVadim Fedorenko char dst[256] = {};
17*8000e627SVadim Fedorenko u8 key[256] = {};
18*8000e627SVadim Fedorenko long hits = 0;
19*8000e627SVadim Fedorenko int status;
20*8000e627SVadim Fedorenko 
21*8000e627SVadim Fedorenko SEC("syscall")
22*8000e627SVadim Fedorenko int crypto_setup(void *args)
23*8000e627SVadim Fedorenko {
24*8000e627SVadim Fedorenko 	struct bpf_crypto_ctx *cctx;
25*8000e627SVadim Fedorenko 	struct bpf_crypto_params params = {
26*8000e627SVadim Fedorenko 		.type = "skcipher",
27*8000e627SVadim Fedorenko 		.key_len = key_len,
28*8000e627SVadim Fedorenko 		.authsize = authsize,
29*8000e627SVadim Fedorenko 	};
30*8000e627SVadim Fedorenko 	int err = 0;
31*8000e627SVadim Fedorenko 
32*8000e627SVadim Fedorenko 	status = 0;
33*8000e627SVadim Fedorenko 
34*8000e627SVadim Fedorenko 	if (!cipher[0] || !key_len || key_len > 256) {
35*8000e627SVadim Fedorenko 		status = -EINVAL;
36*8000e627SVadim Fedorenko 		return 0;
37*8000e627SVadim Fedorenko 	}
38*8000e627SVadim Fedorenko 
39*8000e627SVadim Fedorenko 	__builtin_memcpy(&params.algo, cipher, sizeof(cipher));
40*8000e627SVadim Fedorenko 	__builtin_memcpy(&params.key, key, sizeof(key));
41*8000e627SVadim Fedorenko 	cctx = bpf_crypto_ctx_create(&params, sizeof(params), &err);
42*8000e627SVadim Fedorenko 
43*8000e627SVadim Fedorenko 	if (!cctx) {
44*8000e627SVadim Fedorenko 		status = err;
45*8000e627SVadim Fedorenko 		return 0;
46*8000e627SVadim Fedorenko 	}
47*8000e627SVadim Fedorenko 
48*8000e627SVadim Fedorenko 	err = crypto_ctx_insert(cctx);
49*8000e627SVadim Fedorenko 	if (err && err != -EEXIST)
50*8000e627SVadim Fedorenko 		status = err;
51*8000e627SVadim Fedorenko 
52*8000e627SVadim Fedorenko 	return 0;
53*8000e627SVadim Fedorenko }
54*8000e627SVadim Fedorenko 
55*8000e627SVadim Fedorenko SEC("tc")
56*8000e627SVadim Fedorenko int crypto_encrypt(struct __sk_buff *skb)
57*8000e627SVadim Fedorenko {
58*8000e627SVadim Fedorenko 	struct __crypto_ctx_value *v;
59*8000e627SVadim Fedorenko 	struct bpf_crypto_ctx *ctx;
60*8000e627SVadim Fedorenko 	struct bpf_dynptr psrc, pdst, iv;
61*8000e627SVadim Fedorenko 
62*8000e627SVadim Fedorenko 	v = crypto_ctx_value_lookup();
63*8000e627SVadim Fedorenko 	if (!v) {
64*8000e627SVadim Fedorenko 		status = -ENOENT;
65*8000e627SVadim Fedorenko 		return 0;
66*8000e627SVadim Fedorenko 	}
67*8000e627SVadim Fedorenko 
68*8000e627SVadim Fedorenko 	ctx = v->ctx;
69*8000e627SVadim Fedorenko 	if (!ctx) {
70*8000e627SVadim Fedorenko 		status = -ENOENT;
71*8000e627SVadim Fedorenko 		return 0;
72*8000e627SVadim Fedorenko 	}
73*8000e627SVadim Fedorenko 
74*8000e627SVadim Fedorenko 	bpf_dynptr_from_skb(skb, 0, &psrc);
75*8000e627SVadim Fedorenko 	bpf_dynptr_from_mem(dst, len, 0, &pdst);
76*8000e627SVadim Fedorenko 	bpf_dynptr_from_mem(dst, 0, 0, &iv);
77*8000e627SVadim Fedorenko 
78*8000e627SVadim Fedorenko 	status = bpf_crypto_encrypt(ctx, &psrc, &pdst, &iv);
79*8000e627SVadim Fedorenko 	__sync_add_and_fetch(&hits, 1);
80*8000e627SVadim Fedorenko 
81*8000e627SVadim Fedorenko 	return 0;
82*8000e627SVadim Fedorenko }
83*8000e627SVadim Fedorenko 
84*8000e627SVadim Fedorenko SEC("tc")
85*8000e627SVadim Fedorenko int crypto_decrypt(struct __sk_buff *skb)
86*8000e627SVadim Fedorenko {
87*8000e627SVadim Fedorenko 	struct bpf_dynptr psrc, pdst, iv;
88*8000e627SVadim Fedorenko 	struct __crypto_ctx_value *v;
89*8000e627SVadim Fedorenko 	struct bpf_crypto_ctx *ctx;
90*8000e627SVadim Fedorenko 
91*8000e627SVadim Fedorenko 	v = crypto_ctx_value_lookup();
92*8000e627SVadim Fedorenko 	if (!v)
93*8000e627SVadim Fedorenko 		return -ENOENT;
94*8000e627SVadim Fedorenko 
95*8000e627SVadim Fedorenko 	ctx = v->ctx;
96*8000e627SVadim Fedorenko 	if (!ctx)
97*8000e627SVadim Fedorenko 		return -ENOENT;
98*8000e627SVadim Fedorenko 
99*8000e627SVadim Fedorenko 	bpf_dynptr_from_skb(skb, 0, &psrc);
100*8000e627SVadim Fedorenko 	bpf_dynptr_from_mem(dst, len, 0, &pdst);
101*8000e627SVadim Fedorenko 	bpf_dynptr_from_mem(dst, 0, 0, &iv);
102*8000e627SVadim Fedorenko 
103*8000e627SVadim Fedorenko 	status = bpf_crypto_decrypt(ctx, &psrc, &pdst, &iv);
104*8000e627SVadim Fedorenko 	__sync_add_and_fetch(&hits, 1);
105*8000e627SVadim Fedorenko 
106*8000e627SVadim Fedorenko 	return 0;
107*8000e627SVadim Fedorenko }
108*8000e627SVadim Fedorenko 
109*8000e627SVadim Fedorenko char __license[] SEC("license") = "GPL";
110