我正在尝试通过使用对称密码功能(带有AES的ecb)来测试crypto API。根据各种函数的返回值,一切似乎都不错,但似乎未调用我在请求结构中设置的回调函数(通过printk进行测试)。有什么想法我没看到吗?
存储我所有的东西的结构
struct encrypt_ctx {
struct crypto_skcipher *tfm;
struct skcipher_request *req;
struct completion complete;
int err;
};
我的回调函数,该函数现在应该只将某些内容打印到内核环中。
static void crypto_req_done(struct crypto_async_request *req, int a)
{
struct encrypt_ctx *ectx = req->data;
printk(KERN_ERR "CRYPTO DONE\n");
complete(&ectx->complete);
}
分配密码上下文和请求的初始函数
static int init(struct encrypt_ctx *ectx)
{
ectx->tfm = crypto_alloc_skcipher("ecb(aes)", 0, 0);
if (IS_ERR(ectx->tfm)) {
printk(KERN_ERR "error allocate cipher\n");
return 1;
}
ectx->req = skcipher_request_alloc(ectx->tfm, GFP_KERNEL);
if (!ectx->req) {
printk(KERN_ERR "error skcipher request alloc\n");
return 1;
}
skcipher_request_set_callback(ectx->req, CRYPTO_TFM_REQ_MAY_BACKLOG, crypto_req_done, ectx);
init_completion(&ectx->complete);
return 0;
}
还有我调用初始化并想要触发加密的实际函数
static void encrypt(void *key, void *data, unsigned int size)
{
struct encrypt_ctx ectx;
struct scatterlist sg;
int ret;
if ( init(&ectx)) {
return;
}
crypto_skcipher_setkey(ectx.tfm, key, 32);
sg_init_one(&sg, data, size);
skcipher_request_set_crypt(ectx.req, &sg, &sg, size, NULL);
if (crypto_skcipher_encrypt(ectx.req)) {
printk(KERN_ERR "trigger encryption\n");
return;
}
if (ectx.err) {
printk(KERN_ERR "context error\n");
return;
}
}
基本上是从init函数直接调用的。
static void m_crypt(void)
{
unsigned char key[32] = {0};
char plain[16] = {0};
key[0] = 'E';
plain[0] = 'a';
encrypt(key, plain, 16);
}
static int __init m_init(void) {
m_crypt();
return 0;
}
module_init(m_init);
为了简化起见,我跳过了IV,因为ECB不需要这样做。对于键和明文,我只是使用一些任意值。
我想念什么?
更新:我发现加密实际上是有效的。因此,唯一令我担心的是,未调用回调函数!?