Commit 5772d815c11d4d5d57732206552293640af63b1e
1 parent
2971e0a7
Exists in
master
and in
3 other branches
Fixing CRL download using curl.
Showing
8 changed files
with
368 additions
and
335 deletions
Show diff stats
lib3270.cbp
... | ... | @@ -122,6 +122,9 @@ |
122 | 122 | <Unit filename="src/core/linux/connect.c"> |
123 | 123 | <Option compilerVar="CC" /> |
124 | 124 | </Unit> |
125 | + <Unit filename="src/core/linux/curl.c"> | |
126 | + <Option compilerVar="CC" /> | |
127 | + </Unit> | |
125 | 128 | <Unit filename="src/core/linux/event_dispatcher.c"> |
126 | 129 | <Option compilerVar="CC" /> |
127 | 130 | </Unit> |
... | ... | @@ -308,9 +311,6 @@ |
308 | 311 | <Option compilerVar="CC" /> |
309 | 312 | </Unit> |
310 | 313 | <Unit filename="src/ssl/crl.h" /> |
311 | - <Unit filename="src/ssl/linux/curl.c"> | |
312 | - <Option compilerVar="CC" /> | |
313 | - </Unit> | |
314 | 314 | <Unit filename="src/ssl/linux/getcrl.c"> |
315 | 315 | <Option compilerVar="CC" /> |
316 | 316 | </Unit> |
... | ... | @@ -321,6 +321,9 @@ |
321 | 321 | <Option compilerVar="CC" /> |
322 | 322 | </Unit> |
323 | 323 | <Unit filename="src/ssl/linux/private.h" /> |
324 | + <Unit filename="src/ssl/linux/url.c"> | |
325 | + <Option compilerVar="CC" /> | |
326 | + </Unit> | |
324 | 327 | <Unit filename="src/ssl/negotiate.c"> |
325 | 328 | <Option compilerVar="CC" /> |
326 | 329 | </Unit> |
... | ... | @@ -333,9 +336,6 @@ |
333 | 336 | <Unit filename="src/ssl/state.c"> |
334 | 337 | <Option compilerVar="CC" /> |
335 | 338 | </Unit> |
336 | - <Unit filename="src/ssl/windows/curl.c"> | |
337 | - <Option compilerVar="CC" /> | |
338 | - </Unit> | |
339 | 339 | <Unit filename="src/ssl/windows/getcrl.c"> |
340 | 340 | <Option compilerVar="CC" /> |
341 | 341 | </Unit> | ... | ... |
... | ... | @@ -0,0 +1,231 @@ |
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 | +#if defined(HAVE_LIBCURL) | |
33 | + | |
34 | +#include <lib3270-internals.h> | |
35 | +#include <lib3270.h> | |
36 | +#include <lib3270/log.h> | |
37 | +#include <lib3270/trace.h> | |
38 | +#include <curl/curl.h> | |
39 | + | |
40 | +#define CRL_DATA_LENGTH 2048 | |
41 | + | |
42 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | |
43 | + | |
44 | +static inline void lib3270_autoptr_cleanup_CURL(CURL **ptr) | |
45 | +{ | |
46 | + debug("%s(%p)",__FUNCTION__,*ptr); | |
47 | + if(*ptr) | |
48 | + curl_easy_cleanup(*ptr); | |
49 | + *ptr = NULL; | |
50 | +} | |
51 | + | |
52 | +typedef struct _curldata | |
53 | +{ | |
54 | + size_t length; | |
55 | + H3270 * hSession; | |
56 | + char errbuf[CURL_ERROR_SIZE]; | |
57 | + struct { | |
58 | + size_t length; | |
59 | + unsigned char * contents; | |
60 | + } data; | |
61 | +} CURLDATA; | |
62 | + | |
63 | +static inline void lib3270_autoptr_cleanup_CURLDATA(CURLDATA **ptr) | |
64 | +{ | |
65 | + debug("%s(%p)",__FUNCTION__,*ptr); | |
66 | + if(*ptr) | |
67 | + { | |
68 | + CURLDATA *cdata = *ptr; | |
69 | + | |
70 | + if(cdata->data.contents) { | |
71 | + lib3270_free(cdata->data.contents); | |
72 | + cdata->data.contents = NULL; | |
73 | + } | |
74 | + lib3270_free(cdata); | |
75 | + } | |
76 | + *ptr = NULL; | |
77 | +} | |
78 | + | |
79 | +static size_t internal_curl_write_callback(void *contents, size_t size, size_t nmemb, void *userp) | |
80 | +{ | |
81 | + CURLDATA * data = (CURLDATA *) userp; | |
82 | + | |
83 | + debug("%s",__FUNCTION__); | |
84 | + | |
85 | + size_t realsize = size * nmemb; | |
86 | + | |
87 | + debug("%s size=%d data->length=%d crldatalength=%d",__FUNCTION__,(int) size, (int) data->length, CRL_DATA_LENGTH); | |
88 | + | |
89 | + if((realsize + data->length) > data->data.length) | |
90 | + { | |
91 | + data->data.length += (CRL_DATA_LENGTH + realsize); | |
92 | + data->data.contents = lib3270_realloc(data->data.contents,data->data.length); | |
93 | + memset(&(data->data.contents[data->length]),0,data->data.length-data->length); | |
94 | + } | |
95 | + | |
96 | + debug("%s",__FUNCTION__); | |
97 | + | |
98 | + if(lib3270_get_toggle(data->hSession,LIB3270_TOGGLE_SSL_TRACE)) | |
99 | + { | |
100 | + lib3270_trace_data( | |
101 | + data->hSession, | |
102 | + "Received", | |
103 | + (const unsigned char *) contents, | |
104 | + realsize | |
105 | + ); | |
106 | + } | |
107 | + | |
108 | + debug("%s",__FUNCTION__); | |
109 | + | |
110 | + memcpy(&(data->data.contents[data->length]),contents,realsize); | |
111 | + data->length += realsize; | |
112 | + | |
113 | + debug("%s",__FUNCTION__); | |
114 | + | |
115 | + return realsize; | |
116 | +} | |
117 | + | |
118 | +static int internal_curl_trace_callback(CURL GNUC_UNUSED(*handle), curl_infotype type, char *data, size_t size, void *userp) | |
119 | +{ | |
120 | + const char * text = NULL; | |
121 | + | |
122 | + switch (type) { | |
123 | + case CURLINFO_TEXT: | |
124 | + lib3270_write_log(((CURLDATA *) userp)->hSession,"curl","%s",data); | |
125 | + return 0; | |
126 | + | |
127 | + case CURLINFO_HEADER_OUT: | |
128 | + text = "=> Send header"; | |
129 | + break; | |
130 | + | |
131 | + case CURLINFO_DATA_OUT: | |
132 | + text = "=> Send data"; | |
133 | + break; | |
134 | + | |
135 | + case CURLINFO_SSL_DATA_OUT: | |
136 | + text = "=> Send SSL data"; | |
137 | + break; | |
138 | + | |
139 | + case CURLINFO_HEADER_IN: | |
140 | + text = "<= Recv header"; | |
141 | + break; | |
142 | + | |
143 | + case CURLINFO_DATA_IN: | |
144 | + text = "<= Recv data"; | |
145 | + break; | |
146 | + | |
147 | + case CURLINFO_SSL_DATA_IN: | |
148 | + text = "<= Recv SSL data"; | |
149 | + break; | |
150 | + | |
151 | + default: | |
152 | + return 0; | |
153 | + | |
154 | + } | |
155 | + | |
156 | + lib3270_trace_data( | |
157 | + ((CURLDATA *) userp)->hSession, | |
158 | + text, | |
159 | + (const unsigned char *) data, | |
160 | + size | |
161 | + ); | |
162 | + | |
163 | + return 0; | |
164 | +} | |
165 | + | |
166 | +char * lib3270_get_from_url(H3270 *hSession, const char *url, size_t *length, const char **error_message) | |
167 | +{ | |
168 | + lib3270_trace_event(hSession,"Getting data from %s",url); | |
169 | + | |
170 | + // Use CURL to download the CRL | |
171 | + lib3270_autoptr(CURLDATA) crl_data = lib3270_malloc(sizeof(CURLDATA)); | |
172 | + lib3270_autoptr(CURL) hCurl = curl_easy_init(); | |
173 | + | |
174 | + memset(crl_data,0,sizeof(CURLDATA)); | |
175 | + crl_data->hSession = hSession; | |
176 | + crl_data->data.length = CRL_DATA_LENGTH; | |
177 | + crl_data->data.contents = lib3270_malloc(crl_data->data.length); | |
178 | + | |
179 | + if(!hCurl) | |
180 | + { | |
181 | + *error_message= _( "Can't initialize curl operation" ); | |
182 | + errno = EINVAL; | |
183 | + return NULL; | |
184 | + } | |
185 | + | |
186 | + CURLcode res; | |
187 | + | |
188 | + curl_easy_setopt(hCurl, CURLOPT_URL, url); | |
189 | + curl_easy_setopt(hCurl, CURLOPT_FOLLOWLOCATION, 1L); | |
190 | + | |
191 | + curl_easy_setopt(hCurl, CURLOPT_ERRORBUFFER, crl_data->errbuf); | |
192 | + | |
193 | + curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, internal_curl_write_callback); | |
194 | + curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void *) crl_data); | |
195 | + | |
196 | + curl_easy_setopt(hCurl, CURLOPT_USERNAME, ""); | |
197 | + | |
198 | + if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | |
199 | + { | |
200 | + curl_easy_setopt(hCurl, CURLOPT_VERBOSE, 1L); | |
201 | + curl_easy_setopt(hCurl, CURLOPT_DEBUGFUNCTION, internal_curl_trace_callback); | |
202 | + curl_easy_setopt(hCurl, CURLOPT_DEBUGDATA, (void *) crl_data); | |
203 | + } | |
204 | + | |
205 | + res = curl_easy_perform(hCurl); | |
206 | + | |
207 | + if(res != CURLE_OK) | |
208 | + { | |
209 | + if(crl_data->errbuf[0]) | |
210 | + lib3270_write_log(hSession,"curl","%s: %s",url, crl_data->errbuf); | |
211 | + | |
212 | + *error_message = curl_easy_strerror(res); | |
213 | + | |
214 | + lib3270_write_log(hSession,"curl","%s: %s",url, *error_message); | |
215 | + errno = EINVAL; | |
216 | + return NULL; | |
217 | + | |
218 | + } | |
219 | + | |
220 | + if(length) | |
221 | + *length = (size_t) crl_data->length; | |
222 | + | |
223 | + char * httpText = lib3270_malloc(crl_data->length+1); | |
224 | + memset(httpText,0,crl_data->length+1); | |
225 | + memcpy(httpText,crl_data->data.contents,crl_data->length); | |
226 | + | |
227 | + return httpText; | |
228 | + | |
229 | +} | |
230 | + | |
231 | +#endif // HAVE_LIBCURL | ... | ... |
src/ssl/linux/curl.c
... | ... | @@ -1,325 +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_CURL(CURL **ptr) | |
49 | -{ | |
50 | - debug("%s(%p)",__FUNCTION__,*ptr); | |
51 | - if(*ptr) | |
52 | - curl_easy_cleanup(*ptr); | |
53 | - *ptr = NULL; | |
54 | -} | |
55 | - | |
56 | -typedef struct _curldata | |
57 | -{ | |
58 | - size_t length; | |
59 | - H3270 * hSession; | |
60 | - SSL_ERROR_MESSAGE * message; | |
61 | - char errbuf[CURL_ERROR_SIZE]; | |
62 | - struct { | |
63 | - size_t length; | |
64 | - unsigned char * contents; | |
65 | - } data; | |
66 | -} CURLDATA; | |
67 | - | |
68 | -static inline void lib3270_autoptr_cleanup_CURLDATA(CURLDATA **ptr) | |
69 | -{ | |
70 | - debug("%s(%p)",__FUNCTION__,*ptr); | |
71 | - if(*ptr) | |
72 | - { | |
73 | - CURLDATA *cdata = *ptr; | |
74 | - | |
75 | - if(cdata->data.contents) { | |
76 | - lib3270_free(cdata->data.contents); | |
77 | - cdata->data.contents = NULL; | |
78 | - } | |
79 | - lib3270_free(cdata); | |
80 | - } | |
81 | - *ptr = NULL; | |
82 | -} | |
83 | - | |
84 | -static inline void lib3270_autoptr_cleanup_BIO(BIO **ptr) | |
85 | -{ | |
86 | - debug("%s(%p)",__FUNCTION__,*ptr); | |
87 | - if(*ptr) | |
88 | - BIO_free_all(*ptr); | |
89 | - *ptr = NULL; | |
90 | -} | |
91 | - | |
92 | -static size_t internal_curl_write_callback(void *contents, size_t size, size_t nmemb, void *userp) | |
93 | -{ | |
94 | - CURLDATA * data = (CURLDATA *) userp; | |
95 | - | |
96 | - debug("%s",__FUNCTION__); | |
97 | - | |
98 | - size_t realsize = size * nmemb; | |
99 | - | |
100 | - debug("%s size=%d data->length=%d crldatalength=%d",__FUNCTION__,(int) size, (int) data->length, CRL_DATA_LENGTH); | |
101 | - | |
102 | - if((realsize + data->length) > data->data.length) | |
103 | - { | |
104 | - data->data.length += (CRL_DATA_LENGTH + realsize); | |
105 | - data->data.contents = lib3270_realloc(data->data.contents,data->data.length); | |
106 | - memset(&(data->data.contents[data->length]),0,data->data.length-data->length); | |
107 | - } | |
108 | - | |
109 | - debug("%s",__FUNCTION__); | |
110 | - | |
111 | - if(lib3270_get_toggle(data->hSession,LIB3270_TOGGLE_SSL_TRACE)) | |
112 | - { | |
113 | - lib3270_trace_data( | |
114 | - data->hSession, | |
115 | - "Received", | |
116 | - (const char *) contents, | |
117 | - realsize | |
118 | - ); | |
119 | - } | |
120 | - | |
121 | - debug("%s",__FUNCTION__); | |
122 | - | |
123 | - memcpy(&(data->data.contents[data->length]),contents,realsize); | |
124 | - data->length += realsize; | |
125 | - | |
126 | - debug("%s",__FUNCTION__); | |
127 | - | |
128 | - return realsize; | |
129 | -} | |
130 | - | |
131 | -static int internal_curl_trace_callback(CURL GNUC_UNUSED(*handle), curl_infotype type, char *data, size_t size, void *userp) | |
132 | -{ | |
133 | - const char * text = NULL; | |
134 | - | |
135 | - switch (type) { | |
136 | - case CURLINFO_TEXT: | |
137 | - lib3270_write_log(((CURLDATA *) userp)->hSession,"curl","%s",data); | |
138 | - return 0; | |
139 | - | |
140 | - case CURLINFO_HEADER_OUT: | |
141 | - text = "=> Send header"; | |
142 | - break; | |
143 | - | |
144 | - case CURLINFO_DATA_OUT: | |
145 | - text = "=> Send data"; | |
146 | - break; | |
147 | - | |
148 | - case CURLINFO_SSL_DATA_OUT: | |
149 | - text = "=> Send SSL data"; | |
150 | - break; | |
151 | - | |
152 | - case CURLINFO_HEADER_IN: | |
153 | - text = "<= Recv header"; | |
154 | - break; | |
155 | - | |
156 | - case CURLINFO_DATA_IN: | |
157 | - text = "<= Recv data"; | |
158 | - break; | |
159 | - | |
160 | - case CURLINFO_SSL_DATA_IN: | |
161 | - text = "<= Recv SSL data"; | |
162 | - break; | |
163 | - | |
164 | - default: | |
165 | - return 0; | |
166 | - | |
167 | - } | |
168 | - | |
169 | - lib3270_trace_data( | |
170 | - ((CURLDATA *) userp)->hSession, | |
171 | - text, | |
172 | - data, | |
173 | - size | |
174 | - ); | |
175 | - | |
176 | - return 0; | |
177 | -} | |
178 | - | |
179 | -LIB3270_INTERNAL X509_CRL * get_crl_using_curl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl) | |
180 | -{ | |
181 | - X509_CRL * x509_crl = NULL; | |
182 | - | |
183 | - // Use CURL to download the CRL | |
184 | - lib3270_autoptr(CURLDATA) crl_data = lib3270_malloc(sizeof(CURLDATA)); | |
185 | - lib3270_autoptr(CURL) hCurl = curl_easy_init(); | |
186 | - | |
187 | - memset(crl_data,0,sizeof(CURLDATA)); | |
188 | - crl_data->message = message; | |
189 | - crl_data->hSession = hSession; | |
190 | - crl_data->data.length = CRL_DATA_LENGTH; | |
191 | - crl_data->data.contents = lib3270_malloc(crl_data->data.length); | |
192 | - | |
193 | - if(!hCurl) | |
194 | - { | |
195 | - message->title = _( "Security error" ); | |
196 | - message->text = _( "Error loading certificate revocation list" ); | |
197 | - message->description = _( "Can't initialize curl operation" ); | |
198 | - return NULL; | |
199 | - } | |
200 | - | |
201 | - CURLcode res; | |
202 | - | |
203 | - curl_easy_setopt(hCurl, CURLOPT_URL, consturl); | |
204 | - curl_easy_setopt(hCurl, CURLOPT_FOLLOWLOCATION, 1L); | |
205 | - | |
206 | - curl_easy_setopt(hCurl, CURLOPT_ERRORBUFFER, crl_data->errbuf); | |
207 | - | |
208 | - curl_easy_setopt(hCurl, CURLOPT_WRITEFUNCTION, internal_curl_write_callback); | |
209 | - curl_easy_setopt(hCurl, CURLOPT_WRITEDATA, (void *) crl_data); | |
210 | - | |
211 | - curl_easy_setopt(hCurl, CURLOPT_USERNAME, ""); | |
212 | - | |
213 | - if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE)) | |
214 | - { | |
215 | - curl_easy_setopt(hCurl, CURLOPT_VERBOSE, 1L); | |
216 | - curl_easy_setopt(hCurl, CURLOPT_DEBUGFUNCTION, internal_curl_trace_callback); | |
217 | - curl_easy_setopt(hCurl, CURLOPT_DEBUGDATA, (void *) crl_data); | |
218 | - } | |
219 | - | |
220 | - res = curl_easy_perform(hCurl); | |
221 | - | |
222 | - if(res != CURLE_OK) | |
223 | - { | |
224 | - message->error = hSession->ssl.error = 0; | |
225 | - message->title = _( "Security error" ); | |
226 | - | |
227 | - if(crl_data->errbuf[0]) | |
228 | - { | |
229 | - message->text = curl_easy_strerror(res); | |
230 | - message->description = crl_data->errbuf; | |
231 | - } | |
232 | - else | |
233 | - { | |
234 | - message->text = _( "Error loading certificate revocation list" ); | |
235 | - message->description = curl_easy_strerror(res); | |
236 | - } | |
237 | - | |
238 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); | |
239 | - errno = EINVAL; | |
240 | - return NULL; | |
241 | - | |
242 | - } | |
243 | - | |
244 | - char *ct = NULL; | |
245 | - res = curl_easy_getinfo(hCurl, CURLINFO_CONTENT_TYPE, &ct); | |
246 | - if(res != CURLE_OK) | |
247 | - { | |
248 | - message->error = hSession->ssl.error = 0; | |
249 | - message->title = _( "Security error" ); | |
250 | - message->text = _( "Error loading certificate revocation list" ); | |
251 | - message->description = curl_easy_strerror(res); | |
252 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->description); | |
253 | - errno = EINVAL; | |
254 | - return NULL; | |
255 | - } | |
256 | - | |
257 | - if(lib3270_get_toggle(crl_data->hSession,LIB3270_TOGGLE_SSL_TRACE)) | |
258 | - lib3270_trace_data(crl_data->hSession,"CRL Data",(const char *) crl_data->data.contents, (unsigned int) crl_data->length); | |
259 | - | |
260 | - if(ct) | |
261 | - { | |
262 | - const unsigned char * data = crl_data->data.contents; | |
263 | - | |
264 | - | |
265 | - if(strcasecmp(ct,"application/pkix-crl") == 0) | |
266 | - { | |
267 | - // CRL File, convert it | |
268 | - if(!d2i_X509_CRL(&x509_crl, &data, crl_data->length)) | |
269 | - { | |
270 | - message->error = hSession->ssl.error = ERR_get_error(); | |
271 | - message->title = _( "Security error" ); | |
272 | - message->text = _( "Can't decode certificate revocation list" ); | |
273 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | |
274 | - return NULL; | |
275 | - } | |
276 | - } | |
277 | - else | |
278 | - { | |
279 | - message->error = hSession->ssl.error = ERR_get_error(); | |
280 | - message->title = _( "Security error" ); | |
281 | - message->text = _( "Got an invalid certificate revocation list from server" ); | |
282 | - lib3270_write_log(hSession,"ssl","%s: content-type unexpected: \"%s\"",consturl, ct); | |
283 | - errno = EINVAL; | |
284 | - return NULL; | |
285 | - } | |
286 | - } | |
287 | - else if(strncasecmp(consturl,"ldap://",7) == 0) | |
288 | - { | |
289 | - // It's an LDAP query, assumes a base64 data. | |
290 | - char * data = strstr((char *) crl_data->data.contents,":: "); | |
291 | - if(!data) | |
292 | - { | |
293 | - message->error = hSession->ssl.error = ERR_get_error(); | |
294 | - message->title = _( "Security error" ); | |
295 | - message->text = _( "Got a bad formatted certificate revocation list from LDAP server" ); | |
296 | - lib3270_write_log(hSession,"ssl","%s: invalid format:\n%s\n",consturl, crl_data->data.contents); | |
297 | - errno = EINVAL; | |
298 | - return NULL; | |
299 | - } | |
300 | - data += 3; | |
301 | - | |
302 | - lib3270_autoptr(BIO) bio = BIO_new_mem_buf(data,-1); | |
303 | - | |
304 | - BIO * b64 = BIO_new(BIO_f_base64()); | |
305 | - bio = BIO_push(b64, bio); | |
306 | - | |
307 | - BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); | |
308 | - | |
309 | - if(!d2i_X509_CRL_bio(bio, &x509_crl)) | |
310 | - { | |
311 | - message->error = hSession->ssl.error = ERR_get_error(); | |
312 | - message->title = _( "Security error" ); | |
313 | - message->text = _( "Can't decode certificate revocation list got from LDAP server" ); | |
314 | - lib3270_write_log(hSession,"ssl","%s: %s",consturl, message->text); | |
315 | - errno = EINVAL; | |
316 | - return NULL; | |
317 | - } | |
318 | - | |
319 | - } | |
320 | - | |
321 | - return x509_crl; | |
322 | - | |
323 | -} | |
324 | - | |
325 | -#endif // HAVE_LIBSSL && SSL_ENABLE_CRL_CHECK && HAVE_LIBCURL |
src/ssl/linux/getcrl.c
... | ... | @@ -101,7 +101,7 @@ X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, co |
101 | 101 | { |
102 | 102 | #ifdef HAVE_LIBCURL |
103 | 103 | |
104 | - return get_crl_using_curl(hSession, message, consturl); | |
104 | + return get_crl_using_url(hSession, message, consturl); | |
105 | 105 | |
106 | 106 | #else |
107 | 107 | // Can't get CRL. | ... | ... |
src/ssl/linux/private.h
... | ... | @@ -55,7 +55,7 @@ |
55 | 55 | #ifdef HAVE_LIBCURL |
56 | 56 | |
57 | 57 | /// @brief Use libcurl to get CRL. |
58 | - LIB3270_INTERNAL X509_CRL * get_crl_using_curl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | |
58 | + LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | |
59 | 59 | |
60 | 60 | #endif // HAVE_LIBCURL |
61 | 61 | ... | ... |
... | ... | @@ -0,0 +1,127 @@ |
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 loading 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/windows/getcrl.c
... | ... | @@ -107,7 +107,7 @@ X509_CRL * lib3270_download_crl(H3270 *hSession, SSL_ERROR_MESSAGE * message, co |
107 | 107 | { |
108 | 108 | #ifdef HAVE_LIBCURL |
109 | 109 | |
110 | - return get_crl_using_curl(hSession, message, consturl); | |
110 | + return get_crl_using_url(hSession, message, consturl); | |
111 | 111 | |
112 | 112 | #else |
113 | 113 | // Can't get CRL. | ... | ... |
src/ssl/windows/private.h
... | ... | @@ -53,7 +53,7 @@ |
53 | 53 | #include <curl/curl.h> |
54 | 54 | |
55 | 55 | /// @brief Use libcurl to get CRL. |
56 | - LIB3270_INTERNAL X509_CRL * get_crl_using_curl(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | |
56 | + LIB3270_INTERNAL X509_CRL * get_crl_using_url(H3270 *hSession, SSL_ERROR_MESSAGE * message, const char *consturl); | |
57 | 57 | |
58 | 58 | #endif // HAVE_LIBCURL |
59 | 59 | ... | ... |