Тестирование собственного движка openSSL из командной строки

Быстрый вопрос: Как я могу проверить функциональность собственного движка openSSL, который я пишу из командной строки?

Прямо сейчас я следую этому замечательному учебнику и успешно могу использовать движок (который возвращает значение дайджеста всех 2), используя мою тестовую программу ( исходный код здесь, тестовая программа расположена в test/wssha256engine_test.c).

brett@wintermute:~/openssl_ws/wssha256engine$ make test
make[1]: Entering directory 
/home/brett/openssl_ws/wssha256engine/test
make[1]: '../bin/test' is up to date.
make[1]: Leaving directory 
/home/brett/openssl_ws/wssha256engine/test
brett@wintermute:~/openssl_ws/wssha256engine$ bin/test
Engine Loaded...
Initializing wssha256 engine...
*TEST: Successfuly initialized engine [A test engine for the ws sha256 hardware encryption module, on the Xilinx ZYNQ7000]
    init result = 1
Digest NID=672 requested
SHA256 algorithm context initialized
*TEST: Digest INIT 1
SHA256 update
*TEST: Digest Update 1
SHA256 final: sizeof(EVP_MD)= 120
SHA256 cleanup
*TEST: Digest Final 1 Digest size:32
22222222222222222222222222222222

Тем не менее, по причинам, я хотел бы также использовать интерфейс командной строки openssl для проверки движка, который я только что написал, и чтобы он вычислял дайджест случайной строки, как в этом другом уроке, просто используя sha256, а не md5.

Но когда я пытаюсь это сделать, движок не загружается и выдает ошибку, сообщающую, что NID моего дайджеста не существует, а вместо этого просто хеширует строку стандартным алгоритмом:

brett@wintermute:~/openssl_ws/wssha256engine$ echo "Hello" | openssl dgst -engine /home/brett/Thesis/openssl_ws/wssha256engine/bin/libwssha256engine.so -sha256
ERROR: Digest is empty! (NID = 0)
engine "wssha256" set.
(stdin)= 66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18

Почему я не могу использовать свой движок в командной строке, но я могу создать программу на C для его загрузки? И как я могу использовать свой движок для вычисления дайджеста из командной строки?

Примечание: я могу загрузить двигатель из командной строки, просто не использую его.

1 ответ

Решение

После некоторых копаний я смог выяснить, почему вызов CLI моего движка не работал, и исправить проблему.

Проблема была в моей функции селектора дайджеста (оригинальный неработающий код закомментирован ниже). Первоначально я возвращал состояние ошибки из функции селектора дайджеста, а не возвращал количество идентификаторов дайджеста, которые поддерживает движок.

static int wssha256engine_digest_selector(ENGINE *e, const EVP_MD **digest, const int **nids, int nid)
{
    if (!digest)
  {
    *nids = wssha256_digest_ids;

    // THIS ORIGINAL CODE CAUSES THE ENGINE TO NEVER INITIALIZE FROM A CLI INVOCATION
    //printf("ERROR: Digest is empty! (NID = %d)\n",nid);
    //return FAIL;

    // THIS FIXES IT
    int retnids = sizeof(wssha256_digest_ids - 1) / sizeof(wssha256_digest_ids[0]);
    printf("wssha256engine: digest nids requested...returning [%d]\n",retnids);
    return retnids;
}

Читая более внимательно, мы можем обнаружить, что OpenSSL вызывает функцию селектора дайджеста следующими (отдельными) способами:

  1. с дайджестом NULL. В этом случае ожидается, что *nids будет присвоен массив NID с нулевым символом в конце, и вызов вернется с количеством доступных NID. OpenSSL использует это, чтобы определить, какие дайджесты поддерживаются этим механизмом.
  2. с дайджестом, отличным от NULL. В этом случае ожидается, что *digest будет назначен указатель на структуру EVP_MD, соответствующую NID, заданному nid. Вызов возвращается с 1, если NID запроса был одним из поддерживаемых этим механизмом, в противном случае 0.

Таким образом, даже несмотря на то, что мой движок поддерживал sha256, вызов CLI не работал, потому что он не должен быть инициализирован дайджестом, прежде чем вызывается функция селектора дайджеста (без понятия о порядке операций при использовании CLI). Однако, когда я вручную инициализировал его в своей тестовой программе, все работало нормально. Изменение на возвращаемое значение без сбоев для поддержки вызова 1. выше решило проблему.

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