понедельник, 15 февраля 2010 г.

Криптография под Qt выпуск 2

Как оказалось, чтобы собрать нормальную дебаг версию надо было указать ключ --debug-and-release для configure.exe.
Но это еще не все.
По умолчанию QCA поддерживает только алгоритмы SHA1 и MD5. Чтобы получить остальное нужно ставить дополнительный плагин qca-ossl-2.0.0-beta3.tar.bz2.
Установка его дает нам такой комбайн поддерживаемых алгоритмов: TLS, CMS, X.509, RSA, DSA, Diffie-Hellman, PKCS#7, PKCS#12, SHA0, SHA1, SHA224, SHA256, SHA384, SHA512, MD2, MD4, MD5, RIPEMD160, Blowfish, DES, 3DES, AES128, AES192, AES256, CAST5, HMAC(SHA1, MD5, RIPEMD160), PBKDF1(MD2, SHA1), PBKDF2(SHA1).
Этот плагин в свою очередь зависит от OpenSSL версии не ниже 0.9.6
Взять его можно здесь openssl-0.9.8l
OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA и сертификаты X.509, подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений.
OpenSSL поддерживает разные алгоритмы шифрования и хеширования:
Симметричные
Blowfish, Camellia, DES, RC2, RC4, RC5, IDEA, AES, ГОСТ 28147-89
Хеш-функции
MD5, MD2, SHA, MDC-2, ГОСТ Р 34.11-94
Асимметричные
RSA, DSA, Diffie-Hellman key exchange, ГОСТ Р 34.10-2001, ГОСТ Р 34.10-94
Поддержка алгоритмов ГОСТ появилась в версии 1.0.0, в данный момент находящейся в стадии бета-тестирования.
Чтобы собрать OpenSSL нужен Perl. Пришлось поставить Strawberry Perl.

После чего конфигуряется командой
> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
Затем
> ms\do_ms
И
 > nmake -f ms\ntdll.mak
> nmake -f ms\ntdll.mak install
После установки OpenSSL нужно сплясать еще один танец с бубном. Это касатся уже установки плагина qca-ossl.
В Папке %QTDIR% \mkspecs\features нужно создать файл winlocal.prf со строчкой WINLOCAL_PREFIX = D:/OpenSSL
То есть, указать путь до собранной OpenSSL.

В ходе сборки плагина у меня выскакивала ошибка, что де не найден OBJ_whirlpool. Эта переменная определена в OpenSSL, и управляет включением алгоритма Whirlpool — криптографическая хеш-функция.
Однако плагин в упор не видит исходного кода алгоритма и вылетает. Пришлось в коде плагина убрать упоминания о Whirlpool.
В итоге плагин qca-ossl2.dll все таки собрался.
Копируем его в %QTDIR%\plugins\crypto.
Завтра будем пробовать. По крайней мере if(QCA::isSupported("aes128-cbc-pkcs7")) стало возвращать true.

6 комментариев:

  1. спасибо очень полезная статья

    ОтветитьУдалить
  2. Так просто всё у вас (: Мне qca-ossl так скомпилировать и не удалось. Сыпется при mingw32-make на следующем:

    In file included from qca-ossl.cpp:38:
    c:\openssl\include/openssl/ssl.h:1: error: stray '\377' in program
    c:\openssl\include/openssl/ssl.h:1: error: stray '\376' in program

    ...

    In file included from qca-ossl.cpp:38:
    c:\openssl\include/openssl/ssl.h:1: error: stray '\377' in program
    c:\openssl\include/openssl/ssl.h:1: error: stray '\376' in program

    Может есть идеи как побороть это безумие?

    ОтветитьУдалить
  3. d:\openssl-0.9.8l\crypto\cryptlib.h(62) : fatal error C1083: Не удается открыть
    файл включение: stdlib.h: No such file or directory
    NMAKE : U1077:
    Stop.

    Помогите пожалуйста, в чем может быть проблема? переменные среды выставлены туда где лежит этот файл, причем в 3 разных местах...

    Делал все как Вы писали с первой части, в чем может быть проблема? Помогите пожалуйста.

    ОтветитьУдалить
  4. Собирал давеча qca-ossl-2.0.0-beta3

    ругалось на отсутсвтие EVP_md2:

    .\qca-ossl.cpp(1775) : error C3861: 'EVP_md2': identifier not found
    .\qca-ossl.cpp(1793) : error C3861: 'EVP_md2': identifier not found
    .\qca-ossl.cpp(6792) : error C3861: 'EVP_md2': identifier not found
    .\qca-ossl.cpp(6820) : error C3861: 'EVP_md2': identifier not found
    NMAKE : fatal error U1077: 'C:\Dev\VS9\VC\BIN\cl.EXE' : return code '0x2'
    Stop.
    NMAKE : fatal error U1077: 'C:\Dev\VS9\VC\BIN\nmake.exe' : return code '0x2'
    Stop.

    а дело в том что в OpenSSL 1.0.0 по умолчанию не поддерживается MD2 - пришловсь #ifdef около всех EVP_md2 в либе вставить :)


    зато на whirpool не ругалось вообще

    ОтветитьУдалить
  5. вот и на википедии подтверждение нашлось -
    In 2009, security updates were issued disabling MD2 in OpenSSL, GnuTLS, and Network Security Services.[5]

    http://en.wikipedia.org/wiki/MD2_(cryptography)

    ОтветитьУдалить