Расшифровка с помощью rfc3686(ctr(aes)) без использования инструкций AES-NI в ядре Linux

Я пытаюсь выяснить разницу, которую AES-NI привносит в криптовалюту AES. После попытки с AES-CBC, похоже, ничего не получится, как утверждает Intel. Однако для режимов AES-CTR и AES-GCM Intel обещает значительное улучшение производительности. Я пытаюсь использовать криптоалгоритм rfc3686(ctr(aes)) для расшифровки пакета ESP, но безуспешно. Вот мой фрагмент кода для крипто-API-

struct ablkcipher_request *req;
struct crypto_ablkcipher *tfm;
uint8_t _key[20] = {0};
int ret;

tfm = crypto_alloc_ablkcipher("rfc3686(ctr(aes))", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm)) 
   return -1;

req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
if (!req) {
   return -1;

ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
    decrypt_callback, &dc);
crypto_ablkcipher_clear_flags(tfm, ~0);
memcpy(_key, sa->key, sa->len);
ret = crypto_ablkcipher_setkey(tfm, _key, 20);

sg_init_table(sg_in, 1);
sg_init_table(sg_out, 2);
sg_set_buf(sg_in, in_buf, in_buf_len);
sg_set_buf(&sg_out[0], out_buf, out_buf_len);
sg_set_buf(&sg_out[1], pad, sizeof(pad));
ablkcipher_request_set_crypt(req, sg_in, sg_out,
     in_buf_len,
     iv);
ret = crypto_ablkcipher_decrypt(req);

// здесь decrypt_callback

void decrypt_callback(struct crypto_async_request *req, int err)
{
    struct decrypt_data *dc = req->data;
    struct callback_data *cb = dc->cb;

    printk("err %d\n", err);
    if (err == -EINPROGRESS)
            return;

    ablkcipher_request_free(req);
    kfree(dc);

 }

Теперь, во время обработки пакета, я вижу, что crypto_ablkcipher_decrypt возвращает 0, но decrypt_callback не вызывается.

Кроме того, я поместил некоторые распечатки в AES-NI rfc3686(ctr(aes)), расшифровывающую маршрутизацию, которую я не вижу предстоящей, которая когда помещена в AES-CBC расшифровывается и с использованием алгоритма AES-CBC видна.

Пожалуйста, посоветуйте, что может быть не так.

Спасибо

0 ответов

Другие вопросы по тегам