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(¶ms.algo, cipher, sizeof(cipher)); 40*8000e627SVadim Fedorenko __builtin_memcpy(¶ms.key, key, sizeof(key)); 41*8000e627SVadim Fedorenko cctx = bpf_crypto_ctx_create(¶ms, 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