Commit 265084d8ab9e6d3735aaaa853eb432f11de234d4

Authored by Perry Werneck
1 parent 5d32071a

Refactoring CRL check engine.

lib3270.cbp
... ... @@ -50,6 +50,9 @@
50 50 <Unit filename="src/core/ansi.c">
51 51 <Option compilerVar="CC" />
52 52 </Unit>
  53 + <Unit filename="src/core/array.c">
  54 + <Option compilerVar="CC" />
  55 + </Unit>
53 56 <Unit filename="src/core/bounds.c">
54 57 <Option compilerVar="CC" />
55 58 </Unit>
... ... @@ -225,6 +228,7 @@
225 228 <Unit filename="src/include/3270ds.h" />
226 229 <Unit filename="src/include/ansic.h" />
227 230 <Unit filename="src/include/arpa_telnet.h" />
  231 + <Unit filename="src/include/array.h" />
228 232 <Unit filename="src/include/cg.h" />
229 233 <Unit filename="src/include/config.h" />
230 234 <Unit filename="src/include/config.h.in" />
... ...
src/core/array.c 0 → 100644
... ... @@ -0,0 +1,79 @@
  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 array.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +
  31 +/**
  32 + * @brief Handle text arrays.
  33 + */
  34 +
  35 + #include <lib3270.h>
  36 + #include <lib3270/log.h>
  37 + #include <array.h>
  38 + #include <string.h>
  39 +
  40 +/*---[ Implement ]------------------------------------------------------------------------------------------------------------*/
  41 +
  42 +LIB3270_STRING_ARRAY * lib3270_string_array_new(void)
  43 +{
  44 + LIB3270_STRING_ARRAY * array = lib3270_malloc(sizeof(LIB3270_STRING_ARRAY));
  45 + memset(array,0,sizeof(LIB3270_STRING_ARRAY));
  46 +
  47 + return array;
  48 +}
  49 +
  50 +void lib3270_string_array_free(LIB3270_STRING_ARRAY *array)
  51 +{
  52 + size_t ix;
  53 +
  54 + if(array)
  55 + {
  56 + for(ix = 0; ix < array->length; ix++)
  57 + lib3270_free((char *) array->str[ix]);
  58 +
  59 + lib3270_free(array->str);
  60 + lib3270_free(array);
  61 + }
  62 +}
  63 +
  64 +LIB3270_INTERNAL void lib3270_string_array_append(LIB3270_STRING_ARRAY *array, const char *str)
  65 +{
  66 + if(array->str)
  67 + {
  68 + array->str = lib3270_realloc(array->str,(array->length + 1) * sizeof(char *));
  69 + }
  70 + else
  71 + {
  72 + array->str = lib3270_malloc(sizeof(char *));
  73 + array->length = 0; // Just in case.
  74 + }
  75 +
  76 + array->str[array->length++] = strdup(str);
  77 +
  78 +}
  79 +
... ...
src/include/array.h 0 → 100644
... ... @@ -0,0 +1,56 @@
  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 +/**
  31 + * @file array.h
  32 + * @brief Global declarations for array.c.
  33 + */
  34 +
  35 +#ifndef LIB3270_ARRAY_H_INCLUDED
  36 +
  37 + #define LIB3270_ARRAY_H_INCLUDED
  38 +
  39 + #include <lib3270.h>
  40 +
  41 + typedef struct _lib3270_string_array
  42 + {
  43 + size_t length; ///< @brief Number of elements.
  44 + const char **str;
  45 + } LIB3270_STRING_ARRAY;
  46 +
  47 + LIB3270_INTERNAL LIB3270_STRING_ARRAY * lib3270_string_array_new(void);
  48 + LIB3270_INTERNAL void lib3270_string_array_free(LIB3270_STRING_ARRAY *object);
  49 + LIB3270_INTERNAL void lib3270_string_array_append(LIB3270_STRING_ARRAY *object, const char *str);
  50 +
  51 + inline void lib3270_autoptr_cleanup_LIB3270_STRING_ARRAY(LIB3270_STRING_ARRAY **ptr)
  52 + {
  53 + lib3270_string_array_free(*ptr);
  54 + }
  55 +
  56 +#endif // LIB3270_ARRAY_H_INCLUDED
... ...
src/ssl/negotiate.c
... ... @@ -41,6 +41,7 @@
41 41 #include <openssl/err.h>
42 42 #include <openssl/x509_vfy.h>
43 43 #include <openssl/x509v3.h>
  44 + #include <array.h>
44 45  
45 46 #ifndef SSL_ST_OK
46 47 #define SSL_ST_OK 3
... ... @@ -134,16 +135,60 @@ static int background_ssl_init(H3270 *hSession, void *message)
134 135  
135 136 #if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK)
136 137  
137   -static int getCRLFromDistPoints(CRL_DIST_POINTS * dist_points, SSL_ERROR_MESSAGE *message)
  138 +static int getCRLFromDistPoints(H3270 *hSession, CRL_DIST_POINTS * dist_points, SSL_ERROR_MESSAGE *message)
138 139 {
139   - int ix;
  140 + int ix, i, gtype;
  141 + lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_string_array_new();
  142 +
  143 + // https://nougat.cablelabs.com/DLNA-RUI/openssl/commit/57912ed329f870b237f2fd9f2de8dec3477d1729
140 144  
141 145 for(ix = 0; ix < sk_DIST_POINT_num(dist_points); ix++) {
142 146  
143   - debug("CRL(%d):", ix);
  147 + DIST_POINT *dp = sk_DIST_POINT_value(dist_points, ix);
  148 +
  149 + if(!dp->distpoint || dp->distpoint->type != 0)
  150 + continue;
  151 +
  152 + GENERAL_NAMES *gens = dp->distpoint->name.fullname;
  153 +
  154 + for (i = 0; i < sk_GENERAL_NAME_num(gens); i++)
  155 + {
  156 + GENERAL_NAME *gen = sk_GENERAL_NAME_value(gens, i);
  157 + ASN1_STRING *uri = GENERAL_NAME_get0_value(gen, &gtype);
  158 + if(uri)
  159 + {
  160 + const unsigned char * data = ASN1_STRING_get0_data(uri);
  161 + if(data)
  162 + {
  163 + lib3270_string_array_append(uris,(char *) data);
  164 + }
  165 + }
  166 +
  167 + }
  168 +
  169 + }
  170 +
  171 +#ifdef DEBUG
  172 + {
  173 + for(ix = 0; ix < uris->length; ix++)
  174 + {
  175 + debug("%u: %s", (unsigned int) ix, uris->str[ix]);
  176 + }
  177 + }
  178 +#endif // DEBUG
144 179  
  180 + /*
  181 + if(hSession->ssl.crl.url)
  182 + {
  183 + // Check if we already have the URL.
145 184  
  185 +
  186 + // The URL is invalid or not to this cert, remove it!
  187 + lib3270_free(hSession->ssl.crl.url);
  188 + hSession->ssl.crl.url = NULL;
146 189 }
  190 + */
  191 +
147 192  
148 193 return 0;
149 194 }
... ... @@ -247,7 +292,7 @@ static int background_ssl_negotiation(H3270 *hSession, void *message)
247 292 return EACCES;
248 293 }
249 294  
250   - if(getCRLFromDistPoints(dist_points, (SSL_ERROR_MESSAGE *) message))
  295 + if(getCRLFromDistPoints(hSession, dist_points, (SSL_ERROR_MESSAGE *) message))
251 296 return EACCES;
252 297  
253 298 #endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK
... ...