Commit 4df3e30abfe601bbfd366bcd79b835c4f9bc2ea8
1 parent
ed91a6f4
Exists in
master
and in
3 other branches
Organizing CRL check engine to avoid duplications.
Showing
13 changed files
with
383 additions
and
284 deletions
Show diff stats
configure.ac
| @@ -388,10 +388,10 @@ if test "$app_cv_enable_crl_check" == "yes"; then | @@ -388,10 +388,10 @@ if test "$app_cv_enable_crl_check" == "yes"; then | ||
| 388 | AC_DEFINE(SSL_ENABLE_CRL_CHECK) | 388 | AC_DEFINE(SSL_ENABLE_CRL_CHECK) |
| 389 | fi | 389 | fi |
| 390 | 390 | ||
| 391 | -AC_ARG_WITH([default-crl-url], | ||
| 392 | - [AS_HELP_STRING([--with-default-crl-url], [Set lib3270 default crl url])], | 391 | +AC_ARG_WITH([crl-url], |
| 392 | + [AS_HELP_STRING([--with-crl-url], [Set a hardcoded URL for CRL download])], | ||
| 393 | [ | 393 | [ |
| 394 | - AC_DEFINE_UNQUOTED(SSL_DEFAULT_CRL_URL,"$withval") | 394 | + AC_DEFINE_UNQUOTED(SSL_CRL_URL,"$withval") |
| 395 | ],[ | 395 | ],[ |
| 396 | AC_MSG_NOTICE(No default crl url) | 396 | AC_MSG_NOTICE(No default crl url) |
| 397 | ]) | 397 | ]) |
lib3270.cbp
| @@ -232,6 +232,7 @@ | @@ -232,6 +232,7 @@ | ||
| 232 | <Unit filename="src/include/cg.h" /> | 232 | <Unit filename="src/include/cg.h" /> |
| 233 | <Unit filename="src/include/config.h" /> | 233 | <Unit filename="src/include/config.h" /> |
| 234 | <Unit filename="src/include/config.h.in" /> | 234 | <Unit filename="src/include/config.h.in" /> |
| 235 | + <Unit filename="src/include/crl.h" /> | ||
| 235 | <Unit filename="src/include/ctlrc.h" /> | 236 | <Unit filename="src/include/ctlrc.h" /> |
| 236 | <Unit filename="src/include/ft_cut_ds.h" /> | 237 | <Unit filename="src/include/ft_cut_ds.h" /> |
| 237 | <Unit filename="src/include/ft_cutc.h" /> | 238 | <Unit filename="src/include/ft_cutc.h" /> |
| @@ -304,6 +305,7 @@ | @@ -304,6 +305,7 @@ | ||
| 304 | <Unit filename="src/ssl/crl.c"> | 305 | <Unit filename="src/ssl/crl.c"> |
| 305 | <Option compilerVar="CC" /> | 306 | <Option compilerVar="CC" /> |
| 306 | </Unit> | 307 | </Unit> |
| 308 | + <Unit filename="src/ssl/crl.h" /> | ||
| 307 | <Unit filename="src/ssl/linux/curl.c"> | 309 | <Unit filename="src/ssl/linux/curl.c"> |
| 308 | <Option compilerVar="CC" /> | 310 | <Option compilerVar="CC" /> |
| 309 | </Unit> | 311 | </Unit> |
| @@ -320,6 +322,10 @@ | @@ -320,6 +322,10 @@ | ||
| 320 | <Unit filename="src/ssl/negotiate.c"> | 322 | <Unit filename="src/ssl/negotiate.c"> |
| 321 | <Option compilerVar="CC" /> | 323 | <Option compilerVar="CC" /> |
| 322 | </Unit> | 324 | </Unit> |
| 325 | + <Unit filename="src/ssl/notify.c"> | ||
| 326 | + <Option compilerVar="CC" /> | ||
| 327 | + </Unit> | ||
| 328 | + <Unit filename="src/ssl/private.h" /> | ||
| 323 | <Unit filename="src/ssl/properties.c"> | 329 | <Unit filename="src/ssl/properties.c"> |
| 324 | <Option compilerVar="CC" /> | 330 | <Option compilerVar="CC" /> |
| 325 | </Unit> | 331 | </Unit> |
src/core/connect.c
| @@ -36,9 +36,7 @@ | @@ -36,9 +36,7 @@ | ||
| 36 | #include <lib3270/toggle.h> | 36 | #include <lib3270/toggle.h> |
| 37 | #include <trace_dsc.h> | 37 | #include <trace_dsc.h> |
| 38 | 38 | ||
| 39 | -#if defined(HAVE_LIBSSL) | ||
| 40 | - #include <openssl/err.h> | ||
| 41 | -#endif | 39 | +#include "../ssl/crl.h" |
| 42 | 40 | ||
| 43 | /*---[ Implement ]-------------------------------------------------------------------------------*/ | 41 | /*---[ Implement ]-------------------------------------------------------------------------------*/ |
| 44 | 42 | ||
| @@ -55,104 +53,22 @@ | @@ -55,104 +53,22 @@ | ||
| 55 | 53 | ||
| 56 | } | 54 | } |
| 57 | 55 | ||
| 58 | -static int background_ssl_crl_get(H3270 *hSession, void *ssl_error) | ||
| 59 | -{ | ||
| 60 | - if(ssl_ctx_init(hSession, (SSL_ERROR_MESSAGE *) ssl_error)) { | ||
| 61 | - return -1; | ||
| 62 | - } | ||
| 63 | - | ||
| 64 | - // Do I have X509 CRL? | ||
| 65 | - if(hSession->ssl.crl.cert) | ||
| 66 | - { | ||
| 67 | - // Ok, have it. Is it valid? | ||
| 68 | - | ||
| 69 | - // https://stackoverflow.com/questions/23407376/testing-x509-certificate-expiry-date-with-c | ||
| 70 | - // X509_CRL_get_nextUpdate is deprecated in openssl 1.1.0 | ||
| 71 | - #if OPENSSL_VERSION_NUMBER < 0x10100000L | ||
| 72 | - const ASN1_TIME * next_update = X509_CRL_get_nextUpdate(hSession->ssl.crl.cert); | ||
| 73 | - #else | ||
| 74 | - const ASN1_TIME * next_update = X509_CRL_get0_nextUpdate(hSession->ssl.crl.cert); | ||
| 75 | - #endif | ||
| 76 | - | ||
| 77 | - if(X509_cmp_current_time(next_update) == 1) | ||
| 78 | - { | ||
| 79 | - int day, sec; | ||
| 80 | - if(ASN1_TIME_diff(&day, &sec, NULL, next_update)) | ||
| 81 | - { | ||
| 82 | - trace_ssl(hSession,"CRL Certificate is valid for %d day(s) and %d second(s)\n",day,sec); | ||
| 83 | - return 0; | ||
| 84 | - } | ||
| 85 | - else | ||
| 86 | - { | ||
| 87 | - trace_ssl(hSession,"Can't get CRL next update, releasing it\n"); | ||
| 88 | - } | ||
| 89 | - | ||
| 90 | - } | ||
| 91 | - else | ||
| 92 | - { | ||
| 93 | - trace_ssl(hSession,"CRL Certificate is no longer valid\n"); | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - // Certificate is no longer valid, release it. | ||
| 97 | - X509_CRL_free(hSession->ssl.crl.cert); | ||
| 98 | - hSession->ssl.crl.cert = NULL; | ||
| 99 | - | ||
| 100 | - } | ||
| 101 | - | ||
| 102 | - // | ||
| 103 | - // Get CRL | ||
| 104 | - // | ||
| 105 | - // https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | ||
| 106 | - // | ||
| 107 | - return lib3270_get_crl_from_url(hSession, ssl_error, lib3270_get_crl_url(hSession)); | ||
| 108 | - | ||
| 109 | -} | ||
| 110 | - | ||
| 111 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
| 112 | -static int notify_crl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *message) | ||
| 113 | -{ | ||
| 114 | - lib3270_write_log( | ||
| 115 | - hSession, | ||
| 116 | - "SSL-CRL-GET", | ||
| 117 | - "CRL GET error: %s (rc=%d ssl_error=%d)", | ||
| 118 | - message->title, | ||
| 119 | - rc, | ||
| 120 | - message->error | ||
| 121 | - ); | ||
| 122 | - | ||
| 123 | - if(message->description) | ||
| 124 | - { | ||
| 125 | - if(popup_ssl_error(hSession,rc,message->title,message->text,message->description)) | ||
| 126 | - return rc; | ||
| 127 | - } | ||
| 128 | -#ifdef _WIN32 | ||
| 129 | - else if(message->lasterror) | ||
| 130 | - { | ||
| 131 | - lib3270_autoptr(char) windows_error = lib3270_win32_translate_error_code(message->lasterror); | ||
| 132 | - lib3270_autoptr(char) formatted_error = lib3270_strdup_printf(_( "Windows error was \"%s\" (%u)" ), windows_error,(unsigned int) message->lasterror); | ||
| 133 | 56 | ||
| 134 | - if(popup_ssl_error(hSession,rc,message->title,message->text,formatted_error)) | ||
| 135 | - return rc; | 57 | +#if defined(HAVE_LIBSSL) |
| 136 | 58 | ||
| 137 | - } | ||
| 138 | -#endif // WIN32 | ||
| 139 | - else if(message->error) | ||
| 140 | - { | ||
| 141 | - lib3270_autoptr(char) formatted_error = lib3270_strdup_printf(_( "%s (SSL error %d)" ),ERR_reason_error_string(message->error),message->error); | ||
| 142 | - lib3270_write_log(hSession,"SSL-CRL-GET","%s",formatted_error); | 59 | + static int background_ssl_init(H3270 *hSession, void *ssl_error) |
| 60 | + { | ||
| 61 | + if(ssl_ctx_init(hSession, (SSL_ERROR_MESSAGE *) ssl_error)) | ||
| 62 | + return -1; | ||
| 143 | 63 | ||
| 144 | - if(popup_ssl_error(hSession,rc,message->title,message->text,formatted_error)) | ||
| 145 | - return rc; | ||
| 146 | - } | ||
| 147 | - else | ||
| 148 | - { | ||
| 149 | - if(popup_ssl_error(hSession,rc,message->title,message->text,"")) | ||
| 150 | - return rc; | ||
| 151 | - } | 64 | +#if defined(SSL_ENABLE_CRL_CHECK) |
| 65 | + lib3270_crl_free_if_expired(hSession); | ||
| 66 | +#endif // defined(SSL_ENABLE_CRL_CHECK) | ||
| 152 | 67 | ||
| 153 | return 0; | 68 | return 0; |
| 154 | -} | ||
| 155 | -#endif // SSL_ENABLE_CRL_CHECK | 69 | + } |
| 70 | + | ||
| 71 | +#endif // HAVE_LIBSSL | ||
| 156 | 72 | ||
| 157 | int lib3270_reconnect(H3270 *hSession, int seconds) | 73 | int lib3270_reconnect(H3270 *hSession, int seconds) |
| 158 | { | 74 | { |
| @@ -186,24 +102,20 @@ static int notify_crl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *me | @@ -186,24 +102,20 @@ static int notify_crl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *me | ||
| 186 | } | 102 | } |
| 187 | } | 103 | } |
| 188 | 104 | ||
| 189 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
| 190 | - | ||
| 191 | - SSL_ERROR_MESSAGE ssl_error; | ||
| 192 | - memset(&ssl_error,0,sizeof(ssl_error)); | ||
| 193 | - | ||
| 194 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | ||
| 195 | - int rc = lib3270_run_task(hSession, background_ssl_crl_get, &ssl_error); | ||
| 196 | - | ||
| 197 | - debug("CRL check returns %d",rc); | 105 | +#if defined(HAVE_LIBSSL) |
| 106 | + { | ||
| 107 | + SSL_ERROR_MESSAGE ssl_error; | ||
| 108 | + memset(&ssl_error,0,sizeof(ssl_error)); | ||
| 198 | 109 | ||
| 199 | - if(rc && notify_crl_error(hSession, rc,&ssl_error)) | ||
| 200 | - return errno = rc; | 110 | + set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); |
| 111 | + int rc = lib3270_run_task(hSession, background_ssl_init, &ssl_error); | ||
| 201 | 112 | ||
| 202 | -#endif // SSL_ENABLE_CRL_CHECK | 113 | + if(rc && notify_ssl_error(hSession, rc, &ssl_error)) |
| 114 | + return errno = rc; | ||
| 203 | 115 | ||
| 204 | -#if defined(HAVE_LIBSSL) | ||
| 205 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
| 206 | - hSession->ssl.host = 0; | 116 | + set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 117 | + hSession->ssl.host = 0; | ||
| 118 | + } | ||
| 207 | #endif // HAVE_LIBSSL | 119 | #endif // HAVE_LIBSSL |
| 208 | 120 | ||
| 209 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | 121 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); |
src/core/session.c
| @@ -44,6 +44,7 @@ | @@ -44,6 +44,7 @@ | ||
| 44 | #include "kybdc.h" | 44 | #include "kybdc.h" |
| 45 | #include "3270ds.h" | 45 | #include "3270ds.h" |
| 46 | #include "popupsc.h" | 46 | #include "popupsc.h" |
| 47 | +#include "../ssl/crl.h" | ||
| 47 | #include <lib3270/trace.h> | 48 | #include <lib3270/trace.h> |
| 48 | #include <lib3270/log.h> | 49 | #include <lib3270/log.h> |
| 49 | 50 | ||
| @@ -88,11 +89,7 @@ void lib3270_session_free(H3270 *h) | @@ -88,11 +89,7 @@ void lib3270_session_free(H3270 *h) | ||
| 88 | h->ssl.crl.prefer = NULL; | 89 | h->ssl.crl.prefer = NULL; |
| 89 | } | 90 | } |
| 90 | 91 | ||
| 91 | - if(h->ssl.crl.cert) | ||
| 92 | - { | ||
| 93 | - X509_CRL_free(h->ssl.crl.cert); | ||
| 94 | - h->ssl.crl.cert = NULL; | ||
| 95 | - } | 92 | + lib3270_crl_free(h); |
| 96 | #endif // SSL_ENABLE_CRL_CHECK | 93 | #endif // SSL_ENABLE_CRL_CHECK |
| 97 | 94 | ||
| 98 | // Release state change callbacks | 95 | // Release state change callbacks |
src/include/config.h.in
| @@ -72,7 +72,7 @@ | @@ -72,7 +72,7 @@ | ||
| 72 | #undef SSL_ENABLE_NOTIFICATION_WHEN_FAILED | 72 | #undef SSL_ENABLE_NOTIFICATION_WHEN_FAILED |
| 73 | 73 | ||
| 74 | /* If defined uses a hardcoded CRL path */ | 74 | /* If defined uses a hardcoded CRL path */ |
| 75 | - #undef SSL_DEFAULT_CRL_URL | 75 | + #undef SSL_CRL_URL |
| 76 | 76 | ||
| 77 | /* Optional parts. */ | 77 | /* Optional parts. */ |
| 78 | #undef X3270_DBCS | 78 | #undef X3270_DBCS |
src/include/lib3270-internals.h
| @@ -849,11 +849,11 @@ LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | @@ -849,11 +849,11 @@ LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | ||
| 849 | */ | 849 | */ |
| 850 | LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body); | 850 | LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body); |
| 851 | 851 | ||
| 852 | - #ifdef SSL_ENABLE_CRL_CHECK | ||
| 853 | - LIB3270_INTERNAL X509_CRL * lib3270_get_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *url); | ||
| 854 | - LIB3270_INTERNAL int lib3270_get_crl_from_url(H3270 *hSession, void *ssl_error, const char *url); | ||
| 855 | - LIB3270_INTERNAL int lib3270_get_crl_from_dist_points(H3270 *hSession, CRL_DIST_POINTS * dist_points, void *ssl_error); | ||
| 856 | - #endif // SSL_ENABLE_CRL_CHECK | 852 | + /** |
| 853 | + * @brief Emite popup on SSL error. | ||
| 854 | + * | ||
| 855 | + */ | ||
| 856 | + LIB3270_INTERNAL int notify_ssl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *message); | ||
| 857 | 857 | ||
| 858 | #endif | 858 | #endif |
| 859 | 859 |
src/ssl/crl.c
| @@ -28,46 +28,92 @@ | @@ -28,46 +28,92 @@ | ||
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #include <config.h> | 30 | #include <config.h> |
| 31 | + | ||
| 31 | #include <lib3270-internals.h> | 32 | #include <lib3270-internals.h> |
| 32 | -#include <lib3270.h> | ||
| 33 | #include <lib3270/log.h> | 33 | #include <lib3270/log.h> |
| 34 | +#include <lib3270/trace.h> | ||
| 35 | +#include <lib3270/toggle.h> | ||
| 34 | #include <trace_dsc.h> | 36 | #include <trace_dsc.h> |
| 35 | -#include <array.h> | ||
| 36 | 37 | ||
| 37 | -#ifdef HAVE_LIBSSL | ||
| 38 | - #include <openssl/ssl.h> | ||
| 39 | - #include <openssl/err.h> | ||
| 40 | -#endif // HAVE_LIBSSL | 38 | +#include "crl.h" |
| 41 | 39 | ||
| 42 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 40 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 43 | 41 | ||
| 44 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
| 45 | -int lib3270_get_crl_from_url(H3270 *hSession, void *ssl_error, const char *url) | ||
| 46 | -{ | ||
| 47 | - | ||
| 48 | - if(!(url && *url)) | ||
| 49 | - return -1; | 42 | +#if defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBSSL) |
| 50 | 43 | ||
| 51 | - // Invalidate current certificate. | 44 | +void lib3270_crl_free(H3270 *hSession) |
| 45 | +{ | ||
| 52 | if(hSession->ssl.crl.cert) | 46 | if(hSession->ssl.crl.cert) |
| 53 | { | 47 | { |
| 54 | - trace_ssl(hSession,"%s\n","Discarding current CRL"); | ||
| 55 | X509_CRL_free(hSession->ssl.crl.cert); | 48 | X509_CRL_free(hSession->ssl.crl.cert); |
| 56 | hSession->ssl.crl.cert = NULL; | 49 | hSession->ssl.crl.cert = NULL; |
| 57 | } | 50 | } |
| 58 | 51 | ||
| 52 | +} | ||
| 53 | + | ||
| 54 | +void lib3270_crl_free_if_expired(H3270 *hSession) | ||
| 55 | +{ | ||
| 56 | + if(!hSession->ssl.crl.cert) | ||
| 57 | + return; | ||
| 58 | + | ||
| 59 | + // https://stackoverflow.com/questions/23407376/testing-x509-certificate-expiry-date-with-c | ||
| 60 | + // X509_CRL_get_nextUpdate is deprecated in openssl 1.1.0 | ||
| 61 | + #if OPENSSL_VERSION_NUMBER < 0x10100000L | ||
| 62 | + const ASN1_TIME * next_update = X509_CRL_get_nextUpdate(hSession->ssl.crl.cert); | ||
| 63 | + #else | ||
| 64 | + const ASN1_TIME * next_update = X509_CRL_get0_nextUpdate(hSession->ssl.crl.cert); | ||
| 65 | + #endif | ||
| 66 | + | ||
| 67 | + if(X509_cmp_current_time(next_update) == 1) | ||
| 68 | + { | ||
| 69 | + int day, sec; | ||
| 70 | + if(ASN1_TIME_diff(&day, &sec, NULL, next_update)) | ||
| 71 | + { | ||
| 72 | + trace_ssl(hSession,"CRL is valid for %d day(s) and %d second(s)\n",day,sec); | ||
| 73 | + return; | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + trace_ssl(hSession,"Can't get CRL next update, discarding it\n"); | ||
| 77 | + | ||
| 78 | + } | ||
| 79 | + else | ||
| 80 | + { | ||
| 81 | + trace_ssl(hSession,"CRL is no longer valid\n"); | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + // Certificate is no longer valid, release it. | ||
| 85 | + X509_CRL_free(hSession->ssl.crl.cert); | ||
| 86 | + hSession->ssl.crl.cert = NULL; | ||
| 87 | + | ||
| 88 | +} | ||
| 89 | + | ||
| 90 | +int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url) | ||
| 91 | +{ | ||
| 92 | + if(!(url && *url)) | ||
| 93 | + return -1; | ||
| 94 | + | ||
| 95 | + lib3270_crl_free(hSession); // Just in case! | ||
| 96 | + | ||
| 59 | // | 97 | // |
| 60 | // Get the new CRL | 98 | // Get the new CRL |
| 61 | // | 99 | // |
| 62 | // https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | 100 | // https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session |
| 63 | // | 101 | // |
| 64 | - trace_ssl(hSession,"Getting new CRL from %s\n",url); | 102 | + trace_ssl(hSession,"Getting CRL from %s\n",url); |
| 65 | 103 | ||
| 66 | - hSession->ssl.crl.cert = lib3270_get_crl(hSession,(SSL_ERROR_MESSAGE *) ssl_error,url); | 104 | + hSession->ssl.crl.cert = lib3270_download_crl(hSession,(SSL_ERROR_MESSAGE *) ssl_error, url); |
| 67 | 105 | ||
| 68 | if(hSession->ssl.crl.cert) | 106 | if(hSession->ssl.crl.cert) |
| 69 | { | 107 | { |
| 70 | - // Got CRL, add it to ssl store | 108 | + // Got CRL! |
| 109 | + | ||
| 110 | + // Update URL | ||
| 111 | + if(hSession->ssl.crl.url) | ||
| 112 | + lib3270_free(hSession->ssl.crl.url); | ||
| 113 | + | ||
| 114 | + hSession->ssl.crl.url = lib3270_strdup(url); | ||
| 115 | + | ||
| 116 | + // Add it to ssl store | ||
| 71 | if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | 117 | if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) |
| 72 | { | 118 | { |
| 73 | lib3270_autoptr(char) text = lib3270_get_ssl_crl_text(hSession); | 119 | lib3270_autoptr(char) text = lib3270_get_ssl_crl_text(hSession); |
| @@ -94,95 +140,5 @@ int lib3270_get_crl_from_url(H3270 *hSession, void *ssl_error, const char *url) | @@ -94,95 +140,5 @@ int lib3270_get_crl_from_url(H3270 *hSession, void *ssl_error, const char *url) | ||
| 94 | return -1; | 140 | return -1; |
| 95 | 141 | ||
| 96 | } | 142 | } |
| 97 | -#endif // SSL_ENABLE_CRL_CHECK | ||
| 98 | - | ||
| 99 | -#if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | ||
| 100 | -int lib3270_get_crl_from_dist_points(H3270 *hSession, CRL_DIST_POINTS * dist_points, void *ssl_error) | ||
| 101 | -{ | ||
| 102 | - size_t ix; | ||
| 103 | - int i, gtype; | ||
| 104 | - lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_string_array_new(); | ||
| 105 | - | ||
| 106 | - // https://nougat.cablelabs.com/DLNA-RUI/openssl/commit/57912ed329f870b237f2fd9f2de8dec3477d1729 | ||
| 107 | - | ||
| 108 | - for(ix = 0; ix < (size_t) sk_DIST_POINT_num(dist_points); ix++) { | ||
| 109 | 143 | ||
| 110 | - DIST_POINT *dp = sk_DIST_POINT_value(dist_points, ix); | ||
| 111 | - | ||
| 112 | - if(!dp->distpoint || dp->distpoint->type != 0) | ||
| 113 | - continue; | ||
| 114 | - | ||
| 115 | - GENERAL_NAMES *gens = dp->distpoint->name.fullname; | ||
| 116 | - | ||
| 117 | - for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) | ||
| 118 | - { | ||
| 119 | - GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); | ||
| 120 | - ASN1_STRING *uri = GENERAL_NAME_get0_value(gen, >ype); | ||
| 121 | - if(uri) | ||
| 122 | - { | ||
| 123 | -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) // OpenSSL 1.1.0+ | ||
| 124 | - const unsigned char * data = ASN1_STRING_get0_data(uri); | ||
| 125 | -#else | ||
| 126 | - const unsigned char * data = ASN1_STRING_data(uri); // ASN1_STRING_get0_data(uri); | ||
| 127 | -#endif // OpenSSL 1.1.0+ | ||
| 128 | - if(data) | ||
| 129 | - { | ||
| 130 | - lib3270_string_array_append(uris,(char *) data); | ||
| 131 | - } | ||
| 132 | - } | ||
| 133 | - | ||
| 134 | - } | ||
| 135 | - | ||
| 136 | - } | ||
| 137 | - | ||
| 138 | -#ifdef DEBUG | ||
| 139 | - { | ||
| 140 | - for(ix = 0; ix < uris->length; ix++) | ||
| 141 | - { | ||
| 142 | - debug("%u: %s", (unsigned int) ix, uris->str[ix]); | ||
| 143 | - } | ||
| 144 | - } | ||
| 145 | -#endif // DEBUG | ||
| 146 | - | ||
| 147 | - if(hSession->ssl.crl.url) | ||
| 148 | - { | ||
| 149 | - // Check if we already have the URL. | ||
| 150 | - if(!strcmp(hSession->ssl.crl.url,uris->str[ix])) | ||
| 151 | - { | ||
| 152 | - trace_ssl(hSession,"Keeping CRL from %s\n",hSession->ssl.crl.url); | ||
| 153 | - return 0; | ||
| 154 | - } | ||
| 155 | - | ||
| 156 | - // The URL is invalid or not to this cert, remove it! | ||
| 157 | - lib3270_free(hSession->ssl.crl.url); | ||
| 158 | - hSession->ssl.crl.url = NULL; | ||
| 159 | - } | ||
| 160 | - | ||
| 161 | - if(hSession->ssl.crl.prefer && *hSession->ssl.crl.prefer) | ||
| 162 | - { | ||
| 163 | - size_t length = strlen(hSession->ssl.crl.prefer); | ||
| 164 | - | ||
| 165 | - for(ix = 0; ix < uris->length; ix++) | ||
| 166 | - { | ||
| 167 | - if(!strncmp(uris->str[ix],hSession->ssl.crl.prefer,length)) | ||
| 168 | - { | ||
| 169 | - trace_ssl(hSession,"Trying preferred URL %s\n",uris->str[ix]); | ||
| 170 | - if(lib3270_get_crl_from_url(hSession, ssl_error, uris->str[ix]) == 0) | ||
| 171 | - return 0; | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - } | ||
| 175 | - | ||
| 176 | - } | ||
| 177 | - | ||
| 178 | - // Can't load, try all of them. | ||
| 179 | - for(ix = 0; ix < uris->length; ix++) | ||
| 180 | - { | ||
| 181 | - trace_ssl(hSession,"Trying CRL from %s\n",uris->str[ix]); | ||
| 182 | - if(lib3270_get_crl_from_url(hSession, ssl_error, uris->str[ix]) == 0) | ||
| 183 | - return 0; | ||
| 184 | - } | ||
| 185 | - | ||
| 186 | - return -1; | ||
| 187 | -} | ||
| 188 | -#endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK | 144 | +#endif // SSL_ENABLE_CRL_CHECK && HAVE_LIBSSL |
| @@ -0,0 +1,60 @@ | @@ -0,0 +1,60 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software G3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral ', conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como private.h e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +#ifdef WIN32 | ||
| 31 | + #include <winsock2.h> | ||
| 32 | + #include <windows.h> | ||
| 33 | +#endif // WIN32 | ||
| 34 | + | ||
| 35 | +#include <config.h> /* autoconf settings */ | ||
| 36 | +#include <lib3270.h> /* lib3270 API calls and defs */ | ||
| 37 | + | ||
| 38 | +#if defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBSSL) | ||
| 39 | + | ||
| 40 | + #include <openssl/ssl.h> | ||
| 41 | + #include <openssl/err.h> | ||
| 42 | + | ||
| 43 | + /// @brief Unconditional release of the session CRL. | ||
| 44 | + LIB3270_INTERNAL void lib3270_crl_free(H3270 *hSession); | ||
| 45 | + | ||
| 46 | + /// @brief Release CRL if expired. | ||
| 47 | + LIB3270_INTERNAL void lib3270_crl_free_if_expired(H3270 *hSession); | ||
| 48 | + | ||
| 49 | + /// @brief Load CRL from URL. | ||
| 50 | + LIB3270_INTERNAL int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url); | ||
| 51 | + | ||
| 52 | + | ||
| 53 | + LIB3270_INTERNAL X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *url); | ||
| 54 | +// LIB3270_INTERNAL int lib3270_get_crl_from_url(H3270 *hSession, void *ssl_error, const char *url); | ||
| 55 | +// LIB3270_INTERNAL int lib3270_get_crl_from_dist_points(H3270 *hSession, CRL_DIST_POINTS * dist_points, void *ssl_error); | ||
| 56 | + | ||
| 57 | +#endif // SSL_ENABLE_CRL_CHECK && HAVE_LIBSSL | ||
| 58 | + | ||
| 59 | + | ||
| 60 | + |
src/ssl/linux/getcrl.c
| @@ -45,7 +45,7 @@ static inline void lib3270_autoptr_cleanup_FILE(FILE **file) | @@ -45,7 +45,7 @@ static inline void lib3270_autoptr_cleanup_FILE(FILE **file) | ||
| 45 | fclose(*file); | 45 | fclose(*file); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | -LIB3270_INTERNAL X509_CRL * lib3270_get_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | 48 | +LIB3270_INTERNAL X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) |
| 49 | { | 49 | { |
| 50 | X509_CRL * x509_crl = NULL; | 50 | X509_CRL * x509_crl = NULL; |
| 51 | 51 |
src/ssl/linux/init.c
| @@ -106,6 +106,7 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -106,6 +106,7 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 106 | X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | 106 | X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); |
| 107 | X509_STORE_set1_param(store, param); | 107 | X509_STORE_set1_param(store, param); |
| 108 | X509_VERIFY_PARAM_free(param); | 108 | X509_VERIFY_PARAM_free(param); |
| 109 | + | ||
| 109 | trace_ssl(hSession,"CRL CHECK was enabled\n"); | 110 | trace_ssl(hSession,"CRL CHECK was enabled\n"); |
| 110 | 111 | ||
| 111 | #endif // SSL_ENABLE_CRL_CHECK | 112 | #endif // SSL_ENABLE_CRL_CHECK |
src/ssl/negotiate.c
| @@ -48,6 +48,8 @@ | @@ -48,6 +48,8 @@ | ||
| 48 | #define SSL_ST_OK 3 | 48 | #define SSL_ST_OK 3 |
| 49 | #endif // !SSL_ST_OK | 49 | #endif // !SSL_ST_OK |
| 50 | 50 | ||
| 51 | + #include "crl.h" | ||
| 52 | + | ||
| 51 | #endif | 53 | #endif |
| 52 | 54 | ||
| 53 | #include <errno.h> | 55 | #include <errno.h> |
| @@ -133,7 +135,7 @@ static int background_ssl_init(H3270 *hSession, void *message) | @@ -133,7 +135,7 @@ static int background_ssl_init(H3270 *hSession, void *message) | ||
| 133 | return 0; | 135 | return 0; |
| 134 | } | 136 | } |
| 135 | 137 | ||
| 136 | -#if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | 138 | +#if !defined(SSL_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) |
| 137 | int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | 139 | int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) |
| 138 | { | 140 | { |
| 139 | debug("%s(%d)",__FUNCTION__,ok); | 141 | debug("%s(%d)",__FUNCTION__,ok); |
| @@ -152,8 +154,26 @@ int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | @@ -152,8 +154,26 @@ int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | ||
| 152 | */ | 154 | */ |
| 153 | return ok; | 155 | return ok; |
| 154 | } | 156 | } |
| 155 | -#endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK | 157 | +#endif // !SSL_CRL_URL && SSL_ENABLE_CRL_CHECK |
| 156 | 158 | ||
| 159 | +static int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | ||
| 160 | +{ | ||
| 161 | + debug("%s(%d)",__FUNCTION__,ok); | ||
| 162 | + | ||
| 163 | +/* | ||
| 164 | + 55 { | ||
| 165 | + 56 if (!ok) { | ||
| 166 | + 57 Category::getInstance("OpenSSL").error( | ||
| 167 | + 58 "path validation failure at depth(%d): %s", | ||
| 168 | + 59 X509_STORE_CTX_get_error_depth(ctx), | ||
| 169 | + 60 X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx)) | ||
| 170 | + 61 ); | ||
| 171 | + 62 } | ||
| 172 | + 63 return ok; | ||
| 173 | + 64 } | ||
| 174 | +*/ | ||
| 175 | + return ok; | ||
| 176 | +} | ||
| 157 | 177 | ||
| 158 | static int background_ssl_negotiation(H3270 *hSession, void *message) | 178 | static int background_ssl_negotiation(H3270 *hSession, void *message) |
| 159 | { | 179 | { |
| @@ -234,7 +254,21 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) | @@ -234,7 +254,21 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) | ||
| 234 | 254 | ||
| 235 | hSession->cbk.set_peer_certificate(peer); | 255 | hSession->cbk.set_peer_certificate(peer); |
| 236 | 256 | ||
| 237 | -#if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | 257 | +#ifdef SSL_CRL_URL |
| 258 | + | ||
| 259 | + // Load CRL from pre-defined URL | ||
| 260 | + if(lib3270_crl_new_from_url(hSession, message, SSL_CRL_URL)) | ||
| 261 | + return EACCES; | ||
| 262 | + | ||
| 263 | +#endif // SSL_CRL_URL | ||
| 264 | + | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + /* | ||
| 268 | + if(peer) | ||
| 269 | + { | ||
| 270 | + | ||
| 271 | +#if !defined(SSL_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | ||
| 238 | // | 272 | // |
| 239 | // No default CRL, try to download from the peer | 273 | // No default CRL, try to download from the peer |
| 240 | // | 274 | // |
| @@ -274,17 +308,60 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) | @@ -274,17 +308,60 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) | ||
| 274 | // No CRL download, use the standard verification. | 308 | // No CRL download, use the standard verification. |
| 275 | rv = SSL_get_verify_result(hSession->ssl.con); | 309 | rv = SSL_get_verify_result(hSession->ssl.con); |
| 276 | 310 | ||
| 277 | -#endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK | 311 | +#endif // !SSL_CRL_URL && SSL_ENABLE_CRL_CHECK |
| 278 | 312 | ||
| 279 | } | 313 | } |
| 280 | else | 314 | else |
| 281 | { | 315 | { |
| 282 | rv = SSL_get_verify_result(hSession->ssl.con); | 316 | rv = SSL_get_verify_result(hSession->ssl.con); |
| 283 | } | 317 | } |
| 318 | + */ | ||
| 319 | + | ||
| 320 | + if(SSL_get_verify_result(hSession->ssl.con) == X509_V_ERR_UNABLE_TO_GET_CRL && hSession->ssl.crl.cert) | ||
| 321 | + { | ||
| 322 | + // Verify CRL | ||
| 323 | + // | ||
| 324 | + // References: | ||
| 325 | + // | ||
| 326 | + // http://www.zedwood.com/article/cpp-check-crl-for-revocation | ||
| 327 | + // | ||
| 284 | 328 | ||
| 329 | + trace_ssl(hSession,"Doing CRL check using %s\n",hSession->ssl.crl.url); | ||
| 285 | 330 | ||
| 286 | - // Validate certificate. | 331 | + // Got CRL, verify it! |
| 332 | + // Reference: https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | ||
| 333 | + X509_STORE_CTX *csc = X509_STORE_CTX_new(); | ||
| 334 | + X509_STORE_CTX_set_verify_cb(csc, x509_store_ctx_error_callback); | ||
| 335 | + X509_STORE_CTX_init(csc, SSL_CTX_get_cert_store(ssl_ctx), peer, NULL); | ||
| 336 | + | ||
| 337 | +/* | ||
| 338 | +#ifdef SSL_ENABLE_CRL_CHECK | ||
| 339 | + // Enable CRL check | ||
| 340 | + X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | ||
| 341 | + X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | ||
| 342 | + X509_STORE_CTX_set0_param(csc, param); | ||
| 343 | +#endif // SSL_ENABLE_CRL_CHECK | ||
| 344 | +*/ | ||
| 345 | + | ||
| 346 | + if(X509_verify_cert(csc) != 1) | ||
| 347 | + rv = X509_STORE_CTX_get_error(csc); | ||
| 348 | + else | ||
| 349 | + rv = X509_V_OK; | ||
| 350 | + | ||
| 351 | + debug("CRL Check response was %d", rv); | ||
| 352 | + | ||
| 353 | + SSL_set_verify_result(hSession->ssl.con, rv); | ||
| 354 | + | ||
| 355 | + X509_STORE_CTX_free(csc); | ||
| 287 | 356 | ||
| 357 | +#ifdef SSL_ENABLE_CRL_CHECK | ||
| 358 | +// X509_VERIFY_PARAM_free(param); | ||
| 359 | +#endif // SSL_ENABLE_CRL_CHECK | ||
| 360 | + | ||
| 361 | + } | ||
| 362 | + | ||
| 363 | + // Check validation state. | ||
| 364 | + rv = SSL_get_verify_result(hSession->ssl.con); | ||
| 288 | debug("SSL Verify result was %d", rv); | 365 | debug("SSL Verify result was %d", rv); |
| 289 | const struct ssl_status_msg * msg = ssl_get_status_from_error_code((long) rv); | 366 | const struct ssl_status_msg * msg = ssl_get_status_from_error_code((long) rv); |
| 290 | 367 | ||
| @@ -526,45 +603,3 @@ void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | @@ -526,45 +603,3 @@ void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | ||
| 526 | 603 | ||
| 527 | #endif /*]*/ | 604 | #endif /*]*/ |
| 528 | 605 | ||
| 529 | -int popup_ssl_error(H3270 GNUC_UNUSED(*hSession), int rc, const char GNUC_UNUSED(*title), const char *summary, const char *body) | ||
| 530 | -{ | ||
| 531 | -#ifdef _WIN32 | ||
| 532 | - | ||
| 533 | - lib3270_autoptr(char) rcMessage = lib3270_strdup_printf("The error code was %d",rc); | ||
| 534 | - | ||
| 535 | - const char *outMsg[] = { | ||
| 536 | - title, | ||
| 537 | - summary, | ||
| 538 | - (body ? body : ""), | ||
| 539 | - rcMessage | ||
| 540 | - }; | ||
| 541 | - | ||
| 542 | - ReportEvent( | ||
| 543 | - hEventLog, | ||
| 544 | - EVENTLOG_ERROR_TYPE, | ||
| 545 | - 1, | ||
| 546 | - 0, | ||
| 547 | - NULL, | ||
| 548 | - (sizeof(outMsg)/sizeof(outMsg[0])), | ||
| 549 | - 0, | ||
| 550 | - outMsg, | ||
| 551 | - NULL | ||
| 552 | - ); | ||
| 553 | - | ||
| 554 | -#else | ||
| 555 | - | ||
| 556 | - lib3270_write_log(hSession, "SSL", "%s %s (rc=%d)", summary, (body ? body : ""), rc); | ||
| 557 | - | ||
| 558 | -#endif // _WIN32 | ||
| 559 | - | ||
| 560 | -#ifdef SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
| 561 | - | ||
| 562 | - return hSession->cbk.popup_ssl_error(hSession,rc,title,summary,body); | ||
| 563 | - | ||
| 564 | -#else | ||
| 565 | - | ||
| 566 | - return 0; | ||
| 567 | - | ||
| 568 | -#endif // SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
| 569 | - | ||
| 570 | -} |
| @@ -0,0 +1,132 @@ | @@ -0,0 +1,132 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + * | ||
| 29 | + * References: | ||
| 30 | + * | ||
| 31 | + * http://www.openssl.org/docs/ssl/ | ||
| 32 | + * | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | + | ||
| 36 | +#include <config.h> | ||
| 37 | +#include <lib3270-internals.h> | ||
| 38 | +#include <lib3270/log.h> | ||
| 39 | + | ||
| 40 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
| 41 | + | ||
| 42 | +#if defined(HAVE_LIBSSL) | ||
| 43 | + | ||
| 44 | +#include <openssl/err.h> | ||
| 45 | + | ||
| 46 | +int popup_ssl_error(H3270 GNUC_UNUSED(*hSession), int rc, const char GNUC_UNUSED(*title), const char *summary, const char *body) | ||
| 47 | +{ | ||
| 48 | +#ifdef _WIN32 | ||
| 49 | + | ||
| 50 | + lib3270_autoptr(char) rcMessage = lib3270_strdup_printf("The error code was %d",rc); | ||
| 51 | + | ||
| 52 | + const char *outMsg[] = { | ||
| 53 | + title, | ||
| 54 | + summary, | ||
| 55 | + (body ? body : ""), | ||
| 56 | + rcMessage | ||
| 57 | + }; | ||
| 58 | + | ||
| 59 | + ReportEvent( | ||
| 60 | + hEventLog, | ||
| 61 | + EVENTLOG_ERROR_TYPE, | ||
| 62 | + 1, | ||
| 63 | + 0, | ||
| 64 | + NULL, | ||
| 65 | + (sizeof(outMsg)/sizeof(outMsg[0])), | ||
| 66 | + 0, | ||
| 67 | + outMsg, | ||
| 68 | + NULL | ||
| 69 | + ); | ||
| 70 | + | ||
| 71 | +#else | ||
| 72 | + | ||
| 73 | + lib3270_write_log(hSession, "SSL", "%s %s (rc=%d)", summary, (body ? body : ""), rc); | ||
| 74 | + | ||
| 75 | +#endif // _WIN32 | ||
| 76 | + | ||
| 77 | +#ifdef SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
| 78 | + | ||
| 79 | + return hSession->cbk.popup_ssl_error(hSession,rc,title,summary,body); | ||
| 80 | + | ||
| 81 | +#else | ||
| 82 | + | ||
| 83 | + return 0; | ||
| 84 | + | ||
| 85 | +#endif // SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
| 86 | +} | ||
| 87 | + | ||
| 88 | +int notify_ssl_error(H3270 *hSession, int rc, const SSL_ERROR_MESSAGE *message) | ||
| 89 | +{ | ||
| 90 | + lib3270_write_log( | ||
| 91 | + hSession, | ||
| 92 | + "SSL-CRL-GET", | ||
| 93 | + "CRL GET error: %s (rc=%d ssl_error=%d)", | ||
| 94 | + message->title, | ||
| 95 | + rc, | ||
| 96 | + message->error | ||
| 97 | + ); | ||
| 98 | + | ||
| 99 | + if(message->description) | ||
| 100 | + { | ||
| 101 | + if(popup_ssl_error(hSession,rc,message->title,message->text,message->description)) | ||
| 102 | + return rc; | ||
| 103 | + } | ||
| 104 | +#ifdef _WIN32 | ||
| 105 | + else if(message->lasterror) | ||
| 106 | + { | ||
| 107 | + lib3270_autoptr(char) windows_error = lib3270_win32_translate_error_code(message->lasterror); | ||
| 108 | + lib3270_autoptr(char) formatted_error = lib3270_strdup_printf(_( "Windows error was \"%s\" (%u)" ), windows_error,(unsigned int) message->lasterror); | ||
| 109 | + | ||
| 110 | + if(popup_ssl_error(hSession,rc,message->title,message->text,formatted_error)) | ||
| 111 | + return rc; | ||
| 112 | + | ||
| 113 | + } | ||
| 114 | +#endif // WIN32 | ||
| 115 | + else if(message->error) | ||
| 116 | + { | ||
| 117 | + lib3270_autoptr(char) formatted_error = lib3270_strdup_printf(_( "%s (SSL error %d)" ),ERR_reason_error_string(message->error),message->error); | ||
| 118 | + lib3270_write_log(hSession,"SSL-CRL-GET","%s",formatted_error); | ||
| 119 | + | ||
| 120 | + if(popup_ssl_error(hSession,rc,message->title,message->text,formatted_error)) | ||
| 121 | + return rc; | ||
| 122 | + } | ||
| 123 | + else | ||
| 124 | + { | ||
| 125 | + if(popup_ssl_error(hSession,rc,message->title,message->text,"")) | ||
| 126 | + return rc; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + return 0; | ||
| 130 | +} | ||
| 131 | + | ||
| 132 | +#endif // defined(HAVE_LIBSSL) |
src/ssl/properties.c
| @@ -124,11 +124,11 @@ LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(const H3270 *hSessio | @@ -124,11 +124,11 @@ LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(const H3270 *hSessio | ||
| 124 | if(hSession->ssl.crl.url) | 124 | if(hSession->ssl.crl.url) |
| 125 | return hSession->ssl.crl.url; | 125 | return hSession->ssl.crl.url; |
| 126 | 126 | ||
| 127 | -#ifdef SSL_DEFAULT_CRL_URL | ||
| 128 | - return SSL_DEFAULT_CRL_URL; | 127 | +#ifdef SSL_CRL_URL |
| 128 | + return SSL_CRL_URL; | ||
| 129 | #else | 129 | #else |
| 130 | return getenv("LIB3270_DEFAULT_CRL"); | 130 | return getenv("LIB3270_DEFAULT_CRL"); |
| 131 | -#endif // SSL_DEFAULT_CRL_URL | 131 | +#endif // SSL_CRL_URL |
| 132 | 132 | ||
| 133 | #else | 133 | #else |
| 134 | errno = ENOTSUP; | 134 | errno = ENOTSUP; |