Commit e9bac34b56aea6eea4b4168054cd25aef86d0cc7
1 parent
3be44a48
Exists in
master
and in
3 other branches
Removing unused code.
Showing
28 changed files
with
24 additions
and
3654 deletions
Show diff stats
lib3270.cbp
@@ -366,44 +366,8 @@ | @@ -366,44 +366,8 @@ | ||
366 | <Unit filename="src/selection/selection.c"> | 366 | <Unit filename="src/selection/selection.c"> |
367 | <Option compilerVar="CC" /> | 367 | <Option compilerVar="CC" /> |
368 | </Unit> | 368 | </Unit> |
369 | - <Unit filename="src/ssl/crl.c"> | ||
370 | - <Option compilerVar="CC" /> | ||
371 | - </Unit> | ||
372 | <Unit filename="src/ssl/crl.h" /> | 369 | <Unit filename="src/ssl/crl.h" /> |
373 | - <Unit filename="src/ssl/linux/getcrl.c"> | ||
374 | - <Option compilerVar="CC" /> | ||
375 | - </Unit> | ||
376 | - <Unit filename="src/ssl/linux/init.c"> | ||
377 | - <Option compilerVar="CC" /> | ||
378 | - </Unit> | ||
379 | - <Unit filename="src/ssl/linux/ldap.c"> | ||
380 | - <Option compilerVar="CC" /> | ||
381 | - </Unit> | ||
382 | <Unit filename="src/ssl/linux/private.h" /> | 370 | <Unit filename="src/ssl/linux/private.h" /> |
383 | - <Unit filename="src/ssl/linux/url.c"> | ||
384 | - <Option compilerVar="CC" /> | ||
385 | - </Unit> | ||
386 | - <Unit filename="src/ssl/negotiate.c"> | ||
387 | - <Option compilerVar="CC" /> | ||
388 | - </Unit> | ||
389 | - <Unit filename="src/ssl/notify.c"> | ||
390 | - <Option compilerVar="CC" /> | ||
391 | - </Unit> | ||
392 | - <Unit filename="src/ssl/properties.c"> | ||
393 | - <Option compilerVar="CC" /> | ||
394 | - </Unit> | ||
395 | - <Unit filename="src/ssl/windows/getcrl.c"> | ||
396 | - <Option compilerVar="CC" /> | ||
397 | - </Unit> | ||
398 | - <Unit filename="src/ssl/windows/http.c"> | ||
399 | - <Option compilerVar="CC" /> | ||
400 | - </Unit> | ||
401 | - <Unit filename="src/ssl/windows/init.c"> | ||
402 | - <Option compilerVar="CC" /> | ||
403 | - </Unit> | ||
404 | - <Unit filename="src/ssl/windows/ldap.c"> | ||
405 | - <Option compilerVar="CC" /> | ||
406 | - </Unit> | ||
407 | <Unit filename="src/ssl/windows/private.h" /> | 371 | <Unit filename="src/ssl/windows/private.h" /> |
408 | <Unit filename="src/testprogram/testprogram.c"> | 372 | <Unit filename="src/testprogram/testprogram.c"> |
409 | <Option compilerVar="CC" /> | 373 | <Option compilerVar="CC" /> |
src/core/host.c
@@ -52,7 +52,6 @@ | @@ -52,7 +52,6 @@ | ||
52 | #include "trace_dsc.h" | 52 | #include "trace_dsc.h" |
53 | #include "utilc.h" | 53 | #include "utilc.h" |
54 | #include "xioc.h" | 54 | #include "xioc.h" |
55 | -#include "../ssl/crl.h" | ||
56 | #include "screenc.h" | 55 | #include "screenc.h" |
57 | 56 | ||
58 | #include <errno.h> | 57 | #include <errno.h> |
@@ -293,13 +292,10 @@ static void update_url(H3270 *hSession) | @@ -293,13 +292,10 @@ static void update_url(H3270 *hSession) | ||
293 | lib3270_write_event_trace(hSession,"Host URL was changed\nFrom: %s\nTo: %s\n",hSession->host.url,url); | 292 | lib3270_write_event_trace(hSession,"Host URL was changed\nFrom: %s\nTo: %s\n",hSession->host.url,url); |
294 | lib3270_free(hSession->host.url); | 293 | lib3270_free(hSession->host.url); |
295 | hSession->host.url = url; | 294 | hSession->host.url = url; |
296 | - | ||
297 | -#if defined(HAVE_LIBSSLx) && defined(SSL_ENABLE_CRL_CHECK) | ||
298 | - lib3270_crl_free(hSession); | ||
299 | -#endif // SSL_ENABLE_CRL_CHECK | ||
300 | - | ||
301 | hSession->cbk.update_url(hSession, hSession->host.url); | 295 | hSession->cbk.update_url(hSession, hSession->host.url); |
302 | 296 | ||
297 | + hSession->network.module->reset(hSession); | ||
298 | + | ||
303 | } | 299 | } |
304 | 300 | ||
305 | LIB3270_EXPORT const char * lib3270_get_associated_luname(const H3270 *hSession) | 301 | LIB3270_EXPORT const char * lib3270_get_associated_luname(const H3270 *hSession) |
src/core/linux/connect.c
@@ -307,16 +307,6 @@ | @@ -307,16 +307,6 @@ | ||
307 | // | 307 | // |
308 | hSession->ever_3270 = False; | 308 | hSession->ever_3270 = False; |
309 | 309 | ||
310 | -#if defined(HAVE_LIBSSLx) | ||
311 | - if(hSession->ssl.enabled) | ||
312 | - { | ||
313 | - hSession->ssl.host = 1; | ||
314 | - if(ssl_init(hSession)) | ||
315 | - return errno = ENOTCONN; | ||
316 | - | ||
317 | - } | ||
318 | -#endif // HAVE_LIBSSL | ||
319 | - | ||
320 | // set options for inline out-of-band data and keepalives | 310 | // set options for inline out-of-band data and keepalives |
321 | int optval = 1; | 311 | int optval = 1; |
322 | if(hSession->network.module->setsockopt(hSession, SOL_SOCKET, SO_OOBINLINE, &optval, sizeof(optval)) < 0) | 312 | if(hSession->network.module->setsockopt(hSession, SOL_SOCKET, SO_OOBINLINE, &optval, sizeof(optval)) < 0) |
src/core/properties/signed.c
@@ -49,48 +49,6 @@ | @@ -49,48 +49,6 @@ | ||
49 | return (int) lib3270_get_ssl_state(hSession); | 49 | return (int) lib3270_get_ssl_state(hSession); |
50 | } | 50 | } |
51 | 51 | ||
52 | - static int lib3270_set_ssl_minimum_protocol_version(H3270 *hSession, int value) | ||
53 | - { | ||
54 | -#ifdef HAVE_LIBSSLx | ||
55 | - FAIL_IF_ONLINE(hSession); | ||
56 | - hSession->ssl.protocol.min_version = value; | ||
57 | - return 0; | ||
58 | -#else | ||
59 | - return ENOTSUP; | ||
60 | -#endif // HAVE_LIBSSL | ||
61 | - } | ||
62 | - | ||
63 | - static int lib3270_set_ssl_maximum_protocol_version(H3270 *hSession, int value) | ||
64 | - { | ||
65 | -#ifdef HAVE_LIBSSLx | ||
66 | - FAIL_IF_ONLINE(hSession); | ||
67 | - hSession->ssl.protocol.max_version = value; | ||
68 | - return 0; | ||
69 | -#else | ||
70 | - return ENOTSUP; | ||
71 | -#endif // HAVE_LIBSSL | ||
72 | - } | ||
73 | - | ||
74 | - static int lib3270_get_ssl_minimum_protocol_version(const H3270 *hSession) | ||
75 | - { | ||
76 | -#ifdef HAVE_LIBSSLx | ||
77 | - return hSession->ssl.protocol.min_version; | ||
78 | -#else | ||
79 | - errno = ENOTSUP; | ||
80 | - return 0; | ||
81 | -#endif // HAVE_LIBSSL | ||
82 | - } | ||
83 | - | ||
84 | - static int lib3270_get_ssl_maximum_protocol_version(const H3270 *hSession) | ||
85 | - { | ||
86 | -#ifdef HAVE_LIBSSLx | ||
87 | - return hSession->ssl.protocol.max_version; | ||
88 | -#else | ||
89 | - errno = ENOTSUP; | ||
90 | - return 0; | ||
91 | -#endif // HAVE_LIBSSL | ||
92 | - } | ||
93 | - | ||
94 | const LIB3270_INT_PROPERTY * lib3270_get_int_properties_list(void) | 52 | const LIB3270_INT_PROPERTY * lib3270_get_int_properties_list(void) |
95 | { | 53 | { |
96 | 54 | ||
@@ -117,22 +75,6 @@ | @@ -117,22 +75,6 @@ | ||
117 | .set = NULL // Set value. | 75 | .set = NULL // Set value. |
118 | }, | 76 | }, |
119 | 77 | ||
120 | - { | ||
121 | - .name = "ssl_min_protocol_version", // Property name. | ||
122 | - .description = N_( "ID of the minimum supported SSL protocol version" ), // Property description. | ||
123 | - .default_value = 0, | ||
124 | - .get = lib3270_get_ssl_minimum_protocol_version, // Get value. | ||
125 | - .set = lib3270_set_ssl_minimum_protocol_version // Set value. | ||
126 | - }, | ||
127 | - | ||
128 | - { | ||
129 | - .name = "ssl_max_protocol_version", // Property name. | ||
130 | - .description = N_( "ID of the maximum supported SSL protocol version" ), // Property description. | ||
131 | - .default_value = 0, | ||
132 | - .get = lib3270_get_ssl_maximum_protocol_version, // Get value. | ||
133 | - .set = lib3270_set_ssl_maximum_protocol_version // Set value. | ||
134 | - }, | ||
135 | - | ||
136 | { | 78 | { |
137 | .name = NULL, | 79 | .name = NULL, |
138 | .description = NULL, | 80 | .description = NULL, |
src/core/session.c
@@ -42,7 +42,6 @@ | @@ -42,7 +42,6 @@ | ||
42 | #include "kybdc.h" | 42 | #include "kybdc.h" |
43 | #include "3270ds.h" | 43 | #include "3270ds.h" |
44 | #include "popupsc.h" | 44 | #include "popupsc.h" |
45 | -#include "../ssl/crl.h" | ||
46 | #include <lib3270/trace.h> | 45 | #include <lib3270/trace.h> |
47 | #include <lib3270/log.h> | 46 | #include <lib3270/log.h> |
48 | #include <lib3270/properties.h> | 47 | #include <lib3270/properties.h> |
@@ -74,16 +73,6 @@ void lib3270_session_free(H3270 *h) | @@ -74,16 +73,6 @@ void lib3270_session_free(H3270 *h) | ||
74 | 73 | ||
75 | shutdown_toggles(h); | 74 | shutdown_toggles(h); |
76 | 75 | ||
77 | -#if defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBSSLx) | ||
78 | - if(h->ssl.crl.prefer) | ||
79 | - { | ||
80 | - free(h->ssl.crl.prefer); | ||
81 | - h->ssl.crl.prefer = NULL; | ||
82 | - } | ||
83 | - | ||
84 | - lib3270_crl_free(h); | ||
85 | -#endif // SSL_ENABLE_CRL_CHECK | ||
86 | - | ||
87 | // Release network module | 76 | // Release network module |
88 | if(h->network.module) | 77 | if(h->network.module) |
89 | { | 78 | { |
src/include/networking.h
@@ -166,6 +166,11 @@ | @@ -166,6 +166,11 @@ | ||
166 | /// @return String with the CRL certificate (release it with lib3270_free); NULL if not available. | 166 | /// @return String with the CRL certificate (release it with lib3270_free); NULL if not available. |
167 | char * (*getcrl)(const H3270 *hSession); | 167 | char * (*getcrl)(const H3270 *hSession); |
168 | 168 | ||
169 | + /// @brief Reset. | ||
170 | + /// | ||
171 | + /// Clear network module state (used when URL changes). | ||
172 | + void (*reset)(H3270 *hSession); | ||
173 | + | ||
169 | } LIB3270_NET_MODULE; | 174 | } LIB3270_NET_MODULE; |
170 | 175 | ||
171 | /** | 176 | /** |
src/network_modules/default/main.c
@@ -62,6 +62,9 @@ | @@ -62,6 +62,9 @@ | ||
62 | return 0; | 62 | return 0; |
63 | } | 63 | } |
64 | 64 | ||
65 | + static void unsecure_network_reset(H3270 GNUC_UNUSED(*hSession)) { | ||
66 | + } | ||
67 | + | ||
65 | ssize_t unsecure_network_send(H3270 *hSession, const void *buffer, size_t length) { | 68 | ssize_t unsecure_network_send(H3270 *hSession, const void *buffer, size_t length) { |
66 | 69 | ||
67 | ssize_t bytes = send(hSession->network.context->sock,buffer,length,0); | 70 | ssize_t bytes = send(hSession->network.context->sock,buffer,length,0); |
@@ -164,7 +167,8 @@ void lib3270_set_default_network_module(H3270 *hSession) { | @@ -164,7 +167,8 @@ void lib3270_set_default_network_module(H3270 *hSession) { | ||
164 | .is_connected = unsecure_network_is_connected, | 167 | .is_connected = unsecure_network_is_connected, |
165 | .getsockname = unsecure_network_getsockname, | 168 | .getsockname = unsecure_network_getsockname, |
166 | .setsockopt = unsecure_network_setsockopt, | 169 | .setsockopt = unsecure_network_setsockopt, |
167 | - .getsockopt = unsecure_network_getsockopt | 170 | + .getsockopt = unsecure_network_getsockopt, |
171 | + .reset = unsecure_network_reset | ||
168 | }; | 172 | }; |
169 | 173 | ||
170 | debug("%s",__FUNCTION__); | 174 | debug("%s",__FUNCTION__); |
src/network_modules/openssl/main.c
@@ -35,18 +35,21 @@ | @@ -35,18 +35,21 @@ | ||
35 | #include "private.h" | 35 | #include "private.h" |
36 | 36 | ||
37 | 37 | ||
38 | -static void openssl_network_finalize(H3270 *hSession) { | ||
39 | - | ||
40 | - debug("%s",__FUNCTION__); | 38 | +static void openssl_network_reset(H3270 *hSession) { |
41 | 39 | ||
42 | if(hSession->network.context) { | 40 | if(hSession->network.context) { |
41 | + lib3270_openssl_crl_free(hSession->network.context); | ||
42 | + } | ||
43 | + | ||
44 | +} | ||
43 | 45 | ||
44 | - // Cleanupp | ||
45 | - LIB3270_NET_CONTEXT *context = hSession->network.context; | 46 | +static void openssl_network_finalize(H3270 *hSession) { |
46 | 47 | ||
47 | - lib3270_openssl_crl_free(context); | 48 | + debug("%s",__FUNCTION__); |
48 | 49 | ||
49 | - // Release network context. | 50 | + openssl_network_reset(hSession); |
51 | + | ||
52 | + if(hSession->network.context) { | ||
50 | lib3270_free(hSession->network.context); | 53 | lib3270_free(hSession->network.context); |
51 | hSession->network.context = NULL; | 54 | hSession->network.context = NULL; |
52 | } | 55 | } |
@@ -346,7 +349,8 @@ void lib3270_set_libssl_network_module(H3270 *hSession) { | @@ -346,7 +349,8 @@ void lib3270_set_libssl_network_module(H3270 *hSession) { | ||
346 | .setsockopt = openssl_network_setsockopt, | 349 | .setsockopt = openssl_network_setsockopt, |
347 | .getsockopt = openssl_network_getsockopt, | 350 | .getsockopt = openssl_network_getsockopt, |
348 | .getcert = openssl_network_getcert, | 351 | .getcert = openssl_network_getcert, |
349 | - .getcrl = openssl_network_getcrl | 352 | + .getcrl = openssl_network_getcrl, |
353 | + .reset = openssl_network_reset | ||
350 | }; | 354 | }; |
351 | 355 | ||
352 | debug("%s",__FUNCTION__); | 356 | debug("%s",__FUNCTION__); |
src/network_modules/state.c
@@ -50,15 +50,6 @@ LIB3270_EXPORT int lib3270_is_secure(const H3270 *hSession) | @@ -50,15 +50,6 @@ LIB3270_EXPORT int lib3270_is_secure(const H3270 *hSession) | ||
50 | return lib3270_get_ssl_state(hSession) == LIB3270_SSL_SECURE; | 50 | return lib3270_get_ssl_state(hSession) == LIB3270_SSL_SECURE; |
51 | } | 51 | } |
52 | 52 | ||
53 | -#if defined(HAVE_LIBSSLx) | ||
54 | -LIB3270_EXPORT long lib3270_get_SSL_verify_result(const H3270 *hSession) | ||
55 | -{ | ||
56 | - if(hSession->ssl.con) | ||
57 | - return SSL_get_verify_result(hSession->ssl.con); | ||
58 | - return -1; | ||
59 | -} | ||
60 | -#endif // HAVE_LIBSSL | ||
61 | - | ||
62 | LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_ssl_state(const H3270 *hSession) | 53 | LIB3270_EXPORT LIB3270_SSL_STATE lib3270_get_ssl_state(const H3270 *hSession) |
63 | { | 54 | { |
64 | return hSession->ssl.state; | 55 | return hSession->ssl.state; |
src/ssl/crl.c
@@ -1,292 +0,0 @@ | @@ -1,292 +0,0 @@ | ||
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 | - | ||
30 | -#include <config.h> | ||
31 | - | ||
32 | -#include <internals.h> | ||
33 | -#include <lib3270/log.h> | ||
34 | -#include <lib3270/trace.h> | ||
35 | -#include <lib3270/toggle.h> | ||
36 | -#include <trace_dsc.h> | ||
37 | -#include <array.h> | ||
38 | - | ||
39 | -#include "crl.h" | ||
40 | - | ||
41 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
42 | - | ||
43 | -#if defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBSSL) | ||
44 | - | ||
45 | -void lib3270_crl_free(H3270 *hSession) | ||
46 | -{ | ||
47 | - if(hSession->ssl.crl.cert) | ||
48 | - { | ||
49 | - X509_CRL_free(hSession->ssl.crl.cert); | ||
50 | - hSession->ssl.crl.cert = NULL; | ||
51 | - } | ||
52 | - | ||
53 | - if(hSession->ssl.crl.url) | ||
54 | - { | ||
55 | - free(hSession->ssl.crl.url); | ||
56 | - hSession->ssl.crl.url = NULL; | ||
57 | - } | ||
58 | - | ||
59 | -} | ||
60 | - | ||
61 | -void lib3270_crl_free_if_expired(H3270 *hSession) | ||
62 | -{ | ||
63 | - if(!hSession->ssl.crl.cert) | ||
64 | - return; | ||
65 | - | ||
66 | - // https://stackoverflow.com/questions/23407376/testing-x509-certificate-expiry-date-with-c | ||
67 | - // X509_CRL_get_nextUpdate is deprecated in openssl 1.1.0 | ||
68 | - #if OPENSSL_VERSION_NUMBER < 0x10100000L | ||
69 | - const ASN1_TIME * next_update = X509_CRL_get_nextUpdate(hSession->ssl.crl.cert); | ||
70 | - #else | ||
71 | - const ASN1_TIME * next_update = X509_CRL_get0_nextUpdate(hSession->ssl.crl.cert); | ||
72 | - #endif | ||
73 | - | ||
74 | - if(X509_cmp_current_time(next_update) == 1) | ||
75 | - { | ||
76 | - int day, sec; | ||
77 | - if(ASN1_TIME_diff(&day, &sec, NULL, next_update)) | ||
78 | - { | ||
79 | - trace_ssl(hSession,"CRL is valid for %d day(s) and %d second(s)\n",day,sec); | ||
80 | - return; | ||
81 | - } | ||
82 | - | ||
83 | - trace_ssl(hSession,"Can't get CRL next update, discarding it\n"); | ||
84 | - | ||
85 | - } | ||
86 | - else | ||
87 | - { | ||
88 | - trace_ssl(hSession,"CRL is no longer valid\n"); | ||
89 | - } | ||
90 | - | ||
91 | - // Certificate is no longer valid, release it. | ||
92 | - X509_CRL_free(hSession->ssl.crl.cert); | ||
93 | - hSession->ssl.crl.cert = NULL; | ||
94 | - | ||
95 | -} | ||
96 | - | ||
97 | -int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url) | ||
98 | -{ | ||
99 | - if(!(url && *url)) | ||
100 | - return -1; | ||
101 | - | ||
102 | - lib3270_crl_free(hSession); // Just in case! | ||
103 | - | ||
104 | - // | ||
105 | - // Get the new CRL | ||
106 | - // | ||
107 | - // https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | ||
108 | - // | ||
109 | - trace_ssl(hSession,"Getting CRL from %s\n",url); | ||
110 | - | ||
111 | - hSession->ssl.crl.cert = lib3270_download_crl(hSession,(SSL_ERROR_MESSAGE *) ssl_error, url); | ||
112 | - | ||
113 | - if(hSession->ssl.crl.cert) | ||
114 | - { | ||
115 | - // Got CRL! | ||
116 | - | ||
117 | - // Update URL | ||
118 | - if(hSession->ssl.crl.url) | ||
119 | - lib3270_free(hSession->ssl.crl.url); | ||
120 | - | ||
121 | - hSession->ssl.crl.url = lib3270_strdup(url); | ||
122 | - | ||
123 | - // Add it to ssl store | ||
124 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
125 | - { | ||
126 | - lib3270_autoptr(char) text = lib3270_get_ssl_crl_text(hSession); | ||
127 | - | ||
128 | - if(text) | ||
129 | - trace_ssl(hSession,"\n%s\n",text); | ||
130 | - | ||
131 | - } | ||
132 | - | ||
133 | - // Add CRL in the store. | ||
134 | - X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); | ||
135 | - if(X509_STORE_add_crl(store, hSession->ssl.crl.cert)) | ||
136 | - { | ||
137 | - trace_ssl(hSession,"CRL was added to context cert store\n"); | ||
138 | - } | ||
139 | - else | ||
140 | - { | ||
141 | - trace_ssl(hSession,"CRL was not added to context cert store\n"); | ||
142 | - } | ||
143 | - | ||
144 | - return 0; | ||
145 | - } | ||
146 | - | ||
147 | - trace_ssl(hSession,"Can't get CRL using %s\n",url); | ||
148 | - | ||
149 | - return -1; | ||
150 | - | ||
151 | -} | ||
152 | - | ||
153 | -/// @brief Load CRL from X509 certificate. | ||
154 | -int lib3270_crl_new_from_x509(H3270 *hSession, void *ssl_error, X509 *cert) | ||
155 | -{ | ||
156 | - // References: | ||
157 | - // | ||
158 | - // http://www.zedwood.com/article/cpp-check-crl-for-revocation | ||
159 | - // | ||
160 | - lib3270_autoptr(CRL_DIST_POINTS) dist_points = (CRL_DIST_POINTS *) X509_get_ext_d2i(cert, NID_crl_distribution_points, NULL, NULL); | ||
161 | - | ||
162 | - if(!dist_points) | ||
163 | - { | ||
164 | - static const LIB3270_POPUP popup = { | ||
165 | - .name = "SSL-NoDistPoints", | ||
166 | - .type = LIB3270_NOTIFY_SECURE, | ||
167 | - .summary = N_("Can't verify"), | ||
168 | - .body = N_( "The host certificate doesn't have CRL distribution points" ) | ||
169 | - }; | ||
170 | - | ||
171 | - ((SSL_ERROR_MESSAGE *) ssl_error)->popup = &popup; | ||
172 | - return EACCES; | ||
173 | - } | ||
174 | - | ||
175 | - if(lib3270_crl_new_from_dist_points(hSession, ssl_error, dist_points)) | ||
176 | - return EACCES; | ||
177 | - | ||
178 | - return 0; | ||
179 | -} | ||
180 | - | ||
181 | -int lib3270_crl_new_from_dist_points(H3270 *hSession, void *ssl_error, CRL_DIST_POINTS * dist_points) | ||
182 | -{ | ||
183 | - // | ||
184 | - // Reference: | ||
185 | - // | ||
186 | - // https://nougat.cablelabs.com/DLNA-RUI/openssl/commit/57912ed329f870b237f2fd9f2de8dec3477d1729 | ||
187 | - // | ||
188 | - size_t ix; | ||
189 | - int i; | ||
190 | - | ||
191 | - lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_string_array_new(); | ||
192 | - | ||
193 | - for(ix = 0; ix < (size_t) sk_DIST_POINT_num(dist_points); ix++) { | ||
194 | - | ||
195 | - DIST_POINT *dp = sk_DIST_POINT_value(dist_points, ix); | ||
196 | - | ||
197 | - if(!dp->distpoint || dp->distpoint->type != 0) | ||
198 | - continue; | ||
199 | - | ||
200 | - GENERAL_NAMES *gens = dp->distpoint->name.fullname; | ||
201 | - | ||
202 | - for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) | ||
203 | - { | ||
204 | - int gtype; | ||
205 | - GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i); | ||
206 | - ASN1_STRING *uri = GENERAL_NAME_get0_value(gen, >ype); | ||
207 | - | ||
208 | - if(uri && gtype == GEN_URI) | ||
209 | - { | ||
210 | - int length = ASN1_STRING_length(uri); | ||
211 | - | ||
212 | -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) // OpenSSL 1.1.0+ | ||
213 | - const unsigned char * data = ASN1_STRING_get0_data(uri); | ||
214 | -#else | ||
215 | - const unsigned char * data = ASN1_STRING_data(uri); | ||
216 | -#endif // OpenSSL 1.1.0+ | ||
217 | - | ||
218 | - if(data && length > 0) | ||
219 | - lib3270_string_array_append_with_length(uris,(char *) data, (size_t) length); | ||
220 | - | ||
221 | - } | ||
222 | - | ||
223 | - } | ||
224 | - | ||
225 | - } | ||
226 | - | ||
227 | -#ifdef DEBUG | ||
228 | - { | ||
229 | - for(ix = 0; ix < uris->length; ix++) | ||
230 | - { | ||
231 | - debug("%u: %s", (unsigned int) ix, uris->str[ix]); | ||
232 | - } | ||
233 | - } | ||
234 | -#endif // DEBUG | ||
235 | - | ||
236 | - if(hSession->ssl.crl.url) | ||
237 | - { | ||
238 | - // Check if the current URL is still valid. | ||
239 | - for(ix = 0; ix < uris->length; ix++) | ||
240 | - { | ||
241 | - if(!strcmp(hSession->ssl.crl.url,uris->str[ix])) | ||
242 | - { | ||
243 | - trace_ssl(hSession,"Keeping CRL from %s\n",hSession->ssl.crl.url); | ||
244 | - return 0; | ||
245 | - } | ||
246 | - } | ||
247 | - | ||
248 | - trace_ssl(hSession,"Discarding invalid CRL from %s\n",hSession->ssl.crl.url); | ||
249 | - | ||
250 | - // The URL is invalid or not to this cert, remove it! | ||
251 | - lib3270_free(hSession->ssl.crl.url); | ||
252 | - hSession->ssl.crl.url = NULL; | ||
253 | - } | ||
254 | - | ||
255 | - // | ||
256 | - // Downloading CRLs | ||
257 | - // | ||
258 | - if(hSession->ssl.crl.download) | ||
259 | - { | ||
260 | - if(hSession->ssl.crl.prefer && *hSession->ssl.crl.prefer) | ||
261 | - { | ||
262 | - size_t length = strlen(hSession->ssl.crl.prefer); | ||
263 | - | ||
264 | - for(ix = 0; ix < uris->length; ix++) | ||
265 | - { | ||
266 | - if(!strncmp(uris->str[ix],hSession->ssl.crl.prefer,length)) | ||
267 | - { | ||
268 | - trace_ssl(hSession,"Trying preferred URL %s\n",uris->str[ix]); | ||
269 | - if(lib3270_crl_new_from_url(hSession, ssl_error, uris->str[ix]) == 0) | ||
270 | - return 0; | ||
271 | - } | ||
272 | - | ||
273 | - } | ||
274 | - | ||
275 | - } | ||
276 | - | ||
277 | - // Can't load, try all of them. | ||
278 | - for(ix = 0; ix < uris->length; ix++) | ||
279 | - { | ||
280 | - trace_ssl(hSession,"Trying CRL from %s\n",uris->str[ix]); | ||
281 | - if(lib3270_crl_new_from_url(hSession, ssl_error, uris->str[ix]) == 0) | ||
282 | - return 0; | ||
283 | - } | ||
284 | - | ||
285 | - return -1; | ||
286 | - } | ||
287 | - | ||
288 | - return 0; | ||
289 | - | ||
290 | -} | ||
291 | - | ||
292 | -#endif // SSL_ENABLE_CRL_CHECK && HAVE_LIBSSL |
src/ssl/crl.h
@@ -1,84 +0,0 @@ | @@ -1,84 +0,0 @@ | ||
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(HAVE_LIBSSLx) | ||
39 | - | ||
40 | - #include <openssl/ssl.h> | ||
41 | - #include <openssl/err.h> | ||
42 | - | ||
43 | - /** | ||
44 | - * @brief X509 auto-cleanup. | ||
45 | - */ | ||
46 | - static inline void lib3270_autoptr_cleanup_X509(X509 **ptr) | ||
47 | - { | ||
48 | - if(*ptr) | ||
49 | - X509_free(*ptr); | ||
50 | - } | ||
51 | - | ||
52 | - /** | ||
53 | - * @brief Dist points auto-cleanup. | ||
54 | - */ | ||
55 | - static inline void lib3270_autoptr_cleanup_CRL_DIST_POINTS(CRL_DIST_POINTS **ptr) | ||
56 | - { | ||
57 | - if(*ptr) | ||
58 | - CRL_DIST_POINTS_free(*ptr); | ||
59 | - } | ||
60 | - | ||
61 | - | ||
62 | -#endif // HAVE_LIBSSL | ||
63 | - | ||
64 | -#if defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBSSLx) | ||
65 | - | ||
66 | - /// @brief Unconditional release of the session CRL. | ||
67 | - LIB3270_INTERNAL void lib3270_crl_free(H3270 *hSession); | ||
68 | - | ||
69 | - /// @brief Load CRL from URL. | ||
70 | - LIB3270_INTERNAL int lib3270_crl_new_from_url(H3270 *hSession, void *ssl_error, const char *url); | ||
71 | - | ||
72 | - /// @brief Load CRL from X509 certificate. | ||
73 | - LIB3270_INTERNAL int lib3270_crl_new_from_x509(H3270 *hSession, void *ssl_error, X509 *cert); | ||
74 | - | ||
75 | - /// @brief Load CRL from distribution points. | ||
76 | - LIB3270_INTERNAL int lib3270_crl_new_from_dist_points(H3270 *hSession, void *ssl_error, CRL_DIST_POINTS * dist_points); | ||
77 | - | ||
78 | - LIB3270_INTERNAL X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *url); | ||
79 | - | ||
80 | - | ||
81 | -#endif // SSL_ENABLE_CRL_CHECK && HAVE_LIBSSL | ||
82 | - | ||
83 | - | ||
84 | - |
src/ssl/linux/getcrl.c
@@ -1,144 +0,0 @@ | @@ -1,144 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include "private.h" | ||
37 | - | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
39 | - | ||
40 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
41 | - | ||
42 | -static inline void lib3270_autoptr_cleanup_FILE(FILE **file) | ||
43 | -{ | ||
44 | - if(*file) | ||
45 | - fclose(*file); | ||
46 | -} | ||
47 | - | ||
48 | -X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
49 | -{ | ||
50 | - X509_CRL * x509_crl = NULL; | ||
51 | - | ||
52 | - if(!(consturl && *consturl)) | ||
53 | - { | ||
54 | - static const LIB3270_POPUP popup = { | ||
55 | - .type = LIB3270_NOTIFY_SECURE, | ||
56 | - .name = "SSL-INVCRLURL", | ||
57 | - .summary = N_( "Can't open CRL File" ), | ||
58 | - .body = N_("The URL for the CRL is undefined or empty") | ||
59 | - }; | ||
60 | - | ||
61 | - message->code = hSession->ssl.error = 0; | ||
62 | - message->popup = &popup; | ||
63 | - errno = ENOENT; | ||
64 | - return NULL; | ||
65 | - } | ||
66 | - | ||
67 | - if(strncasecmp(consturl,"file://",7) == 0) | ||
68 | - { | ||
69 | - lib3270_autoptr(FILE) hCRL = fopen(consturl+7,"r"); | ||
70 | - | ||
71 | - if(!hCRL) | ||
72 | - { | ||
73 | - // Can't open CRL File. | ||
74 | - int err = errno; | ||
75 | - | ||
76 | - static const LIB3270_POPUP popup = { | ||
77 | - .type = LIB3270_NOTIFY_SECURE, | ||
78 | - .name = "SSL-CRLOPEN", | ||
79 | - .summary = N_( "Can't open CRL File" ) | ||
80 | - }; | ||
81 | - | ||
82 | - message->code = hSession->ssl.error = 0; | ||
83 | - message->popup = &popup; | ||
84 | - | ||
85 | - trace_ssl(hSession,"Can't open %s: %s\n",consturl,strerror(err)); | ||
86 | - | ||
87 | - return NULL; | ||
88 | - | ||
89 | - } | ||
90 | - | ||
91 | - trace_ssl(hSession,"Loading CRL from %s\n",consturl+7); | ||
92 | - if(d2i_X509_CRL_fp(hCRL, &x509_crl)) | ||
93 | - { | ||
94 | - static const LIB3270_POPUP popup = { | ||
95 | - .type = LIB3270_NOTIFY_SECURE, | ||
96 | - .name = "SSL-CRLDECODE", | ||
97 | - .summary = N_( "Can't decode CRL" ) | ||
98 | - }; | ||
99 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
100 | - message->popup = &popup; | ||
101 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, popup.summary); | ||
102 | - return NULL; | ||
103 | - } | ||
104 | - | ||
105 | - } | ||
106 | -#ifdef HAVE_LDAP | ||
107 | - else if(strncasecmp(consturl,"ldap://",7) == 0 && strlen(consturl) > 8) | ||
108 | - { | ||
109 | - return get_crl_using_ldap(hSession, message, consturl); | ||
110 | - | ||
111 | - } | ||
112 | -#endif // HAVE_LDAP | ||
113 | - else | ||
114 | - { | ||
115 | -#ifdef HAVE_LIBCURL | ||
116 | - | ||
117 | - return get_crl_using_url(hSession, message, consturl); | ||
118 | - | ||
119 | -#else | ||
120 | - // Can't get CRL. | ||
121 | - | ||
122 | - message->error = hSession->ssl.error = 0; | ||
123 | - | ||
124 | - if(!(message->text && message->description)) | ||
125 | - message->title = _( "Security error" ); | ||
126 | - | ||
127 | - if(!message->text) | ||
128 | - message->text = _( "Unexpected or invalid CRL URL" ); | ||
129 | - | ||
130 | - if(!message->description) | ||
131 | - message->description = _("The URL scheme is unknown"); | ||
132 | - | ||
133 | - trace_ssl(hSession,"%s: The URL scheme is unknown",consturl); | ||
134 | - | ||
135 | - errno = EINVAL; | ||
136 | - return NULL; | ||
137 | -#endif // HAVE_LIBCURL | ||
138 | - } | ||
139 | - | ||
140 | - return x509_crl; | ||
141 | - | ||
142 | -} | ||
143 | - | ||
144 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK |
src/ssl/linux/ldap.c
@@ -1,241 +0,0 @@ | @@ -1,241 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include <config.h> | ||
37 | -#include <internals.h> | ||
38 | -#include <lib3270/log.h> | ||
39 | -#include <lib3270/trace.h> | ||
40 | -#include <lib3270/toggle.h> | ||
41 | - | ||
42 | -#include "utilc.h" | ||
43 | - | ||
44 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LDAP) | ||
45 | - | ||
46 | -#include <openssl/ssl.h> | ||
47 | -#include <openssl/err.h> | ||
48 | -#include <openssl/x509_vfy.h> | ||
49 | -#include <openssl/x509.h> | ||
50 | - | ||
51 | -#define LDAP_DEPRECATED 1 | ||
52 | -#include <ldap.h> | ||
53 | - | ||
54 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
55 | - | ||
56 | -static inline void lib3270_autoptr_cleanup_LDAPMessage(LDAPMessage **message) | ||
57 | -{ | ||
58 | - debug("%s(%p)",__FUNCTION__,*message); | ||
59 | - if(message) | ||
60 | - ldap_msgfree(*message); | ||
61 | - *message = NULL; | ||
62 | -} | ||
63 | - | ||
64 | -static inline void lib3270_autoptr_cleanup_LDAP(LDAP **ld) | ||
65 | -{ | ||
66 | - debug("%s(%p)",__FUNCTION__,*ld); | ||
67 | - if(*ld) | ||
68 | - ldap_unbind_ext(*ld, NULL, NULL); | ||
69 | - *ld = NULL; | ||
70 | -} | ||
71 | - | ||
72 | -static inline void lib3270_autoptr_cleanup_BerElement(BerElement **ber) | ||
73 | -{ | ||
74 | - debug("%s(%p)",__FUNCTION__,*ber); | ||
75 | - if(*ber) | ||
76 | - ber_free(*ber, 0); | ||
77 | - *ber = NULL; | ||
78 | -} | ||
79 | - | ||
80 | -static inline void lib3270_autoptr_cleanup_LDAPPTR(char **ptr) | ||
81 | -{ | ||
82 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
83 | - if(*ptr) | ||
84 | - ldap_memfree(*ptr); | ||
85 | - *ptr = NULL; | ||
86 | -} | ||
87 | - | ||
88 | -LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
89 | -{ | ||
90 | - X509_CRL * x509_crl = NULL; | ||
91 | - | ||
92 | - int rc; | ||
93 | - lib3270_autoptr(char) url = lib3270_unescape(consturl); | ||
94 | - char * base = strchr(url+7,'/'); | ||
95 | - char * attrs[] = { NULL, NULL }; | ||
96 | - | ||
97 | - if(!base) | ||
98 | - { | ||
99 | - message->error = hSession->ssl.error = 0; | ||
100 | - message->title = _( "Security error" ); | ||
101 | - message->text = _( "No DN of the entry at which to start the search on the URL" ); | ||
102 | - message->description = _( "The URL argument should be in the format ldap://[HOST]/[DN]?attribute" ); | ||
103 | - errno = EINVAL; | ||
104 | - return NULL; | ||
105 | - } | ||
106 | - | ||
107 | - *(base++) = 0; | ||
108 | - attrs[0] = strchr(base,'?'); | ||
109 | - | ||
110 | - if(!base) | ||
111 | - { | ||
112 | - message->error = hSession->ssl.error = 0; | ||
113 | - message->title = _( "Security error" ); | ||
114 | - message->text = _( "No LDAP attribute on the URL" ); | ||
115 | - message->description = _( "The URL argument should be in the format ldap://[HOST]/[DN]?attribute" ); | ||
116 | - errno = EINVAL; | ||
117 | - return NULL; | ||
118 | - } | ||
119 | - | ||
120 | - *(attrs[0]++) = 0; | ||
121 | - | ||
122 | - debug("host: \"%s\"",url); | ||
123 | - debug("Base: \"%s\"",base); | ||
124 | - debug("Attr: \"%s\"",attrs[0]); | ||
125 | - | ||
126 | - // Do LDAP Query | ||
127 | - LDAP __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_LDAP))) *ld = NULL; | ||
128 | - BerElement __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_BerElement))) * ber = NULL; | ||
129 | - | ||
130 | - rc = ldap_initialize(&ld, url); | ||
131 | - if(rc != LDAP_SUCCESS) | ||
132 | - { | ||
133 | - message->error = hSession->ssl.error = 0; | ||
134 | - message->title = _( "Security error" ); | ||
135 | - message->text = _( "Can't initialize LDAP" ); | ||
136 | - message->description = ldap_err2string(rc); | ||
137 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
138 | - return NULL; | ||
139 | - } | ||
140 | - | ||
141 | - unsigned long version = LDAP_VERSION3; | ||
142 | - rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,(void *) &version); | ||
143 | - if(rc != LDAP_SUCCESS) { | ||
144 | - message->error = hSession->ssl.error = 0; | ||
145 | - message->title = _( "Security error" ); | ||
146 | - message->text = _( "Can't set LDAP protocol version" ); | ||
147 | - message->description = ldap_err2string(rc); | ||
148 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
149 | - return NULL; | ||
150 | - } | ||
151 | - | ||
152 | - rc = ldap_simple_bind_s(ld, "", ""); | ||
153 | - if(rc != LDAP_SUCCESS) | ||
154 | - { | ||
155 | - message->error = hSession->ssl.error = 0; | ||
156 | - message->title = _( "Security error" ); | ||
157 | - message->text = _( "Can't bind to LDAP server" ); | ||
158 | - message->description = ldap_err2string(rc); | ||
159 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
160 | - return NULL; | ||
161 | - } | ||
162 | - | ||
163 | - lib3270_autoptr(LDAPMessage) results = NULL; | ||
164 | - rc = ldap_search_ext_s( | ||
165 | - ld, // Specifies the LDAP pointer returned by a previous call to ldap_init(), ldap_ssl_init(), or ldap_open(). | ||
166 | - base, // Specifies the DN of the entry at which to start the search. | ||
167 | - LDAP_SCOPE_BASE, // Specifies the scope of the search. | ||
168 | - NULL, // Specifies a string representation of the filter to apply in the search. | ||
169 | - (char **) &attrs, // Specifies a null-terminated array of character string attribute types to return from entries that match filter. | ||
170 | - 0, // Should be set to 1 to request attribute types only. Set to 0 to request both attributes types and attribute values. | ||
171 | - NULL, | ||
172 | - NULL, | ||
173 | - NULL, | ||
174 | - 0, | ||
175 | - &results | ||
176 | - ); | ||
177 | - | ||
178 | - if(rc != LDAP_SUCCESS) | ||
179 | - { | ||
180 | - message->error = hSession->ssl.error = 0; | ||
181 | - message->title = _( "Security error" ); | ||
182 | - message->text = _( "Can't search LDAP server" ); | ||
183 | - message->description = ldap_err2string(rc); | ||
184 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
185 | - return NULL; | ||
186 | - } | ||
187 | - | ||
188 | - char __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_LDAPPTR))) *attr = ldap_first_attribute(ld, results, &ber); | ||
189 | - if(!attr) | ||
190 | - { | ||
191 | - message->error = hSession->ssl.error = 0; | ||
192 | - message->title = _( "Security error" ); | ||
193 | - message->text = _( "Can't get LDAP attribute" ); | ||
194 | - message->description = _("Search did not produce any attributes."); | ||
195 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
196 | - errno = ENOENT; | ||
197 | - return NULL; | ||
198 | - } | ||
199 | - | ||
200 | - struct berval ** value = ldap_get_values_len(ld, results, attr); | ||
201 | - if(!value) | ||
202 | - { | ||
203 | - message->error = hSession->ssl.error = 0; | ||
204 | - message->title = _( "Security error" ); | ||
205 | - message->text = _( "Can't get LDAP attribute" ); | ||
206 | - message->description = _("Search did not produce any values."); | ||
207 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
208 | - errno = ENOENT; | ||
209 | - return NULL; | ||
210 | - } | ||
211 | - | ||
212 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
213 | - { | ||
214 | - lib3270_trace_data( | ||
215 | - hSession, | ||
216 | - "CRL Data received from LDAP server", | ||
217 | - (const unsigned char *) value[0]->bv_val, | ||
218 | - value[0]->bv_len | ||
219 | - ); | ||
220 | - } | ||
221 | - | ||
222 | - // Precisa salvar uma cópia porque d2i_X509_CRL modifica o ponteiro. | ||
223 | - const unsigned char *crl_data = (const unsigned char *) value[0]->bv_val; | ||
224 | - | ||
225 | - if(!d2i_X509_CRL(&x509_crl, &crl_data, value[0]->bv_len)) | ||
226 | - { | ||
227 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
228 | - message->title = _( "Security error" ); | ||
229 | - message->text = _( "Can't decode certificate revocation list" ); | ||
230 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->text); | ||
231 | - ldap_value_free_len(value); | ||
232 | - return NULL; | ||
233 | - } | ||
234 | - | ||
235 | - ldap_value_free_len(value); | ||
236 | - | ||
237 | - return x509_crl; | ||
238 | - | ||
239 | -} | ||
240 | - | ||
241 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK && HAVE_LDAP |
src/ssl/linux/private.h
@@ -1,63 +0,0 @@ | @@ -1,63 +0,0 @@ | ||
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 | -#ifndef LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED | ||
31 | - | ||
32 | - #define LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED | ||
33 | - | ||
34 | - #include <config.h> | ||
35 | - | ||
36 | - #include <openssl/ssl.h> | ||
37 | - #include <openssl/err.h> | ||
38 | - #include <openssl/x509_vfy.h> | ||
39 | - #include <openssl/x509.h> | ||
40 | - | ||
41 | - #include <internals.h> | ||
42 | - #include <trace_dsc.h> | ||
43 | - #include <errno.h> | ||
44 | - #include <lib3270.h> | ||
45 | - #include <lib3270/trace.h> | ||
46 | - #include <lib3270/log.h> | ||
47 | - | ||
48 | - #if defined(HAVE_LIBSSL) && defined(HAVE_LDAP) | ||
49 | - | ||
50 | - /// @brief Use libldap to get CRL. | ||
51 | - LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
52 | - | ||
53 | - #endif // HAVE_LDAP | ||
54 | - | ||
55 | - #if defined (HAVE_LIBSSLx) && defined(HAVE_LIBCURL) | ||
56 | - | ||
57 | - /// @brief Use libcurl to get CRL. | ||
58 | - LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
59 | - | ||
60 | - #endif // HAVE_LIBCURL | ||
61 | - | ||
62 | - | ||
63 | -#endif // !LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED |
src/ssl/linux/url.c
@@ -1,146 +0,0 @@ | @@ -1,146 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include <config.h> | ||
37 | - | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBCURL) | ||
39 | - | ||
40 | -#include "private.h" | ||
41 | -#include <curl/curl.h> | ||
42 | -#include <lib3270/toggle.h> | ||
43 | - | ||
44 | -#define CRL_DATA_LENGTH 2048 | ||
45 | - | ||
46 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
47 | - | ||
48 | -static inline void lib3270_autoptr_cleanup_BIO(BIO **ptr) | ||
49 | -{ | ||
50 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
51 | - if(*ptr) | ||
52 | - BIO_free_all(*ptr); | ||
53 | - *ptr = NULL; | ||
54 | -} | ||
55 | - | ||
56 | -LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
57 | -{ | ||
58 | - X509_CRL * x509_crl = NULL; | ||
59 | - | ||
60 | - size_t szText = 0; | ||
61 | - const char * error_message = NULL; | ||
62 | - lib3270_autoptr(char) httpText = lib3270_get_from_url(hSession, consturl, &szText, &error_message); | ||
63 | - | ||
64 | - if(!httpText) | ||
65 | - { | ||
66 | - LIB3270_POPUP popup = { | ||
67 | - .type = LIB3270_NOTIFY_SECURE, | ||
68 | - .name = "SSL-CantGetCRL", | ||
69 | - .summary = N_( "Error getting certificate revocation list" ), | ||
70 | - .body = error_message | ||
71 | - }; | ||
72 | - message->popup = &popup; | ||
73 | - return NULL; | ||
74 | - } | ||
75 | - | ||
76 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
77 | - lib3270_trace_data(hSession,"CRL Data",(const unsigned char *) httpText, (unsigned int) szText); | ||
78 | - | ||
79 | - if(strncasecmp(consturl,"ldap://",7) == 0) | ||
80 | - { | ||
81 | - // It's an LDAP query, assumes a base64 data. | ||
82 | - char * data = strstr((char *) httpText,":: "); | ||
83 | - if(!data) | ||
84 | - { | ||
85 | - static const LIB3270_POPUP popup = { | ||
86 | - .type = LIB3270_NOTIFY_SECURE, | ||
87 | - .summary = N_( "Got a bad formatted certificate revocation list from LDAP server" ) | ||
88 | - }; | ||
89 | - | ||
90 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
91 | - message->popup = &popup; | ||
92 | - lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n", consturl, httpText); | ||
93 | - errno = EINVAL; | ||
94 | - return NULL; | ||
95 | - } | ||
96 | - data += 3; | ||
97 | - | ||
98 | - lib3270_autoptr(BIO) bio = BIO_new_mem_buf(httpText,-1); | ||
99 | - | ||
100 | - BIO * b64 = BIO_new(BIO_f_base64()); | ||
101 | - bio = BIO_push(b64, bio); | ||
102 | - | ||
103 | - BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); | ||
104 | - | ||
105 | - if(!d2i_X509_CRL_bio(bio, &x509_crl)) | ||
106 | - { | ||
107 | - static const LIB3270_POPUP popup = { | ||
108 | - .type = LIB3270_NOTIFY_SECURE, | ||
109 | - .summary = N_( "Can't decode certificate revocation list got from LDAP server" ) | ||
110 | - }; | ||
111 | - | ||
112 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
113 | - message->popup = &popup; | ||
114 | - | ||
115 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, popup.summary); | ||
116 | - errno = EINVAL; | ||
117 | - return NULL; | ||
118 | - } | ||
119 | - | ||
120 | - } | ||
121 | - else | ||
122 | - { | ||
123 | - // CRL File, convert it | ||
124 | - // Copy the pointer because d2i_X509_CRL changes the value!!! | ||
125 | - const unsigned char *crl_data = (const unsigned char *) httpText; | ||
126 | - | ||
127 | - if(!d2i_X509_CRL(&x509_crl, &crl_data, szText)) | ||
128 | - { | ||
129 | - static const LIB3270_POPUP popup = { | ||
130 | - .type = LIB3270_NOTIFY_SECURE, | ||
131 | - .summary = N_( "Can't decode certificate revocation list" ) | ||
132 | - }; | ||
133 | - | ||
134 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
135 | - message->popup = &popup; | ||
136 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, popup.summary); | ||
137 | - return NULL; | ||
138 | - } | ||
139 | - | ||
140 | - } | ||
141 | - | ||
142 | - return x509_crl; | ||
143 | - | ||
144 | -} | ||
145 | - | ||
146 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK && HAVE_LIBCURL |
src/ssl/macos/getcrl.c
@@ -1,131 +0,0 @@ | @@ -1,131 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include "private.h" | ||
37 | - | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
39 | - | ||
40 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
41 | - | ||
42 | -static inline void lib3270_autoptr_cleanup_FILE(FILE **file) | ||
43 | -{ | ||
44 | - if(*file) | ||
45 | - fclose(*file); | ||
46 | -} | ||
47 | - | ||
48 | -X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
49 | -{ | ||
50 | - X509_CRL * x509_crl = NULL; | ||
51 | - | ||
52 | - if(!(consturl && *consturl)) | ||
53 | - { | ||
54 | - message->error = hSession->ssl.error = 0; | ||
55 | - message->title = _( "Security error" ); | ||
56 | - message->text = _( "Can't open CRL File" ); | ||
57 | - message->description = _("The URL for the CRL is undefined or empty"); | ||
58 | - errno = ENOENT; | ||
59 | - return NULL; | ||
60 | - } | ||
61 | - | ||
62 | - if(strncasecmp(consturl,"file://",7) == 0) | ||
63 | - { | ||
64 | - lib3270_autoptr(FILE) hCRL = fopen(consturl+7,"r"); | ||
65 | - | ||
66 | - if(!hCRL) | ||
67 | - { | ||
68 | - // Can't open CRL File. | ||
69 | - int err = errno; | ||
70 | - | ||
71 | - message->error = hSession->ssl.error = 0; | ||
72 | - message->title = _( "Security error" ); | ||
73 | - message->text = _( "Can't open CRL File" ); | ||
74 | - message->description = strerror(err); | ||
75 | - trace_ssl(hSession,"Can't open %s: %s\n",consturl,message->description); | ||
76 | - return NULL; | ||
77 | - | ||
78 | - } | ||
79 | - | ||
80 | - trace_ssl(hSession,"Loading CRL from %s\n",consturl+7); | ||
81 | - if(d2i_X509_CRL_fp(hCRL, &x509_crl)) | ||
82 | - { | ||
83 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
84 | - message->title = _( "Security error" ); | ||
85 | - message->text = _( "Can't decode CRL" ); | ||
86 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | ||
87 | - return NULL; | ||
88 | - } | ||
89 | - | ||
90 | - | ||
91 | - | ||
92 | - } | ||
93 | -#ifdef HAVE_LDAP | ||
94 | - else if(strncasecmp(consturl,"ldap://",7) == 0 && strlen(consturl) > 8) | ||
95 | - { | ||
96 | - return get_crl_using_ldap(hSession, message, consturl); | ||
97 | - | ||
98 | - } | ||
99 | -#endif // HAVE_LDAP | ||
100 | - else | ||
101 | - { | ||
102 | -#ifdef HAVE_LIBCURL | ||
103 | - | ||
104 | - return get_crl_using_url(hSession, message, consturl); | ||
105 | - | ||
106 | -#else | ||
107 | - // Can't get CRL. | ||
108 | - | ||
109 | - message->error = hSession->ssl.error = 0; | ||
110 | - | ||
111 | - if(!(message->text && message->description)) | ||
112 | - message->title = _( "Security error" ); | ||
113 | - | ||
114 | - if(!message->text) | ||
115 | - message->text = _( "Unexpected or invalid CRL URL" ); | ||
116 | - | ||
117 | - if(!message->description) | ||
118 | - message->description = _("The URL scheme is unknown"); | ||
119 | - | ||
120 | - trace_ssl(hSession,"%s: The URL scheme is unknown",consturl); | ||
121 | - | ||
122 | - errno = EINVAL; | ||
123 | - return NULL; | ||
124 | -#endif // HAVE_LIBCURL | ||
125 | - } | ||
126 | - | ||
127 | - return x509_crl; | ||
128 | - | ||
129 | -} | ||
130 | - | ||
131 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK |
src/ssl/macos/init.c
@@ -1,118 +0,0 @@ | @@ -1,118 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -/** | ||
37 | - * @brief OpenSSL initialization for linux. | ||
38 | - * | ||
39 | - */ | ||
40 | - | ||
41 | -#include <config.h> | ||
42 | - | ||
43 | -#if defined(HAVE_LIBSSL) | ||
44 | - | ||
45 | -#include <openssl/ssl.h> | ||
46 | -#include <openssl/err.h> | ||
47 | -#include <openssl/x509_vfy.h> | ||
48 | - | ||
49 | -#ifndef SSL_ST_OK | ||
50 | - #define SSL_ST_OK 3 | ||
51 | -#endif // !SSL_ST_OK | ||
52 | - | ||
53 | -#include <internals.h> | ||
54 | -#include <errno.h> | ||
55 | -#include <lib3270.h> | ||
56 | -#include <lib3270/internals.h> | ||
57 | -#include <lib3270/trace.h> | ||
58 | -#include <lib3270/log.h> | ||
59 | -#include "trace_dsc.h" | ||
60 | - | ||
61 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
62 | - #include <openssl/x509.h> | ||
63 | -#endif // SSL_ENABLE_CRL_CHECK | ||
64 | - | ||
65 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
66 | - | ||
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) | ||
74 | -{ | ||
75 | - debug("%s ssl_ctx=%p",__FUNCTION__,ssl_ctx); | ||
76 | - | ||
77 | - if(ssl_ctx) | ||
78 | - return 0; | ||
79 | - | ||
80 | - trace_ssl(hSession,"Initializing SSL context.\n"); | ||
81 | - | ||
82 | - SSL_load_error_strings(); | ||
83 | - SSL_library_init(); | ||
84 | - | ||
85 | - ssl_ctx = SSL_CTX_new(SSLv23_method()); | ||
86 | - if(ssl_ctx == NULL) | ||
87 | - { | ||
88 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
89 | - message->title = _( "Security error" ); | ||
90 | - message->text = _( "Cant initialize the SSL context." ); | ||
91 | - return -1; | ||
92 | - } | ||
93 | - | ||
94 | - SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL); | ||
95 | - SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); | ||
96 | - | ||
97 | - SSL_CTX_set_default_verify_paths(ssl_ctx); | ||
98 | - | ||
99 | - ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); | ||
100 | - | ||
101 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
102 | - | ||
103 | - // Enable CRL check | ||
104 | - X509_STORE *store = SSL_CTX_get_cert_store(ssl_ctx); | ||
105 | - X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | ||
106 | - X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | ||
107 | - X509_STORE_set1_param(store, param); | ||
108 | - X509_VERIFY_PARAM_free(param); | ||
109 | - | ||
110 | - trace_ssl(hSession,"CRL CHECK was enabled\n"); | ||
111 | - | ||
112 | -#endif // SSL_ENABLE_CRL_CHECK | ||
113 | - | ||
114 | - return 0; | ||
115 | - | ||
116 | -} | ||
117 | - | ||
118 | -#endif // HAVE_LIBSSL |
src/ssl/macos/ldap.c
@@ -1,241 +0,0 @@ | @@ -1,241 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include <config.h> | ||
37 | -#include <internals.h> | ||
38 | -#include <lib3270/log.h> | ||
39 | -#include <lib3270/trace.h> | ||
40 | -#include <lib3270/toggle.h> | ||
41 | - | ||
42 | -#include "utilc.h" | ||
43 | - | ||
44 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LDAP) | ||
45 | - | ||
46 | -#include <openssl/ssl.h> | ||
47 | -#include <openssl/err.h> | ||
48 | -#include <openssl/x509_vfy.h> | ||
49 | -#include <openssl/x509.h> | ||
50 | - | ||
51 | -#define LDAP_DEPRECATED 1 | ||
52 | -#include <ldap.h> | ||
53 | - | ||
54 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
55 | - | ||
56 | -static inline void lib3270_autoptr_cleanup_LDAPMessage(LDAPMessage **message) | ||
57 | -{ | ||
58 | - debug("%s(%p)",__FUNCTION__,*message); | ||
59 | - if(message) | ||
60 | - ldap_msgfree(*message); | ||
61 | - *message = NULL; | ||
62 | -} | ||
63 | - | ||
64 | -static inline void lib3270_autoptr_cleanup_LDAP(LDAP **ld) | ||
65 | -{ | ||
66 | - debug("%s(%p)",__FUNCTION__,*ld); | ||
67 | - if(*ld) | ||
68 | - ldap_unbind_ext(*ld, NULL, NULL); | ||
69 | - *ld = NULL; | ||
70 | -} | ||
71 | - | ||
72 | -static inline void lib3270_autoptr_cleanup_BerElement(BerElement **ber) | ||
73 | -{ | ||
74 | - debug("%s(%p)",__FUNCTION__,*ber); | ||
75 | - if(*ber) | ||
76 | - ber_free(*ber, 0); | ||
77 | - *ber = NULL; | ||
78 | -} | ||
79 | - | ||
80 | -static inline void lib3270_autoptr_cleanup_LDAPPTR(char **ptr) | ||
81 | -{ | ||
82 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
83 | - if(*ptr) | ||
84 | - ldap_memfree(*ptr); | ||
85 | - *ptr = NULL; | ||
86 | -} | ||
87 | - | ||
88 | -LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
89 | -{ | ||
90 | - X509_CRL * x509_crl = NULL; | ||
91 | - | ||
92 | - int rc; | ||
93 | - lib3270_autoptr(char) url = lib3270_unescape(consturl); | ||
94 | - char * base = strchr(url+7,'/'); | ||
95 | - char * attrs[] = { NULL, NULL }; | ||
96 | - | ||
97 | - if(!base) | ||
98 | - { | ||
99 | - message->error = hSession->ssl.error = 0; | ||
100 | - message->title = _( "Security error" ); | ||
101 | - message->text = _( "No DN of the entry at which to start the search on the URL" ); | ||
102 | - message->description = _( "The URL argument should be in the format ldap://[HOST]/[DN]?attribute" ); | ||
103 | - errno = EINVAL; | ||
104 | - return NULL; | ||
105 | - } | ||
106 | - | ||
107 | - *(base++) = 0; | ||
108 | - attrs[0] = strchr(base,'?'); | ||
109 | - | ||
110 | - if(!base) | ||
111 | - { | ||
112 | - message->error = hSession->ssl.error = 0; | ||
113 | - message->title = _( "Security error" ); | ||
114 | - message->text = _( "No LDAP attribute on the URL" ); | ||
115 | - message->description = _( "The URL argument should be in the format ldap://[HOST]/[DN]?attribute" ); | ||
116 | - errno = EINVAL; | ||
117 | - return NULL; | ||
118 | - } | ||
119 | - | ||
120 | - *(attrs[0]++) = 0; | ||
121 | - | ||
122 | - debug("host: \"%s\"",url); | ||
123 | - debug("Base: \"%s\"",base); | ||
124 | - debug("Attr: \"%s\"",attrs[0]); | ||
125 | - | ||
126 | - // Do LDAP Query | ||
127 | - LDAP __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_LDAP))) *ld = NULL; | ||
128 | - BerElement __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_BerElement))) * ber = NULL; | ||
129 | - | ||
130 | - rc = ldap_initialize(&ld, url); | ||
131 | - if(rc != LDAP_SUCCESS) | ||
132 | - { | ||
133 | - message->error = hSession->ssl.error = 0; | ||
134 | - message->title = _( "Security error" ); | ||
135 | - message->text = _( "Can't initialize LDAP" ); | ||
136 | - message->description = ldap_err2string(rc); | ||
137 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
138 | - return NULL; | ||
139 | - } | ||
140 | - | ||
141 | - unsigned long version = LDAP_VERSION3; | ||
142 | - rc = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,(void *) &version); | ||
143 | - if(rc != LDAP_SUCCESS) { | ||
144 | - message->error = hSession->ssl.error = 0; | ||
145 | - message->title = _( "Security error" ); | ||
146 | - message->text = _( "Can't set LDAP protocol version" ); | ||
147 | - message->description = ldap_err2string(rc); | ||
148 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
149 | - return NULL; | ||
150 | - } | ||
151 | - | ||
152 | - rc = ldap_simple_bind_s(ld, "", ""); | ||
153 | - if(rc != LDAP_SUCCESS) | ||
154 | - { | ||
155 | - message->error = hSession->ssl.error = 0; | ||
156 | - message->title = _( "Security error" ); | ||
157 | - message->text = _( "Can't bind to LDAP server" ); | ||
158 | - message->description = ldap_err2string(rc); | ||
159 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
160 | - return NULL; | ||
161 | - } | ||
162 | - | ||
163 | - lib3270_autoptr(LDAPMessage) results = NULL; | ||
164 | - rc = ldap_search_ext_s( | ||
165 | - ld, // Specifies the LDAP pointer returned by a previous call to ldap_init(), ldap_ssl_init(), or ldap_open(). | ||
166 | - base, // Specifies the DN of the entry at which to start the search. | ||
167 | - LDAP_SCOPE_BASE, // Specifies the scope of the search. | ||
168 | - NULL, // Specifies a string representation of the filter to apply in the search. | ||
169 | - (char **) &attrs, // Specifies a null-terminated array of character string attribute types to return from entries that match filter. | ||
170 | - 0, // Should be set to 1 to request attribute types only. Set to 0 to request both attributes types and attribute values. | ||
171 | - NULL, | ||
172 | - NULL, | ||
173 | - NULL, | ||
174 | - 0, | ||
175 | - &results | ||
176 | - ); | ||
177 | - | ||
178 | - if(rc != LDAP_SUCCESS) | ||
179 | - { | ||
180 | - message->error = hSession->ssl.error = 0; | ||
181 | - message->title = _( "Security error" ); | ||
182 | - message->text = _( "Can't search LDAP server" ); | ||
183 | - message->description = ldap_err2string(rc); | ||
184 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
185 | - return NULL; | ||
186 | - } | ||
187 | - | ||
188 | - char __attribute__ ((__cleanup__(lib3270_autoptr_cleanup_LDAPPTR))) *attr = ldap_first_attribute(ld, results, &ber); | ||
189 | - if(!attr) | ||
190 | - { | ||
191 | - message->error = hSession->ssl.error = 0; | ||
192 | - message->title = _( "Security error" ); | ||
193 | - message->text = _( "Can't get LDAP attribute" ); | ||
194 | - message->description = _("Search did not produce any attributes."); | ||
195 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
196 | - errno = ENOENT; | ||
197 | - return NULL; | ||
198 | - } | ||
199 | - | ||
200 | - struct berval ** value = ldap_get_values_len(ld, results, attr); | ||
201 | - if(!value) | ||
202 | - { | ||
203 | - message->error = hSession->ssl.error = 0; | ||
204 | - message->title = _( "Security error" ); | ||
205 | - message->text = _( "Can't get LDAP attribute" ); | ||
206 | - message->description = _("Search did not produce any values."); | ||
207 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->description); | ||
208 | - errno = ENOENT; | ||
209 | - return NULL; | ||
210 | - } | ||
211 | - | ||
212 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
213 | - { | ||
214 | - lib3270_trace_data( | ||
215 | - hSession, | ||
216 | - "CRL Data received from LDAP server", | ||
217 | - (const unsigned char *) value[0]->bv_val, | ||
218 | - value[0]->bv_len | ||
219 | - ); | ||
220 | - } | ||
221 | - | ||
222 | - // Precisa salvar uma cópia porque d2i_X509_CRL modifica o ponteiro. | ||
223 | - const unsigned char *crl_data = (const unsigned char *) value[0]->bv_val; | ||
224 | - | ||
225 | - if(!d2i_X509_CRL(&x509_crl, &crl_data, value[0]->bv_len)) | ||
226 | - { | ||
227 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
228 | - message->title = _( "Security error" ); | ||
229 | - message->text = _( "Can't decode certificate revocation list" ); | ||
230 | - lib3270_write_log(hSession,"ssl","%s: %s",url, message->text); | ||
231 | - ldap_value_free_len(value); | ||
232 | - return NULL; | ||
233 | - } | ||
234 | - | ||
235 | - ldap_value_free_len(value); | ||
236 | - | ||
237 | - return x509_crl; | ||
238 | - | ||
239 | -} | ||
240 | - | ||
241 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK && HAVE_LDAP |
src/ssl/macos/private.h
@@ -1,63 +0,0 @@ | @@ -1,63 +0,0 @@ | ||
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 | -#ifndef LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED | ||
31 | - | ||
32 | - #define LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED | ||
33 | - | ||
34 | - #include <config.h> | ||
35 | - | ||
36 | - #include <openssl/ssl.h> | ||
37 | - #include <openssl/err.h> | ||
38 | - #include <openssl/x509_vfy.h> | ||
39 | - #include <openssl/x509.h> | ||
40 | - | ||
41 | - #include <internals.h> | ||
42 | - #include <trace_dsc.h> | ||
43 | - #include <errno.h> | ||
44 | - #include <lib3270.h> | ||
45 | - #include <lib3270/trace.h> | ||
46 | - #include <lib3270/log.h> | ||
47 | - | ||
48 | - #ifdef HAVE_LDAP | ||
49 | - | ||
50 | - /// @brief Use libldap to get CRL. | ||
51 | - LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
52 | - | ||
53 | - #endif // HAVE_LDAP | ||
54 | - | ||
55 | - #ifdef HAVE_LIBCURL | ||
56 | - | ||
57 | - /// @brief Use libcurl to get CRL. | ||
58 | - LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
59 | - | ||
60 | - #endif // HAVE_LIBCURL | ||
61 | - | ||
62 | - | ||
63 | -#endif // !LIB3270_LINUX_SSL_PRIVATE_H_INCLUDED |
src/ssl/macos/url.c
@@ -1,127 +0,0 @@ | @@ -1,127 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include <config.h> | ||
37 | - | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBCURL) | ||
39 | - | ||
40 | -#include "private.h" | ||
41 | -#include <curl/curl.h> | ||
42 | -#include <lib3270/toggle.h> | ||
43 | - | ||
44 | -#define CRL_DATA_LENGTH 2048 | ||
45 | - | ||
46 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
47 | - | ||
48 | -static inline void lib3270_autoptr_cleanup_BIO(BIO **ptr) | ||
49 | -{ | ||
50 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
51 | - if(*ptr) | ||
52 | - BIO_free_all(*ptr); | ||
53 | - *ptr = NULL; | ||
54 | -} | ||
55 | - | ||
56 | -LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
57 | -{ | ||
58 | - X509_CRL * x509_crl = NULL; | ||
59 | - | ||
60 | - size_t szText = 0; | ||
61 | - lib3270_autoptr(char) httpText = lib3270_get_from_url(hSession, consturl, &szText, &message->description); | ||
62 | - | ||
63 | - if(!httpText) | ||
64 | - { | ||
65 | - message->title = _( "Security error" ); | ||
66 | - message->text = _( "Error getting certificate revocation list" ); | ||
67 | - return NULL; | ||
68 | - } | ||
69 | - | ||
70 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
71 | - lib3270_trace_data(hSession,"CRL Data",(const unsigned char *) httpText, (unsigned int) szText); | ||
72 | - | ||
73 | - if(strncasecmp(consturl,"ldap://",7) == 0) | ||
74 | - { | ||
75 | - // It's an LDAP query, assumes a base64 data. | ||
76 | - char * data = strstr((char *) httpText,":: "); | ||
77 | - if(!data) | ||
78 | - { | ||
79 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
80 | - message->title = _( "Security error" ); | ||
81 | - message->text = _( "Got a bad formatted certificate revocation list from LDAP server" ); | ||
82 | - lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n", consturl, httpText); | ||
83 | - errno = EINVAL; | ||
84 | - return NULL; | ||
85 | - } | ||
86 | - data += 3; | ||
87 | - | ||
88 | - lib3270_autoptr(BIO) bio = BIO_new_mem_buf(httpText,-1); | ||
89 | - | ||
90 | - BIO * b64 = BIO_new(BIO_f_base64()); | ||
91 | - bio = BIO_push(b64, bio); | ||
92 | - | ||
93 | - BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); | ||
94 | - | ||
95 | - if(!d2i_X509_CRL_bio(bio, &x509_crl)) | ||
96 | - { | ||
97 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
98 | - message->title = _( "Security error" ); | ||
99 | - message->text = _( "Can't decode certificate revocation list got from LDAP server" ); | ||
100 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | ||
101 | - errno = EINVAL; | ||
102 | - return NULL; | ||
103 | - } | ||
104 | - | ||
105 | - } | ||
106 | - else | ||
107 | - { | ||
108 | - // CRL File, convert it | ||
109 | - // Copy the pointer because d2i_X509_CRL changes the value!!! | ||
110 | - const unsigned char *crl_data = (const unsigned char *) httpText; | ||
111 | - | ||
112 | - if(!d2i_X509_CRL(&x509_crl, &crl_data, szText)) | ||
113 | - { | ||
114 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
115 | - message->title = _( "Security error" ); | ||
116 | - message->text = _( "Can't decode certificate revocation list" ); | ||
117 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | ||
118 | - return NULL; | ||
119 | - } | ||
120 | - | ||
121 | - } | ||
122 | - | ||
123 | - return x509_crl; | ||
124 | - | ||
125 | -} | ||
126 | - | ||
127 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK && HAVE_LIBCURL |
src/ssl/negotiate.c
@@ -1,556 +0,0 @@ | @@ -1,556 +0,0 @@ | ||
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 <internals.h> | ||
38 | - | ||
39 | -#if defined(HAVE_LIBSSL) | ||
40 | - | ||
41 | - #include <openssl/ssl.h> | ||
42 | - #include <openssl/err.h> | ||
43 | - #include <openssl/x509_vfy.h> | ||
44 | - #include <openssl/x509v3.h> | ||
45 | - | ||
46 | - #ifndef SSL_ST_OK | ||
47 | - #define SSL_ST_OK 3 | ||
48 | - #endif // !SSL_ST_OK | ||
49 | - | ||
50 | - #include "crl.h" | ||
51 | - | ||
52 | -#endif | ||
53 | - | ||
54 | -#include <errno.h> | ||
55 | -#include <lib3270.h> | ||
56 | -#include <lib3270/internals.h> | ||
57 | -#include <lib3270/trace.h> | ||
58 | -#include <lib3270/log.h> | ||
59 | -#include <lib3270/toggle.h> | ||
60 | -#include <lib3270/properties.h> | ||
61 | -#include "hostc.h" // host_disconnect | ||
62 | -#include "trace_dsc.h" | ||
63 | - | ||
64 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
65 | - | ||
66 | -#if defined(HAVE_LIBSSLx) | ||
67 | - | ||
68 | - /** | ||
69 | - * @brief Index of h3270 handle in SSL session. | ||
70 | - * | ||
71 | - */ | ||
72 | - int ssl_3270_ex_index = -1; | ||
73 | - | ||
74 | -/** | ||
75 | - * @brief Global SSL_CTX object as framework to establish TLS/SSL or DTLS enabled connections. | ||
76 | - * | ||
77 | - */ | ||
78 | - SSL_CTX * ssl_ctx = NULL; | ||
79 | - | ||
80 | -/** | ||
81 | - * @brief Initialize openssl session. | ||
82 | - * | ||
83 | - * @param hSession lib3270 session handle. | ||
84 | - * | ||
85 | - * @return 0 if ok, non zero if fails. | ||
86 | - * | ||
87 | - */ | ||
88 | -static int background_ssl_init(H3270 *hSession, void *message) | ||
89 | -{ | ||
90 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
91 | - hSession->ssl.error = 0; | ||
92 | - hSession->ssl.host = False; | ||
93 | - | ||
94 | - if(ssl_ctx_init(hSession, (SSL_ERROR_MESSAGE *) message)) { | ||
95 | - debug("%s has failed","ssl_ctx_init"); | ||
96 | - set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); | ||
97 | - hSession->ssl.host = False; | ||
98 | - return -1; | ||
99 | - } | ||
100 | - | ||
101 | - if(hSession->ssl.con) | ||
102 | - SSL_free(hSession->ssl.con); | ||
103 | - | ||
104 | - hSession->ssl.con = SSL_new(ssl_ctx); | ||
105 | - if(hSession->ssl.con == NULL) | ||
106 | - { | ||
107 | - static const LIB3270_POPUP popup = { | ||
108 | - .type = LIB3270_NOTIFY_SECURE, | ||
109 | - .summary = N_( "Cant create a new SSL structure for current connection." ) | ||
110 | - }; | ||
111 | - | ||
112 | - ((SSL_ERROR_MESSAGE *) message)->code = hSession->ssl.error = ERR_get_error(); | ||
113 | - ((SSL_ERROR_MESSAGE *) message)->popup = &popup; | ||
114 | - return -1; | ||
115 | - } | ||
116 | - | ||
117 | - SSL_set_ex_data(hSession->ssl.con,ssl_3270_ex_index,(char *) hSession); | ||
118 | -// SSL_set_verify(session->ssl_con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); | ||
119 | - SSL_set_verify(hSession->ssl.con, 0, NULL); | ||
120 | - | ||
121 | - return 0; | ||
122 | -} | ||
123 | - | ||
124 | -#if defined(SSL_ENABLE_CRL_CHECK) | ||
125 | -int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx)) | ||
126 | -{ | ||
127 | - debug("%s(%d)",__FUNCTION__,ok); | ||
128 | - | ||
129 | -/* | ||
130 | - 55 { | ||
131 | - 56 if (!ok) { | ||
132 | - 57 Category::getInstance("OpenSSL").error( | ||
133 | - 58 "path validation failure at depth(%d): %s", | ||
134 | - 59 X509_STORE_CTX_get_error_depth(ctx), | ||
135 | - 60 X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx)) | ||
136 | - 61 ); | ||
137 | - 62 } | ||
138 | - 63 return ok; | ||
139 | - 64 } | ||
140 | -*/ | ||
141 | - return ok; | ||
142 | -} | ||
143 | -#endif // SSL_ENABLE_CRL_CHECK | ||
144 | - | ||
145 | -static const struct ssl_protocol { | ||
146 | - int id; | ||
147 | - const char * description; | ||
148 | -} ssl_protocols[] = { | ||
149 | - | ||
150 | - { | ||
151 | - .id = SSL3_VERSION, | ||
152 | - .description = SSL_TXT_SSLV3 | ||
153 | - }, | ||
154 | - { | ||
155 | - .id = TLS1_VERSION, | ||
156 | - .description = SSL_TXT_TLSV1 | ||
157 | - }, | ||
158 | - { | ||
159 | - .id = TLS1_1_VERSION, | ||
160 | - .description = SSL_TXT_TLSV1_1 | ||
161 | - }, | ||
162 | - { | ||
163 | - .id = TLS1_2_VERSION, | ||
164 | - .description = SSL_TXT_TLSV1_2 | ||
165 | - }, | ||
166 | -#ifdef DTLS1_VERSION | ||
167 | - { | ||
168 | - .id = DTLS1_VERSION, | ||
169 | - .description = "DTLSv1" | ||
170 | - }, | ||
171 | -#endif // DTLS1_VERSION | ||
172 | -#ifdef DTLS1_2_VERSION | ||
173 | - { | ||
174 | - .id = DTLS1_2_VERSION, | ||
175 | - .description = "DTLSv2" | ||
176 | - }, | ||
177 | -#endif // DTLS1_2_VERSION | ||
178 | - | ||
179 | -}; | ||
180 | - | ||
181 | -static const struct ssl_protocol * get_protocol_from_id(int id) { | ||
182 | - | ||
183 | - if(id < 1) | ||
184 | - return NULL; | ||
185 | - | ||
186 | - id--; | ||
187 | - | ||
188 | - if( ((size_t) id) > (sizeof(ssl_protocols)/sizeof(ssl_protocols[0]))) | ||
189 | - return NULL; | ||
190 | - | ||
191 | - return ssl_protocols + id; | ||
192 | - | ||
193 | -} | ||
194 | - | ||
195 | -static int background_ssl_negotiation(H3270 *hSession, void *message) | ||
196 | -{ | ||
197 | - int rv; | ||
198 | - | ||
199 | - trace("%s",__FUNCTION__); | ||
200 | - | ||
201 | - /* Initialize the SSL library. */ | ||
202 | - if(background_ssl_init(hSession,message)) | ||
203 | - { | ||
204 | - return -1; | ||
205 | - } | ||
206 | - | ||
207 | - /* Set up the TLS/SSL connection. */ | ||
208 | - const struct ssl_protocol * protocol; | ||
209 | - | ||
210 | - if( (protocol = get_protocol_from_id(hSession->ssl.protocol.min_version)) != NULL ) | ||
211 | - { | ||
212 | -#if (OPENSSL_VERSION_NUMBER >= 0x1010009fL) | ||
213 | - if(SSL_set_min_proto_version(hSession->ssl.con,protocol->id) == 1) | ||
214 | - { | ||
215 | - trace_ssl(hSession,"Minimum protocol version set to %s\n",protocol->description); | ||
216 | - } | ||
217 | - else | ||
218 | - { | ||
219 | - lib3270_write_log(hSession,"ssl","Can't set minimum protocol version to %s",protocol->description); | ||
220 | - } | ||
221 | -#else | ||
222 | - trace_ssl(hSession,"Can't set minimum protocol version to %s\n",protocol->description); | ||
223 | -#endif // OPENSSL_VERSION_NUMBER | ||
224 | - } | ||
225 | - | ||
226 | - if( (protocol = get_protocol_from_id(hSession->ssl.protocol.max_version)) != NULL ) | ||
227 | - { | ||
228 | -#if (OPENSSL_VERSION_NUMBER >= 0x1010009fL) | ||
229 | - if(SSL_set_max_proto_version(hSession->ssl.con,protocol->id) == 1) | ||
230 | - { | ||
231 | - trace_ssl(hSession,"Maximum protocol version set to %s\n",protocol->description); | ||
232 | - } | ||
233 | - else | ||
234 | - { | ||
235 | - lib3270_write_log(hSession,"ssl","Can't set maximum protocol version to %s",protocol->description); | ||
236 | - } | ||
237 | -#else | ||
238 | - trace_ssl(hSession,"Can't set maximum protocol version to %s\n",protocol->description); | ||
239 | -#endif // OPENSSL_VERSION_NUMBER | ||
240 | - } | ||
241 | - | ||
242 | - if(SSL_set_fd(hSession->ssl.con, hSession->connection.sock) != 1) | ||
243 | - { | ||
244 | - trace_ssl(hSession,"%s","SSL_set_fd failed!\n"); | ||
245 | - | ||
246 | - static const LIB3270_POPUP popup = { | ||
247 | - .summary = N_( "SSL negotiation failed" ), | ||
248 | - .body = N_( "Cant set the file descriptor for the input/output facility for the TLS/SSL (encrypted) side of ssl." ) | ||
249 | - }; | ||
250 | - | ||
251 | - ((SSL_ERROR_MESSAGE *) message)->popup = &popup; | ||
252 | - | ||
253 | - return -1; | ||
254 | - } | ||
255 | - | ||
256 | -#ifdef SSL_CRL_URL | ||
257 | - | ||
258 | - // Load CRL from pre-defined URL | ||
259 | - if(!hSession->ssl.crl.cert) | ||
260 | - { | ||
261 | - if(lib3270_crl_new_from_url(hSession, message, SSL_CRL_URL)) | ||
262 | - return EACCES; | ||
263 | - } | ||
264 | - | ||
265 | -#endif // SSL_CRL_URL | ||
266 | - | ||
267 | - trace_ssl(hSession, "%s","Running SSL_connect\n"); | ||
268 | - rv = SSL_connect(hSession->ssl.con); | ||
269 | - trace_ssl(hSession, "SSL_connect exits with rc=%d\n",rv); | ||
270 | - | ||
271 | - if (rv != 1) | ||
272 | - { | ||
273 | - ((SSL_ERROR_MESSAGE *) message)->code = SSL_get_error(hSession->ssl.con,rv); | ||
274 | - if(((SSL_ERROR_MESSAGE *) message)->code == SSL_ERROR_SYSCALL && hSession->ssl.error) | ||
275 | - ((SSL_ERROR_MESSAGE *) message)->code = hSession->ssl.error; | ||
276 | - | ||
277 | - const char * msg = ERR_lib_error_string(((SSL_ERROR_MESSAGE *) message)->code); | ||
278 | - | ||
279 | - trace_ssl(hSession,"SSL_connect failed: %s %s\n",msg,ERR_reason_error_string(hSession->ssl.error)); | ||
280 | - | ||
281 | - static const LIB3270_POPUP popup = { | ||
282 | - .type = LIB3270_NOTIFY_ERROR, | ||
283 | - .summary = N_( "SSL Connect failed" ), | ||
284 | - }; | ||
285 | - | ||
286 | - ((SSL_ERROR_MESSAGE *) message)->popup = &popup; | ||
287 | - | ||
288 | - return -1; | ||
289 | - | ||
290 | - } | ||
291 | - | ||
292 | - // | ||
293 | - // Success. | ||
294 | - // | ||
295 | - | ||
296 | - // Get peer certificate, notify application before validation. | ||
297 | - lib3270_autoptr(X509) peer = SSL_get_peer_certificate(hSession->ssl.con); | ||
298 | - | ||
299 | - if(peer) | ||
300 | - { | ||
301 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
302 | - { | ||
303 | - BIO * out = BIO_new(BIO_s_mem()); | ||
304 | - unsigned char * data; | ||
305 | - unsigned char * text; | ||
306 | - int n; | ||
307 | - | ||
308 | - X509_print(out,peer); | ||
309 | - | ||
310 | - n = BIO_get_mem_data(out, &data); | ||
311 | - text = (unsigned char *) malloc (n+1); | ||
312 | - text[n] ='\0'; | ||
313 | - memcpy(text,data,n); | ||
314 | - | ||
315 | - trace_ssl(hSession,"TLS/SSL peer certificate:\n%s\n",text); | ||
316 | - | ||
317 | - free(text); | ||
318 | - BIO_free(out); | ||
319 | - | ||
320 | - } | ||
321 | - | ||
322 | - hSession->cbk.set_peer_certificate(peer); | ||
323 | - | ||
324 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
325 | - | ||
326 | - if(!hSession->ssl.crl.cert) | ||
327 | - { | ||
328 | - if(lib3270_crl_new_from_x509(hSession, message, peer)) | ||
329 | - return EACCES; | ||
330 | - } | ||
331 | - | ||
332 | -#endif // SSL_ENABLE_CRL_CHECK | ||
333 | - | ||
334 | - } | ||
335 | - | ||
336 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
337 | - if(SSL_get_verify_result(hSession->ssl.con) == X509_V_ERR_UNABLE_TO_GET_CRL && hSession->ssl.crl.cert && peer) | ||
338 | - { | ||
339 | - // | ||
340 | - // Verify CRL | ||
341 | - // | ||
342 | - // References: | ||
343 | - // | ||
344 | - // http://www.zedwood.com/article/cpp-check-crl-for-revocation | ||
345 | - // | ||
346 | - | ||
347 | - trace_ssl(hSession,"Doing CRL check using %s\n",hSession->ssl.crl.url); | ||
348 | - | ||
349 | - // Got CRL, verify it! | ||
350 | - // Reference: https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session | ||
351 | - X509_STORE_CTX *csc = X509_STORE_CTX_new(); | ||
352 | - X509_STORE_CTX_set_verify_cb(csc, x509_store_ctx_error_callback); | ||
353 | - X509_STORE_CTX_init(csc, SSL_CTX_get_cert_store(ssl_ctx), peer, NULL); | ||
354 | - | ||
355 | - if(X509_verify_cert(csc) != 1) | ||
356 | - rv = X509_STORE_CTX_get_error(csc); | ||
357 | - else | ||
358 | - rv = X509_V_OK; | ||
359 | - | ||
360 | - trace_ssl(hSession, "X509_verify_cert error code was %d", rv); | ||
361 | - | ||
362 | - SSL_set_verify_result(hSession->ssl.con, rv); | ||
363 | - | ||
364 | - X509_STORE_CTX_free(csc); | ||
365 | - | ||
366 | - } | ||
367 | -#endif // SSL_ENABLE_CRL_CHECK | ||
368 | - | ||
369 | - // Check validation state. | ||
370 | - rv = SSL_get_verify_result(hSession->ssl.con); | ||
371 | - debug("SSL Verify result was %d", rv); | ||
372 | - const struct ssl_status_msg * msg = ssl_get_status_from_error_code((long) rv); | ||
373 | - | ||
374 | - if(!msg) | ||
375 | - { | ||
376 | - trace_ssl(hSession,"Unexpected or invalid TLS/SSL verify result %d\n",rv); | ||
377 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
378 | - | ||
379 | - static LIB3270_POPUP popup = { | ||
380 | - .summary = N_( "Can't verify." ), | ||
381 | - .body = N_( "Unexpected or invalid TLS/SSL verify result" ) | ||
382 | - }; | ||
383 | - | ||
384 | - ((SSL_ERROR_MESSAGE *) message)->popup = &popup; | ||
385 | - return EACCES; | ||
386 | - | ||
387 | - } | ||
388 | - else | ||
389 | - { | ||
390 | - switch(rv) | ||
391 | - { | ||
392 | - case X509_V_OK: | ||
393 | - trace_ssl(hSession,"TLS/SSL negotiated connection complete. Peer certificate %s presented.\n", peer ? "was" : "was not"); | ||
394 | - set_ssl_state(hSession,LIB3270_SSL_SECURE); | ||
395 | - break; | ||
396 | - | ||
397 | - case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: | ||
398 | - | ||
399 | - trace_ssl(hSession,"TLS/SSL negotiated connection complete with self signed certificate in certificate chain (rc=%d)\n",rv); | ||
400 | - | ||
401 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATED); | ||
402 | - | ||
403 | -#ifdef SSL_ENABLE_SELF_SIGNED_CERT_CHECK | ||
404 | - static const LIB3270_POPUP popup = { | ||
405 | - .type = LIB3270_NOTIFY_SECURE, | ||
406 | - .summary = N_( "The SSL certificate for this host is not trusted." ), | ||
407 | - .body = N_( "The security certificate presented by this host was not issued by a trusted certificate authority." ) | ||
408 | - }; | ||
409 | - | ||
410 | - ((SSL_ERROR_MESSAGE *) message)->popup = &popup; | ||
411 | - return EACCES; | ||
412 | -#else | ||
413 | - break; | ||
414 | -#endif // SSL_ENABLE_SELF_SIGNED_CERT_CHECK | ||
415 | - | ||
416 | - case X509_V_ERR_UNABLE_TO_GET_CRL: | ||
417 | - | ||
418 | - trace_ssl(hSession,"TLS/SSL verify result was %d (%s)\n", rv, msg->body); | ||
419 | - | ||
420 | - ((SSL_ERROR_MESSAGE *) message)->popup = (LIB3270_POPUP *) msg; | ||
421 | - | ||
422 | - debug("message: %s",((SSL_ERROR_MESSAGE *) message)->popup->summary); | ||
423 | - debug("description: %s",((SSL_ERROR_MESSAGE *) message)->popup->body); | ||
424 | - | ||
425 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATED); | ||
426 | - | ||
427 | - if(msg->type == LIB3270_NOTIFY_ERROR && lib3270_ssl_get_crl_download(hSession)) | ||
428 | - return EACCES; | ||
429 | - | ||
430 | - break; | ||
431 | - | ||
432 | - default: | ||
433 | - trace_ssl(hSession,"TLS/SSL verify result was %d (%s)\n", rv, msg->body); | ||
434 | - | ||
435 | - ((SSL_ERROR_MESSAGE *) message)->popup = (LIB3270_POPUP *) msg; | ||
436 | - | ||
437 | - debug("message: %s",((SSL_ERROR_MESSAGE *) message)->popup->summary); | ||
438 | - debug("description: %s",((SSL_ERROR_MESSAGE *) message)->popup->body); | ||
439 | - | ||
440 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATED); | ||
441 | - | ||
442 | - if(msg->type == LIB3270_NOTIFY_ERROR) | ||
443 | - return EACCES; | ||
444 | - | ||
445 | - } | ||
446 | - | ||
447 | - } | ||
448 | - | ||
449 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
450 | - { | ||
451 | - char buffer[4096]; | ||
452 | - int alg_bits = 0; | ||
453 | - const SSL_CIPHER * cipher = SSL_get_current_cipher(hSession->ssl.con); | ||
454 | - | ||
455 | - trace_ssl(hSession,"TLS/SSL cipher description: %s",SSL_CIPHER_description((SSL_CIPHER *) cipher, buffer, 4095)); | ||
456 | - SSL_CIPHER_get_bits(cipher, &alg_bits); | ||
457 | - trace_ssl(hSession,"%s version %s with %d bits\n", | ||
458 | - SSL_CIPHER_get_name(cipher), | ||
459 | - SSL_CIPHER_get_version(cipher), | ||
460 | - alg_bits); | ||
461 | - } | ||
462 | - | ||
463 | - return 0; | ||
464 | -} | ||
465 | - | ||
466 | -int ssl_negotiate(H3270 *hSession) | ||
467 | -{ | ||
468 | - int rc; | ||
469 | - SSL_ERROR_MESSAGE msg; | ||
470 | - | ||
471 | - memset(&msg,0,sizeof(msg)); | ||
472 | - | ||
473 | - set_ssl_state(hSession,LIB3270_SSL_NEGOTIATING); | ||
474 | - non_blocking(hSession,False); | ||
475 | - | ||
476 | - rc = lib3270_run_task(hSession, background_ssl_negotiation, &msg); | ||
477 | - | ||
478 | - debug("background_ssl_negotiation exits with rc=%d",rc); | ||
479 | - if(rc && msg.popup) | ||
480 | - { | ||
481 | - // SSL Negotiation has failed. | ||
482 | - if(popup_ssl_error(hSession,rc,&msg)) | ||
483 | - { | ||
484 | - host_disconnect(hSession,1); // Disconnect with "failed" status. | ||
485 | - return rc; | ||
486 | - } | ||
487 | - | ||
488 | - } else if(rc) { | ||
489 | - | ||
490 | - // SSL Negotiation has failed, no popup to present. | ||
491 | - const LIB3270_POPUP popup = { | ||
492 | - .summary = N_("SSL negotiation has failed") | ||
493 | - }; | ||
494 | - | ||
495 | - msg.popup = &popup; | ||
496 | - if(popup_ssl_error(hSession,rc,&msg)) | ||
497 | - { | ||
498 | - host_disconnect(hSession,1); // Disconnect with "failed" status. | ||
499 | - return rc; | ||
500 | - } | ||
501 | - | ||
502 | - } | ||
503 | - | ||
504 | - // Tell the world that we are (still) connected, now in secure mode. | ||
505 | - lib3270_set_connected_initial(hSession); | ||
506 | - non_blocking(hSession,True); | ||
507 | - | ||
508 | - return 0; | ||
509 | -} | ||
510 | - | ||
511 | - | ||
512 | -int ssl_init(H3270 *hSession) { | ||
513 | - | ||
514 | - int rc; | ||
515 | - SSL_ERROR_MESSAGE msg; | ||
516 | - | ||
517 | - memset(&msg,0,sizeof(msg)); | ||
518 | - | ||
519 | - non_blocking(hSession,False); | ||
520 | - | ||
521 | - rc = lib3270_run_task(hSession, background_ssl_init, &msg); | ||
522 | - if(rc) | ||
523 | - { | ||
524 | - // SSL init has failed. | ||
525 | - host_disconnect(hSession,1); // Disconnect with "failed" status. | ||
526 | - | ||
527 | - if(msg.popup) | ||
528 | - { | ||
529 | - ssl_popup_message(hSession,&msg); | ||
530 | - } | ||
531 | - else | ||
532 | - { | ||
533 | - LIB3270_POPUP popup = { | ||
534 | - .summary = N_("Unexpected error on SSL initialization") | ||
535 | - }; | ||
536 | - | ||
537 | - lib3270_autoptr(char) body = lib3270_strdup_printf("%s (rc=%d)",strerror(rc),rc); | ||
538 | - popup.body = body; | ||
539 | - | ||
540 | - msg.popup = &popup; | ||
541 | - ssl_popup_message(hSession,&msg); | ||
542 | - msg.popup = NULL; | ||
543 | - | ||
544 | - } | ||
545 | - | ||
546 | - | ||
547 | - } | ||
548 | - | ||
549 | - non_blocking(hSession,True); | ||
550 | - | ||
551 | - return rc; | ||
552 | - | ||
553 | -} | ||
554 | - | ||
555 | -#endif /*]*/ | ||
556 | - |
src/ssl/notify.c
@@ -1,216 +0,0 @@ | @@ -1,216 +0,0 @@ | ||
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 <internals.h> | ||
38 | -#include <lib3270/log.h> | ||
39 | -#include <lib3270/popup.h> | ||
40 | -#include <lib3270/win32.h> | ||
41 | - | ||
42 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
43 | - | ||
44 | -#if defined(HAVE_LIBSSLx) | ||
45 | - | ||
46 | -#include <openssl/err.h> | ||
47 | - | ||
48 | -/** | ||
49 | - * @brief Translate strings from ssl error message. | ||
50 | - * | ||
51 | - * @param msg SSL error message descriptor. | ||
52 | - * @param rc Value of errno. | ||
53 | - * | ||
54 | - * @return Dynamically allocated popup description. | ||
55 | - * | ||
56 | - */ | ||
57 | -static LIB3270_POPUP * translate_ssl_error_message(const SSL_ERROR_MESSAGE *msg, int rc) | ||
58 | -{ | ||
59 | - LIB3270_POPUP * popup; | ||
60 | - | ||
61 | - printf("\n\nMSG-CODE=%d\n\n",msg->code); | ||
62 | - | ||
63 | - const char *body = (msg->body ? msg->body : msg->popup->body); | ||
64 | - | ||
65 | - if(msg->code) | ||
66 | - { | ||
67 | - if(body) | ||
68 | - { | ||
69 | - popup = lib3270_popup_clone_printf( | ||
70 | - msg->popup, | ||
71 | - _( "%s\nThe SSL error message was \"%s\"(%d)" ), | ||
72 | - dgettext(GETTEXT_PACKAGE,body), | ||
73 | - ERR_reason_error_string(msg->code), | ||
74 | - msg->code | ||
75 | - ); | ||
76 | - } | ||
77 | - else | ||
78 | - { | ||
79 | - popup = lib3270_popup_clone_printf( | ||
80 | - msg->popup, | ||
81 | - _( "The SSL error message was \"%s\" (%d)" ), | ||
82 | - ERR_reason_error_string(msg->code), | ||
83 | - msg->code | ||
84 | - ); | ||
85 | - } | ||
86 | - | ||
87 | - } | ||
88 | -#ifdef _WIN32 | ||
89 | - else if(msg->lasterror) | ||
90 | - { | ||
91 | - lib3270_autoptr(char) windows_error = lib3270_win32_translate_error_code(msg->lasterror); | ||
92 | - | ||
93 | - if(body) | ||
94 | - { | ||
95 | - popup = lib3270_popup_clone_printf( | ||
96 | - msg->popup, | ||
97 | - _( "%s\nThe windows error was \"%s\" (%u)" ), | ||
98 | - dgettext(GETTEXT_PACKAGE,body), | ||
99 | - windows_error, | ||
100 | - (unsigned int) msg->lasterror | ||
101 | - ); | ||
102 | - } | ||
103 | - else | ||
104 | - { | ||
105 | - popup = lib3270_popup_clone_printf( | ||
106 | - msg->popup, | ||
107 | - _( "Windows error was \"%s\" (%u)" ), | ||
108 | - windows_error, | ||
109 | - (unsigned int) msg->lasterror | ||
110 | - ); | ||
111 | - } | ||
112 | - | ||
113 | - } | ||
114 | -#endif // _WIN32 | ||
115 | - else if(rc) | ||
116 | - { | ||
117 | - if(body) | ||
118 | - { | ||
119 | - popup = lib3270_popup_clone_printf( | ||
120 | - msg->popup, | ||
121 | - _( "%s\nThe operating system error was \"%s\" (%u)" ), | ||
122 | - dgettext(GETTEXT_PACKAGE,body), | ||
123 | - strerror(rc), | ||
124 | - rc | ||
125 | - ); | ||
126 | - } | ||
127 | - else | ||
128 | - { | ||
129 | - popup = lib3270_popup_clone_printf( | ||
130 | - msg->popup, | ||
131 | - _( "The operating system error was \"%s\" (%u)" ), | ||
132 | - strerror(rc), | ||
133 | - rc | ||
134 | - ); | ||
135 | - } | ||
136 | - | ||
137 | - } | ||
138 | - else | ||
139 | - { | ||
140 | - popup = lib3270_malloc(sizeof(LIB3270_POPUP)); | ||
141 | - *popup = *msg->popup; | ||
142 | - | ||
143 | - if(body) | ||
144 | - popup->body = dgettext(GETTEXT_PACKAGE,body); | ||
145 | - | ||
146 | - } | ||
147 | - | ||
148 | - popup->summary = dgettext(GETTEXT_PACKAGE,msg->popup->summary); | ||
149 | - | ||
150 | - debug("%s: names[\"%s\",\"%s\"]",__FUNCTION__,popup->name, msg->popup->name); | ||
151 | - | ||
152 | - if(popup->title) | ||
153 | - popup->title = dgettext(GETTEXT_PACKAGE,popup->title); | ||
154 | - else | ||
155 | - popup->title = _("Your connection is not safe"); | ||
156 | - | ||
157 | - popup->label = _("Continue"); | ||
158 | - return popup; | ||
159 | -} | ||
160 | - | ||
161 | - | ||
162 | -int popup_ssl_error(H3270 GNUC_UNUSED(*hSession), int rc, const SSL_ERROR_MESSAGE *msg) | ||
163 | -{ | ||
164 | - int response = 0; | ||
165 | - | ||
166 | - LIB3270_POPUP * popup = translate_ssl_error_message(msg,0); | ||
167 | - | ||
168 | -#ifdef _WIN32 | ||
169 | - | ||
170 | - lib3270_autoptr(char) rcMessage = lib3270_strdup_printf("The error code was %d",rc); | ||
171 | - | ||
172 | - const char *outMsg[] = { | ||
173 | - popup->title, | ||
174 | - popup->summary, | ||
175 | - (popup->body ? popup->body : ""), | ||
176 | - rcMessage | ||
177 | - }; | ||
178 | - | ||
179 | - ReportEvent( | ||
180 | - hEventLog, | ||
181 | - EVENTLOG_ERROR_TYPE, | ||
182 | - 1, | ||
183 | - 0, | ||
184 | - NULL, | ||
185 | - (sizeof(outMsg)/sizeof(outMsg[0])), | ||
186 | - 0, | ||
187 | - outMsg, | ||
188 | - NULL | ||
189 | - ); | ||
190 | - | ||
191 | -#else | ||
192 | - | ||
193 | - lib3270_write_log(hSession, "SSL", "%s %s (rc=%d)", popup->summary, (popup->body ? popup->body : ""), rc); | ||
194 | - | ||
195 | -#endif // _WIN32 | ||
196 | - | ||
197 | -#ifdef SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
198 | - | ||
199 | - response = hSession->cbk.popup(hSession,popup,1); | ||
200 | - | ||
201 | -#endif // SSL_ENABLE_NOTIFICATION_WHEN_FAILED | ||
202 | - | ||
203 | - lib3270_free(popup); | ||
204 | - return response; | ||
205 | - | ||
206 | -} | ||
207 | - | ||
208 | -void ssl_popup_message(H3270 *hSession, const SSL_ERROR_MESSAGE *msg) { | ||
209 | - | ||
210 | - LIB3270_POPUP * popup = translate_ssl_error_message(msg,0); | ||
211 | - hSession->cbk.popup(hSession,popup,0); | ||
212 | - lib3270_free(popup); | ||
213 | - | ||
214 | -} | ||
215 | - | ||
216 | -#endif // defined(HAVE_LIBSSL) |
src/ssl/properties.c
@@ -1,199 +0,0 @@ | @@ -1,199 +0,0 @@ | ||
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. 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 | - | ||
30 | -#include <internals.h> | ||
31 | -#include <lib3270/properties.h> | ||
32 | - | ||
33 | -#if defined(HAVE_LIBSSL) | ||
34 | - #include <openssl/ssl.h> | ||
35 | -#endif | ||
36 | - | ||
37 | - | ||
38 | -/** | ||
39 | - * @brief Get SSL host option. | ||
40 | - * | ||
41 | - * @return Non zero if the host URL has SSL scheme. | ||
42 | - * | ||
43 | - */ | ||
44 | -#ifdef HAVE_LIBSSLx | ||
45 | -LIB3270_EXPORT int lib3270_get_secure_host(const H3270 *hSession) | ||
46 | -{ | ||
47 | - return hSession->ssl.enabled ? 1 : 0; | ||
48 | -} | ||
49 | -#else | ||
50 | -LIB3270_EXPORT int lib3270_get_secure_host(const H3270 GNUC_UNUSED(*hSession)) | ||
51 | -{ | ||
52 | - errno = ENOTSUP; | ||
53 | - return 0; | ||
54 | -} | ||
55 | -#endif // HAVE_LIBSSL | ||
56 | - | ||
57 | - | ||
58 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
59 | -LIB3270_EXPORT char * lib3270_get_ssl_crl_text(const H3270 *hSession) | ||
60 | -{ | ||
61 | - | ||
62 | - if(hSession->ssl.crl.cert) | ||
63 | - { | ||
64 | - | ||
65 | - BIO * out = BIO_new(BIO_s_mem()); | ||
66 | - unsigned char * data; | ||
67 | - unsigned char * text; | ||
68 | - int n; | ||
69 | - | ||
70 | - X509_CRL_print(out,hSession->ssl.crl.cert); | ||
71 | - | ||
72 | - n = BIO_get_mem_data(out, &data); | ||
73 | - text = (unsigned char *) lib3270_malloc(n+1); | ||
74 | - text[n] ='\0'; | ||
75 | - | ||
76 | - memcpy(text,data,n); | ||
77 | - BIO_free(out); | ||
78 | - | ||
79 | - return (char *) text; | ||
80 | - | ||
81 | - } | ||
82 | - | ||
83 | - return NULL; | ||
84 | - | ||
85 | -} | ||
86 | -#else | ||
87 | -LIB3270_EXPORT char * lib3270_get_ssl_crl_text(const H3270 GNUC_UNUSED(*hSession)) | ||
88 | -{ | ||
89 | - return NULL; | ||
90 | -} | ||
91 | -#endif // SSL_ENABLE_CRL_CHECK | ||
92 | - | ||
93 | - | ||
94 | -LIB3270_EXPORT char * lib3270_get_ssl_peer_certificate_text(const H3270 *hSession) | ||
95 | -{ | ||
96 | -#ifdef HAVE_LIBSSLx | ||
97 | - if(hSession->ssl.con) | ||
98 | - { | ||
99 | - X509 * peer = SSL_get_peer_certificate(hSession->ssl.con); | ||
100 | - if(peer) | ||
101 | - { | ||
102 | - BIO * out = BIO_new(BIO_s_mem()); | ||
103 | - unsigned char * data; | ||
104 | - unsigned char * text; | ||
105 | - int n; | ||
106 | - | ||
107 | - X509_print(out,peer); | ||
108 | - | ||
109 | - n = BIO_get_mem_data(out, &data); | ||
110 | - text = (unsigned char *) lib3270_malloc(n+1); | ||
111 | - text[n] ='\0'; | ||
112 | - memcpy(text,data,n); | ||
113 | - BIO_free(out); | ||
114 | - | ||
115 | - return (char *) text; | ||
116 | - } | ||
117 | - } | ||
118 | -#endif // HAVE_LIBSSL | ||
119 | - | ||
120 | - return NULL; | ||
121 | -} | ||
122 | - | ||
123 | - #pragma GCC diagnostic push | ||
124 | - #pragma GCC diagnostic ignored "-Wunused-parameter" | ||
125 | - const char * lib3270_crl_get_url(const H3270 *hSession) | ||
126 | - { | ||
127 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
128 | - if(hSession->ssl.crl.url) | ||
129 | - return hSession->ssl.crl.url; | ||
130 | - | ||
131 | -#ifdef SSL_CRL_URL | ||
132 | - return SSL_CRL_URL; | ||
133 | -#else | ||
134 | - return getenv("LIB3270_DEFAULT_CRL"); | ||
135 | -#endif // SSL_CRL_URL | ||
136 | - | ||
137 | -#else | ||
138 | - errno = ENOTSUP; | ||
139 | - return ""; | ||
140 | -#endif | ||
141 | - } | ||
142 | - #pragma GCC diagnostic pop | ||
143 | - | ||
144 | - #pragma GCC diagnostic push | ||
145 | - #pragma GCC diagnostic ignored "-Wunused-parameter" | ||
146 | - int lib3270_crl_set_url(H3270 *hSession, const char *crl) | ||
147 | - { | ||
148 | - | ||
149 | - FAIL_IF_ONLINE(hSession); | ||
150 | - | ||
151 | -#if defined(HAVE_LIBSSLx) && defined(SSL_ENABLE_CRL_CHECK) | ||
152 | - | ||
153 | - if(hSession->ssl.crl.url) | ||
154 | - { | ||
155 | - free(hSession->ssl.crl.url); | ||
156 | - hSession->ssl.crl.url = NULL; | ||
157 | - } | ||
158 | - | ||
159 | - if(hSession->ssl.crl.cert) | ||
160 | - { | ||
161 | - X509_CRL_free(hSession->ssl.crl.cert); | ||
162 | - hSession->ssl.crl.cert = NULL; | ||
163 | - } | ||
164 | - | ||
165 | - if(crl) | ||
166 | - { | ||
167 | - hSession->ssl.crl.url = strdup(crl); | ||
168 | - } | ||
169 | - | ||
170 | - return 0; | ||
171 | - | ||
172 | -#else | ||
173 | - | ||
174 | - return errno = ENOTSUP; | ||
175 | - | ||
176 | -#endif // SSL_ENABLE_CRL_CHECK | ||
177 | - | ||
178 | - } | ||
179 | - #pragma GCC diagnostic pop | ||
180 | - | ||
181 | - const char ** lib3270_crl_get_available_protocols(void) | ||
182 | - { | ||
183 | - static const char * protocols[] = | ||
184 | - { | ||
185 | -#ifdef HAVE_LDAP | ||
186 | - "ldap", | ||
187 | -#endif // HAVE_LDAP | ||
188 | - | ||
189 | -#if defined(_WIN32) || defined(HAVE_LIBCURL) | ||
190 | - "http", | ||
191 | -#endif // _WIN32 || LIBCURL | ||
192 | - | ||
193 | - NULL | ||
194 | - }; | ||
195 | - | ||
196 | - return protocols; | ||
197 | - } | ||
198 | - | ||
199 | - |
src/ssl/windows/curl.c
@@ -1,382 +0,0 @@ | @@ -1,382 +0,0 @@ | ||
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 | - * References: | ||
29 | - * | ||
30 | - * http://www.openssl.org/docs/ssl/ | ||
31 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
32 | - * | ||
33 | - */ | ||
34 | - | ||
35 | -#include <config.h> | ||
36 | - | ||
37 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBCURL) | ||
38 | - | ||
39 | -#include "private.h" | ||
40 | -#include <curl/curl.h> | ||
41 | -#include <lib3270/toggle.h> | ||
42 | - | ||
43 | -#define CRL_DATA_LENGTH 2048 | ||
44 | - | ||
45 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
46 | - | ||
47 | -static inline void lib3270_autoptr_cleanup_CURL(CURL **ptr) | ||
48 | -{ | ||
49 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
50 | - if(*ptr) | ||
51 | - curl_easy_cleanup(*ptr); | ||
52 | - *ptr = NULL; | ||
53 | -} | ||
54 | - | ||
55 | -typedef struct _curldata | ||
56 | -{ | ||
57 | - size_t length; | ||
58 | - H3270 * hSession; | ||
59 | - SSL_ERROR_MESSAGE * message; | ||
60 | - char errbuf[CURL_ERROR_SIZE]; | ||
61 | - struct { | ||
62 | - size_t length; | ||
63 | - unsigned char * contents; | ||
64 | - } data; | ||
65 | -} CURLDATA; | ||
66 | - | ||
67 | -static inline void lib3270_autoptr_cleanup_CURLDATA(CURLDATA **ptr) | ||
68 | -{ | ||
69 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
70 | - if(*ptr) | ||
71 | - { | ||
72 | - CURLDATA *cdata = *ptr; | ||
73 | - | ||
74 | - if(cdata->data.contents) { | ||
75 | - lib3270_free(cdata->data.contents); | ||
76 | - cdata->data.contents = NULL; | ||
77 | - } | ||
78 | - lib3270_free(cdata); | ||
79 | - } | ||
80 | - *ptr = NULL; | ||
81 | -} | ||
82 | - | ||
83 | -static inline void lib3270_autoptr_cleanup_BIO(BIO **ptr) | ||
84 | -{ | ||
85 | - debug("%s(%p)",__FUNCTION__,*ptr); | ||
86 | - if(*ptr) | ||
87 | - BIO_free_all(*ptr); | ||
88 | - *ptr = NULL; | ||
89 | -} | ||
90 | - | ||
91 | -static size_t internal_curl_write_callback(void *contents, size_t size, size_t nmemb, void *userp) | ||
92 | -{ | ||
93 | - CURLDATA * data = (CURLDATA *) userp; | ||
94 | - | ||
95 | - size_t realsize = size * nmemb; | ||
96 | - size_t ix; | ||
97 | - | ||
98 | - debug("Received %u bytes (datablock is %p)", (unsigned int) realsize, data); | ||
99 | - | ||
100 | - unsigned char *ptr = (unsigned char *) contents; | ||
101 | - | ||
102 | - if(lib3270_get_toggle(data->hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
103 | - lib3270_trace_data(data->hSession,"curl_write:",(const char *) contents, realsize); | ||
104 | - | ||
105 | - if((realsize + data->length) > data->data.length) | ||
106 | - { | ||
107 | - data->data.length += (CRL_DATA_LENGTH + realsize); | ||
108 | - data->data.contents = lib3270_realloc(data->data.contents,data->data.length); | ||
109 | - | ||
110 | - for(ix = data->length; ix < data->data.length; ix++) | ||
111 | - { | ||
112 | - data->data.contents[ix] = 0; | ||
113 | - } | ||
114 | - | ||
115 | - } | ||
116 | - | ||
117 | - for(ix = 0; ix < realsize; ix++) | ||
118 | - { | ||
119 | - data->data.contents[data->length++] = *(ptr++); | ||
120 | - } | ||
121 | - | ||
122 | - return realsize; | ||
123 | -} | ||
124 | - | ||
125 | -static int internal_curl_trace_callback(CURL GNUC_UNUSED(*handle), curl_infotype type, char *data, size_t size, void *userp) | ||
126 | -{ | ||
127 | - const char * text = NULL; | ||
128 | - | ||
129 | - switch (type) { | ||
130 | - case CURLINFO_TEXT: | ||
131 | - lib3270_write_log(((CURLDATA *) userp)->hSession,"curl","%s",data); | ||
132 | - return 0; | ||
133 | - | ||
134 | - case CURLINFO_HEADER_OUT: | ||
135 | - text = "=> Send header"; | ||
136 | - break; | ||
137 | - | ||
138 | - case CURLINFO_DATA_OUT: | ||
139 | - text = "=> Send data"; | ||
140 | - break; | ||
141 | - | ||
142 | - case CURLINFO_SSL_DATA_OUT: | ||
143 | - text = "=> Send SSL data"; | ||
144 | - break; | ||
145 | - | ||
146 | - case CURLINFO_HEADER_IN: | ||
147 | - text = "<= Recv header"; | ||
148 | - break; | ||
149 | - | ||
150 | - case CURLINFO_DATA_IN: | ||
151 | - text = "<= Recv data"; | ||
152 | - break; | ||
153 | - | ||
154 | - case CURLINFO_SSL_DATA_IN: | ||
155 | - text = "<= Recv SSL data"; | ||
156 | - break; | ||
157 | - | ||
158 | - default: | ||
159 | - return 0; | ||
160 | - | ||
161 | - } | ||
162 | - | ||
163 | - lib3270_trace_data( | ||
164 | - ((CURLDATA *) userp)->hSession, | ||
165 | - text, | ||
166 | - data, | ||
167 | - size | ||
168 | - ); | ||
169 | - | ||
170 | - return 0; | ||
171 | -} | ||
172 | - | ||
173 | -X509_CRL * get_crl_using_curl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
174 | -{ | ||
175 | - X509_CRL * x509_crl = NULL; | ||
176 | - | ||
177 | - lib3270_autoptr(CURLDATA) crl_data = lib3270_malloc(sizeof(CURLDATA)); | ||
178 | - lib3270_autoptr(CURL) hCurl = curl_easy_init(); | ||
179 | - | ||
180 | - memset(crl_data,0,sizeof(CURLDATA)); | ||
181 | - crl_data->message = message; | ||
182 | - crl_data->hSession = hSession; | ||
183 | - crl_data->data.length = CRL_DATA_LENGTH; | ||
184 | - crl_data->data.contents = lib3270_malloc(crl_data->data.length); | ||
185 | - | ||
186 | - if(!hCurl) | ||
187 | - { | ||
188 | - message->title = _( "Security error" ); | ||
189 | - message->text = _( "Error loading certificate revocation list" ); | ||
190 | - message->description = _( "Can't initialize curl operation" ); | ||
191 | - return NULL; | ||
192 | - } | ||
193 | - | ||
194 | - CURLcode res; | ||
195 | - | ||
196 | - curl_easy_setopt(hCurl, CURLOPT_URL, consturl); | ||
197 | - curl_easy_setopt(hCurl, CURLOPT_FOLLOWLOCATION, 1L); | ||
198 | - | ||
199 | - curl_easy_setopt(hCurl, CURLOPT_ERRORBUFFER, crl_data->errbuf); | ||
200 | - | ||
201 | - curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, internal_curl_write_callback); | ||
202 | - curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void *) crl_data); | ||
203 | - | ||
204 | - curl_easy_setopt(hCurl, CURLOPT_USERNAME, ""); | ||
205 | - | ||
206 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
207 | - { | ||
208 | - curl_easy_setopt(hCurl, CURLOPT_VERBOSE, 1L); | ||
209 | - curl_easy_setopt(hCurl, CURLOPT_DEBUGFUNCTION, internal_curl_trace_callback); | ||
210 | - curl_easy_setopt(hCurl, CURLOPT_DEBUGDATA, (void *) crl_data); | ||
211 | - } | ||
212 | - | ||
213 | - res = curl_easy_perform(hCurl); | ||
214 | - | ||
215 | - if(res != CURLE_OK) | ||
216 | - { | ||
217 | - message->error = hSession->ssl.error = 0; | ||
218 | - message->title = _( "Security error" ); | ||
219 | - | ||
220 | - if(crl_data->errbuf[0]) | ||
221 | - { | ||
222 | - message->text = curl_easy_strerror(res); | ||
223 | - message->description = crl_data->errbuf; | ||
224 | - } | ||
225 | - else | ||
226 | - { | ||
227 | - message->text = _( "Error loading certificate revocation list" ); | ||
228 | - message->description = curl_easy_strerror(res); | ||
229 | - } | ||
230 | - | ||
231 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); | ||
232 | - errno = EINVAL; | ||
233 | - return NULL; | ||
234 | - | ||
235 | - } | ||
236 | - | ||
237 | - char *ct = NULL; | ||
238 | - res = curl_easy_getinfo(hCurl, CURLINFO_CONTENT_TYPE, &ct); | ||
239 | - if(res != CURLE_OK) | ||
240 | - { | ||
241 | - message->error = hSession->ssl.error = 0; | ||
242 | - message->title = _( "Security error" ); | ||
243 | - message->text = _( "Error loading certificate revocation list" ); | ||
244 | - message->description = curl_easy_strerror(res); | ||
245 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); | ||
246 | - errno = EINVAL; | ||
247 | - return NULL; | ||
248 | - } | ||
249 | - | ||
250 | - if(lib3270_get_toggle(crl_data->hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
251 | - lib3270_trace_data(crl_data->hSession,"CRL Data",(const char *) crl_data->data.contents, (unsigned int) crl_data->length); | ||
252 | - | ||
253 | - if(ct) | ||
254 | - { | ||
255 | - const unsigned char * data = crl_data->data.contents; | ||
256 | - | ||
257 | - if(strcasecmp(ct,"application/pkix-crl") == 0) | ||
258 | - { | ||
259 | - // CRL File, convert it | ||
260 | - if(!d2i_X509_CRL(&x509_crl, &data, crl_data->length)) | ||
261 | - { | ||
262 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
263 | - message->title = _( "Security error" ); | ||
264 | - message->text = _( "Can't decode certificate revocation list" ); | ||
265 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | ||
266 | - return NULL; | ||
267 | - } | ||
268 | - } | ||
269 | - else | ||
270 | - { | ||
271 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
272 | - message->title = _( "Security error" ); | ||
273 | - message->text = _( "Got an invalid certificate revocation list from server" ); | ||
274 | - lib3270_write_log(hSession,"ssl","%s: content-type unexpected: \"%s\"",consturl, ct); | ||
275 | - errno = EINVAL; | ||
276 | - return NULL; | ||
277 | - } | ||
278 | - } | ||
279 | - else if(strncasecmp(consturl,"ldap://",7) == 0) | ||
280 | - { | ||
281 | - // | ||
282 | - // curl's LDAP query on windows returns diferently. Working with it. | ||
283 | - // | ||
284 | -#ifdef DEBUG | ||
285 | - { | ||
286 | - FILE *out = fopen("downloaded.crl","w"); | ||
287 | - if(out) | ||
288 | - { | ||
289 | - fwrite(crl_data->data.contents,crl_data->length,1,out); | ||
290 | - fclose(out); | ||
291 | - } | ||
292 | - | ||
293 | - } | ||
294 | -#endif | ||
295 | - | ||
296 | - char * attr = strchr(consturl,'?'); | ||
297 | - if(!attr) | ||
298 | - { | ||
299 | - message->error = hSession->ssl.error = 0; | ||
300 | - message->title = _( "Security error" ); | ||
301 | - message->text = _( "No attribute in LDAP search URL" ); | ||
302 | - errno = ENOENT; | ||
303 | - return NULL; | ||
304 | - } | ||
305 | - | ||
306 | - attr++; | ||
307 | - | ||
308 | - lib3270_autoptr(char) text = lib3270_strdup_printf("No mime-type, extracting \"%s\" directly from LDAP response\n",attr); | ||
309 | - trace_ssl(crl_data->hSession, text); | ||
310 | - | ||
311 | - lib3270_autoptr(char) key = lib3270_strdup_printf("%s: ",attr); | ||
312 | - | ||
313 | - | ||
314 | -// char *ptr = strcasestr((char *) crl_data->data.contents, key); | ||
315 | - | ||
316 | - size_t ix; | ||
317 | - unsigned char *from = NULL; | ||
318 | - size_t keylength = strlen(key); | ||
319 | - for(ix = 0; ix < (crl_data->length - keylength); ix++) | ||
320 | - { | ||
321 | - if(!strncasecmp( (char *) (crl_data->data.contents+ix),key,keylength)) | ||
322 | - { | ||
323 | - from = crl_data->data.contents+ix; | ||
324 | - break; | ||
325 | - } | ||
326 | - } | ||
327 | - | ||
328 | - debug("strstr(%s): %p", key, from); | ||
329 | - | ||
330 | - if(!from) | ||
331 | - { | ||
332 | - message->error = hSession->ssl.error = 0; | ||
333 | - message->title = _( "Security error" ); | ||
334 | - message->text = _( "Can't find certificate revocation list in LDAP response" ); | ||
335 | - errno = ENOENT; | ||
336 | - return NULL; | ||
337 | - } | ||
338 | - | ||
339 | - from += strlen(key); | ||
340 | - size_t length = crl_data->length - (from - crl_data->data.contents); | ||
341 | - | ||
342 | - static const char terminator[] = { 0x0a, 0x0a, 0x09 }; | ||
343 | - unsigned char *to = from+length; | ||
344 | - | ||
345 | - for(ix = 0; ix < (length - sizeof(terminator)); ix++) | ||
346 | - { | ||
347 | - if(!memcmp(from+ix,terminator,sizeof(terminator))) | ||
348 | - { | ||
349 | - to = from+ix; | ||
350 | - break; | ||
351 | - } | ||
352 | - } | ||
353 | - | ||
354 | - length = to - from; | ||
355 | - | ||
356 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | ||
357 | - { | ||
358 | - lib3270_trace_data( | ||
359 | - hSession, | ||
360 | - "CRL Data received from LDAP server", | ||
361 | - (const char *) from, | ||
362 | - length | ||
363 | - ); | ||
364 | - } | ||
365 | - | ||
366 | - if(!d2i_X509_CRL(&x509_crl, (const unsigned char **) &from, length)) | ||
367 | - { | ||
368 | - message->error = hSession->ssl.error = ERR_get_error(); | ||
369 | - message->title = _( "Security error" ); | ||
370 | - message->text = _( "Can't decode certificate revocation list got from LDAP Search" ); | ||
371 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | ||
372 | - errno = EINVAL; | ||
373 | - return NULL; | ||
374 | - } | ||
375 | - | ||
376 | - } | ||
377 | - | ||
378 | - return x509_crl; | ||
379 | - | ||
380 | -} | ||
381 | - | ||
382 | -#endif // defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) && defined(HAVE_LIBCURL) |
src/ssl/windows/getcrl.c
@@ -1,145 +0,0 @@ | @@ -1,145 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -#include <config.h> | ||
37 | - | ||
38 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
39 | - | ||
40 | -#include "private.h" | ||
41 | - | ||
42 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
43 | - | ||
44 | -static inline void lib3270_autoptr_cleanup_FILE(FILE **file) | ||
45 | -{ | ||
46 | - if(*file) | ||
47 | - fclose(*file); | ||
48 | -} | ||
49 | - | ||
50 | -X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
51 | -{ | ||
52 | - X509_CRL * x509_crl = NULL; | ||
53 | - | ||
54 | - if(!(consturl && *consturl)) | ||
55 | - { | ||
56 | - static const LIB3270_POPUP popup = { | ||
57 | - .name = "CantOpenCRL", | ||
58 | - .summary = N_("Can´t open CRL file"), | ||
59 | - .body = N_("The URL for the CRL is undefined or empty") | ||
60 | - }; | ||
61 | - | ||
62 | - message->code = hSession->ssl.error = 0; | ||
63 | - message->popup = &popup; | ||
64 | - errno = ENOENT; | ||
65 | - return NULL; | ||
66 | - } | ||
67 | - | ||
68 | - if(strncasecmp(consturl,"file://",7) == 0) | ||
69 | - { | ||
70 | - lib3270_autoptr(FILE) hCRL = fopen(consturl+7,"r"); | ||
71 | - | ||
72 | - if(!hCRL) | ||
73 | - { | ||
74 | - // Can't open CRL File. | ||
75 | - static const LIB3270_POPUP popup = { | ||
76 | - .summary = N_("Can´t open CRL file"), | ||
77 | - .body = N_("Unable to open the defined CRL file") | ||
78 | - }; | ||
79 | - | ||
80 | - message->code = errno; | ||
81 | - message->popup = &popup; | ||
82 | - hSession->ssl.error = 0; | ||
83 | - trace_ssl(hSession,"Can't open %s: %s\n",consturl,strerror(errno)); | ||
84 | - return NULL; | ||
85 | - | ||
86 | - } | ||
87 | - | ||
88 | - trace_ssl(hSession,"Loading CRL from %s\n",consturl+7); | ||
89 | - if(d2i_X509_CRL_fp(hCRL, &x509_crl)) | ||
90 | - { | ||
91 | - static const LIB3270_POPUP popup = { | ||
92 | - .summary = N_("Unable to decode CRL") | ||
93 | - }; | ||
94 | - | ||
95 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
96 | - message->popup = &popup; | ||
97 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, popup.summary); | ||
98 | - return NULL; | ||
99 | - } | ||
100 | - | ||
101 | - | ||
102 | - | ||
103 | - } | ||
104 | -#ifdef HAVE_LDAP | ||
105 | - else if(strncasecmp(consturl,"ldap://",7) == 0 && strlen(consturl) > 8) | ||
106 | - { | ||
107 | - return get_crl_using_ldap(hSession, message, consturl); | ||
108 | - | ||
109 | - } | ||
110 | -#endif // HAVE_LDAP | ||
111 | - else if(strncasecmp(consturl,"http://",7) == 0 && strlen(consturl) > 8) | ||
112 | - { | ||
113 | - return get_crl_using_http(hSession, message, consturl); | ||
114 | - } | ||
115 | - else | ||
116 | - { | ||
117 | -#ifdef HAVE_LIBCURL | ||
118 | - | ||
119 | - return get_crl_using_url(hSession, message, consturl); | ||
120 | - | ||
121 | -#else | ||
122 | - // Can't get CRL. | ||
123 | - | ||
124 | - message->code = hSession->ssl.error = 0; | ||
125 | - if(!message->popup) { | ||
126 | - static const LIB3270_POPUP popup = { | ||
127 | - .summary = N_( "Unexpected or invalid CRL URL" ), | ||
128 | - .body = N_("The URL scheme is unknown") | ||
129 | - }; | ||
130 | - message->popup = &popup; | ||
131 | - } | ||
132 | - | ||
133 | - trace_ssl(hSession,"%s: The URL scheme is unknown",consturl); | ||
134 | - | ||
135 | - errno = EINVAL; | ||
136 | - return NULL; | ||
137 | - | ||
138 | -#endif // HAVE_LIBCURL | ||
139 | - } | ||
140 | - | ||
141 | - return x509_crl; | ||
142 | - | ||
143 | -} | ||
144 | - | ||
145 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK |
src/ssl/windows/http.c
@@ -1,101 +0,0 @@ | @@ -1,101 +0,0 @@ | ||
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 | - * References: | ||
29 | - * | ||
30 | - * https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttp-autoproxy-api | ||
31 | - * | ||
32 | - */ | ||
33 | - | ||
34 | -/** | ||
35 | - * @brief Implements CRL download using winhttp. | ||
36 | - * | ||
37 | - */ | ||
38 | - | ||
39 | -#include <config.h> | ||
40 | -#include "private.h" | ||
41 | - | ||
42 | -#if defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) | ||
43 | - | ||
44 | -#include <winhttp.h> | ||
45 | -#include <utilc.h> | ||
46 | - | ||
47 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
48 | - | ||
49 | -X509_CRL * get_crl_using_http(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | ||
50 | -{ | ||
51 | - size_t szResponse = 0; | ||
52 | - const char * error_message = NULL; | ||
53 | - lib3270_autoptr(char) httpText = lib3270_get_from_url(hSession, consturl, &szResponse, &error_message); | ||
54 | - | ||
55 | - if(!httpText) | ||
56 | - { | ||
57 | - static LIB3270_POPUP popup = { | ||
58 | - .summary = N_("Can´t get CRL"), | ||
59 | - }; | ||
60 | - | ||
61 | - popup.body = error_message; | ||
62 | - message->popup = &popup; | ||
63 | - message->code = hSession->ssl.error = 0; | ||
64 | - trace_ssl( | ||
65 | - hSession,"Can't get %s: %s\n", | ||
66 | - consturl, | ||
67 | - popup.body ? popup.body : "Undefined message" | ||
68 | - ); | ||
69 | - return NULL; | ||
70 | - } | ||
71 | - | ||
72 | - // Copy the pointer because d2i_X509_CRL changes the value!!! | ||
73 | - const unsigned char *crl_data = (const unsigned char *) httpText; | ||
74 | - | ||
75 | - X509_CRL * x509_crl = NULL; | ||
76 | - | ||
77 | - if(!d2i_X509_CRL(&x509_crl,&crl_data, (DWORD) szResponse)) | ||
78 | - { | ||
79 | - static const LIB3270_POPUP popup = { | ||
80 | - .summary = N_( "Can't decode certificate revocation list" ) | ||
81 | - }; | ||
82 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
83 | - message->popup = &popup; | ||
84 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, popup.summary); | ||
85 | - | ||
86 | - trace_ssl( | ||
87 | - hSession,"%s: %s\n", | ||
88 | - consturl, | ||
89 | - popup.summary | ||
90 | - ); | ||
91 | - | ||
92 | - return NULL; | ||
93 | - } | ||
94 | - | ||
95 | - trace_ssl(hSession,"Got CRL from %s\n",consturl); | ||
96 | - | ||
97 | - return x509_crl; | ||
98 | - | ||
99 | -} | ||
100 | - | ||
101 | -#endif // defined(HAVE_LIBSSL) && defined(SSL_ENABLE_CRL_CHECK) |
src/ssl/windows/init.c
@@ -1,195 +0,0 @@ | @@ -1,195 +0,0 @@ | ||
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 | - * https://stackoverflow.com/questions/4389954/does-openssl-automatically-handle-crls-certificate-revocation-lists-now | ||
33 | - * | ||
34 | - */ | ||
35 | - | ||
36 | -/** | ||
37 | - * @brief OpenSSL initialization for linux. | ||
38 | - * | ||
39 | - */ | ||
40 | - | ||
41 | -#include <winsock2.h> | ||
42 | -#include <windows.h> | ||
43 | -#include <config.h> | ||
44 | - | ||
45 | -#if defined(HAVE_LIBSSL) | ||
46 | - | ||
47 | -#include <openssl/ssl.h> | ||
48 | -#include <openssl/err.h> | ||
49 | -#include <openssl/x509_vfy.h> | ||
50 | - | ||
51 | -#ifndef SSL_ST_OK | ||
52 | - #define SSL_ST_OK 3 | ||
53 | -#endif // !SSL_ST_OK | ||
54 | - | ||
55 | -#include <internals.h> | ||
56 | -#include <errno.h> | ||
57 | -#include <lib3270.h> | ||
58 | -#include <lib3270/internals.h> | ||
59 | -#include <lib3270/trace.h> | ||
60 | -#include <lib3270/log.h> | ||
61 | -#include <dirent.h> | ||
62 | - | ||
63 | -#include "trace_dsc.h" | ||
64 | - | ||
65 | -#include <openssl/x509.h> | ||
66 | - | ||
67 | -/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
68 | - | ||
69 | -/** | ||
70 | - * @brief Initialize openssl library. | ||
71 | - * | ||
72 | - * @return 0 if ok, non zero if fails. | ||
73 | - * | ||
74 | - */ | ||
75 | -int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
76 | -{ | ||
77 | - debug("%s ssl_ctx=%p",__FUNCTION__,ssl_ctx); | ||
78 | - | ||
79 | - if(ssl_ctx) | ||
80 | - return 0; | ||
81 | - | ||
82 | - trace_ssl(hSession,"Initializing SSL context.\n"); | ||
83 | - | ||
84 | - SSL_load_error_strings(); | ||
85 | - SSL_library_init(); | ||
86 | - | ||
87 | - ssl_ctx = SSL_CTX_new(SSLv23_method()); | ||
88 | - if(ssl_ctx == NULL) | ||
89 | - { | ||
90 | - static const LIB3270_POPUP popup = { | ||
91 | - .summary = N_( "Cant initialize the SSL context." ) | ||
92 | - }; | ||
93 | - | ||
94 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
95 | - message->popup = &popup; | ||
96 | - return -1; | ||
97 | - } | ||
98 | - | ||
99 | - SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL); | ||
100 | - SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); | ||
101 | - | ||
102 | - // SSL_CTX_set_default_verify_paths(ssl_ctx); | ||
103 | - | ||
104 | - // Load certs | ||
105 | - // https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store | ||
106 | - X509_STORE * store = SSL_CTX_get_cert_store(ssl_ctx); | ||
107 | - | ||
108 | - lib3270_autoptr(char) certpath = lib3270_build_data_filename("certs","*.der",NULL); | ||
109 | - | ||
110 | - WIN32_FIND_DATA ffd; | ||
111 | - HANDLE hFind = FindFirstFile(certpath, &ffd); | ||
112 | - | ||
113 | - if(hFind == INVALID_HANDLE_VALUE) | ||
114 | - { | ||
115 | - static const LIB3270_POPUP popup = { | ||
116 | - .summary = N_( "Cant open custom certificate directory." ) | ||
117 | - }; | ||
118 | - | ||
119 | - message->popup = &popup; | ||
120 | - | ||
121 | - trace_ssl(hSession, _( "Can't open \"%s\" (The Windows error code was %ld)\n" ), certpath, (long) GetLastError()); | ||
122 | - } | ||
123 | - else | ||
124 | - { | ||
125 | - do | ||
126 | - { | ||
127 | - char * filename = lib3270_build_data_filename("certs", ffd.cFileName, NULL); | ||
128 | - | ||
129 | - debug("Loading \"%s\"",filename); | ||
130 | - | ||
131 | - FILE *fp = fopen(filename,"r"); | ||
132 | - if(!fp) { | ||
133 | - | ||
134 | - trace_ssl(hSession, _( "Can't open \"%s\": %s" ), filename, strerror(errno)); | ||
135 | - | ||
136 | - } | ||
137 | - else | ||
138 | - { | ||
139 | - X509 * cert = d2i_X509_fp(fp, NULL); | ||
140 | - | ||
141 | - if(!cert) | ||
142 | - { | ||
143 | - static const LIB3270_POPUP popup = { | ||
144 | - .summary = N_( "Cant read custom certificate file." ) | ||
145 | - }; | ||
146 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
147 | - message->popup = &popup; | ||
148 | - | ||
149 | - trace_ssl(hSession, _( "Can't read \"%s\": %s" ), filename, ERR_lib_error_string(hSession->ssl.error)); | ||
150 | - } | ||
151 | - else | ||
152 | - { | ||
153 | - | ||
154 | - if(X509_STORE_add_cert(store, cert) != 1) | ||
155 | - { | ||
156 | - static const LIB3270_POPUP popup = { | ||
157 | - .summary = N_( "Cant load custom certificate file." ) | ||
158 | - }; | ||
159 | - message->code = hSession->ssl.error = ERR_get_error(); | ||
160 | - message->popup = &popup; | ||
161 | - | ||
162 | - trace_ssl(hSession, _( "Can't load \"%s\": %s" ), filename, ERR_lib_error_string(hSession->ssl.error)); | ||
163 | - } | ||
164 | - | ||
165 | - X509_free(cert); | ||
166 | - } | ||
167 | - | ||
168 | - fclose(fp); | ||
169 | - } | ||
170 | - | ||
171 | - lib3270_free(filename); | ||
172 | - | ||
173 | - } | ||
174 | - while (FindNextFile(hFind, &ffd) != 0); | ||
175 | - | ||
176 | - } | ||
177 | - | ||
178 | - ssl_3270_ex_index = SSL_get_ex_new_index(0,NULL,NULL,NULL,NULL); | ||
179 | - | ||
180 | -#ifdef SSL_ENABLE_CRL_CHECK | ||
181 | - | ||
182 | - // Enable CRL check | ||
183 | - X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | ||
184 | - X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK); | ||
185 | - X509_STORE_set1_param(store, param); | ||
186 | - X509_VERIFY_PARAM_free(param); | ||
187 | - trace_ssl(hSession,"CRL CHECK was enabled\n"); | ||
188 | - | ||
189 | -#endif // SSL_ENABLE_CRL_CHECK | ||
190 | - | ||
191 | - return 0; | ||
192 | - | ||
193 | -} | ||
194 | - | ||
195 | -#endif // HAVE_LIBSSL |
src/ssl/windows/private.h
@@ -1,71 +0,0 @@ | @@ -1,71 +0,0 @@ | ||
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 | -#ifndef LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED | ||
31 | - | ||
32 | - #define LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED | ||
33 | - | ||
34 | - #include <config.h> | ||
35 | - | ||
36 | - #include <winsock2.h> | ||
37 | - #include <windows.h> | ||
38 | - | ||
39 | - #include <openssl/ssl.h> | ||
40 | - #include <openssl/err.h> | ||
41 | - #include <openssl/x509_vfy.h> | ||
42 | - #include <openssl/x509.h> | ||
43 | - | ||
44 | - #include <internals.h> | ||
45 | - #include <trace_dsc.h> | ||
46 | - #include <errno.h> | ||
47 | - #include <lib3270.h> | ||
48 | - #include <lib3270/trace.h> | ||
49 | - #include <lib3270/log.h> | ||
50 | - | ||
51 | - #ifdef HAVE_LIBCURL | ||
52 | - | ||
53 | - #include <curl/curl.h> | ||
54 | - | ||
55 | - /// @brief Use libcurl to get CRL. | ||
56 | - LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
57 | - | ||
58 | - #endif // HAVE_LIBCURL | ||
59 | - | ||
60 | - #ifdef HAVE_LDAP | ||
61 | - | ||
62 | - /// @brief Use winldap to get CRL. | ||
63 | - LIB3270_INTERNAL X509_CRL * get_crl_using_ldap(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
64 | - | ||
65 | - #endif // HAVE_LDAP | ||
66 | - | ||
67 | - /// @brief Use winhttp to get CRL. | ||
68 | - LIB3270_INTERNAL X509_CRL * get_crl_using_http(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | ||
69 | - | ||
70 | - | ||
71 | -#endif // !LIB3270_WIN32_SSL_PRIVATE_H_INCLUDED |