Commit 889dfbb24a4dfb839bb3d1d3392fcc0007a426e6
1 parent
7a87d265
Exists in
master
and in
3 other branches
Implementing openssl network module.
Showing
11 changed files
with
373 additions
and
232 deletions
Show diff stats
lib3270.cbp
| @@ -310,6 +310,9 @@ | @@ -310,6 +310,9 @@ | ||
| 310 | <Unit filename="src/network_modules/linux/connect.c"> | 310 | <Unit filename="src/network_modules/linux/connect.c"> |
| 311 | <Option compilerVar="CC" /> | 311 | <Option compilerVar="CC" /> |
| 312 | </Unit> | 312 | </Unit> |
| 313 | + <Unit filename="src/network_modules/openssl.c"> | ||
| 314 | + <Option compilerVar="CC" /> | ||
| 315 | + </Unit> | ||
| 313 | <Unit filename="src/network_modules/private.h" /> | 316 | <Unit filename="src/network_modules/private.h" /> |
| 314 | <Unit filename="src/network_modules/unsecure.c"> | 317 | <Unit filename="src/network_modules/unsecure.c"> |
| 315 | <Option compilerVar="CC" /> | 318 | <Option compilerVar="CC" /> |
src/core/connect.c
| @@ -54,23 +54,6 @@ | @@ -54,23 +54,6 @@ | ||
| 54 | 54 | ||
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | - | ||
| 58 | -#if defined(HAVE_LIBSSL) | ||
| 59 | - | ||
| 60 | - static int background_ssl_init(H3270 *hSession, void *ssl_error) | ||
| 61 | - { | ||
| 62 | - if(ssl_ctx_init(hSession, (SSL_ERROR_MESSAGE *) ssl_error)) | ||
| 63 | - return -1; | ||
| 64 | - | ||
| 65 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
| 66 | - lib3270_crl_free_if_expired(hSession); | ||
| 67 | -#endif // defined(SSL_ENABLE_CRL_CHECK) | ||
| 68 | - | ||
| 69 | - return 0; | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | -#endif // HAVE_LIBSSL | ||
| 73 | - | ||
| 74 | /* | 57 | /* |
| 75 | void connection_failed(H3270 *hSession, const char *message) | 58 | void connection_failed(H3270 *hSession, const char *message) |
| 76 | { | 59 | { |
| @@ -141,28 +124,13 @@ | @@ -141,28 +124,13 @@ | ||
| 141 | return errno == 0 ? -1 : errno; | 124 | return errno == 0 ? -1 : errno; |
| 142 | } | 125 | } |
| 143 | 126 | ||
| 144 | -#if defined(HAVE_LIBSSL) | ||
| 145 | - debug("%s: TLS/SSL is %s",__FUNCTION__,hSession->ssl.enabled ? "ENABLED" : "DISABLED") | ||
| 146 | - trace_dsn(hSession,"TLS/SSL is %s\n", hSession->ssl.enabled ? "enabled" : "disabled" ); | ||
| 147 | - | ||
| 148 | - if(hSession->ssl.enabled) | ||
| 149 | - { | ||
| 150 | - SSL_ERROR_MESSAGE ssl_error; | ||
| 151 | - memset(&ssl_error,0,sizeof(ssl_error)); | 127 | +// debug("%s: TLS/SSL is %s",__FUNCTION__,hSession->ssl.enabled ? "ENABLED" : "DISABLED") |
| 128 | +// trace_dsn(hSession,"TLS/SSL is %s\n", hSession->ssl.enabled ? "enabled" : "disabled" ); | ||
| 152 | 129 | ||
| 153 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | ||
| 154 | - int rc = lib3270_run_task(hSession, background_ssl_init, &ssl_error); | ||
| 155 | - | ||
| 156 | - if(rc && popup_ssl_error(hSession, rc, &ssl_error)) | ||
| 157 | - return errno = rc; | ||
| 158 | - | ||
| 159 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
| 160 | - hSession->ssl.host = 0; | ||
| 161 | - } | ||
| 162 | -#endif // HAVE_LIBSSL | 130 | + set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
| 131 | + // hSession->ssl.host = 0; | ||
| 163 | 132 | ||
| 164 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | 133 | snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); |
| 165 | - | ||
| 166 | lib3270_write_event_trace(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); | 134 | lib3270_write_event_trace(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); |
| 167 | 135 | ||
| 168 | hSession->ever_3270 = False; | 136 | hSession->ever_3270 = False; |
| @@ -175,32 +143,34 @@ | @@ -175,32 +143,34 @@ | ||
| 175 | { | 143 | { |
| 176 | int rc = 0; | 144 | int rc = 0; |
| 177 | 145 | ||
| 178 | - if(hSession->network.module->start_tls,required) | ||
| 179 | - { | ||
| 180 | - LIB3270_NETWORK_STATE state; | ||
| 181 | - memset(&state,0,sizeof(state)); | 146 | + hSession->ssl.required = (required ? 1 : 0); |
| 182 | 147 | ||
| 183 | - non_blocking(hSession,False); | 148 | + LIB3270_NETWORK_STATE state; |
| 149 | + memset(&state,0,sizeof(state)); | ||
| 184 | 150 | ||
| 185 | - rc = lib3270_run_task( | ||
| 186 | - hSession, | ||
| 187 | - (int(*)(H3270 *h, void *)) hSession->network.module->start_tls, | ||
| 188 | - &state | ||
| 189 | - ); | 151 | + non_blocking(hSession,False); |
| 190 | 152 | ||
| 191 | - if(state.popup) { | ||
| 192 | - if(lib3270_popup(hSession,state.popup,1)) { | ||
| 193 | - lib3270_disconnect(hSession); | ||
| 194 | - return rc; | ||
| 195 | - } | 153 | + rc = lib3270_run_task( |
| 154 | + hSession, | ||
| 155 | + (int(*)(H3270 *h, void *)) hSession->network.module->start_tls, | ||
| 156 | + &state | ||
| 157 | + ); | ||
| 196 | 158 | ||
| 197 | - // User has selected "continue", ignore error. | ||
| 198 | - return 0; | ||
| 199 | - } | 159 | + if(required && rc) { |
| 160 | + | ||
| 161 | + // SSL is required and TLS/SSL has failed, abort. | ||
| 162 | + | ||
| 163 | + lib3270_popup(hSession,state.popup,0); | ||
| 164 | + lib3270_disconnect(hSession); | ||
| 165 | + return rc; | ||
| 200 | 166 | ||
| 201 | } | 167 | } |
| 202 | 168 | ||
| 203 | - return rc; | 169 | + // Not required or success |
| 170 | + | ||
| 171 | + non_blocking(hSession,True); | ||
| 172 | + | ||
| 173 | + return 0; | ||
| 204 | } | 174 | } |
| 205 | 175 | ||
| 206 | 176 |
src/core/telnet.c
| @@ -707,13 +707,13 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED | @@ -707,13 +707,13 @@ void net_input(H3270 *hSession, int GNUC_UNUSED(fd), LIB3270_IO_FLAG GNUC_UNUSED | ||
| 707 | } | 707 | } |
| 708 | else if (nr == 0) | 708 | else if (nr == 0) |
| 709 | { | 709 | { |
| 710 | - /* Host disconnected. */ | 710 | + // Host disconnected. |
| 711 | trace_dsn(hSession,"RCVD disconnect\n"); | 711 | trace_dsn(hSession,"RCVD disconnect\n"); |
| 712 | host_disconnect(hSession,False); | 712 | host_disconnect(hSession,False); |
| 713 | return; | 713 | return; |
| 714 | } | 714 | } |
| 715 | 715 | ||
| 716 | - /* Process the data. */ | 716 | + // Process the data. |
| 717 | if (HALF_CONNECTED) | 717 | if (HALF_CONNECTED) |
| 718 | { | 718 | { |
| 719 | if (non_blocking(hSession,False) < 0) | 719 | if (non_blocking(hSession,False) < 0) |
src/include/internals.h
| @@ -666,34 +666,6 @@ struct _h3270 | @@ -666,34 +666,6 @@ struct _h3270 | ||
| 666 | void * except; | 666 | void * except; |
| 667 | } xio; | 667 | } xio; |
| 668 | 668 | ||
| 669 | -#ifdef HAVE_LIBSSL | ||
| 670 | - /// @brief SSL Data. | ||
| 671 | - struct | ||
| 672 | - { | ||
| 673 | - char enabled; | ||
| 674 | - char host; | ||
| 675 | - LIB3270_SSL_STATE state; | ||
| 676 | - unsigned long error; | ||
| 677 | - | ||
| 678 | - struct | ||
| 679 | - { | ||
| 680 | - int min_version; ///< @brief The minimum supported protocol version. | ||
| 681 | - int max_version; ///< @brief The maximum supported protocol version. | ||
| 682 | - } protocol; | ||
| 683 | - | ||
| 684 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
| 685 | - struct | ||
| 686 | - { | ||
| 687 | - char download; ///< @brief Non zero to download CRL. | ||
| 688 | - char * prefer; ///< @brief Prefered protocol for CRL. | ||
| 689 | - char * url; ///< @brief URL for CRL download. | ||
| 690 | - X509_CRL * cert; ///< @brief Loaded CRL (can be null). | ||
| 691 | - } crl; | ||
| 692 | -#endif // SSL_ENABLE_CRL_CHECK | ||
| 693 | - SSL * con; | ||
| 694 | - } ssl; | ||
| 695 | -#endif // HAVE_LIBSSL | ||
| 696 | - | ||
| 697 | struct lib3270_linked_list_head timeouts; | 669 | struct lib3270_linked_list_head timeouts; |
| 698 | 670 | ||
| 699 | struct | 671 | struct |
| @@ -709,6 +681,13 @@ struct _h3270 | @@ -709,6 +681,13 @@ struct _h3270 | ||
| 709 | void *userdata; | 681 | void *userdata; |
| 710 | } trace; | 682 | } trace; |
| 711 | 683 | ||
| 684 | + struct | ||
| 685 | + { | ||
| 686 | + int error; ///< @brief OpenSSL error. | ||
| 687 | + unsigned char required; ///< @brief Non zero if SSL is required. | ||
| 688 | + LIB3270_SSL_STATE state; | ||
| 689 | + } ssl; | ||
| 690 | + | ||
| 712 | /// @brief Event Listeners. | 691 | /// @brief Event Listeners. |
| 713 | struct | 692 | struct |
| 714 | { | 693 | { |
| @@ -795,6 +774,9 @@ LIB3270_INTERNAL int check_offline_session(const H3270 *hSession); | @@ -795,6 +774,9 @@ LIB3270_INTERNAL int check_offline_session(const H3270 *hSession); | ||
| 795 | 774 | ||
| 796 | LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | 775 | LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); |
| 797 | 776 | ||
| 777 | +LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | ||
| 778 | + | ||
| 779 | +/* | ||
| 798 | #if defined(HAVE_LIBSSL) | 780 | #if defined(HAVE_LIBSSL) |
| 799 | 781 | ||
| 800 | typedef struct ssl_status_msg | 782 | typedef struct ssl_status_msg |
| @@ -820,44 +802,25 @@ LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | @@ -820,44 +802,25 @@ LIB3270_INTERNAL int non_blocking(H3270 *session, Boolean on); | ||
| 820 | LIB3270_INTERNAL int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE *message); | 802 | LIB3270_INTERNAL int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE *message); |
| 821 | LIB3270_INTERNAL int ssl_init(H3270 *session); | 803 | LIB3270_INTERNAL int ssl_init(H3270 *session); |
| 822 | LIB3270_INTERNAL int ssl_negotiate(H3270 *hSession); | 804 | LIB3270_INTERNAL int ssl_negotiate(H3270 *hSession); |
| 823 | - LIB3270_INTERNAL void set_ssl_state(H3270 *session, LIB3270_SSL_STATE state); | ||
| 824 | LIB3270_INTERNAL const struct ssl_status_msg * ssl_get_status_from_error_code(long id); | 805 | LIB3270_INTERNAL const struct ssl_status_msg * ssl_get_status_from_error_code(long id); |
| 825 | 806 | ||
| 826 | 807 | ||
| 827 | - #if OPENSSL_VERSION_NUMBER >= 0x00907000L | ||
| 828 | - #define INFO_CONST const | ||
| 829 | - #else | ||
| 830 | - #define INFO_CONST | ||
| 831 | - #endif | ||
| 832 | 808 | ||
| 833 | LIB3270_INTERNAL void ssl_info_callback(INFO_CONST SSL *s, int where, int ret); | 809 | LIB3270_INTERNAL void ssl_info_callback(INFO_CONST SSL *s, int where, int ret); |
| 834 | 810 | ||
| 835 | - /** | ||
| 836 | - * @brief Global SSL_CTX object as framework to establish TLS/SSL or DTLS enabled connections. | ||
| 837 | - * | ||
| 838 | - */ | 811 | + // @brief Global SSL_CTX object as framework to establish TLS/SSL or DTLS enabled connections. |
| 839 | LIB3270_INTERNAL SSL_CTX * ssl_ctx; | 812 | LIB3270_INTERNAL SSL_CTX * ssl_ctx; |
| 840 | 813 | ||
| 841 | - /** | ||
| 842 | - * @brief Index of h3270 handle in SSL session. | ||
| 843 | - * | ||
| 844 | - */ | ||
| 845 | - LIB3270_INTERNAL int ssl_3270_ex_index; | ||
| 846 | 814 | ||
| 847 | - /** | ||
| 848 | - * @brief Emit popup on ssl error. | ||
| 849 | - * | ||
| 850 | - */ | 815 | + |
| 816 | + /// @brief Emit popup on ssl error. | ||
| 851 | LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const SSL_ERROR_MESSAGE *message); | 817 | LIB3270_INTERNAL int popup_ssl_error(H3270 *session, int rc, const SSL_ERROR_MESSAGE *message); |
| 852 | 818 | ||
| 853 | - /** | ||
| 854 | - * @brief Emits SSL popup. | ||
| 855 | - * | ||
| 856 | - * | ||
| 857 | - */ | 819 | + /// @brief Emits SSL popup. |
| 858 | LIB3270_INTERNAL void ssl_popup_message(H3270 *hSession, const SSL_ERROR_MESSAGE *msg); | 820 | LIB3270_INTERNAL void ssl_popup_message(H3270 *hSession, const SSL_ERROR_MESSAGE *msg); |
| 859 | 821 | ||
| 860 | #endif | 822 | #endif |
| 823 | +*/ | ||
| 861 | 824 | ||
| 862 | /// @brief Clear element at adress. | 825 | /// @brief Clear element at adress. |
| 863 | LIB3270_INTERNAL void clear_chr(H3270 *hSession, int baddr); | 826 | LIB3270_INTERNAL void clear_chr(H3270 *hSession, int baddr); |
src/include/networking.h
| @@ -76,7 +76,7 @@ | @@ -76,7 +76,7 @@ | ||
| 76 | /// | 76 | /// |
| 77 | int (*disconnect)(H3270 *hSession); | 77 | int (*disconnect)(H3270 *hSession); |
| 78 | 78 | ||
| 79 | - int (*start_tls)(H3270 *hSession, LIB3270_NETWORK_STATE *msg, unsigned char required); | 79 | + int (*start_tls)(H3270 *hSession, LIB3270_NETWORK_STATE *msg); |
| 80 | 80 | ||
| 81 | /// @brief Send on network context. | 81 | /// @brief Send on network context. |
| 82 | /// | 82 | /// |
| @@ -104,7 +104,7 @@ | @@ -104,7 +104,7 @@ | ||
| 104 | /// @brief Check if the session is online. | 104 | /// @brief Check if the session is online. |
| 105 | /// | 105 | /// |
| 106 | /// @retval 0 The session is offline. | 106 | /// @retval 0 The session is offline. |
| 107 | - int (*is_connected)(H3270 *hSession); | 107 | + int (*is_connected)(const H3270 *hSession); |
| 108 | 108 | ||
| 109 | /// @brief get socket name. | 109 | /// @brief get socket name. |
| 110 | /// | 110 | /// |
| @@ -136,5 +136,8 @@ | @@ -136,5 +136,8 @@ | ||
| 136 | */ | 136 | */ |
| 137 | LIB3270_INTERNAL int lib3270_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state); | 137 | LIB3270_INTERNAL int lib3270_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state); |
| 138 | 138 | ||
| 139 | + | ||
| 140 | + LIB3270_INTERNAL void * lib3270_get_openssl_context(H3270 *hSession, LIB3270_NETWORK_STATE *state); | ||
| 141 | + | ||
| 139 | #endif // LIB3270_NETWORKING_H_INCLUDED | 142 | #endif // LIB3270_NETWORKING_H_INCLUDED |
| 140 | 143 |
| @@ -0,0 +1,213 @@ | @@ -0,0 +1,213 @@ | ||
| 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 ', 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 openssl.c 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 | + /** | ||
| 31 | + * @brief OpenSSL based networking methods. | ||
| 32 | + * | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | + #include "private.h" | ||
| 36 | + | ||
| 37 | + #include <sys/types.h> | ||
| 38 | + #include <sys/socket.h> | ||
| 39 | + #include <netdb.h> | ||
| 40 | + #include <openssl/ssl.h> | ||
| 41 | + #include <openssl/x509.h> | ||
| 42 | + | ||
| 43 | + struct _lib3270_net_context { | ||
| 44 | + | ||
| 45 | + int sock; ///< @brief Session socket. | ||
| 46 | + | ||
| 47 | + SSL * con; ///< @brief SSL Connection handle. | ||
| 48 | + | ||
| 49 | + struct { | ||
| 50 | + char download; ///< @brief Non zero to download CRL. | ||
| 51 | + char * prefer; ///< @brief Prefered protocol for CRL. | ||
| 52 | + char * url; ///< @brief URL for CRL download. | ||
| 53 | + X509_CRL * cert; ///< @brief Loaded CRL (can be null). | ||
| 54 | + } crl; | ||
| 55 | + | ||
| 56 | + }; | ||
| 57 | + | ||
| 58 | +static void crl_free(LIB3270_NET_CONTEXT *context) { | ||
| 59 | + if(context->crl.cert) { | ||
| 60 | + X509_CRL_free(context->crl.cert); | ||
| 61 | + context->crl.cert = NULL; | ||
| 62 | + } | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +static void openssl_network_finalize(H3270 *hSession) { | ||
| 66 | + | ||
| 67 | + debug("%s",__FUNCTION__); | ||
| 68 | + | ||
| 69 | + | ||
| 70 | + if(hSession->network.context) { | ||
| 71 | + | ||
| 72 | + // Cleanupp | ||
| 73 | + LIB3270_NET_CONTEXT *context = hSession->network.context; | ||
| 74 | + | ||
| 75 | + crl_free(context); | ||
| 76 | + | ||
| 77 | + // Release network context. | ||
| 78 | + lib3270_free(hSession->network.context); | ||
| 79 | + hSession->network.context = NULL; | ||
| 80 | + } | ||
| 81 | + | ||
| 82 | +} | ||
| 83 | + | ||
| 84 | +static int openssl_network_disconnect(H3270 *hSession) { | ||
| 85 | + | ||
| 86 | + | ||
| 87 | +} | ||
| 88 | + | ||
| 89 | +ssize_t openssl_network_send(H3270 *hSession, const void *buffer, size_t length) { | ||
| 90 | + | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +static ssize_t openssl_network_recv(H3270 *hSession, void *buf, size_t len) { | ||
| 94 | + | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { | ||
| 98 | + | ||
| 99 | +} | ||
| 100 | + | ||
| 101 | +static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { | ||
| 102 | + | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +static int openssl_network_non_blocking(H3270 *hSession, const unsigned char on) { | ||
| 106 | + | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +static int openssl_network_is_connected(H3270 *hSession) { | ||
| 110 | + | ||
| 111 | +} | ||
| 112 | + | ||
| 113 | +static int openssl_network_setsockopt(H3270 *hSession, int level, int optname, const void *optval, size_t optlen) { | ||
| 114 | + | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +static int openssl_network_getsockopt(H3270 *hSession, int level, int optname, void *optval, socklen_t *optlen) { | ||
| 118 | +} | ||
| 119 | + | ||
| 120 | +static int openssl_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state) { | ||
| 121 | + | ||
| 122 | + set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
| 123 | + | ||
| 124 | + SSL_CTX * ctx_context = (SSL_CTX *) lib3270_get_openssl_context(state,state); | ||
| 125 | + if(!ctx_context) | ||
| 126 | + return -1; | ||
| 127 | + | ||
| 128 | + // | ||
| 129 | + // Prepare for connection | ||
| 130 | + // | ||
| 131 | + LIB3270_NET_CONTEXT *context = hSession->network.context; | ||
| 132 | + | ||
| 133 | + if(context->crl.cert) { | ||
| 134 | + | ||
| 135 | + // Release CRL if expired. | ||
| 136 | + // https://stackoverflow.com/questions/23407376/testing-x509-certificate-expiry-date-with-c | ||
| 137 | + // X509_CRL_get_nextUpdate is deprecated in openssl 1.1.0 | ||
| 138 | + | ||
| 139 | + #if OPENSSL_VERSION_NUMBER < 0x10100000L | ||
| 140 | + const ASN1_TIME * next_update = X509_CRL_get_nextUpdate(context->crl.cert); | ||
| 141 | + #else | ||
| 142 | + const ASN1_TIME * next_update = X509_CRL_get0_nextUpdate(context->crl.cert); | ||
| 143 | + #endif | ||
| 144 | + | ||
| 145 | + if(X509_cmp_current_time(next_update) == 1) | ||
| 146 | + { | ||
| 147 | + int day, sec; | ||
| 148 | + if(ASN1_TIME_diff(&day, &sec, NULL, next_update)) | ||
| 149 | + { | ||
| 150 | + trace_ssl(hSession,"CRL is valid for %d day(s) and %d second(s)\n",day,sec); | ||
| 151 | + } | ||
| 152 | + else | ||
| 153 | + { | ||
| 154 | + trace_ssl(hSession,"Can't get CRL next update, discarding it\n"); | ||
| 155 | + crl_free(context); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + } | ||
| 159 | + else | ||
| 160 | + { | ||
| 161 | + trace_ssl(hSession,"CRL is no longer valid\n"); | ||
| 162 | + crl_free(context); | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + // | ||
| 168 | + // Connect to host. | ||
| 169 | + // | ||
| 170 | + context->sock = lib3270_network_connect(hSession, state); | ||
| 171 | + | ||
| 172 | + return (context->sock < 0 ? -1 : 0); | ||
| 173 | + | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +static int openssl_network_start_tls(H3270 *hSession, LIB3270_NETWORK_STATE *msg) { | ||
| 177 | + | ||
| 178 | + LIB3270_NET_CONTEXT * context = hSession->network.context; | ||
| 179 | + | ||
| 180 | + | ||
| 181 | +} | ||
| 182 | + | ||
| 183 | +void lib3270_set_openssl_network_module(H3270 *hSession) { | ||
| 184 | + | ||
| 185 | + static const LIB3270_NET_MODULE module = { | ||
| 186 | + .finalize = openssl_network_finalize, | ||
| 187 | + .connect = openssl_network_connect, | ||
| 188 | + .disconnect = openssl_network_disconnect, | ||
| 189 | + .start_tls = openssl_network_start_tls, | ||
| 190 | + .send = openssl_network_send, | ||
| 191 | + .recv = openssl_network_recv, | ||
| 192 | + .add_poll = openssl_network_add_poll, | ||
| 193 | + .non_blocking = openssl_network_non_blocking, | ||
| 194 | + .is_connected = openssl_network_is_connected, | ||
| 195 | + .getsockname = openssl_network_getsockname, | ||
| 196 | + .setsockopt = openssl_network_setsockopt, | ||
| 197 | + .getsockopt = openssl_network_getsockopt | ||
| 198 | + }; | ||
| 199 | + | ||
| 200 | + debug("%s",__FUNCTION__); | ||
| 201 | + | ||
| 202 | + if(hSession->network.context) { | ||
| 203 | + // Has context, finalize it. | ||
| 204 | + hSession->network.module->finalize(hSession); | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + hSession->network.context = lib3270_malloc(sizeof(LIB3270_NET_CONTEXT)); | ||
| 208 | + memset(hSession->network.context,0,sizeof(LIB3270_NET_CONTEXT)); | ||
| 209 | + | ||
| 210 | + | ||
| 211 | + | ||
| 212 | + hSession->network.module = &module; | ||
| 213 | +} |
src/network_modules/unsecure.c
| @@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
| 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin |
| 19 | * St, Fifth Floor, Boston, MA 02110-1301 USA | 19 | * St, Fifth Floor, Boston, MA 02110-1301 USA |
| 20 | * | 20 | * |
| 21 | - * Este programa está nomeado como networking.h e possui - linhas de código. | 21 | + * Este programa está nomeado como unsecure.c e possui - linhas de código. |
| 22 | * | 22 | * |
| 23 | * Contatos: | 23 | * Contatos: |
| 24 | * | 24 | * |
| @@ -213,7 +213,7 @@ static int unsecure_network_non_blocking(H3270 *hSession, const unsigned char on | @@ -213,7 +213,7 @@ static int unsecure_network_non_blocking(H3270 *hSession, const unsigned char on | ||
| 213 | return 0; | 213 | return 0; |
| 214 | } | 214 | } |
| 215 | 215 | ||
| 216 | -static int unsecure_network_is_connected(H3270 *hSession) { | 216 | +static int unsecure_network_is_connected(const H3270 *hSession) { |
| 217 | return hSession->network.context->sock > 0; | 217 | return hSession->network.context->sock > 0; |
| 218 | } | 218 | } |
| 219 | 219 | ||
| @@ -247,9 +247,9 @@ static int unsecure_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *stat | @@ -247,9 +247,9 @@ static int unsecure_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *stat | ||
| 247 | return 0; | 247 | return 0; |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | -static int unsecure_network_start_tls(H3270 GNUC_UNUSED(*hSession), LIB3270_NETWORK_STATE *msg, unsigned char required) { | 250 | +static int unsecure_network_start_tls(H3270 GNUC_UNUSED(*hSession), LIB3270_NETWORK_STATE *msg) { |
| 251 | 251 | ||
| 252 | - if(required) { | 252 | + if(hSession->ssl.required) { |
| 253 | 253 | ||
| 254 | // TODO: Replace network module with the openssl version, initialize and execute start_tls on it. | 254 | // TODO: Replace network module with the openssl version, initialize and execute start_tls on it. |
| 255 | 255 |
src/ssl/crl.h
| @@ -66,9 +66,6 @@ | @@ -66,9 +66,6 @@ | ||
| 66 | /// @brief Unconditional release of the session CRL. | 66 | /// @brief Unconditional release of the session CRL. |
| 67 | LIB3270_INTERNAL void lib3270_crl_free(H3270 *hSession); | 67 | LIB3270_INTERNAL void lib3270_crl_free(H3270 *hSession); |
| 68 | 68 | ||
| 69 | - /// @brief Release CRL if expired. | ||
| 70 | - LIB3270_INTERNAL void lib3270_crl_free_if_expired(H3270 *hSession); | ||
| 71 | - | ||
| 72 | /// @brief Load CRL from URL. | 69 | /// @brief Load CRL from URL. |
| 73 | LIB3270_INTERNAL int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url); | 70 | LIB3270_INTERNAL int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url); |
| 74 | 71 |
src/ssl/linux/init.c
| @@ -35,13 +35,10 @@ | @@ -35,13 +35,10 @@ | ||
| 35 | 35 | ||
| 36 | /** | 36 | /** |
| 37 | * @brief OpenSSL initialization for linux. | 37 | * @brief OpenSSL initialization for linux. |
| 38 | - * | ||
| 39 | */ | 38 | */ |
| 40 | 39 | ||
| 41 | #include <config.h> | 40 | #include <config.h> |
| 42 | 41 | ||
| 43 | -#if defined(HAVE_LIBSSL) | ||
| 44 | - | ||
| 45 | #include <openssl/ssl.h> | 42 | #include <openssl/ssl.h> |
| 46 | #include <openssl/err.h> | 43 | #include <openssl/err.h> |
| 47 | #include <openssl/x509_vfy.h> | 44 | #include <openssl/x509_vfy.h> |
| @@ -51,63 +48,138 @@ | @@ -51,63 +48,138 @@ | ||
| 51 | #endif // !SSL_ST_OK | 48 | #endif // !SSL_ST_OK |
| 52 | 49 | ||
| 53 | #include <internals.h> | 50 | #include <internals.h> |
| 54 | -#include <errno.h> | ||
| 55 | -#include <lib3270.h> | ||
| 56 | -#include <lib3270/internals.h> | ||
| 57 | -#include <lib3270/trace.h> | 51 | +#include <networking.h> |
| 58 | #include <lib3270/log.h> | 52 | #include <lib3270/log.h> |
| 59 | -#include "trace_dsc.h" | ||
| 60 | 53 | ||
| 61 | #ifdef SSL_ENABLE_CRL_CHECK | 54 | #ifdef SSL_ENABLE_CRL_CHECK |
| 62 | - #include <openssl/x509.h> | ||
| 63 | #endif // SSL_ENABLE_CRL_CHECK | 55 | #endif // SSL_ENABLE_CRL_CHECK |
| 64 | 56 | ||
| 57 | +#if OPENSSL_VERSION_NUMBER >= 0x00907000L | ||
| 58 | + #define INFO_CONST const | ||
| 59 | +#else | ||
| 60 | + #define INFO_CONST | ||
| 61 | +#endif | ||
| 62 | + | ||
| 65 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 63 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 66 | 64 | ||
| 67 | -/** | ||
| 68 | - * @brief Initialize openssl library. | ||
| 69 | - * | ||
| 70 | - * @return 0 if ok, non zero if fails. | ||
| 71 | - * | ||
| 72 | - */ | ||
| 73 | -int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | 65 | +// @brief Index of h3270 handle in SSL session. |
| 66 | +static int ssl_3270_ex_index; | ||
| 67 | + | ||
| 68 | +/// @brief Callback for tracing protocol negotiation. | ||
| 69 | +static void info_callback(INFO_CONST SSL *s, int where, int ret) | ||
| 74 | { | 70 | { |
| 75 | - debug("%s ssl_ctx=%p",__FUNCTION__,ssl_ctx); | 71 | + H3270 *hSession = (H3270 *) SSL_get_ex_data(s,ssl_3270_ex_index); |
| 76 | 72 | ||
| 77 | - if(ssl_ctx) | ||
| 78 | - return 0; | 73 | + switch(where) |
| 74 | + { | ||
| 75 | + case SSL_CB_CONNECT_LOOP: | ||
| 76 | + trace_ssl(hSession,"SSL_connect: %s %s\n",SSL_state_string(s), SSL_state_string_long(s)); | ||
| 77 | + break; | ||
| 78 | + | ||
| 79 | + case SSL_CB_CONNECT_EXIT: | ||
| 80 | + | ||
| 81 | + trace_ssl(hSession,"%s: SSL_CB_CONNECT_EXIT\n",__FUNCTION__); | ||
| 82 | + | ||
| 83 | + if (ret == 0) | ||
| 84 | + { | ||
| 85 | + trace_ssl(hSession,"SSL_connect: failed in %s\n",SSL_state_string_long(s)); | ||
| 86 | + } | ||
| 87 | + else if (ret < 0) | ||
| 88 | + { | ||
| 89 | + unsigned long e = ERR_get_error(); | ||
| 90 | + char err_buf[1024]; | ||
| 91 | + | ||
| 92 | + if(e != 0) | ||
| 93 | + { | ||
| 94 | + hSession->ssl.error = e; | ||
| 95 | + (void) ERR_error_string_n(e, err_buf, 1023); | ||
| 96 | + } | ||
| 97 | +#if defined(_WIN32) | ||
| 98 | + else if (GetLastError() != 0) | ||
| 99 | + { | ||
| 100 | + strncpy(err_buf,lib3270_win32_strerror(GetLastError()),1023); | ||
| 101 | + } | ||
| 102 | +#else | ||
| 103 | + else if (errno != 0) | ||
| 104 | + { | ||
| 105 | + strncpy(err_buf, strerror(errno),1023); | ||
| 106 | + } | ||
| 107 | +#endif | ||
| 108 | + else | ||
| 109 | + { | ||
| 110 | + err_buf[0] = '\0'; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + trace_ssl(hSession,"SSL Connect error %d\nMessage: %s\nState: %s\nAlert: %s\n", | ||
| 114 | + ret, | ||
| 115 | + err_buf, | ||
| 116 | + SSL_state_string_long(s), | ||
| 117 | + SSL_alert_type_string_long(ret) | ||
| 118 | + ); | ||
| 119 | + | ||
| 120 | + } | ||
| 121 | + break; | ||
| 122 | + | ||
| 123 | + default: | ||
| 124 | + trace_ssl(hSession,"SSL Current state is \"%s\"\n",SSL_state_string_long(s)); | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | +#ifdef DEBUG | ||
| 128 | + if(where & SSL_CB_EXIT) | ||
| 129 | + { | ||
| 130 | + trace("%s: SSL_CB_EXIT ret=%d\n",__FUNCTION__,ret); | ||
| 131 | + } | ||
| 132 | +#endif | ||
| 133 | + | ||
| 134 | + if(where & SSL_CB_ALERT) | ||
| 135 | + trace_ssl(hSession,"SSL ALERT: %s\n",SSL_alert_type_string_long(ret)); | ||
| 136 | + | ||
| 137 | + if(where & SSL_CB_HANDSHAKE_DONE) | ||
| 138 | + { | ||
| 139 | + trace_ssl(hSession,"%s: SSL_CB_HANDSHAKE_DONE state=%04x\n",__FUNCTION__,SSL_get_state(s)); | ||
| 140 | + if(SSL_get_state(s) == SSL_ST_OK) | ||
| 141 | + set_ssl_state(hSession,LIB3270_SSL_NEGOTIATED); | ||
| 142 | + else | ||
| 143 | + set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 144 | + } | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +void * lib3270_get_openssl_context(H3270 *hSession, LIB3270_NETWORK_STATE *state) { | ||
| 148 | + | ||
| 149 | + static SSL_CTX * context = NULL; | ||
| 150 | + | ||
| 151 | + if(context) | ||
| 152 | + return context; | ||
| 79 | 153 | ||
| 80 | trace_ssl(hSession,"Initializing SSL context.\n"); | 154 | trace_ssl(hSession,"Initializing SSL context.\n"); |
| 81 | 155 | ||
| 82 | SSL_load_error_strings(); | 156 | SSL_load_error_strings(); |
| 83 | SSL_library_init(); | 157 | SSL_library_init(); |
| 84 | 158 | ||
| 85 | - ssl_ctx = SSL_CTX_new(SSLv23_method()); | ||
| 86 | - if(ssl_ctx == NULL) | 159 | + context = SSL_CTX_new(SSLv23_method()); |
| 160 | + if(context == NULL) | ||
| 87 | { | 161 | { |
| 88 | static const LIB3270_POPUP popup = { | 162 | static const LIB3270_POPUP popup = { |
| 89 | - .name = "SSL-CTXERROR", | ||
| 90 | .type = LIB3270_NOTIFY_SECURE, | 163 | .type = LIB3270_NOTIFY_SECURE, |
| 91 | - .summary = N_( "Cant initialize the SSL context." ) | 164 | + .summary = N_( "Can't initialize the SSL context." ) |
| 92 | }; | 165 | }; |
| 93 | 166 | ||
| 94 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
| 95 | - message->popup = &popup; | 167 | +// message->code = hSession->ssl.error = ERR_get_error(); |
| 168 | + state->popup = &popup; | ||
| 96 | return -1; | 169 | return -1; |
| 97 | } | 170 | } |
| 98 | 171 | ||
| 99 | - SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL); | ||
| 100 | - SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); | 172 | + SSL_CTX_set_options(context, SSL_OP_ALL); |
| 173 | + SSL_CTX_set_info_callback(context, info_callback); | ||
| 101 | 174 | ||
| 102 | - SSL_CTX_set_default_verify_paths(ssl_ctx); | 175 | + SSL_CTX_set_default_verify_paths(context); |
| 103 | 176 | ||
| 104 | ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); | 177 | ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); |
| 105 | 178 | ||
| 106 | - | ||
| 107 | #ifdef SSL_ENABLE_CRL_CHECK | 179 | #ifdef SSL_ENABLE_CRL_CHECK |
| 108 | 180 | ||
| 109 | // Enable CRL check | 181 | // Enable CRL check |
| 110 | - X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); | 182 | + X509_STORE *store = SSL_CTX_get_cert_store(context); |
| 111 | X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | 183 | X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); |
| 112 | X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | 184 | X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); |
| 113 | X509_STORE_set1_param(store, param); | 185 | X509_STORE_set1_param(store, param); |
| @@ -117,8 +189,6 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -117,8 +189,6 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 117 | 189 | ||
| 118 | #endif // SSL_ENABLE_CRL_CHECK | 190 | #endif // SSL_ENABLE_CRL_CHECK |
| 119 | 191 | ||
| 120 | - return 0; | 192 | + return context; |
| 121 | 193 | ||
| 122 | } | 194 | } |
| 123 | - | ||
| 124 | -#endif // HAVE_LIBSSL |
src/ssl/negotiate.c
| @@ -535,85 +535,5 @@ int ssl_init(H3270 *hSession) { | @@ -535,85 +535,5 @@ int ssl_init(H3270 *hSession) { | ||
| 535 | 535 | ||
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | - | ||
| 539 | -/* Callback for tracing protocol negotiation. */ | ||
| 540 | -void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) | ||
| 541 | -{ | ||
| 542 | - H3270 *hSession = (H3270 *) SSL_get_ex_data(s,ssl_3270_ex_index); | ||
| 543 | - | ||
| 544 | - switch(where) | ||
| 545 | - { | ||
| 546 | - case SSL_CB_CONNECT_LOOP: | ||
| 547 | - trace_ssl(hSession,"SSL_connect: %s %s\n",SSL_state_string(s), SSL_state_string_long(s)); | ||
| 548 | - break; | ||
| 549 | - | ||
| 550 | - case SSL_CB_CONNECT_EXIT: | ||
| 551 | - | ||
| 552 | - trace_ssl(hSession,"%s: SSL_CB_CONNECT_EXIT\n",__FUNCTION__); | ||
| 553 | - | ||
| 554 | - if (ret == 0) | ||
| 555 | - { | ||
| 556 | - trace_ssl(hSession,"SSL_connect: failed in %s\n",SSL_state_string_long(s)); | ||
| 557 | - } | ||
| 558 | - else if (ret < 0) | ||
| 559 | - { | ||
| 560 | - unsigned long e = ERR_get_error(); | ||
| 561 | - char err_buf[1024]; | ||
| 562 | - | ||
| 563 | - if(e != 0) | ||
| 564 | - { | ||
| 565 | - hSession->ssl.error = e; | ||
| 566 | - (void) ERR_error_string_n(e, err_buf, 1023); | ||
| 567 | - } | ||
| 568 | -#if defined(_WIN32) | ||
| 569 | - else if (GetLastError() != 0) | ||
| 570 | - { | ||
| 571 | - strncpy(err_buf,lib3270_win32_strerror(GetLastError()),1023); | ||
| 572 | - } | ||
| 573 | -#else | ||
| 574 | - else if (errno != 0) | ||
| 575 | - { | ||
| 576 | - strncpy(err_buf, strerror(errno),1023); | ||
| 577 | - } | ||
| 578 | -#endif | ||
| 579 | - else | ||
| 580 | - { | ||
| 581 | - err_buf[0] = '\0'; | ||
| 582 | - } | ||
| 583 | - | ||
| 584 | - trace_ssl(hSession,"SSL Connect error %d\nMessage: %s\nState: %s\nAlert: %s\n", | ||
| 585 | - ret, | ||
| 586 | - err_buf, | ||
| 587 | - SSL_state_string_long(s), | ||
| 588 | - SSL_alert_type_string_long(ret) | ||
| 589 | - ); | ||
| 590 | - | ||
| 591 | - } | ||
| 592 | - break; | ||
| 593 | - | ||
| 594 | - default: | ||
| 595 | - trace_ssl(hSession,"SSL Current state is \"%s\"\n",SSL_state_string_long(s)); | ||
| 596 | - } | ||
| 597 | - | ||
| 598 | -#ifdef DEBUG | ||
| 599 | - if(where & SSL_CB_EXIT) | ||
| 600 | - { | ||
| 601 | - trace("%s: SSL_CB_EXIT ret=%d\n",__FUNCTION__,ret); | ||
| 602 | - } | ||
| 603 | -#endif | ||
| 604 | - | ||
| 605 | - if(where & SSL_CB_ALERT) | ||
| 606 | - trace_ssl(hSession,"SSL ALERT: %s\n",SSL_alert_type_string_long(ret)); | ||
| 607 | - | ||
| 608 | - if(where & SSL_CB_HANDSHAKE_DONE) | ||
| 609 | - { | ||
| 610 | - trace_ssl(hSession,"%s: SSL_CB_HANDSHAKE_DONE state=%04x\n",__FUNCTION__,SSL_get_state(s)); | ||
| 611 | - if(SSL_get_state(s) == SSL_ST_OK) | ||
| 612 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATED); | ||
| 613 | - else | ||
| 614 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 615 | - } | ||
| 616 | -} | ||
| 617 | - | ||
| 618 | #endif /*]*/ | 538 | #endif /*]*/ |
| 619 | 539 |
src/ssl/state.c
| @@ -70,7 +70,6 @@ LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_ssl_state(const H3270 *hSession) | @@ -70,7 +70,6 @@ LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_ssl_state(const H3270 *hSession) | ||
| 70 | #endif // HAVE_LIBSSL | 70 | #endif // HAVE_LIBSSL |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | -#if defined(HAVE_LIBSSL) | ||
| 74 | void set_ssl_state(H3270 *hSession, LIB3270_SSL_STATE state) | 73 | void set_ssl_state(H3270 *hSession, LIB3270_SSL_STATE state) |
| 75 | { | 74 | { |
| 76 | if(state == hSession->ssl.state) | 75 | if(state == hSession->ssl.state) |
| @@ -83,6 +82,9 @@ void set_ssl_state(H3270 *hSession, LIB3270_SSL_STATE state) | @@ -83,6 +82,9 @@ void set_ssl_state(H3270 *hSession, LIB3270_SSL_STATE state) | ||
| 83 | hSession->cbk.update_ssl(hSession,hSession->ssl.state); | 82 | hSession->cbk.update_ssl(hSession,hSession->ssl.state); |
| 84 | } | 83 | } |
| 85 | 84 | ||
| 85 | + | ||
| 86 | +#if defined(HAVE_LIBSSL) | ||
| 87 | + | ||
| 86 | static const struct ssl_status_msg status_msg[] = | 88 | static const struct ssl_status_msg status_msg[] = |
| 87 | { | 89 | { |
| 88 | // http://www.openssl.org/docs/apps/verify.html | 90 | // http://www.openssl.org/docs/apps/verify.html |