Linux Kernel Crypto API - PullRequest
       9

Linux Kernel Crypto API

1 голос
/ 21 сентября 2019

Я пытаюсь создать простой модуль ядра с использованием Linux Kernel Crypto API.
У меня есть пример из https://www.kernel.org/doc/html/v4.17/crypto/api-samples.html (Пример кода для работы шифра с симметричным ключом)

Моя проблема связана с переменной " scratchpad " (Дата ввода) являетсяТо же значение до и после запуска.
Также bracnh никогда не используется:

if (rc)
        pr_info("skcipher encrypt returned with result %d\n", rc);

Я уверен, что делаю что-то не так?

1 Ответ

0 голосов
/ 21 сентября 2019

Относительно первой части вопроса:

Моя проблема состоит в том, что переменная "блокнот" (дата ввода) имеет одинаковое значение до и после ее запуска.

Поскольку вы пытаетесь зашифровать на месте, передавая тот же список разброса / сбора, что и пункт назначения, это проблема.Они не должны быть одинаковыми.

Для отладки вы можете:

  1. Попробуйте другие алгоритмы.Я вижу из вашего /proc/crypto файла, что у вас есть __cbc-aes-aesni.Вы можете попробовать это и другие, чтобы проверить логику вашего модуля.
  2. Попробуйте cryptodev из пространства пользователя (/dev/crypto).Это значительно упрощает отладку благодаря использованию cryptodev tests и проверке dmesg.Добавление enable_stats=1 к параметрам модуля также помогает.Когда ваше приложение стабильно работает в пользовательском пространстве, вы можете вернуться к ядру.

Для второй части:

Также никогда не используется bracnh:

if (rc)
       pr_info("skcipher encrypt returned with result %d\n", rc);

Я бы сказал, что это не проблема.

Следуя кодовой последовательности (ссылаясь на ту же версию ядра v4.17, что и ссылка на документацию):

  1. crypto_wait_req принимает код ошибки, в нашем случае переданный crypto_skcipher_encrypt().Если ошибка не равна -EBUSY или -EINPROGRESS, этот код ошибки возвращается к rc, и ноль является совершенно нормальным.
  2. В свою очередь, crypto_skcipher_encrypt возвращает 0, еслиоперация шифрования прошла успешно;<0, если произошла ошибка.Поскольку вы установили ключ, должно быть возвращено 0. </li>
  3. Я буду ссылаться на Intel __cbc-aes-aesni в качестве драйвера.Отметив cbc_encrypt(), можно увидеть, что ноль - это возвращаемое значение в случае успеха, о чем свидетельствует возвращаемое значение skcipher_walk_done() в успешном состоянии.

Таким образом, ожидается, что при успешном выполнении операции ветвь не будет вызвана.

...