/* BPF crypto initialization parameters struct */ /** * struct bpf_crypto_params - BPF crypto initialization parameters structure * @type: The string of crypto operation type. * @reserved: Reserved member, will be reused for more options in future * Values: * 0 * @algo: The string of algorithm to initialize. * @key: The cipher key used to init crypto algorithm. * @key_len: The length of cipher key. * @authsize: The length of authentication tag used by algorithm.
*/ struct bpf_crypto_params { char type[14];
u8 reserved[2]; char algo[128];
u8 key[256];
u32 key_len;
u32 authsize;
};
/** * struct bpf_crypto_ctx - refcounted BPF crypto context structure * @type: The pointer to bpf crypto type * @tfm: The pointer to instance of crypto API struct. * @siv_len: Size of IV and state storage for cipher * @rcu: The RCU head used to free the crypto context with RCU safety. * @usage: Object reference counter. When the refcount goes to 0, the * memory is released back to the BPF allocator, which provides * RCU safety.
*/ struct bpf_crypto_ctx { conststruct bpf_crypto_type *type; void *tfm;
u32 siv_len; struct rcu_head rcu;
refcount_t usage;
};
int bpf_crypto_register_type(conststruct bpf_crypto_type *type)
{ struct bpf_crypto_type_list *node; int err = -EEXIST;
down_read(&bpf_crypto_types_sem);
list_for_each_entry(node, &bpf_crypto_types, list) { if (strcmp(node->type->name, name)) continue;
if (try_module_get(node->type->owner))
type = node->type; break;
}
up_read(&bpf_crypto_types_sem);
return type;
}
__bpf_kfunc_start_defs();
/** * bpf_crypto_ctx_create() - Create a mutable BPF crypto context. * * Allocates a crypto context that can be used, acquired, and released by * a BPF program. The crypto context returned by this function must either * be embedded in a map as a kptr, or freed with bpf_crypto_ctx_release(). * As crypto API functions use GFP_KERNEL allocations, this function can * only be used in sleepable BPF programs. * * bpf_crypto_ctx_create() allocates memory for crypto context. * It may return NULL if no memory is available. * @params: pointer to struct bpf_crypto_params which contains all the * details needed to initialise crypto context. * @params__sz: size of steuct bpf_crypto_params usef by bpf program * @err: integer to store error code when NULL is returned.
*/
__bpf_kfunc struct bpf_crypto_ctx *
bpf_crypto_ctx_create(conststruct bpf_crypto_params *params, u32 params__sz, int *err)
{ conststruct bpf_crypto_type *type; struct bpf_crypto_ctx *ctx;
/** * bpf_crypto_ctx_acquire() - Acquire a reference to a BPF crypto context. * @ctx: The BPF crypto context being acquired. The ctx must be a trusted * pointer. * * Acquires a reference to a BPF crypto context. The context returned by this function * must either be embedded in a map as a kptr, or freed with * bpf_crypto_ctx_release().
*/
__bpf_kfunc struct bpf_crypto_ctx *
bpf_crypto_ctx_acquire(struct bpf_crypto_ctx *ctx)
{ if (!refcount_inc_not_zero(&ctx->usage)) return NULL; return ctx;
}
/** * bpf_crypto_ctx_release() - Release a previously acquired BPF crypto context. * @ctx: The crypto context being released. * * Releases a previously acquired reference to a BPF crypto context. When the final * reference of the BPF crypto context has been released, its memory * will be released.
*/
__bpf_kfunc void bpf_crypto_ctx_release(struct bpf_crypto_ctx *ctx)
{ if (refcount_dec_and_test(&ctx->usage))
call_rcu(&ctx->rcu, crypto_free_cb);
}
/** * bpf_crypto_decrypt() - Decrypt buffer using configured context and IV provided. * @ctx: The crypto context being used. The ctx must be a trusted pointer. * @src: bpf_dynptr to the encrypted data. Must be a trusted pointer. * @dst: bpf_dynptr to the buffer where to store the result. Must be a trusted pointer. * @siv__nullable: bpf_dynptr to IV data and state data to be used by decryptor. May be NULL. * * Decrypts provided buffer using IV data and the crypto context. Crypto context must be configured.
*/
__bpf_kfunc int bpf_crypto_decrypt(struct bpf_crypto_ctx *ctx, conststruct bpf_dynptr *src, conststruct bpf_dynptr *dst, conststruct bpf_dynptr *siv__nullable)
{ conststruct bpf_dynptr_kern *src_kern = (struct bpf_dynptr_kern *)src; conststruct bpf_dynptr_kern *dst_kern = (struct bpf_dynptr_kern *)dst; conststruct bpf_dynptr_kern *siv_kern = (struct bpf_dynptr_kern *)siv__nullable;
/** * bpf_crypto_encrypt() - Encrypt buffer using configured context and IV provided. * @ctx: The crypto context being used. The ctx must be a trusted pointer. * @src: bpf_dynptr to the plain data. Must be a trusted pointer. * @dst: bpf_dynptr to the buffer where to store the result. Must be a trusted pointer. * @siv__nullable: bpf_dynptr to IV data and state data to be used by decryptor. May be NULL. * * Encrypts provided buffer using IV data and the crypto context. Crypto context must be configured.
*/
__bpf_kfunc int bpf_crypto_encrypt(struct bpf_crypto_ctx *ctx, conststruct bpf_dynptr *src, conststruct bpf_dynptr *dst, conststruct bpf_dynptr *siv__nullable)
{ conststruct bpf_dynptr_kern *src_kern = (struct bpf_dynptr_kern *)src; conststruct bpf_dynptr_kern *dst_kern = (struct bpf_dynptr_kern *)dst; conststruct bpf_dynptr_kern *siv_kern = (struct bpf_dynptr_kern *)siv__nullable;
ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_SCHED_CLS, &crypt_kfunc_set);
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_SCHED_ACT, &crypt_kfunc_set);
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &crypt_kfunc_set);
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_SYSCALL,
&crypt_init_kfunc_set); return ret ?: register_btf_id_dtor_kfuncs(bpf_crypto_dtors,
ARRAY_SIZE(bpf_crypto_dtors),
THIS_MODULE);
}
late_initcall(crypto_kfunc_init);
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.