我正在尝试使用“arc4”算法来加密来自模块的任意数据流。但我对我应该如何处理它有点无能为力。实施在<crypto/arc4.c>
$find . -type f -name '*.[ch]' -exec grep 'EXPORT_SYMBOL' {} \; | grep
'rc4'
什么也没返回。所以我想没有外部接口
static void arc4_crypt(struct crypto_tfm *tfm, u8 *out, const u8 *in).
寄存器函数定义为
static int __init arc4_init(void)
{
return crypto_register_alg(&arc4_alg);
}
并且有一个静态实例struct crypto_alg
。
通过这些提示,我得出结论,我需要更高级别的接口来访问此算法。
在我的情况下似乎相关的唯一功能是:
EXPORT_SYMBOL_GPL(crypto_alloc_tfm);
来自<crypto/api.c>
:
void *crypto_alloc_tfm(const char *alg_name,
const struct crypto_type *frontend, u32 type, u32 mask)
它回来void *
了,这是我最关心的问题。
而且还从<crypt/api.c>
crypto_alloc_tfm() 将首先尝试定位已加载的算法。如果失败并且内核支持动态加载模块,它将尝试加载同名或别名的模块。如果失败,它将向任何已加载的加密管理器发送查询以动态构建算法。在算法上抓取一个引用计数,然后将其与新的变换相关联。
返回的转换是不确定的类型。大多数人应该使用一种更具体的分配函数,例如 crypto_alloc_blkcipher。
但是crypto_alloc_*
我找不到具体的可以提供arc4
算法的。
第二个顾虑:
struct crypto_type
in 手动实例化看起来很可怕。
最后,如果获得一个tfm
实例,我如何使用它来进行实际加密?