Итак мы подходим к готовому результату. То есть здесь мы получим полноценную среду для отладки исходников 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 в режиме отладки :
Такой хорошенький период времени убит при сборке из-за 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 будет запихнут в список с хедерами.