Я пытаюсь протестировать криптографический 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.Для ключа и открытого текста я просто использую произвольные значения.
Чего мне не хватает?
Обновление: я обнаружил, что шифрование действительно работает.Так что меня беспокоит только то, что функция обратного вызова не вызывается!?