AsyncSslSocketLayer.cpp 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464
  1. /* CAsyncSslSocketLayer by Tim Kosse
  2. mailto: [email protected])
  3. Version 2.0 (2005-02-27)
  4. -------------------------------------------------------------
  5. Introduction
  6. ------------
  7. CAsyncSslSocketLayer is a layer class for CAsyncSocketEx which allows you to establish SSL secured
  8. connections. Support for both client and server side is provided.
  9. How to use
  10. ----------
  11. Using this class is really simple. In the easiest case, just add an instance of
  12. CAsyncSslSocketLayer to your socket and call InitClientSsl after creation of the socket.
  13. This class only has a couple of public functions:
  14. - InitSSLConnection(bool clientMode);
  15. This functions establishes an SSL connection. The clientMode parameter specifies wether the SSL connection
  16. is in server or in client mode.
  17. Most likely you want to call this function right after calling Create for the socket.
  18. But sometimes, you'll need to call this function later. One example is for an FTP connection
  19. with explicit SSL: In this case you would have to call InitSSLConnection after receiving the reply
  20. to an 'AUTH SSL' command.
  21. - Is UsingSSL();
  22. Returns true if you've previously called InitClientSsl()
  23. - SetNotifyReply(SetNotifyReply(int nID, int nCode, int result);
  24. You can call this function only after receiving a layerspecific callback with the SSL_VERIFY_CERT
  25. id. Set result to 1 if you trust the certificate and 0 if you don't trust it.
  26. nID has to be the priv_data element of the t_SslCertData structure and nCode has to be SSL_VERIFY_CERT.
  27. - CreateSslCertificate(LPCTSTR filename, int bits, unsigned char* country, unsigned char* state,
  28. unsigned char* locality, unsigned char* organization, unsigned char* unit, unsigned char* cname,
  29. unsigned char *email, CString& err);
  30. Creates a new self-signed SSL certificate and stores it in the given file
  31. - SendRaw(const void* lpBuf, int nBufLen, int nFlags = 0)
  32. Sends a raw, unencrypted message. This may be useful after successful initialization to tell the other
  33. side that can use SSL.
  34. This layer sends some layerspecific notifications to your socket instance, you can handle them in
  35. OnLayerCallback of your socket class.
  36. Valid notification IDs are:
  37. - SSL_INFO 0
  38. There are two possible values for param2:
  39. SSL_INFO_ESTABLISHED 0 - You'll get this notification if the SSL negotiation was successful
  40. SSL_INFO_SHUTDOWNCOMPLETE 1 - You'll get this notification if the SSL connection has been shut
  41. down sucessfully. See below for details.
  42. - SSL_FAILURE 1
  43. This notification is sent if the SSL connection could not be established or if an existing
  44. connection failed. Valid values for param2 are:
  45. - SSL_FAILURE_UNKNOWN 0 - Details may have been sent with a SSL_VERBOSE_* notification.
  46. - SSL_FAILURE_ESTABLISH 1 - Problem during SSL negotiation
  47. - SSL_FAILURE_LOADDLLS 2
  48. - SSL_FAILURE_INITSSL 4
  49. - SSL_FAILURE_VERIFYCERT 8 - The remote SSL certificate was invalid
  50. - SSL_FAILURE_CERTREJECTED 16 - The remote SSL certificate was rejected by user
  51. - SSL_VERBOSE_WARNING 3
  52. SSL_VERBOSE_INFO 4
  53. This two notifications contain some additional information. The value given by param2 is a
  54. pointer to a null-terminated char string (char *) with some useful information.
  55. - SSL_VERIFY_CERT 2
  56. This notification is sent each time a remote certificate has to be verified.
  57. param2 is a pointer to a t_SslCertData structure which contains some information
  58. about the remote certificate.
  59. You have to set the reply to this message using the SetNotifyReply function.
  60. Be careful with closing the connection after sending data, not all data may have been sent already.
  61. Before closing the connection, you should call Shutdown() and wait for the SSL_INFO_SHUTDOWNCOMPLETE
  62. notification. This assures that all encrypted data really has been sent.
  63. License
  64. -------
  65. Feel free to use this class, as long as you don't claim that you wrote it
  66. and this copyright notice stays intact in the source files.
  67. If you want to use this class in a commercial application, a short message
  68. to [email protected] would be appreciated but is not required.
  69. This product includes software developed by the OpenSSL Project
  70. for use in the OpenSSL Toolkit. (http://www.openssl.org/)
  71. Version history
  72. ---------------
  73. Version 2.0:
  74. - Add server support
  75. - a lot of bug fixes
  76. */
  77. #include "stdafx.h"
  78. #include "AsyncSslSocketLayer.h"
  79. #if defined _DEBUG && defined _AFX
  80. #define new DEBUG_NEW
  81. #undef THIS_FILE
  82. static char THIS_FILE[] = __FILE__;
  83. #endif
  84. // Simple macro to declare function type and function pointer based on the
  85. // three given parametrs:
  86. // r - return type,
  87. // n - function name
  88. // a - argument list
  89. //
  90. // Example:
  91. // def(int, foo, (int x)) becomes the following:
  92. // typedef int (*tfoo)(int x);
  93. // static tfoo pfoo;
  94. #define def(r, n, a) \
  95. typedef r (*t##n) a; \
  96. static t##n p##n;
  97. // Macro to load the given macro from a dll:
  98. #ifdef MPEXT_NO_SSLDLL
  99. #include <openssl/err.h>
  100. #define load(dll, n) \
  101. p##n = n;
  102. #else
  103. #define load(dll, n) \
  104. p##n = (t##n) GetProcAddress(dll, #n); \
  105. if (!p##n) \
  106. bError = true;
  107. #endif
  108. //The following functions from the SSL libraries are used:
  109. def(int, SSL_state, (const SSL *s));
  110. def(const char*, SSL_state_string_long, (const SSL *s));
  111. def(void, SSL_set_info_callback, (SSL *ssl, void (*cb)(const SSL *ssl,int type,int val)));
  112. def(void, SSL_set_bio, (SSL *s, BIO *rbio, BIO *wbio));
  113. def(void, SSL_set_connect_state, (SSL *s));
  114. def(int, SSL_set_session, (SSL *to, SSL_SESSION *session));
  115. def(BIO_METHOD*, BIO_f_ssl, (void));
  116. def(SSL*, SSL_new, (SSL_CTX *ctx));
  117. #ifdef MPEXT
  118. def(SSL_CTX*, SSL_CTX_new, (const SSL_METHOD *meth));
  119. def(const SSL_METHOD*, SSLv23_method, (void));
  120. #else
  121. def(SSL_CTX*, SSL_CTX_new, (SSL_METHOD *meth));
  122. def(SSL_METHOD*, SSLv23_method, (void));
  123. #endif
  124. def(void, SSL_load_error_strings, (void));
  125. def(int, SSL_library_init, (void));
  126. def(void, SSL_CTX_free, (SSL_CTX *));
  127. def(void, SSL_free, (SSL *ssl));
  128. def(int, SSL_get_error, (const SSL *s, int retcode));
  129. def(int, SSL_shutdown, (SSL *s));
  130. def(int, SSL_get_shutdown, (const SSL *ssl));
  131. def(const char*, SSL_alert_type_string_long, (int value));
  132. def(const char*, SSL_alert_desc_string_long, (int value));
  133. def(void, SSL_CTX_set_verify, (SSL_CTX *ctx, int mode, int (*callback)(int, X509_STORE_CTX *)));
  134. def(X509_STORE*, SSL_CTX_get_cert_store, (const SSL_CTX *));
  135. def(long, SSL_get_verify_result, (const SSL *ssl));
  136. def(X509*, SSL_get_peer_certificate, (const SSL *s));
  137. def(const char*, SSL_get_version, (const SSL *ssl));
  138. #ifdef MPEXT
  139. def(const SSL_CIPHER*, SSL_get_current_cipher, (const SSL *ssl));
  140. #else
  141. def(SSL_CIPHER*, SSL_get_current_cipher, (const SSL *ssl));
  142. #endif
  143. def(const char*, SSL_CIPHER_get_name, (const SSL_CIPHER *cipher));
  144. def(char*, SSL_CIPHER_get_version, (const SSL_CIPHER *cipher));
  145. def(int, SSL_get_ex_data_X509_STORE_CTX_idx, (void));
  146. def(int, SSL_CTX_load_verify_locations, (SSL_CTX *ctx, const char *CAfile, const char *CApath));
  147. def(long, SSL_ctrl, (SSL *ssl, int cmd, long larg, void *parg));
  148. def(void, SSL_set_accept_state, (SSL *ssl));
  149. def(int, SSL_CTX_use_PrivateKey_file, (SSL_CTX *ctx, const char *file, int type));
  150. def(int, SSL_CTX_use_certificate_file, (SSL_CTX *ctx, const char *file, int type));
  151. def(int, SSL_CTX_check_private_key, (const SSL_CTX *ctx));
  152. def(void, SSL_CTX_set_default_passwd_cb, (SSL_CTX *ctx, pem_password_cb *cb));
  153. def(void, SSL_CTX_set_default_passwd_cb_userdata, (SSL_CTX *ctx, void *u));
  154. def(int, SSL_CTX_use_certificate_chain_file, (SSL_CTX *ctx, const char *file));
  155. def(size_t, BIO_ctrl_pending, (BIO *b));
  156. def(int, BIO_read, (BIO *b, void *data, int len));
  157. def(long, BIO_ctrl, (BIO *bp, int cmd, long larg, void *parg));
  158. def(int, BIO_write, (BIO *b, const void *data, int len));
  159. def(size_t, BIO_ctrl_get_write_guarantee, (BIO *b));
  160. def(int, BIO_new_bio_pair, (BIO **bio1, size_t writebuf1, BIO **bio2, size_t writebuf2));
  161. def(BIO*, BIO_new, (BIO_METHOD *type));
  162. def(int, BIO_free, (BIO *a));
  163. def(int, i2t_ASN1_OBJECT, (char *buf, int buf_len, ASN1_OBJECT *a));
  164. def(int, OBJ_obj2nid, (const ASN1_OBJECT *o));
  165. def(ASN1_OBJECT*, X509_NAME_ENTRY_get_object, (X509_NAME_ENTRY *ne));
  166. def(X509_NAME_ENTRY*, X509_NAME_get_entry, (X509_NAME *name, int loc));
  167. def(int, X509_NAME_entry_count, (X509_NAME *name));
  168. def(X509_NAME*, X509_get_subject_name, (X509 *a));
  169. def(X509_NAME*, X509_get_issuer_name, (X509 *a));
  170. def(const char*, OBJ_nid2sn, (int n));
  171. def(ASN1_STRING*, X509_NAME_ENTRY_get_data, (X509_NAME_ENTRY *ne));
  172. def(void, X509_STORE_CTX_set_error, (X509_STORE_CTX *ctx, int s));
  173. def(int, X509_digest, (const X509 *data, const EVP_MD *type, unsigned char *md, unsigned int *len));
  174. def(const EVP_MD*, EVP_sha1, (void));
  175. def(X509*, X509_STORE_CTX_get_current_cert, (X509_STORE_CTX *ctx));
  176. def(int, X509_STORE_CTX_get_error, (X509_STORE_CTX *ctx));
  177. def(void, X509_free, (X509 *a));
  178. def(EVP_PKEY*, X509_get_pubkey, (X509 *x));
  179. def(int, BN_num_bits, (const BIGNUM *a));
  180. def(void, EVP_PKEY_free, (EVP_PKEY *pkey));
  181. def(void*, X509_STORE_CTX_get_ex_data, (X509_STORE_CTX *ctx, int idx));
  182. def(char*, X509_NAME_oneline, (X509_NAME *a, char *buf, int size));
  183. def(const char*, X509_verify_cert_error_string, (long n));
  184. def(int, X509_STORE_CTX_get_error_depth, (X509_STORE_CTX *ctx));
  185. def(unsigned long, ERR_get_error, (void));
  186. #ifdef MPEXT
  187. def(char*, ERR_error_string, (unsigned long e, char *buf));
  188. #else
  189. def(const char*, ERR_error_string, (unsigned long e, char *buf));
  190. #endif
  191. def(int, ASN1_STRING_to_UTF8, (unsigned char **out, ASN1_STRING *in));
  192. def(void, CRYPTO_free, (void *p));
  193. def(RSA*, RSA_generate_key, (int bits, unsigned long e, void (*callback)(int,int,void *), void *cb_arg));
  194. def(int, X509_set_version, (X509 *x,long version));
  195. def(ASN1_TIME*, X509_gmtime_adj, (ASN1_TIME *s, long adj));
  196. def(int, X509_set_pubkey, (X509 *x, EVP_PKEY *pkey));
  197. def(int, X509_NAME_add_entry_by_txt, (X509_NAME *name, const char *field, int type, const unsigned char *bytes, int len, int loc, int set));
  198. def(int, X509_NAME_add_entry_by_NID, (X509_NAME *name, int nid, int type, unsigned char *bytes, int len, int loc, int set));
  199. def(int, X509_set_issuer_name, (X509 *x, X509_NAME *name));
  200. def(int, X509_sign, (X509 *x, EVP_PKEY *pkey, const EVP_MD *md));
  201. def(EVP_PKEY*, EVP_PKEY_new, (void));
  202. #ifdef MPEXT
  203. def(int, EVP_PKEY_assign, (EVP_PKEY *pkey, int type, void *key));
  204. #else
  205. def(int, EVP_PKEY_assign, (EVP_PKEY *pkey, int type, char *key));
  206. #endif
  207. def(X509*, X509_new, (void));
  208. def(int, ASN1_INTEGER_set, (ASN1_INTEGER *a, long v));
  209. def(ASN1_INTEGER*, X509_get_serialNumber, (X509 *x));
  210. #ifdef MPEXT
  211. def(int, PEM_ASN1_write_bio, (i2d_of_void *i2d,const char *name,BIO *bp,void *x, const EVP_CIPHER *enc,unsigned char *kstr,int klen, pem_password_cb *callback, void *u));
  212. #else
  213. def(int, PEM_ASN1_write_bio, (int (*i2d)(),const char *name,BIO *bp,char *x, const EVP_CIPHER *enc,unsigned char *kstr,int klen, pem_password_cb *callback, void *u));
  214. #endif
  215. def(int, i2d_X509, (X509 *x, unsigned char **out));
  216. def(BIO_METHOD *, BIO_s_mem, (void));
  217. def(int, i2d_PrivateKey, (EVP_PKEY *a, unsigned char **pp));
  218. // Critical section wrapper class
  219. #ifndef CCRITICALSECTIONWRAPPERINCLUDED
  220. class CCriticalSectionWrapper
  221. {
  222. public:
  223. CCriticalSectionWrapper()
  224. {
  225. m_bInitialized = TRUE;
  226. InitializeCriticalSection(&m_criticalSection);
  227. }
  228. ~CCriticalSectionWrapper()
  229. {
  230. if (m_bInitialized)
  231. DeleteCriticalSection(&m_criticalSection);
  232. m_bInitialized = FALSE;
  233. }
  234. void Lock()
  235. {
  236. if (m_bInitialized)
  237. EnterCriticalSection(&m_criticalSection);
  238. }
  239. void Unlock()
  240. {
  241. if (m_bInitialized)
  242. LeaveCriticalSection(&m_criticalSection);
  243. }
  244. protected:
  245. CRITICAL_SECTION m_criticalSection;
  246. BOOL m_bInitialized;
  247. };
  248. #define CCRITICALSECTIONWRAPPERINCLUDED
  249. #endif
  250. /////////////////////////////////////////////////////////////////////////////
  251. // CAsyncSslSocketLayer
  252. CCriticalSectionWrapper CAsyncSslSocketLayer::m_sCriticalSection;
  253. CAsyncSslSocketLayer::t_SslLayerList* CAsyncSslSocketLayer::m_pSslLayerList = 0;
  254. int CAsyncSslSocketLayer::m_nSslRefCount = 0;
  255. #ifndef MPEXT_NO_SSLDLL
  256. HMODULE CAsyncSslSocketLayer::m_hSslDll1 = 0;
  257. HMODULE CAsyncSslSocketLayer::m_hSslDll2 = 0;
  258. #endif
  259. std::map<SSL_CTX *, int> CAsyncSslSocketLayer::m_contextRefCount;
  260. CAsyncSslSocketLayer::CAsyncSslSocketLayer()
  261. {
  262. m_ssl = 0;
  263. m_sslbio = 0;
  264. m_ibio = 0;
  265. m_nbio = 0;
  266. m_ssl_ctx = 0;
  267. m_bUseSSL = false;
  268. m_bSslInitialized = FALSE;
  269. m_bSslEstablished = FALSE;
  270. m_nNetworkSendBufferLen = 0;
  271. m_nNetworkSendBufferMaxLen = 0;
  272. m_pNetworkSendBuffer = NULL;
  273. m_pRetrySendBuffer = 0;
  274. m_nRetrySendBufferLen = 0;
  275. m_nNetworkError = 0;
  276. m_nShutDown = 0;
  277. m_bBlocking = FALSE;
  278. m_nSslAsyncNotifyId = 0;
  279. m_bFailureSent = FALSE;
  280. m_nVerificationResult = 0;
  281. m_nVerificationDepth = 0;
  282. m_mayTriggerRead = true;
  283. m_mayTriggerWrite = true;
  284. m_mayTriggerReadUp = true;
  285. m_mayTriggerWriteUp = true;
  286. m_onCloseCalled = false;
  287. m_pKeyPassword = 0;
  288. m_Main = NULL;
  289. m_sessionid = NULL;
  290. m_sessionreuse = true;
  291. }
  292. CAsyncSslSocketLayer::~CAsyncSslSocketLayer()
  293. {
  294. UnloadSSL();
  295. delete [] m_pNetworkSendBuffer;
  296. delete [] m_pRetrySendBuffer;
  297. delete [] m_pKeyPassword;
  298. }
  299. int CAsyncSslSocketLayer::InitSSL()
  300. {
  301. if (m_bSslInitialized)
  302. return 0;
  303. m_sCriticalSection.Lock();
  304. if (!m_nSslRefCount)
  305. {
  306. #ifndef MPEXT_NO_SSLDLL
  307. m_hSslDll2=
  308. LoadLibrary(_T("libeay32.dll"));
  309. if (!m_hSslDll2)
  310. {
  311. if (m_hSslDll1)
  312. FreeLibrary(m_hSslDll1);
  313. m_hSslDll1=0;
  314. m_sCriticalSection.Unlock();
  315. return SSL_FAILURE_LOADDLLS;
  316. }
  317. bool bError = false;
  318. #endif
  319. load(m_hSslDll2, BIO_ctrl_pending);
  320. load(m_hSslDll2, BIO_ctrl_pending);
  321. load(m_hSslDll2, BIO_read);
  322. load(m_hSslDll2, BIO_ctrl);
  323. load(m_hSslDll2, BIO_write);
  324. load(m_hSslDll2, BIO_ctrl_get_write_guarantee);
  325. load(m_hSslDll2, BIO_new_bio_pair);
  326. load(m_hSslDll2, BIO_new);
  327. load(m_hSslDll2, BIO_free);
  328. load(m_hSslDll2, i2t_ASN1_OBJECT);
  329. load(m_hSslDll2, OBJ_obj2nid);
  330. load(m_hSslDll2, X509_NAME_ENTRY_get_object);
  331. load(m_hSslDll2, X509_NAME_get_entry);
  332. load(m_hSslDll2, X509_NAME_entry_count);
  333. load(m_hSslDll2, X509_get_subject_name);
  334. load(m_hSslDll2, X509_get_issuer_name);
  335. load(m_hSslDll2, OBJ_nid2sn);
  336. load(m_hSslDll2, X509_NAME_ENTRY_get_data);
  337. load(m_hSslDll2, X509_STORE_CTX_set_error);
  338. load(m_hSslDll2, X509_digest);
  339. load(m_hSslDll2, EVP_sha1);
  340. load(m_hSslDll2, X509_STORE_CTX_get_current_cert);
  341. load(m_hSslDll2, X509_STORE_CTX_get_error);
  342. load(m_hSslDll2, X509_free);
  343. load(m_hSslDll2, X509_get_pubkey);
  344. load(m_hSslDll2, BN_num_bits);
  345. load(m_hSslDll2, EVP_PKEY_free);
  346. load(m_hSslDll2, X509_STORE_CTX_get_ex_data);
  347. load(m_hSslDll2, X509_NAME_oneline);
  348. load(m_hSslDll2, X509_verify_cert_error_string);
  349. load(m_hSslDll2, X509_STORE_CTX_get_error_depth);
  350. load(m_hSslDll2, ERR_get_error);
  351. load(m_hSslDll2, ERR_error_string);
  352. load(m_hSslDll2, ASN1_STRING_to_UTF8);
  353. load(m_hSslDll2, CRYPTO_free);
  354. load(m_hSslDll2, RSA_generate_key);
  355. load(m_hSslDll2, X509_set_version);
  356. load(m_hSslDll2, X509_gmtime_adj);
  357. load(m_hSslDll2, X509_set_pubkey);
  358. load(m_hSslDll2, X509_NAME_add_entry_by_txt);
  359. load(m_hSslDll2, X509_NAME_add_entry_by_NID);
  360. load(m_hSslDll2, X509_set_issuer_name);
  361. load(m_hSslDll2, X509_sign);
  362. load(m_hSslDll2, EVP_PKEY_new);
  363. load(m_hSslDll2, EVP_PKEY_assign);
  364. load(m_hSslDll2, X509_new);
  365. load(m_hSslDll2, ASN1_INTEGER_set);
  366. load(m_hSslDll2, X509_get_serialNumber);
  367. load(m_hSslDll2, PEM_ASN1_write_bio);
  368. load(m_hSslDll2, i2d_X509);
  369. load(m_hSslDll2, BIO_s_mem);
  370. load(m_hSslDll2, i2d_PrivateKey);
  371. #ifndef MPEXT_NO_SSLDLL
  372. if (bError)
  373. {
  374. FreeLibrary(m_hSslDll1);
  375. m_hSslDll1 = 0;
  376. FreeLibrary(m_hSslDll2);
  377. m_hSslDll2 = 0;
  378. m_sCriticalSection.Unlock();
  379. return SSL_FAILURE_LOADDLLS;
  380. }
  381. m_hSslDll1 = LoadLibrary(_T("ssleay32.dll"));
  382. if (!m_hSslDll1)
  383. {
  384. if (m_hSslDll2)
  385. FreeLibrary(m_hSslDll2);
  386. m_hSslDll2 = NULL;
  387. m_sCriticalSection.Unlock();
  388. return SSL_FAILURE_LOADDLLS;
  389. }
  390. #endif
  391. load(m_hSslDll1, SSL_state_string_long);
  392. load(m_hSslDll1, SSL_state);
  393. load(m_hSslDll1, SSL_set_info_callback);
  394. load(m_hSslDll1, SSL_set_bio);
  395. load(m_hSslDll1, SSL_set_connect_state);
  396. load(m_hSslDll1, SSL_set_session);
  397. load(m_hSslDll1, BIO_f_ssl);
  398. load(m_hSslDll1, SSL_new);
  399. load(m_hSslDll1, SSL_CTX_new);
  400. load(m_hSslDll1, SSLv23_method);
  401. load(m_hSslDll1, SSL_load_error_strings);
  402. load(m_hSslDll1, SSL_library_init);
  403. load(m_hSslDll1, SSL_CTX_free);
  404. load(m_hSslDll1, SSL_free);
  405. load(m_hSslDll1, SSL_get_error);
  406. load(m_hSslDll1, SSL_shutdown);
  407. load(m_hSslDll1, SSL_get_shutdown);
  408. load(m_hSslDll1, SSL_alert_type_string_long);
  409. load(m_hSslDll1, SSL_alert_desc_string_long);
  410. load(m_hSslDll1, SSL_CTX_set_verify);
  411. load(m_hSslDll1, SSL_CTX_get_cert_store);
  412. load(m_hSslDll1, SSL_get_verify_result);
  413. load(m_hSslDll1, SSL_get_peer_certificate);
  414. load(m_hSslDll1, SSL_get_version);
  415. load(m_hSslDll1, SSL_get_current_cipher);
  416. load(m_hSslDll1, SSL_CIPHER_get_name);
  417. load(m_hSslDll1, SSL_CIPHER_get_version);
  418. load(m_hSslDll1, SSL_get_ex_data_X509_STORE_CTX_idx);
  419. load(m_hSslDll1, SSL_CTX_load_verify_locations);
  420. load(m_hSslDll1, SSL_ctrl);
  421. load(m_hSslDll1, SSL_set_accept_state);
  422. load(m_hSslDll1, SSL_CTX_use_PrivateKey_file);
  423. load(m_hSslDll1, SSL_CTX_use_certificate_file);
  424. load(m_hSslDll1, SSL_CTX_check_private_key);
  425. load(m_hSslDll1, SSL_CTX_set_default_passwd_cb_userdata);
  426. load(m_hSslDll1, SSL_CTX_set_default_passwd_cb);
  427. load(m_hSslDll1, SSL_CTX_use_certificate_chain_file);
  428. #ifndef MPEXT_NO_SSLDLL
  429. if (bError)
  430. {
  431. FreeLibrary(m_hSslDll1);
  432. m_hSslDll1=0;
  433. if (m_hSslDll2)
  434. FreeLibrary(m_hSslDll2);
  435. m_hSslDll2=0;
  436. m_sCriticalSection.Unlock();
  437. return SSL_FAILURE_LOADDLLS;
  438. }
  439. #endif
  440. pSSL_load_error_strings();
  441. if (!pSSL_library_init())
  442. {
  443. #ifndef MPEXT_NO_SSLDLL
  444. FreeLibrary(m_hSslDll1);
  445. m_hSslDll1=0;
  446. FreeLibrary(m_hSslDll2);
  447. m_hSslDll2=0;
  448. m_sCriticalSection.Unlock();
  449. #endif
  450. return SSL_FAILURE_INITSSL;
  451. }
  452. }
  453. m_nSslRefCount++;
  454. m_sCriticalSection.Unlock();
  455. m_bSslInitialized = true;
  456. return 0;
  457. }
  458. void CAsyncSslSocketLayer::OnReceive(int nErrorCode)
  459. {
  460. if (m_bUseSSL)
  461. {
  462. if (m_bBlocking)
  463. {
  464. m_mayTriggerRead = true;
  465. return;
  466. }
  467. if (m_nNetworkError)
  468. {
  469. return;
  470. }
  471. char buffer[16384];
  472. m_mayTriggerRead = false;
  473. //Get number of bytes we can receive and store in the network input bio
  474. int len = pBIO_ctrl_get_write_guarantee(m_nbio);
  475. if (len > 16384)
  476. len = 16384;
  477. else if (!len)
  478. {
  479. m_mayTriggerRead = true;
  480. TriggerEvents();
  481. return;
  482. }
  483. int numread = 0;
  484. // Receive data
  485. numread = ReceiveNext(buffer, len);
  486. if (numread > 0)
  487. {
  488. //Store it in the network input bio and process data
  489. int numwritten = pBIO_write(m_nbio, buffer, numread);
  490. pBIO_ctrl(m_nbio, BIO_CTRL_FLUSH, 0, NULL);
  491. // I have no idea why this call is needed, but without it, connections
  492. // will stall. Perhaps it triggers some internal processing.
  493. // Also, ignore return value, don't do any error checking. This function
  494. // can report errors, even though a later call can succeed.
  495. char buffer;
  496. pBIO_read(m_sslbio, &buffer, 0);
  497. }
  498. if (!numread)
  499. {
  500. if (GetLayerState() == connected)
  501. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  502. }
  503. else if (numread == SOCKET_ERROR)
  504. {
  505. int nError = GetLastError();
  506. if (nError != WSAEWOULDBLOCK && nError != WSAENOTCONN)
  507. {
  508. m_nNetworkError = GetLastError();
  509. TriggerEvent(FD_CLOSE, 0, TRUE);
  510. return;
  511. }
  512. }
  513. if (m_pRetrySendBuffer)
  514. {
  515. int numwrite = pBIO_write(m_sslbio, m_pRetrySendBuffer, m_nRetrySendBufferLen);
  516. if (numwrite >= 0)
  517. {
  518. pBIO_ctrl(m_sslbio, BIO_CTRL_FLUSH, 0, NULL);
  519. delete [] m_pRetrySendBuffer;
  520. m_pRetrySendBuffer = 0;
  521. }
  522. else if (numwrite == -1)
  523. {
  524. if (!BIO_should_retry(m_sslbio))
  525. {
  526. delete [] m_pRetrySendBuffer;
  527. m_pRetrySendBuffer = 0;
  528. SetLastError(WSAECONNABORTED);
  529. TriggerEvent(FD_CLOSE, 0, TRUE);
  530. return;
  531. }
  532. }
  533. }
  534. if (!m_nShutDown && pSSL_get_shutdown(m_ssl))
  535. {
  536. size_t pending = pBIO_ctrl_pending(m_sslbio);
  537. if (pending <= 0)
  538. {
  539. if (ShutDown() || GetLastError() == WSAEWOULDBLOCK)
  540. {
  541. if (ShutDownComplete())
  542. TriggerEvent(FD_CLOSE, 0, TRUE);
  543. }
  544. else
  545. {
  546. m_nNetworkError = WSAECONNABORTED;
  547. WSASetLastError(WSAECONNABORTED);
  548. TriggerEvent(FD_CLOSE, WSAECONNABORTED, TRUE);
  549. }
  550. return;
  551. }
  552. }
  553. if (ShutDownComplete() && m_nShutDown == 1)
  554. {
  555. //Send shutdown notification if all pending data has been sent
  556. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_INFO, SSL_INFO_SHUTDOWNCOMPLETE);
  557. m_nShutDown++;
  558. }
  559. TriggerEvents();
  560. }
  561. else
  562. {
  563. TriggerEvent(FD_READ, nErrorCode, TRUE);
  564. }
  565. }
  566. void CAsyncSslSocketLayer::OnSend(int nErrorCode)
  567. {
  568. if (m_bUseSSL)
  569. {
  570. if (m_nNetworkError)
  571. {
  572. return;
  573. }
  574. m_mayTriggerWrite = false;
  575. //Send data in the send buffer
  576. while (m_nNetworkSendBufferLen)
  577. {
  578. int numsent = SendNext(m_pNetworkSendBuffer, m_nNetworkSendBufferLen);
  579. if (numsent == SOCKET_ERROR)
  580. {
  581. int nError = GetLastError();
  582. if (nError != WSAEWOULDBLOCK && nError != WSAENOTCONN)
  583. {
  584. m_nNetworkError = nError;
  585. TriggerEvent(FD_CLOSE, 0, TRUE);
  586. }
  587. return;
  588. }
  589. else if (!numsent)
  590. {
  591. if (GetLayerState() == connected)
  592. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  593. }
  594. if (numsent == m_nNetworkSendBufferLen)
  595. m_nNetworkSendBufferLen = 0;
  596. else
  597. {
  598. memmove(m_pNetworkSendBuffer, m_pNetworkSendBuffer + numsent, m_nNetworkSendBufferLen - numsent);
  599. m_nNetworkSendBufferLen -= numsent;
  600. }
  601. }
  602. //Send the data waiting in the network bio
  603. char buffer[16384];
  604. size_t len = pBIO_ctrl_pending(m_nbio);
  605. int numread = pBIO_read(m_nbio, buffer, len);
  606. if (numread <= 0)
  607. m_mayTriggerWrite = true;
  608. while (numread > 0)
  609. {
  610. int numsent = SendNext(buffer, numread);
  611. if (!numsent)
  612. {
  613. if (GetLayerState() == connected)
  614. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  615. }
  616. if (numsent == SOCKET_ERROR || numsent < numread)
  617. {
  618. if (numsent == SOCKET_ERROR)
  619. if (GetLastError() != WSAEWOULDBLOCK && GetLastError() != WSAENOTCONN)
  620. {
  621. m_nNetworkError = GetLastError();
  622. TriggerEvent(FD_CLOSE, 0, TRUE);
  623. return;
  624. }
  625. else
  626. numsent = 0;
  627. // Add all data that was retrieved from the network bio but could not be sent to the send buffer.
  628. if (m_nNetworkSendBufferMaxLen < (m_nNetworkSendBufferLen + numread - numsent))
  629. {
  630. char * tmp = m_pNetworkSendBuffer;
  631. m_nNetworkSendBufferMaxLen = static_cast<int>((m_nNetworkSendBufferLen + numread - numsent) * 1.5);
  632. m_pNetworkSendBuffer = new char[m_nNetworkSendBufferMaxLen];
  633. if (tmp)
  634. {
  635. memcpy(m_pNetworkSendBuffer, tmp, m_nNetworkSendBufferLen);
  636. delete [] tmp;
  637. }
  638. }
  639. ASSERT(m_pNetworkSendBuffer);
  640. memcpy(m_pNetworkSendBuffer + m_nNetworkSendBufferLen, buffer, numread-numsent);
  641. m_nNetworkSendBufferLen += numread - numsent;
  642. }
  643. if (!numsent)
  644. break;
  645. len = pBIO_ctrl_pending(m_nbio);
  646. if (!len)
  647. {
  648. m_mayTriggerWrite = true;
  649. break;
  650. }
  651. numread = pBIO_read(m_nbio, buffer, len);
  652. if (numread <= 0)
  653. m_mayTriggerWrite = true;
  654. }
  655. if (m_pRetrySendBuffer)
  656. {
  657. int numwrite = pBIO_write(m_sslbio, m_pRetrySendBuffer, m_nRetrySendBufferLen);
  658. if (numwrite >= 0)
  659. {
  660. pBIO_ctrl(m_sslbio, BIO_CTRL_FLUSH, 0, NULL);
  661. delete [] m_pRetrySendBuffer;
  662. m_pRetrySendBuffer = 0;
  663. }
  664. else if (numwrite == -1)
  665. {
  666. if (!BIO_should_retry(m_sslbio))
  667. {
  668. delete [] m_pRetrySendBuffer;
  669. m_pRetrySendBuffer = 0;
  670. SetLastError(WSAECONNABORTED);
  671. TriggerEvent(FD_CLOSE, 0, TRUE);
  672. return;
  673. }
  674. }
  675. }
  676. // No more data available, ask for more.
  677. TriggerEvents();
  678. if (m_nShutDown == 1 && ShutDownComplete())
  679. {
  680. //Send shutdown notification if all pending data has been sent
  681. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_INFO, SSL_INFO_SHUTDOWNCOMPLETE);
  682. m_nShutDown++;
  683. }
  684. }
  685. else
  686. TriggerEvent(FD_WRITE, nErrorCode, TRUE);
  687. }
  688. int CAsyncSslSocketLayer::Send(const void* lpBuf, int nBufLen, int nFlags)
  689. {
  690. if (m_bUseSSL)
  691. {
  692. if (!lpBuf)
  693. {
  694. return 0;
  695. }
  696. if (m_bBlocking || m_pRetrySendBuffer)
  697. {
  698. m_mayTriggerWriteUp = true;
  699. SetLastError(WSAEWOULDBLOCK);
  700. return SOCKET_ERROR;
  701. }
  702. if (m_nNetworkError)
  703. {
  704. SetLastError(m_nNetworkError);
  705. return SOCKET_ERROR;
  706. }
  707. if (m_nShutDown)
  708. {
  709. SetLastError(WSAESHUTDOWN);
  710. return SOCKET_ERROR;
  711. }
  712. if (!m_bSslEstablished)
  713. {
  714. m_mayTriggerWriteUp = true;
  715. SetLastError(WSAEWOULDBLOCK);
  716. return SOCKET_ERROR;
  717. }
  718. if (!nBufLen)
  719. {
  720. return 0;
  721. }
  722. if (m_onCloseCalled)
  723. {
  724. TriggerEvent(FD_CLOSE, 0, TRUE);
  725. return 0;
  726. }
  727. int len = pBIO_ctrl_get_write_guarantee(m_sslbio);
  728. if (nBufLen > len)
  729. nBufLen = len;
  730. if (!len)
  731. {
  732. m_mayTriggerWriteUp = true;
  733. TriggerEvents();
  734. SetLastError(WSAEWOULDBLOCK);
  735. }
  736. m_pRetrySendBuffer = new char[nBufLen];
  737. m_nRetrySendBufferLen = nBufLen;
  738. memcpy(m_pRetrySendBuffer, lpBuf, nBufLen);
  739. int numwrite = pBIO_write(m_sslbio, m_pRetrySendBuffer, m_nRetrySendBufferLen);
  740. if (numwrite >= 0)
  741. {
  742. pBIO_ctrl(m_sslbio, BIO_CTRL_FLUSH, 0, NULL);
  743. delete [] m_pRetrySendBuffer;
  744. m_pRetrySendBuffer = 0;
  745. }
  746. else if (numwrite == -1)
  747. {
  748. if (BIO_should_retry(m_sslbio))
  749. {
  750. if (GetLayerState() == closed)
  751. {
  752. return 0;
  753. }
  754. else if (GetLayerState() != connected)
  755. {
  756. SetLastError(m_nNetworkError);
  757. return SOCKET_ERROR;
  758. }
  759. TriggerEvents();
  760. return nBufLen;
  761. }
  762. else
  763. {
  764. delete [] m_pRetrySendBuffer;
  765. m_pRetrySendBuffer = 0;
  766. SetLastError(WSAECONNABORTED);
  767. }
  768. return SOCKET_ERROR;
  769. }
  770. m_mayTriggerWriteUp = true;
  771. TriggerEvents();
  772. return numwrite;
  773. }
  774. else
  775. {
  776. return SendNext(lpBuf, nBufLen, nFlags);
  777. }
  778. }
  779. int CAsyncSslSocketLayer::Receive(void* lpBuf, int nBufLen, int nFlags)
  780. {
  781. if (m_bUseSSL)
  782. {
  783. if (m_bBlocking)
  784. {
  785. m_mayTriggerReadUp = true;
  786. SetLastError(WSAEWOULDBLOCK);
  787. return SOCKET_ERROR;
  788. }
  789. if (m_nNetworkError)
  790. {
  791. size_t pending = pBIO_ctrl_pending(m_sslbio);
  792. if (pending && !m_nShutDown)
  793. {
  794. m_mayTriggerReadUp = true;
  795. TriggerEvents();
  796. return pBIO_read(m_sslbio, lpBuf,nBufLen);
  797. }
  798. WSASetLastError(m_nNetworkError);
  799. return SOCKET_ERROR;
  800. }
  801. if (m_nShutDown)
  802. {
  803. SetLastError(WSAESHUTDOWN);
  804. return SOCKET_ERROR;
  805. }
  806. if (!nBufLen)
  807. {
  808. return 0;
  809. }
  810. size_t pending = pBIO_ctrl_pending(m_sslbio);
  811. if (!pending)
  812. {
  813. if (GetLayerState() == closed)
  814. {
  815. return 0;
  816. }
  817. if (m_onCloseCalled)
  818. {
  819. TriggerEvent(FD_CLOSE, 0, TRUE);
  820. return 0;
  821. }
  822. else if (GetLayerState() != connected)
  823. {
  824. SetLastError(m_nNetworkError);
  825. return SOCKET_ERROR;
  826. }
  827. else
  828. {
  829. if (pSSL_get_shutdown(m_ssl))
  830. {
  831. if (ShutDown() || GetLastError() == WSAEWOULDBLOCK)
  832. {
  833. if (ShutDownComplete())
  834. {
  835. TriggerEvent(FD_CLOSE, 0, TRUE);
  836. return 0;
  837. }
  838. else
  839. WSASetLastError(WSAEWOULDBLOCK);
  840. }
  841. else
  842. {
  843. m_nNetworkError = WSAECONNABORTED;
  844. WSASetLastError(WSAECONNABORTED);
  845. TriggerEvent(FD_CLOSE, WSAECONNABORTED, TRUE);
  846. }
  847. return SOCKET_ERROR;
  848. }
  849. }
  850. m_mayTriggerReadUp = true;
  851. TriggerEvents();
  852. SetLastError(WSAEWOULDBLOCK);
  853. return SOCKET_ERROR;
  854. }
  855. int numread = pBIO_read(m_sslbio, lpBuf, nBufLen);
  856. if (!numread)
  857. {
  858. if (pSSL_get_shutdown(m_ssl))
  859. {
  860. if (ShutDown() || GetLastError() == WSAEWOULDBLOCK)
  861. {
  862. if (ShutDownComplete())
  863. {
  864. TriggerEvent(FD_CLOSE, 0, TRUE);
  865. return 0;
  866. }
  867. else
  868. WSASetLastError(WSAEWOULDBLOCK);
  869. }
  870. else
  871. {
  872. m_nNetworkError = WSAECONNABORTED;
  873. WSASetLastError(WSAECONNABORTED);
  874. TriggerEvent(FD_CLOSE, WSAECONNABORTED, TRUE);
  875. }
  876. return SOCKET_ERROR;
  877. }
  878. m_mayTriggerReadUp = true;
  879. TriggerEvents();
  880. SetLastError(WSAEWOULDBLOCK);
  881. return SOCKET_ERROR;
  882. }
  883. if (numread < 0)
  884. {
  885. if (!BIO_should_retry(m_sslbio))
  886. {
  887. PrintLastErrorMsg();
  888. m_nNetworkError = WSAECONNABORTED;
  889. WSASetLastError(WSAECONNABORTED);
  890. TriggerEvent(FD_CLOSE, 0, TRUE);
  891. return SOCKET_ERROR;
  892. }
  893. else
  894. {
  895. if (pSSL_get_shutdown(m_ssl))
  896. {
  897. if (ShutDown() || GetLastError() == WSAEWOULDBLOCK)
  898. {
  899. if (ShutDownComplete())
  900. {
  901. TriggerEvent(FD_CLOSE, 0, TRUE);
  902. return 0;
  903. }
  904. else
  905. WSASetLastError(WSAEWOULDBLOCK);
  906. }
  907. else
  908. {
  909. m_nNetworkError = WSAECONNABORTED;
  910. WSASetLastError(WSAECONNABORTED);
  911. TriggerEvent(FD_CLOSE, 0, TRUE);
  912. }
  913. return SOCKET_ERROR;
  914. }
  915. m_mayTriggerReadUp = true;
  916. TriggerEvents();
  917. SetLastError(WSAEWOULDBLOCK);
  918. return SOCKET_ERROR;
  919. }
  920. }
  921. m_mayTriggerReadUp = true;
  922. TriggerEvents();
  923. return numread;
  924. }
  925. else
  926. {
  927. return ReceiveNext(lpBuf, nBufLen, nFlags);
  928. }
  929. }
  930. void CAsyncSslSocketLayer::Close()
  931. {
  932. m_nShutDown = 0;
  933. m_onCloseCalled = false;
  934. ResetSslSession();
  935. CloseNext();
  936. }
  937. BOOL CAsyncSslSocketLayer::Connect(const SOCKADDR *lpSockAddr, int nSockAddrLen)
  938. {
  939. BOOL res = ConnectNext(lpSockAddr, nSockAddrLen);
  940. if (!res)
  941. if (GetLastError() != WSAEWOULDBLOCK)
  942. ResetSslSession();
  943. return res;
  944. }
  945. BOOL CAsyncSslSocketLayer::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
  946. {
  947. BOOL res = ConnectNext(lpszHostAddress, nHostPort);
  948. if (!res)
  949. if (GetLastError()!=WSAEWOULDBLOCK)
  950. ResetSslSession();
  951. return res;
  952. }
  953. int CAsyncSslSocketLayer::InitSSLConnection(bool clientMode,
  954. CAsyncSslSocketLayer* main, bool sessionreuse,
  955. int minTlsVersion, int maxTlsVersion,
  956. void* pSslContext /*=0*/)
  957. {
  958. if (m_bUseSSL)
  959. return 0;
  960. int res = InitSSL();
  961. if (res)
  962. return res;
  963. m_sCriticalSection.Lock();
  964. if ((SSL_CTX*)pSslContext)
  965. {
  966. if (m_ssl_ctx)
  967. {
  968. m_sCriticalSection.Unlock();
  969. ResetSslSession();
  970. return SSL_FAILURE_INITSSL;
  971. }
  972. #ifdef MPEXT
  973. std::map<SSL_CTX *, int>::iterator iter = m_contextRefCount.find((SSL_CTX*)pSslContext);
  974. #else
  975. std::map<SSL_CTX *, int>::iterator& iter = m_contextRefCount.find((SSL_CTX*)pSslContext);
  976. #endif
  977. if (iter == m_contextRefCount.end() || iter->second < 1)
  978. {
  979. m_sCriticalSection.Unlock();
  980. ResetSslSession();
  981. return SSL_FAILURE_INITSSL;
  982. }
  983. m_ssl_ctx = (SSL_CTX*)pSslContext;
  984. iter->second++;
  985. }
  986. else if (!m_ssl_ctx)
  987. {
  988. // Create new context if none given
  989. if (!(m_ssl_ctx = pSSL_CTX_new( pSSLv23_method())))
  990. {
  991. m_sCriticalSection.Unlock();
  992. ResetSslSession();
  993. return SSL_FAILURE_INITSSL;
  994. }
  995. m_contextRefCount[m_ssl_ctx] = 1;
  996. if (clientMode)
  997. {
  998. USES_CONVERSION;
  999. pSSL_CTX_set_verify(m_ssl_ctx, SSL_VERIFY_PEER, verify_callback);
  1000. CFileStatus Dummy;
  1001. if (CFile::GetStatus((LPCTSTR)m_CertStorage, Dummy))
  1002. {
  1003. pSSL_CTX_load_verify_locations(m_ssl_ctx, T2CA(m_CertStorage), 0);
  1004. }
  1005. }
  1006. }
  1007. //Create new SSL session
  1008. if (!(m_ssl = pSSL_new(m_ssl_ctx)))
  1009. {
  1010. m_sCriticalSection.Unlock();
  1011. ResetSslSession();
  1012. return SSL_FAILURE_INITSSL;
  1013. }
  1014. //Add current instance to list of active instances
  1015. t_SslLayerList *tmp = m_pSslLayerList;
  1016. m_pSslLayerList = new t_SslLayerList;
  1017. m_pSslLayerList->pNext = tmp;
  1018. m_pSslLayerList->pLayer = this;
  1019. m_sCriticalSection.Unlock();
  1020. pSSL_set_info_callback(m_ssl, apps_ssl_info_callback);
  1021. //Create bios
  1022. m_sslbio = pBIO_new(pBIO_f_ssl());
  1023. pBIO_new_bio_pair(&m_ibio, 4096, &m_nbio, 4096);
  1024. if (!m_sslbio || !m_nbio || !m_ibio)
  1025. {
  1026. ResetSslSession();
  1027. return SSL_FAILURE_INITSSL;
  1028. }
  1029. long options = pSSL_ctrl(m_ssl, SSL_CTRL_OPTIONS, 0, NULL);
  1030. #define MASK_TLS_VERSION(VERSION, FLAG) ((minTlsVersion > VERSION) || (maxTlsVersion < VERSION) ? FLAG : 0)
  1031. options |=
  1032. SSL_OP_ALL |
  1033. MASK_TLS_VERSION(SSL_VERSION_SSL2, SSL_OP_NO_SSLv2) |
  1034. MASK_TLS_VERSION(SSL_VERSION_SSL3, SSL_OP_NO_SSLv3) |
  1035. MASK_TLS_VERSION(SSL_VERSION_TLS10, SSL_OP_NO_TLSv1) |
  1036. MASK_TLS_VERSION(SSL_VERSION_TLS11, SSL_OP_NO_TLSv1_1) |
  1037. MASK_TLS_VERSION(SSL_VERSION_TLS12, SSL_OP_NO_TLSv1_2);
  1038. pSSL_ctrl(m_ssl, SSL_CTRL_OPTIONS, options, NULL);
  1039. LogSocketMessage(FZ_LOG_INFO, _T("Loading system certificates"));
  1040. LoadSslWindowsSystemCertificateStore(m_ssl_ctx);
  1041. //Init SSL connection
  1042. void *ssl_sessionid = NULL;
  1043. {
  1044. USES_CONVERSION;
  1045. m_Main = main;
  1046. m_sessionreuse = sessionreuse;
  1047. }
  1048. if ((m_Main != NULL) && m_sessionreuse)
  1049. {
  1050. if (m_Main->m_sessionid != NULL)
  1051. {
  1052. if (!pSSL_set_session(m_ssl, m_Main->m_sessionid))
  1053. {
  1054. LogSocketMessage(FZ_LOG_INFO, _T("SSL_set_session failed"));
  1055. return SSL_FAILURE_INITSSL;
  1056. }
  1057. LogSocketMessage(FZ_LOG_INFO, _T("Trying reuse main TLS session ID"));
  1058. }
  1059. else
  1060. {
  1061. LogSocketMessage(FZ_LOG_INFO, _T("Main TLS session ID was not reused previously, not trying again"));
  1062. pSSL_set_session(m_ssl, NULL);
  1063. }
  1064. }
  1065. else
  1066. {
  1067. pSSL_set_session(m_ssl, NULL);
  1068. }
  1069. if (clientMode)
  1070. {
  1071. pSSL_set_connect_state(m_ssl);
  1072. }
  1073. else
  1074. {
  1075. pSSL_set_accept_state(m_ssl);
  1076. }
  1077. pSSL_set_bio(m_ssl, m_ibio, m_ibio);
  1078. pBIO_ctrl(m_sslbio, BIO_C_SET_SSL, BIO_NOCLOSE, m_ssl);
  1079. pBIO_read(m_sslbio, (void *)1, 0);
  1080. // Trigger FD_WRITE so that we can initialize SSL negotiation
  1081. if (GetLayerState() == connected || GetLayerState() == attached)
  1082. {
  1083. TriggerEvent(FD_READ, 0);
  1084. TriggerEvent(FD_WRITE, 0);
  1085. TriggerEvent(FD_READ, 0, TRUE);
  1086. TriggerEvent(FD_WRITE, 0, TRUE);
  1087. }
  1088. m_bUseSSL = true;
  1089. return 0;
  1090. }
  1091. void CAsyncSslSocketLayer::ResetSslSession()
  1092. {
  1093. if (m_pRetrySendBuffer)
  1094. {
  1095. delete [] m_pRetrySendBuffer;
  1096. m_pRetrySendBuffer = 0;
  1097. }
  1098. m_bFailureSent = FALSE;
  1099. m_bBlocking = FALSE;
  1100. m_nSslAsyncNotifyId++;
  1101. m_nNetworkError = 0;
  1102. m_bUseSSL = FALSE;
  1103. m_nVerificationResult = 0;
  1104. m_nVerificationDepth = 0;
  1105. m_bSslEstablished = FALSE;
  1106. if (m_sslbio)
  1107. {
  1108. pBIO_free(m_sslbio);
  1109. }
  1110. if (m_ssl)
  1111. {
  1112. pSSL_set_session(m_ssl,NULL);
  1113. }
  1114. if (m_nbio)
  1115. {
  1116. pBIO_free(m_nbio);
  1117. }
  1118. if (m_ibio)
  1119. {
  1120. pBIO_free(m_ibio);
  1121. }
  1122. m_nNetworkSendBufferLen = 0;
  1123. m_nbio = 0;
  1124. m_ibio = 0;
  1125. m_sslbio = 0;
  1126. if (m_ssl)
  1127. {
  1128. pSSL_free(m_ssl);
  1129. }
  1130. m_sCriticalSection.Lock();
  1131. if (m_ssl_ctx)
  1132. {
  1133. #ifdef MPEXT
  1134. std::map<SSL_CTX *, int>::iterator iter = m_contextRefCount.find(m_ssl_ctx);
  1135. #else
  1136. std::map<SSL_CTX *, int>::iterator& iter = m_contextRefCount.find(m_ssl_ctx);
  1137. #endif
  1138. if (iter != m_contextRefCount.end())
  1139. {
  1140. if (iter->second <= 1)
  1141. {
  1142. pSSL_CTX_free(m_ssl_ctx);
  1143. m_contextRefCount.erase(iter);
  1144. }
  1145. else
  1146. iter->second--;
  1147. }
  1148. m_ssl_ctx = 0;
  1149. }
  1150. delete [] m_pKeyPassword;
  1151. m_pKeyPassword = 0;
  1152. m_ssl = 0;
  1153. t_SslLayerList *cur = m_pSslLayerList;
  1154. if (!cur)
  1155. {
  1156. m_sCriticalSection.Unlock();
  1157. return;
  1158. }
  1159. if (cur->pLayer == this)
  1160. {
  1161. m_pSslLayerList = cur->pNext;
  1162. delete cur;
  1163. }
  1164. else
  1165. while (cur->pNext)
  1166. {
  1167. if (cur->pNext->pLayer == this)
  1168. {
  1169. t_SslLayerList *tmp = cur->pNext;
  1170. cur->pNext = cur->pNext->pNext;
  1171. delete tmp;
  1172. m_sCriticalSection.Unlock();
  1173. return;
  1174. }
  1175. cur = cur->pNext;
  1176. }
  1177. if (m_sessionid != NULL)
  1178. {
  1179. SSL_SESSION_free(m_sessionid);
  1180. m_sessionid = NULL;
  1181. }
  1182. m_sessionreuse = true;
  1183. m_sCriticalSection.Unlock();
  1184. }
  1185. bool CAsyncSslSocketLayer::IsUsingSSL()
  1186. {
  1187. return m_bUseSSL;
  1188. }
  1189. BOOL CAsyncSslSocketLayer::ShutDown(int nHow /*=sends*/)
  1190. {
  1191. if (m_bUseSSL)
  1192. {
  1193. if (m_pRetrySendBuffer)
  1194. {
  1195. if (!m_nShutDown)
  1196. m_nShutDown = 1;
  1197. WSASetLastError(WSAEWOULDBLOCK);
  1198. return false;
  1199. }
  1200. #ifdef MPEXT
  1201. if (!m_bSslEstablished)
  1202. {
  1203. m_mayTriggerWriteUp = true;
  1204. SetLastError(WSAEWOULDBLOCK);
  1205. return false;
  1206. }
  1207. #endif
  1208. if (!m_nShutDown)
  1209. m_nShutDown = 1;
  1210. else
  1211. {
  1212. if (ShutDownComplete())
  1213. return ShutDownNext();
  1214. else
  1215. {
  1216. TriggerEvents();
  1217. WSASetLastError(WSAEWOULDBLOCK);
  1218. return false;
  1219. }
  1220. }
  1221. int res = pSSL_shutdown(m_ssl);
  1222. if (res != -1)
  1223. {
  1224. if (!res)
  1225. {
  1226. pSSL_shutdown(m_ssl);
  1227. }
  1228. if (ShutDownComplete())
  1229. return ShutDownNext();
  1230. else
  1231. {
  1232. TriggerEvents();
  1233. WSASetLastError(WSAEWOULDBLOCK);
  1234. return FALSE;
  1235. }
  1236. }
  1237. else
  1238. {
  1239. int error = pSSL_get_error(m_ssl, -1);
  1240. if (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE)
  1241. {
  1242. #ifdef MPEXT
  1243. // retry shutdown later
  1244. m_nShutDown = 0;
  1245. #endif
  1246. TriggerEvents();
  1247. WSASetLastError(WSAEWOULDBLOCK);
  1248. return FALSE;
  1249. }
  1250. else if (ShutDownComplete())
  1251. return ShutDownNext();
  1252. else
  1253. {
  1254. TriggerEvents();
  1255. WSASetLastError(WSAEWOULDBLOCK);
  1256. return FALSE;
  1257. }
  1258. }
  1259. }
  1260. else
  1261. {
  1262. if (!m_nShutDown)
  1263. m_nShutDown = 1;
  1264. return ShutDownNext(nHow);
  1265. }
  1266. }
  1267. BOOL CAsyncSslSocketLayer::ShutDownComplete()
  1268. {
  1269. //If a ShutDown was issued, has the connection already been shut down?
  1270. if (!m_nShutDown)
  1271. return FALSE;
  1272. else if (!m_bUseSSL)
  1273. return FALSE;
  1274. else if (m_nNetworkSendBufferLen)
  1275. return FALSE;
  1276. else if (m_pRetrySendBuffer)
  1277. return FALSE;
  1278. // Empty read buffer
  1279. char buffer[1000];
  1280. int numread;
  1281. do
  1282. {
  1283. numread = pBIO_read(m_sslbio, buffer, 1000);
  1284. } while (numread > 0);
  1285. size_t pending = pBIO_ctrl_pending(m_nbio);
  1286. if (pending)
  1287. {
  1288. return FALSE;
  1289. }
  1290. else
  1291. {
  1292. return TRUE;
  1293. }
  1294. }
  1295. void CAsyncSslSocketLayer::apps_ssl_info_callback(const SSL *s, int where, int ret)
  1296. {
  1297. USES_CONVERSION;
  1298. CAsyncSslSocketLayer *pLayer = 0;
  1299. m_sCriticalSection.Lock();
  1300. t_SslLayerList *cur = m_pSslLayerList;
  1301. while (cur)
  1302. {
  1303. if (cur->pLayer->m_ssl == s)
  1304. break;
  1305. cur = cur->pNext;
  1306. }
  1307. if (!cur)
  1308. {
  1309. m_sCriticalSection.Unlock();
  1310. MessageBox(0, _T("Can't lookup TLS session!"), _T("Critical error"), MB_ICONEXCLAMATION);
  1311. return;
  1312. }
  1313. else
  1314. pLayer = cur->pLayer;
  1315. m_sCriticalSection.Unlock();
  1316. // Called while unloading?
  1317. if (!pLayer->m_bUseSSL && (where != SSL_CB_LOOP))
  1318. return;
  1319. char * str;
  1320. int w;
  1321. w = where& ~SSL_ST_MASK;
  1322. if (w & SSL_ST_CONNECT)
  1323. {
  1324. str = "TLS connect";
  1325. if (pLayer->m_sessionreuse)
  1326. {
  1327. SSL_SESSION * sessionid = SSL_get1_session(pLayer->m_ssl);
  1328. if (pLayer->m_sessionid != sessionid)
  1329. {
  1330. if (pLayer->m_sessionid == NULL)
  1331. {
  1332. if (SSL_session_reused(pLayer->m_ssl))
  1333. {
  1334. pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Session ID reused"));
  1335. }
  1336. else
  1337. {
  1338. if ((pLayer->m_Main != NULL) && (pLayer->m_Main->m_sessionid != NULL))
  1339. {
  1340. pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Main TLS session ID not reused, will not try again"));
  1341. SSL_SESSION_free(pLayer->m_Main->m_sessionid);
  1342. pLayer->m_Main->m_sessionid = NULL;
  1343. }
  1344. }
  1345. pLayer->LogSocketMessage(FZ_LOG_DEBUG, _T("Saving session ID"));
  1346. }
  1347. else
  1348. {
  1349. SSL_SESSION_free(pLayer->m_sessionid);
  1350. pLayer->LogSocketMessage(FZ_LOG_INFO, _T("Session ID changed"));
  1351. }
  1352. pLayer->m_sessionid = sessionid;
  1353. }
  1354. else
  1355. {
  1356. SSL_SESSION_free(sessionid);
  1357. }
  1358. }
  1359. }
  1360. else if (w & SSL_ST_ACCEPT)
  1361. str = "TLS accept";
  1362. else
  1363. str = "Undefined";
  1364. if (where & SSL_CB_LOOP)
  1365. {
  1366. char* debug = NULL;
  1367. // exact SSL_CB_LOOP is abused for debugging
  1368. if (where == SSL_CB_LOOP)
  1369. {
  1370. debug = reinterpret_cast<char*>(ret);
  1371. }
  1372. char *buffer = new char[4096 + ((debug != NULL) ? strlen(debug) : 0)];
  1373. sprintf(buffer, "%s: %s",
  1374. str,
  1375. pSSL_state_string_long(s));
  1376. if (debug != NULL)
  1377. {
  1378. sprintf(buffer + strlen(buffer), " [%s]", debug);
  1379. OPENSSL_free(debug);
  1380. }
  1381. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_INFO, 0, buffer);
  1382. }
  1383. else if (where & SSL_CB_ALERT)
  1384. {
  1385. str=(where & SSL_CB_READ)? "read" : "write";
  1386. const char* desc = pSSL_alert_desc_string_long(ret);
  1387. // Don't send close notify warning
  1388. if (desc)
  1389. {
  1390. if (strcmp(desc, "close notify"))
  1391. {
  1392. char *buffer = new char[4096];
  1393. sprintf(buffer, "SSL3 alert %s: %s: %s",
  1394. str,
  1395. pSSL_alert_type_string_long(ret),
  1396. desc);
  1397. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_WARNING, 0, buffer);
  1398. }
  1399. }
  1400. }
  1401. else if (where & SSL_CB_EXIT)
  1402. {
  1403. if (ret == 0)
  1404. {
  1405. char *buffer = new char[4096];
  1406. sprintf(buffer, "%s: failed in %s",
  1407. str,
  1408. pSSL_state_string_long(s));
  1409. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_WARNING, 0, buffer);
  1410. if (!pLayer->m_bFailureSent)
  1411. {
  1412. pLayer->m_bFailureSent=TRUE;
  1413. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_FAILURE, pLayer->m_bSslEstablished ? SSL_FAILURE_UNKNOWN : SSL_FAILURE_ESTABLISH);
  1414. }
  1415. }
  1416. else if (ret < 0)
  1417. {
  1418. int error = pSSL_get_error(s,ret);
  1419. if (error != SSL_ERROR_WANT_READ && error != SSL_ERROR_WANT_WRITE)
  1420. {
  1421. char *buffer = new char[4096];
  1422. sprintf(buffer, "%s: error in %s",
  1423. str,
  1424. pSSL_state_string_long(s));
  1425. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_WARNING, 0, buffer);
  1426. if (!pLayer->m_bFailureSent)
  1427. {
  1428. pLayer->m_bFailureSent=TRUE;
  1429. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_FAILURE, pLayer->m_bSslEstablished ? SSL_FAILURE_UNKNOWN : SSL_FAILURE_ESTABLISH);
  1430. }
  1431. }
  1432. }
  1433. }
  1434. if (where & SSL_CB_HANDSHAKE_DONE)
  1435. {
  1436. int error = pSSL_get_verify_result(pLayer->m_ssl);
  1437. if (error)
  1438. {
  1439. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERIFY_CERT, error);
  1440. pLayer->m_bBlocking = TRUE;
  1441. return;
  1442. }
  1443. pLayer->m_bSslEstablished = TRUE;
  1444. pLayer->PrintSessionInfo();
  1445. pLayer->DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_INFO, SSL_INFO_ESTABLISHED);
  1446. pLayer->TriggerEvents();
  1447. }
  1448. }
  1449. void CAsyncSslSocketLayer::UnloadSSL()
  1450. {
  1451. if (!m_bSslInitialized)
  1452. return;
  1453. ResetSslSession();
  1454. m_bSslInitialized = false;
  1455. m_sCriticalSection.Lock();
  1456. m_nSslRefCount--;
  1457. if (m_nSslRefCount)
  1458. {
  1459. m_sCriticalSection.Unlock();
  1460. return;
  1461. }
  1462. #ifndef MPEXT_NO_SSLDLL
  1463. if (m_hSslDll1)
  1464. FreeLibrary(m_hSslDll1);
  1465. if (m_hSslDll2)
  1466. {
  1467. FreeLibrary(m_hSslDll2);
  1468. }
  1469. m_hSslDll1 = NULL;
  1470. m_hSslDll2 = NULL;
  1471. #endif
  1472. m_sCriticalSection.Unlock();
  1473. }
  1474. bool AsnTimeToValidTime(ASN1_TIME * AsnTime, t_SslCertData::t_validTime & ValidTime)
  1475. {
  1476. int i = AsnTime->length;
  1477. const char * v = (const char *)AsnTime->data;
  1478. if (i < 10)
  1479. {
  1480. return FALSE;
  1481. }
  1482. for (int i2 = 0; i2 < 10; i2++)
  1483. {
  1484. if ((v[i2] > '9') || (v[i2] < '0'))
  1485. {
  1486. return FALSE;
  1487. }
  1488. }
  1489. if (AsnTime->type == V_ASN1_UTCTIME)
  1490. {
  1491. ValidTime.y= (v[0]-'0')*10+(v[1]-'0');
  1492. if (ValidTime.y < 50) ValidTime.y+=100;
  1493. ValidTime.y += 1900;
  1494. v += 2;
  1495. i -= 2;
  1496. }
  1497. else if (AsnTime->type == V_ASN1_GENERALIZEDTIME)
  1498. {
  1499. if (i < 12)
  1500. {
  1501. return FALSE;
  1502. }
  1503. ValidTime.y = (v[0]-'0')*1000+(v[1]-'0')*100 + (v[2]-'0')*10+(v[3]-'0');
  1504. v += 4;
  1505. i -= 4;
  1506. }
  1507. else
  1508. {
  1509. return FALSE;
  1510. }
  1511. ValidTime.M = (v[0]-'0')*10+(v[1]-'0');
  1512. if ((ValidTime.M > 12) || (ValidTime.M < 1))
  1513. {
  1514. return FALSE;
  1515. }
  1516. ValidTime.d = (v[2]-'0')*10+(v[3]-'0');
  1517. ValidTime.h = (v[4]-'0')*10+(v[5]-'0');
  1518. ValidTime.m = (v[6]-'0')*10+(v[7]-'0');
  1519. if ((i >= 10) &&
  1520. (v[8] >= '0') && (v[8] <= '9') &&
  1521. (v[9] >= '0') && (v[9] <= '9'))
  1522. {
  1523. ValidTime.s = (v[8]-'0')*10+(v[9]-'0');
  1524. }
  1525. else
  1526. {
  1527. ValidTime.s = 0;
  1528. }
  1529. return TRUE;
  1530. }
  1531. BOOL CAsyncSslSocketLayer::GetPeerCertificateData(t_SslCertData &SslCertData, LPCTSTR & Error)
  1532. {
  1533. X509 *pX509=pSSL_get_peer_certificate(m_ssl);
  1534. if (!pX509)
  1535. {
  1536. Error = _T("Cannot get certificate");
  1537. return FALSE;
  1538. }
  1539. //Reset the contents of SslCertData
  1540. memset(&SslCertData, 0, sizeof(t_SslCertData));
  1541. //Set subject data fields
  1542. X509_NAME *pX509Name=pX509_get_subject_name(pX509);
  1543. if (pX509Name)
  1544. {
  1545. int count=pX509_NAME_entry_count(pX509Name);
  1546. for (int i=0;i<count;i++)
  1547. {
  1548. X509_NAME_ENTRY *pX509NameEntry=pX509_NAME_get_entry(pX509Name,i);
  1549. if (!pX509NameEntry)
  1550. continue;
  1551. ASN1_OBJECT *pObject = pX509_NAME_ENTRY_get_object(pX509NameEntry);
  1552. ASN1_STRING *pString = pX509_NAME_ENTRY_get_data(pX509NameEntry);
  1553. CString str;
  1554. unsigned char *out;
  1555. int len = pASN1_STRING_to_UTF8(&out, pString);
  1556. if (len > 0)
  1557. {
  1558. // Keep it huge
  1559. LPWSTR unicode = new WCHAR[len * 10];
  1560. memset(unicode, 0, sizeof(WCHAR) * len * 10);
  1561. int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, (const char *)out, len, unicode, len * 10);
  1562. if (unicodeLen > 0)
  1563. {
  1564. #ifdef _UNICODE
  1565. str = unicode;
  1566. #else
  1567. LPSTR ansi = new CHAR[len * 10];
  1568. memset(ansi, 0, sizeof(CHAR) * len * 10);
  1569. int ansiLen = WideCharToMultiByte(CP_ACP, 0, unicode, unicodeLen, ansi, len * 10, 0, 0);
  1570. if (ansiLen > 0)
  1571. str = ansi;
  1572. delete [] ansi;
  1573. #endif
  1574. }
  1575. delete [] unicode;
  1576. pCRYPTO_free(out);
  1577. }
  1578. switch(pOBJ_obj2nid(pObject))
  1579. {
  1580. case NID_organizationName:
  1581. _tcsncpy(SslCertData.subject.Organization, str, 255);
  1582. SslCertData.subject.Organization[255] = 0;
  1583. break;
  1584. case NID_organizationalUnitName:
  1585. _tcsncpy(SslCertData.subject.Unit, str, 255);
  1586. SslCertData.subject.Unit[255] = 0;
  1587. break;
  1588. case NID_commonName:
  1589. _tcsncpy(SslCertData.subject.CommonName, str, 255);
  1590. SslCertData.subject.CommonName[255] = 0;
  1591. break;
  1592. case NID_pkcs9_emailAddress:
  1593. _tcsncpy(SslCertData.subject.Mail, str, 255);
  1594. SslCertData.subject.Mail[255] = 0;
  1595. break;
  1596. case NID_countryName:
  1597. _tcsncpy(SslCertData.subject.Country, str, 255);
  1598. SslCertData.subject.Country[255] = 0;
  1599. break;
  1600. case NID_stateOrProvinceName:
  1601. _tcsncpy(SslCertData.subject.StateProvince, str, 255);
  1602. SslCertData.subject.StateProvince[255] = 0;
  1603. break;
  1604. case NID_localityName:
  1605. _tcsncpy(SslCertData.subject.Town, str, 255);
  1606. SslCertData.subject.Town[255] = 0;
  1607. break;
  1608. default:
  1609. if ( !pOBJ_nid2sn(pOBJ_obj2nid(pObject)) )
  1610. {
  1611. TCHAR tmp[20];
  1612. _stprintf(tmp, _T("%d"), pOBJ_obj2nid(pObject));
  1613. int maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1614. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), tmp, maxlen);
  1615. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1616. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), _T("="), maxlen);
  1617. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1618. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), str, maxlen);
  1619. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1620. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), _T(";"), maxlen);
  1621. }
  1622. else
  1623. {
  1624. int maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1625. USES_CONVERSION;
  1626. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), A2CT(pOBJ_nid2sn(pOBJ_obj2nid(pObject))), maxlen);
  1627. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1628. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), _T("="), maxlen);
  1629. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1630. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), str, maxlen);
  1631. maxlen = 1024 - _tcslen(SslCertData.subject.Other)-1;
  1632. _tcsncpy(SslCertData.subject.Other+_tcslen(SslCertData.subject.Other), _T(";"), maxlen);
  1633. }
  1634. break;
  1635. }
  1636. }
  1637. }
  1638. //Set issuer data fields
  1639. pX509Name=pX509_get_issuer_name(pX509);
  1640. if (pX509Name)
  1641. {
  1642. int count=pX509_NAME_entry_count(pX509Name);
  1643. for (int i=0;i<count;i++)
  1644. {
  1645. X509_NAME_ENTRY *pX509NameEntry=pX509_NAME_get_entry(pX509Name,i);
  1646. if (!pX509NameEntry)
  1647. continue;
  1648. ASN1_STRING *pString=pX509_NAME_ENTRY_get_data(pX509NameEntry);
  1649. ASN1_OBJECT *pObject=pX509_NAME_ENTRY_get_object(pX509NameEntry);
  1650. CString str;
  1651. unsigned char *out;
  1652. int len = pASN1_STRING_to_UTF8(&out, pString);
  1653. if (len > 0)
  1654. {
  1655. // Keep it huge
  1656. LPWSTR unicode = new WCHAR[len * 10];
  1657. memset(unicode, 0, sizeof(WCHAR) * len * 10);
  1658. int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, (const char *)out, len, unicode, len * 10);
  1659. if (unicodeLen > 0)
  1660. {
  1661. #ifdef _UNICODE
  1662. str = unicode;
  1663. #else
  1664. LPSTR ansi = new CHAR[len * 10];
  1665. memset(ansi, 0, sizeof(CHAR) * len * 10);
  1666. int ansiLen = WideCharToMultiByte(CP_ACP, 0, unicode, unicodeLen, ansi, len * 10, 0, 0);
  1667. if (ansiLen > 0)
  1668. str = ansi;
  1669. delete [] ansi;
  1670. #endif
  1671. }
  1672. delete [] unicode;
  1673. pCRYPTO_free(out);
  1674. }
  1675. switch(pOBJ_obj2nid(pObject))
  1676. {
  1677. case NID_organizationName:
  1678. _tcsncpy(SslCertData.issuer.Organization, str, 255);
  1679. SslCertData.issuer.Organization[255] = 0;
  1680. break;
  1681. case NID_organizationalUnitName:
  1682. _tcsncpy(SslCertData.issuer.Unit, str, 255);
  1683. SslCertData.issuer.Unit[255] = 0;
  1684. break;
  1685. case NID_commonName:
  1686. _tcsncpy(SslCertData.issuer.CommonName, str, 255);
  1687. SslCertData.issuer.CommonName[255] = 0;
  1688. break;
  1689. case NID_pkcs9_emailAddress:
  1690. _tcsncpy(SslCertData.issuer.Mail, str, 255);
  1691. SslCertData.issuer.Mail[255] = 0;
  1692. break;
  1693. case NID_countryName:
  1694. _tcsncpy(SslCertData.issuer.Country, str, 255);
  1695. SslCertData.issuer.Country[255] = 0;
  1696. break;
  1697. case NID_stateOrProvinceName:
  1698. _tcsncpy(SslCertData.issuer.StateProvince, str, 255);
  1699. SslCertData.issuer.StateProvince[255] = 0;
  1700. break;
  1701. case NID_localityName:
  1702. _tcsncpy(SslCertData.issuer.Town, str, 255);
  1703. SslCertData.issuer.Town[255] = 0;
  1704. break;
  1705. default:
  1706. if ( !pOBJ_nid2sn(pOBJ_obj2nid(pObject)) )
  1707. {
  1708. TCHAR tmp[20];
  1709. _stprintf(tmp, _T("%d"), pOBJ_obj2nid(pObject));
  1710. int maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1711. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), tmp, maxlen);
  1712. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1713. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), _T("="), maxlen);
  1714. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1715. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), str, maxlen);
  1716. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1717. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), _T(";"), maxlen);
  1718. }
  1719. else
  1720. {
  1721. int maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1722. USES_CONVERSION;
  1723. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), A2CT(pOBJ_nid2sn(pOBJ_obj2nid(pObject))), maxlen);
  1724. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1725. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), _T("="), maxlen);
  1726. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1727. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), str, maxlen);
  1728. maxlen = 1024 - _tcslen(SslCertData.issuer.Other)-1;
  1729. _tcsncpy(SslCertData.issuer.Other+_tcslen(SslCertData.issuer.Other), _T(";"), maxlen);
  1730. }
  1731. break;
  1732. }
  1733. }
  1734. }
  1735. //Set date fields
  1736. //Valid from
  1737. ASN1_TIME *pTime=X509_get_notBefore(pX509);
  1738. if (!pTime)
  1739. {
  1740. pX509_free(pX509);
  1741. Error = _T("Cannot get start time");
  1742. return FALSE;
  1743. }
  1744. if (!AsnTimeToValidTime(pTime, SslCertData.validFrom))
  1745. {
  1746. pX509_free(pX509);
  1747. Error = _T("Invalid start time");
  1748. return FALSE;
  1749. }
  1750. //Valid until
  1751. pTime = X509_get_notAfter(pX509);
  1752. if (!pTime)
  1753. {
  1754. pX509_free(pX509);
  1755. Error = _T("Cannot get end time");
  1756. return FALSE;
  1757. }
  1758. if (!AsnTimeToValidTime(pTime, SslCertData.validUntil))
  1759. {
  1760. pX509_free(pX509);
  1761. Error = _T("Invalid end time");
  1762. return FALSE;
  1763. }
  1764. unsigned int length = 20;
  1765. pX509_digest(pX509, pEVP_sha1(), SslCertData.hash, &length);
  1766. SslCertData.priv_data = m_nSslAsyncNotifyId;
  1767. pX509_free(pX509);
  1768. SslCertData.verificationResult = m_nVerificationResult;
  1769. SslCertData.verificationDepth = m_nVerificationDepth;
  1770. return TRUE;
  1771. }
  1772. std::string CAsyncSslSocketLayer::GetTlsVersionStr()
  1773. {
  1774. return m_TlsVersionStr;
  1775. }
  1776. std::string CAsyncSslSocketLayer::GetCipherName()
  1777. {
  1778. return m_CipherName;
  1779. }
  1780. void CAsyncSslSocketLayer::SetNotifyReply(int nID, int nCode, int result)
  1781. {
  1782. if (!m_bBlocking)
  1783. return;
  1784. if (nID != m_nSslAsyncNotifyId)
  1785. return;
  1786. if (nCode != SSL_VERIFY_CERT)
  1787. return;
  1788. m_bBlocking = FALSE;
  1789. if (!result)
  1790. {
  1791. m_nNetworkError = WSAECONNABORTED;
  1792. WSASetLastError(WSAECONNABORTED);
  1793. if (!m_bFailureSent)
  1794. {
  1795. m_bFailureSent = TRUE;
  1796. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_FAILURE, SSL_FAILURE_CERTREJECTED);
  1797. }
  1798. TriggerEvent(FD_CLOSE, 0, TRUE);
  1799. return;
  1800. }
  1801. m_bSslEstablished = TRUE;
  1802. PrintSessionInfo();
  1803. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_INFO, SSL_INFO_ESTABLISHED);
  1804. TriggerEvents();
  1805. }
  1806. void CAsyncSslSocketLayer::PrintSessionInfo()
  1807. {
  1808. #ifdef MPEXT
  1809. const
  1810. #endif
  1811. SSL_CIPHER *ciph;
  1812. X509 *cert;
  1813. ciph = pSSL_get_current_cipher(m_ssl);
  1814. char enc[4096] = {0};
  1815. cert=pSSL_get_peer_certificate(m_ssl);
  1816. if (cert != NULL)
  1817. {
  1818. EVP_PKEY *pkey = pX509_get_pubkey(cert);
  1819. if (pkey != NULL)
  1820. {
  1821. if (0)
  1822. ;
  1823. #ifndef NO_RSA
  1824. else if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL
  1825. && pkey->pkey.rsa->n != NULL)
  1826. sprintf(enc, "%d bit RSA", pBN_num_bits(pkey->pkey.rsa->n));
  1827. #endif
  1828. #ifndef NO_DSA
  1829. else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL
  1830. && pkey->pkey.dsa->p != NULL)
  1831. sprintf(enc, "%d bit DSA", pBN_num_bits(pkey->pkey.dsa->p));
  1832. #endif
  1833. pEVP_PKEY_free(pkey);
  1834. }
  1835. pX509_free(cert);
  1836. /* The SSL API does not allow us to look at temporary RSA/DH keys,
  1837. * otherwise we should print their lengths too */
  1838. }
  1839. char *buffer = new char[4096];
  1840. m_TlsVersionStr = pSSL_get_version(m_ssl);
  1841. sprintf(buffer, "%s: %s, %s",
  1842. pSSL_CIPHER_get_version(ciph),
  1843. pSSL_CIPHER_get_name(ciph),
  1844. enc);
  1845. m_CipherName = buffer;
  1846. sprintf(buffer, "Using %s, cipher %s",
  1847. m_TlsVersionStr.c_str(),
  1848. m_CipherName.c_str());
  1849. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_WARNING, 0, buffer);
  1850. }
  1851. void CAsyncSslSocketLayer::OnConnect(int nErrorCode)
  1852. {
  1853. if (m_bUseSSL && nErrorCode)
  1854. TriggerEvent(FD_WRITE, 0);
  1855. TriggerEvent(FD_CONNECT, nErrorCode, TRUE);
  1856. }
  1857. int CAsyncSslSocketLayer::verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
  1858. {
  1859. X509 *err_cert;
  1860. int err, depth;
  1861. SSL *ssl;
  1862. err_cert = pX509_STORE_CTX_get_current_cert(ctx);
  1863. err = pX509_STORE_CTX_get_error(ctx);
  1864. depth = pX509_STORE_CTX_get_error_depth(ctx);
  1865. /*
  1866. * Retrieve the pointer to the SSL of the connection currently treated
  1867. * and the application specific data stored into the SSL object.
  1868. */
  1869. ssl = (SSL *)pX509_STORE_CTX_get_ex_data(ctx, pSSL_get_ex_data_X509_STORE_CTX_idx());
  1870. // Lookup CAsyncSslSocketLayer instance
  1871. CAsyncSslSocketLayer *pLayer = 0;
  1872. m_sCriticalSection.Lock();
  1873. t_SslLayerList *cur = m_pSslLayerList;
  1874. while (cur)
  1875. {
  1876. if (cur->pLayer->m_ssl == ssl)
  1877. break;
  1878. cur = cur->pNext;
  1879. }
  1880. if (!cur)
  1881. {
  1882. m_sCriticalSection.Unlock();
  1883. MessageBox(0, _T("Can't lookup TLS session!"), _T("Critical error"), MB_ICONEXCLAMATION);
  1884. return 1;
  1885. }
  1886. else
  1887. pLayer = cur->pLayer;
  1888. m_sCriticalSection.Unlock();
  1889. /*
  1890. * Catch a too long certificate chain. The depth limit set using
  1891. * SSL_CTX_set_verify_depth() is by purpose set to "limit+1" so
  1892. * that whenever the "depth>verify_depth" condition is met, we
  1893. * have violated the limit and want to log this error condition.
  1894. * We must do it here, because the CHAIN_TOO_LONG error would not
  1895. * be found explicitly; only errors introduced by cutting off the
  1896. * additional certificates would be logged.
  1897. */
  1898. if (depth > 10) {//mydata->verify_depth) {
  1899. preverify_ok = 0;
  1900. err = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  1901. pX509_STORE_CTX_set_error(ctx, err);
  1902. }
  1903. if (!preverify_ok)
  1904. {
  1905. if (!pLayer->m_nVerificationResult)
  1906. {
  1907. pLayer->m_nVerificationDepth = depth;
  1908. pLayer->m_nVerificationResult = err;
  1909. }
  1910. }
  1911. return 1;
  1912. }
  1913. BOOL CAsyncSslSocketLayer::SetCertStorage(CString file)
  1914. {
  1915. m_CertStorage = file;
  1916. return TRUE;
  1917. }
  1918. void CAsyncSslSocketLayer::OnClose(int nErrorCode)
  1919. {
  1920. m_onCloseCalled = true;
  1921. if (m_bUseSSL && pBIO_ctrl)
  1922. {
  1923. size_t pending = pBIO_ctrl_pending(m_sslbio);
  1924. if (pending > 0)
  1925. {
  1926. TriggerEvents();
  1927. }
  1928. else TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  1929. }
  1930. else
  1931. TriggerEvent(FD_CLOSE, nErrorCode, TRUE);
  1932. }
  1933. void CAsyncSslSocketLayer::PrintLastErrorMsg()
  1934. {
  1935. int err = pERR_get_error();
  1936. while (err)
  1937. {
  1938. char *buffer = new char[512];
  1939. pERR_error_string(err, buffer);
  1940. err = pERR_get_error();
  1941. DoLayerCallback(LAYERCALLBACK_LAYERSPECIFIC, SSL_VERBOSE_WARNING, 0, buffer);
  1942. }
  1943. }
  1944. bool CAsyncSslSocketLayer::CreateSslCertificate(LPCTSTR filename, int bits, unsigned char* country, unsigned char* state,
  1945. unsigned char* locality, unsigned char* organization, unsigned char* unit, unsigned char* cname,
  1946. unsigned char *email, CString& err)
  1947. {
  1948. // Certificate valid for a year
  1949. int days = 365;
  1950. CAsyncSslSocketLayer layer;
  1951. if (layer.InitSSL())
  1952. {
  1953. err = _T("Failed to initialize TLS library");
  1954. return false;
  1955. }
  1956. X509 *x;
  1957. EVP_PKEY *pk;
  1958. RSA *rsa;
  1959. X509_NAME *name = NULL;
  1960. if ((pk = pEVP_PKEY_new()) == NULL)
  1961. {
  1962. err = _T("Could not create key object");
  1963. return false;
  1964. }
  1965. if ((x = pX509_new()) == NULL)
  1966. {
  1967. err = _T("Could not create certificate object");
  1968. return false;
  1969. }
  1970. rsa = pRSA_generate_key(bits, RSA_F4, 0/*callback*/, NULL);
  1971. if (!pEVP_PKEY_assign(pk, EVP_PKEY_RSA, (char *)(rsa)))
  1972. {
  1973. err = _T("Failed to assign rsa key to key object");
  1974. return false;
  1975. }
  1976. rsa = NULL;
  1977. pX509_set_version(x,2);
  1978. pASN1_INTEGER_set(pX509_get_serialNumber(x), 0/*serial*/);
  1979. pX509_gmtime_adj(X509_get_notBefore(x),0);
  1980. pX509_gmtime_adj(X509_get_notAfter(x),(long)60*60*24*days);
  1981. pX509_set_pubkey(x,pk);
  1982. name = pX509_get_subject_name(x);
  1983. /* This function creates and adds the entry, working out the
  1984. * correct string type and performing checks on its length.
  1985. * Normally we'd check the return value for errors...
  1986. */
  1987. pX509_NAME_add_entry_by_txt(name, "CN",
  1988. MBSTRING_ASC, cname, -1, -1, 0);
  1989. pX509_NAME_add_entry_by_txt(name, "C",
  1990. MBSTRING_ASC, country, -1, -1, 0);
  1991. pX509_NAME_add_entry_by_txt(name, "ST",
  1992. MBSTRING_ASC, state, -1, -1, 0);
  1993. pX509_NAME_add_entry_by_txt(name, "L",
  1994. MBSTRING_ASC, locality, -1, -1, 0);
  1995. pX509_NAME_add_entry_by_txt(name, "O",
  1996. MBSTRING_ASC, organization, -1, -1, 0);
  1997. pX509_NAME_add_entry_by_txt(name, "OU",
  1998. MBSTRING_ASC, unit, -1, -1, 0);
  1999. pX509_NAME_add_entry_by_NID(name, NID_pkcs9_emailAddress,
  2000. MBSTRING_ASC, email, -1, -1, 0);
  2001. /* Its self signed so set the issuer name to be the same as the
  2002. * subject.
  2003. */
  2004. pX509_set_issuer_name(x,name);
  2005. if (!pX509_sign(x, pk, pEVP_sha1()))
  2006. {
  2007. err = _T("Failed to sign certificate");
  2008. return false;
  2009. }
  2010. // Write key and certificate to file
  2011. // We use a memory bio, since the OpenSSL functions accepting a filepointer
  2012. // do crash for no obvious reason.
  2013. #ifndef _UNICODE
  2014. FILE* file = fopen(filename, "w+");
  2015. #else
  2016. FILE* file = _wfopen(filename, _T("w+"));
  2017. #endif
  2018. if (!file)
  2019. {
  2020. err = _T("Failed to open output file");
  2021. return false;
  2022. }
  2023. BIO* bio = pBIO_new(pBIO_s_mem());
  2024. #ifdef MPEXT
  2025. pPEM_ASN1_write_bio((i2d_of_void*)pi2d_PrivateKey, (((pk)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA), bio, (char *)pk, NULL, NULL, 0, NULL, NULL);
  2026. pPEM_ASN1_write_bio((i2d_of_void*)pi2d_X509, PEM_STRING_X509, bio, (char *)x, NULL, NULL, 0, NULL, NULL);
  2027. #else
  2028. pPEM_ASN1_write_bio((int (*)())pi2d_PrivateKey, (((pk)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA), bio, (char *)pk, NULL, NULL, 0, NULL, NULL);
  2029. pPEM_ASN1_write_bio((int (*)())pi2d_X509, PEM_STRING_X509, bio, (char *)x, NULL, NULL, 0, NULL, NULL);
  2030. #endif
  2031. char buffer[1001];
  2032. int len;
  2033. while ((len = pBIO_read(bio, buffer, 1000)) > 0)
  2034. {
  2035. buffer[len] = 0;
  2036. fprintf(file, buffer);
  2037. }
  2038. fclose(file);
  2039. pX509_free(x);
  2040. pEVP_PKEY_free(pk);
  2041. pBIO_free(bio);
  2042. layer.UnloadSSL();
  2043. return true;
  2044. }
  2045. int CAsyncSslSocketLayer::SetCertKeyFile(const char* cert, const char* key, const char* pass, CString* error /*=0*/)
  2046. {
  2047. int res = InitSSL();
  2048. if (res)
  2049. return res;
  2050. m_sCriticalSection.Lock();
  2051. if (!m_ssl_ctx)
  2052. {
  2053. // Create new context
  2054. if (!(m_ssl_ctx = pSSL_CTX_new( pSSLv23_method())))
  2055. {
  2056. m_sCriticalSection.Unlock();
  2057. return SSL_FAILURE_INITSSL;
  2058. }
  2059. m_contextRefCount[m_ssl_ctx] = 1;
  2060. }
  2061. pSSL_CTX_set_default_passwd_cb(m_ssl_ctx, pem_passwd_cb);
  2062. pSSL_CTX_set_default_passwd_cb_userdata(m_ssl_ctx, this);
  2063. if (pass)
  2064. {
  2065. size_t len = strlen(pass);
  2066. m_pKeyPassword = new char[len + 1];
  2067. strcpy(m_pKeyPassword, pass);
  2068. }
  2069. else
  2070. {
  2071. delete [] m_pKeyPassword;
  2072. m_pKeyPassword = 0;
  2073. }
  2074. if (pSSL_CTX_use_certificate_chain_file(m_ssl_ctx, cert) <= 0)
  2075. //if (pSSL_CTX_use_certificate_file(m_ssl_ctx, cert, SSL_FILETYPE_PEM) <= 0)
  2076. {
  2077. if (error)
  2078. *error = _T("Could not load certificate file.");
  2079. m_sCriticalSection.Unlock();
  2080. return SSL_FAILURE_VERIFYCERT;
  2081. }
  2082. if (pSSL_CTX_use_PrivateKey_file(m_ssl_ctx, key, SSL_FILETYPE_PEM) <= 0)
  2083. {
  2084. if (error)
  2085. *error = _T("Could not load key file.");
  2086. m_sCriticalSection.Unlock();
  2087. return SSL_FAILURE_VERIFYCERT;
  2088. }
  2089. if (!pSSL_CTX_check_private_key(m_ssl_ctx))
  2090. {
  2091. if (error)
  2092. *error = _T("Private key does not match the certificate public key.");
  2093. m_sCriticalSection.Unlock();
  2094. return SSL_FAILURE_VERIFYCERT;
  2095. }
  2096. m_sCriticalSection.Unlock();
  2097. return 0;
  2098. }
  2099. int CAsyncSslSocketLayer::SendRaw(const void* lpBuf, int nBufLen, int nFlags)
  2100. {
  2101. if (!m_bUseSSL)
  2102. {
  2103. SetLastError(WSANOTINITIALISED);
  2104. return SOCKET_ERROR;
  2105. }
  2106. if (!lpBuf)
  2107. return 0;
  2108. if (m_nNetworkError)
  2109. {
  2110. SetLastError(m_nNetworkError);
  2111. return SOCKET_ERROR;
  2112. }
  2113. if (m_nShutDown)
  2114. {
  2115. SetLastError(WSAESHUTDOWN);
  2116. return SOCKET_ERROR;
  2117. }
  2118. if (m_nNetworkSendBufferLen)
  2119. {
  2120. SetLastError(WSAEINPROGRESS);
  2121. return SOCKET_ERROR;
  2122. }
  2123. if (!nBufLen)
  2124. return 0;
  2125. if (m_nNetworkSendBufferMaxLen < nBufLen)
  2126. m_nNetworkSendBufferMaxLen = nBufLen;
  2127. delete [] m_pNetworkSendBuffer;
  2128. m_pNetworkSendBuffer = new char[m_nNetworkSendBufferMaxLen];
  2129. memcpy(m_pNetworkSendBuffer, lpBuf, nBufLen);
  2130. m_nNetworkSendBufferLen = nBufLen;
  2131. TriggerEvent(FD_WRITE, 0);
  2132. return nBufLen;
  2133. }
  2134. void CAsyncSslSocketLayer::TriggerEvents()
  2135. {
  2136. size_t pending = pBIO_ctrl_pending(m_nbio);
  2137. if (pending > 0)
  2138. {
  2139. if (m_mayTriggerWrite)
  2140. {
  2141. m_mayTriggerWrite = false;
  2142. TriggerEvent(FD_WRITE, 0);
  2143. }
  2144. }
  2145. else if (!m_nNetworkSendBufferLen && m_bSslEstablished && !m_pRetrySendBuffer)
  2146. {
  2147. if (pBIO_ctrl_get_write_guarantee(m_sslbio) > 0 && m_mayTriggerWriteUp)
  2148. {
  2149. m_mayTriggerWriteUp = false;
  2150. TriggerEvent(FD_WRITE, 0, TRUE);
  2151. }
  2152. }
  2153. if (m_bSslEstablished && pBIO_ctrl_pending(m_sslbio) > 0)
  2154. {
  2155. if (m_mayTriggerReadUp && !m_bBlocking)
  2156. {
  2157. m_mayTriggerReadUp = false;
  2158. TriggerEvent(FD_READ, 0, TRUE);
  2159. }
  2160. }
  2161. else
  2162. {
  2163. int len = pBIO_ctrl_get_write_guarantee(m_nbio);
  2164. if (len > 0 && m_mayTriggerRead)
  2165. {
  2166. m_mayTriggerRead = false;
  2167. TriggerEvent(FD_READ, 0);
  2168. }
  2169. }
  2170. if (m_onCloseCalled && m_bSslEstablished)
  2171. {
  2172. if (pBIO_ctrl_pending(m_sslbio) <= 0)
  2173. {
  2174. TriggerEvent(FD_CLOSE, 0, TRUE);
  2175. }
  2176. }
  2177. }
  2178. int CAsyncSslSocketLayer::pem_passwd_cb(char *buf, int size, int rwflag, void *userdata)
  2179. {
  2180. CAsyncSslSocketLayer* pThis = (CAsyncSslSocketLayer*)userdata;
  2181. if (!pThis || !pThis->m_pKeyPassword)
  2182. return 0;
  2183. int len = strlen(pThis->m_pKeyPassword);
  2184. if (len >= size)
  2185. len = size - 1;
  2186. memcpy(buf, pThis->m_pKeyPassword, len);
  2187. buf[len] = 0;
  2188. return len;
  2189. }
  2190. //---------------------------------------------------------------------------
  2191. #include <wincrypt.h>
  2192. //---------------------------------------------------------------------------
  2193. // Taken from
  2194. // http://openssl.6102.n7.nabble.com/Get-root-certificates-from-System-Store-of-Windows-td40959.html
  2195. void __fastcall LoadSslWindowsSystemCertificateStore(SSL_CTX * Ctx)
  2196. {
  2197. HCERTSTORE CertStore = CertStore = CertOpenSystemStore(0, L"ROOT");
  2198. if (CertStore != NULL)
  2199. {
  2200. PCCERT_CONTEXT CertContext = NULL;
  2201. while ((CertContext = CertEnumCertificatesInStore(CertStore, CertContext)) != NULL)
  2202. {
  2203. #ifdef _DEBUG
  2204. wchar_t Buf[1024];
  2205. CertNameToStr(X509_ASN_ENCODING, &CertContext->pCertInfo->Subject, CERT_X500_NAME_STR, Buf, LENOF(Buf));
  2206. Buf[LENOF(Buf) - 1] = L'\0';
  2207. CertNameToStr(X509_ASN_ENCODING, &CertContext->pCertInfo->Issuer, CERT_X500_NAME_STR, Buf, LENOF(Buf));
  2208. Buf[LENOF(Buf) - 1] = L'\0';
  2209. #endif
  2210. X509 * x509 = d2i_X509(NULL, const_cast<const unsigned char **>(&CertContext->pbCertEncoded), CertContext->cbCertEncoded);
  2211. if (x509 != NULL)
  2212. {
  2213. #ifdef _DEBUG
  2214. int AddCertResult =
  2215. #endif
  2216. X509_STORE_add_cert(Ctx->cert_store, x509);
  2217. X509_free(x509);
  2218. }
  2219. }
  2220. CertFreeCertificateContext(CertContext);
  2221. CertCloseStore(CertStore, 0);
  2222. }
  2223. }