собираем приложение с исходниками openssl 1.0.2 под Qt Creator 2.4.1

Итак мы подходим к готовому результату. То есть здесь мы получим полноценную среду для отладки исходников openssl (1.0.2) под Qt Creator 2.4.1 (библиотека Qt 4.8.1) под Windows 10-64 , где установлен Microsof Visual Studio 2010 Ultimate.

Главные плюсы это отладка , навигация по коду , подсветка макросов и т.д.

Мы берем все исходники из каталогов crypto, ssl, ms, engines и apps и запихиваем в проект под Qt creator.

Из apps берем только то , что связано с s_client.c .

Собирать будем debug версию.

Вот такой у нас будет pro файл :

TEMPLATE = app

QT      += core
QT       -= gui
CONFIG   += console
CONFIG   -= app_bundle

DEFINES = OPENSSL_THREADS DSO_WIN32 OPENSSL_SYSNAME_WIN32 WIN32_LEAN_AND_MEAN L_ENDIAN _CRT_SECURE_NO_DEPRECATE _WINSOCK_DEPRECATED_NO_WARNINGS OPENSSL_USE_APPLINK OPENSSL_NO_RC5 OPENSSL_NO_MD2 OPENSSL_NO_SSL2 OPENSSL_NO_KRB5 OPENSSL_NO_JPAKE OPENSSL_NO_WEAK_SSL_CIPHERS OPENSSL_NO_RC5 OPENSSL_NO_STATIC_ENGINE OPENSSL_NO_RC5 OPENSSL_BUILD_SHLIBCRYPTO _WINDLL

#OPENSSL_SYS_WIN16
#OPENSSL_NO_FP_API

INCLUDEPATH += $$PWD/crypto $$PWD/ssl
DEPENDPATH += $$PWD/crypto $$PWD/ssl

win32:LIBS += ws2_32.lib gdi32.lib advapi32.lib crypt32.lib user32.lib

OBJECTS_DIR     = tmp\\obj\\$$out_dir
MOC_DIR         = tmp\\moc\\$$out_dir
RCC_DIR         = tmp\\rcc\\$$out_dir

#CONFIG -= release static
#CONFIG += debug shared

include(ms/ms.pri)

include(engine/engine.pri)

include(ssl/ssl.pri)

include(crypto/crypto.pri)

include(apps/apps.pri)

Такой у нас получился crypto.pri (набор файлов из папки crypto) :

include(my_windows/my_windows.pri)
#include(ms/ms.pri)
include(aes/aes.pri)
include(asn1/asn1.pri)
include(bf/bf.pri)
include($$PWD/bio/bio.pri)
include(bn/bn.pri)
include(buffer/buffer.pri)
include(camellia/camellia.pri)
include(cast/cast.pri)
include(cmac/cmac.pri)
include(cms/cms.pri)
include(comp/comp.pri)
include(conf/conf.pri)

include(des/des.pri)
include(dh/dh.pri)
include(dsa/dsa.pri)
include(dso/dso.pri)
include(ec/ec.pri)
include(ecdh/ecdh.pri)
include(ecdsa/ecdsa.pri)

include(evp/evp.pri)
include(hmac/hmac.pri)
include(idea/idea.pri)
#include(jpake/jpake.pri)
include(krb5/krb5.pri)
include(lhash/lhash.pri)
#include(md2/md2.pri)
include(md4/md4.pri)
include(md5/md5.pri)
include(mdc2/mdc2.pri)
include(modes/modes.pri)

include(objects/objects.pri)
include(ocsp/ocsp.pri)
include(pem/pem.pri)
include(pkcs7/pkcs7.pri)
include(pkcs12/pkcs12.pri)
include(pqueue/pqueue.pri)
include(rand/rand.pri)
include(rc2/rc2.pri)
include(rc4/rc4.pri)
#include(rc5/rc5.pri)
include(ripemd/ripemd.pri)
include(rsa/rsa.pri)
include(seed/seed.pri)
include(sha/sha.pri)
include(srp/srp.pri)
#include(store/store.pri) no-store
#include(threads/threads.pri)

include(ts/ts.pri)
include(txt_db/txt_db.pri)
include(ui/ui.pri)
include(whrlpool/whrlpool.pri)
include(x509/x509.pri)
include(x509v3/x509v3.pri)

include(err/err.pri)

HEADERS += cryptlib.h \
    buildinf.h \
    md32_common.h \
    o_time.h \
    o_str.h \
    o_dir.h \
    crypto.h \
    opensslv.h \
    opensslconf.h \
    ebcdic.h \
    symhacks.h \
    ossl_typ.h \
    bn_int.h \
    vms_rms.h \
    sparc_arch.h \
    ppc_arch.h \
    fips_err.h \
    constant_time_locl.h \
    arm_arch.h


