没有调用crypto_skcipher_encrypt回调

时间:2019-05-11 22:04:08

标签: linux kernel crypt

我正在尝试通过使用对称密码功能(带有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不需要这样做。对于键和明文,我只是使用一些任意值。

我想念什么?

更新:我发现加密实际上是有效的。因此,唯一令我担心的是,未调用回调函数!?

0 个答案:

没有答案