обратный вызов crypto_skcipher_encrypt не вызывается - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь протестировать криптографический API с помощью симметричных функций шифрования (ecb с aes).В соответствии с возвращаемыми значениями различных функций, все выглядит нормально, но кажется, что функция обратного вызова, которую я установил в структуре запроса, не вызывается (тестирование через 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.Для ключа и открытого текста я просто использую произвольные значения.

Чего мне не хватает?

Обновление: я обнаружил, что шифрование действительно работает.Так что меня беспокоит только то, что функция обратного вызова не вызывается!?

...