brintos

brintos / linux-shallow public Read only

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