SOURCES += cryptlib.c \
    mem.c \
    mem_clr.c \
    mem_dbg.c \
    cversion.c \
    ex_data.c \
    cpt_err.c \
    ebcdic.c \
    uid.c \
    o_time.c \
    o_str.c \
    o_dir.c \
    o_fips.c \
    o_init.c \
    fips_ers.c \
    my_123_my.c \
    getenv.c

include(stack/stack.pri)

include(my_windows/my_windows.pri) только для того , чтобы #include "winsock2.h" сделать первым (до #include "windows.h").

Далее ssl.pri в таком же духе :

INCLUDEPATH += $$PWD/.. $$PWD/../ms $$PWD/../crypto $$PWD/../crypto/err
DEPENDPATH += $$PWD/.. $$PWD/../ms $$PWD/../crypto $$PWD/../crypto/err

HEADERS += \
    ssl/dtls1.h \
    ssl/kssl.h \
    ssl/kssl_lcl.h \
    ssl/srtp.h \
    ssl/ssl.h \
    ssl/ssl_locl.h \
    ssl/ssl2.h \
    ssl/ssl3.h \
    ssl/ssl23.h \
    ssl/tls1.h \


SOURCES += \
    ssl/bio_ssl.c \
    ssl/d1_both.c \
    ssl/d1_clnt.c \
    ssl/d1_lib.c \
    ssl/d1_meth.c \
    ssl/d1_pkt.c \
    ssl/d1_srtp.c \
    ssl/d1_srvr.c \
    ssl/kssl.c \
    ssl/s2_clnt.c \
    ssl/s2_enc.c \
    ssl/s2_lib.c \
    ssl/s2_meth.c \
    ssl/s2_pkt.c \
    ssl/s2_srvr.c \
    ssl/s3_both.c \
    ssl/s3_cbc.c \
    ssl/s3_clnt.c \
    ssl/s3_enc.c \
    ssl/s3_lib.c \
    ssl/s3_meth.c \
    ssl/s3_pkt.c \
    ssl/s3_srvr.c \
    ssl/s23_clnt.c \
    ssl/s23_lib.c \
    ssl/s23_meth.c \
    ssl/s23_pkt.c \
    ssl/s23_srvr.c \
    ssl/ssl_algs.c \
    ssl/ssl_asn1.c \
    ssl/ssl_cert.c \
    ssl/ssl_ciph.c \
    ssl/ssl_conf.c \
    ssl/ssl_err.c \
    ssl/ssl_err2.c \
    ssl/ssl_lib.c \
    ssl/ssl_rsa.c \
    ssl/ssl_sess.c \
    ssl/ssl_stat.c \
    ssl/ssl_txt.c \
    ssl/ssl_utst.c \
    ssl/t1_clnt.c \
    ssl/t1_enc.c \
    ssl/t1_ext.c \
    ssl/t1_lib.c \
    ssl/t1_meth.c \
    ssl/t1_reneg.c \
    ssl/t1_srvr.c \
    ssl/t1_trce.c \
    ssl/tls_srp.c

Последняя ветка проекта apps.pri - это сам s_client.c , который содержит main() для тестирования соединения с сервером по SSL/TLS. По сути это тот же :

openssl s_client -connect kkmspb.ru:443 -servername kkmspb.ru -tls1_2

include(../ms/ms.pri)

SOURCES += \
    apps/s_client.c \
    apps/s_cb.c \
    apps/apps.c \
    apps/app_rand.c \
    apps/s_socket.c

HEADERS += \
    apps/apps.h \
    apps/testrsa.h \
    apps/testdsa.h \
    apps/s_apps.h \
    apps/progs.h

Ну и наконец запускаем отладку и начинаем изучать код openssl 1.0.2 в режиме отладки :

фотка 1

Такой хорошенький период времени убит при сборке из-за bss_file.c

Возможно и у вас будет затык в компиляции с файлом bss_file.c , то есть файл есть в проекте Qt , но bss_file.obj почему-то не создается благодаря фрагменту кода ниже :

#if defined(_WINDLL) && defined(OPENSSL_SYS_WIN16)
# include "../crypto/bio/bss_file.c"  // надо закомментировать !
#endif

Чтобы понять , что происходит надо открыть Makefile.Debug , созданных qmake под Qt Creator и все станет очевидно : bss_file.c будет запихнут в список с хедерами.