File fix-crl-get-engine.patch of Package lib3270

diff --git a/src/network_modules/openssl/crl.c b/src/network_modules/openssl/crl.c
index 408340a..b07c08b 100644
--- a/src/network_modules/openssl/crl.c
+++ b/src/network_modules/openssl/crl.c
@@ -27,7 +27,7 @@
  *
  */
 
-/// @brief Get CRL infro from X509 cert.
+/// @brief Get CRL info from X509 cert.
 ///
 /// References:
 ///
@@ -35,6 +35,7 @@
 
 
 #include "private.h"
+#include <utilc.h>
 
 /*--[ Implement ]------------------------------------------------------------------------------------*/
 
@@ -79,7 +80,13 @@ LIB3270_STRING_ARRAY * lib3270_openssl_get_crls_from_peer(H3270 *hSession, X509
 #endif // OpenSSL 1.1.0+
 
 				if(data && length > 0)
-					lib3270_string_array_append_with_length(uris,(char *) data, (size_t) length);
+				{
+					lib3270_autoptr(char) uri = lib3270_malloc( ((size_t) length) + 1);
+					strncpy(uri,(char *) data, (size_t) length);
+
+					lib3270_autoptr(char) unescaped = lib3270_unescape(uri);
+					lib3270_string_array_append(uris,unescaped);
+				}
 
 			}
 
diff --git a/src/network_modules/openssl/start.c b/src/network_modules/openssl/start.c
index f0ecb92..d720117 100644
--- a/src/network_modules/openssl/start.c
+++ b/src/network_modules/openssl/start.c
@@ -34,6 +34,7 @@
 
  #include "private.h"
  #include <lib3270/properties.h>
+ #include <utilc.h>
 
  static int import_crl(H3270 *hSession, SSL_CTX * ssl_ctx, LIB3270_NET_CONTEXT * context, const char *url) {
 
@@ -103,25 +104,26 @@
 
 	if(X509_STORE_add_crl(store, x509_crl)) {
 		trace_ssl(hSession,"CRL was added to context cert store\n");
-	} else {
-		trace_ssl(hSession,"CRL was not added to context cert store\n");
+		return 0;
 	}
 
-	return 0;
+	trace_ssl(hSession,"CRL was not added to context cert store\n");
+
+	return -1;
 
  }
 
- static void download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) {
+ static int download_crl_from_peer(H3270 *hSession, SSL_CTX * ctx_context, LIB3270_NET_CONTEXT * context, X509 *peer) {
 
 	debug("%s peer=%p",__FUNCTION__,(void *) peer);
 
 	if(!peer)
-		return;
+		return -1;
 
 	lib3270_autoptr(LIB3270_STRING_ARRAY) uris = lib3270_openssl_get_crls_from_peer(hSession, peer);
 	if(!uris) {
 		trace_ssl(hSession,"Can't get distpoints from peer certificate\n");
-		return;
+		return -1;
 	}
 
 	size_t ix;
@@ -134,11 +136,11 @@
 
 			if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
 				trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
-				return;
+				return 0;
 			}
 
 		}
-		return;
+		return -1;
 
 	}
 
@@ -152,10 +154,9 @@
 		if(strncasecmp(prefer,uris->str[ix],length))
 			continue;
 
-		debug("Trying %s",uris->str[ix]);
 		if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
 			trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
-			return;
+			return 0;
 		}
 
 	}
@@ -168,13 +169,34 @@
 
 		if(!import_crl(hSession,ctx_context,context,uris->str[ix])) {
 			trace_ssl(hSession,"Got CRL from %s\n",uris->str[ix]);
-			return;
+			return 0;
 		}
 
 	}
 
+	return -1;
+
  }
 
+int x509_store_ctx_error_callback(int ok, X509_STORE_CTX GNUC_UNUSED(*ctx))
+{
+	debug("%s(%d)",__FUNCTION__,ok);
+
+/*
+  55     {
+  56         if (!ok) {
+  57             Category::getInstance("OpenSSL").error(
+  58                 "path validation failure at depth(%d): %s",
+  59                 X509_STORE_CTX_get_error_depth(ctx),
+  60                 X509_verify_cert_error_string(X509_STORE_CTX_get_error(ctx))
+  61                 );
+  62         }
+  63         return ok;
+  64     }
+*/
+	return ok;
+}
+
  int openssl_network_start_tls(H3270 *hSession) {
 
 	SSL_CTX * ctx_context = (SSL_CTX *) lib3270_openssl_get_context(hSession);
@@ -199,7 +221,8 @@
 
 	SSL_set_ex_data(context->con,lib3270_openssl_get_ex_index(hSession),(char *) hSession);
 //	SSL_set_verify(context->con, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
-	SSL_set_verify(context->con, 0, NULL);
+//	SSL_set_verify(context->con, SSL_VERIFY_PEER, NULL);
+	SSL_set_verify(context->con, SSL_VERIFY_NONE, NULL);
 
 	if(SSL_set_fd(context->con, context->sock) != 1)
 	{
@@ -295,13 +318,40 @@
 
 		// CRL download is enabled and verification has failed; look for CRL file.
 
+
 		trace_ssl(hSession,"CRL Validation has failed, requesting CRL download\n");
 		set_ssl_state(hSession,LIB3270_SSL_VERIFYING);
 
+		int rc_download = -1;
+
 		if(context->crl.url) {
-			import_crl(hSession, ctx_context,context,context->crl.url);
+			rc_download = import_crl(hSession, ctx_context,context,context->crl.url);
 		} else {
-			download_crl_from_peer(hSession, ctx_context, context, peer);
+			rc_download = download_crl_from_peer(hSession, ctx_context, context, peer);
+		}
+
+		debug("Download rc=%d",rc_download);
+
+		if(!rc_download)
+		{
+			// Got CRL, verify it!
+			// Reference: https://stackoverflow.com/questions/10510850/how-to-verify-the-certificate-for-the-ongoing-ssl-session
+
+			X509_STORE_CTX *csc = X509_STORE_CTX_new();
+			X509_STORE_CTX_set_verify_cb(csc, x509_store_ctx_error_callback);
+			X509_STORE_CTX_init(csc, SSL_CTX_get_cert_store(ctx_context), peer, NULL);
+
+			if(X509_verify_cert(csc) != 1)
+				rv = X509_STORE_CTX_get_error(csc);
+			else
+				rv = X509_V_OK;
+
+			trace_ssl(hSession, "X509_verify_cert error code was %d\n", rv);
+
+			SSL_set_verify_result(context->con, rv);
+
+			X509_STORE_CTX_free(csc);
+
 		}
 
 	}
@@ -313,6 +363,7 @@
 
 	// Get validation message.
 	hSession->ssl.message = lib3270_openssl_message_from_id(verify_result);
+	debug("Verify message: %s",hSession->ssl.message->summary);
 
 	// Trace cypher
 	if(lib3270_get_toggle(hSession,LIB3270_TOGGLE_SSL_TRACE))
@@ -331,7 +382,7 @@
 
 	// Check results.
 	if(hSession->ssl.message)
-		trace_ssl(hSession,"%s",hSession->ssl.message->summary);
+		trace_ssl(hSession,"%s\n",hSession->ssl.message->summary);
 	else
 		trace_ssl(hSession,"TLS/SSL verify result was %ld\n", verify_result);
 
openSUSE Build Service is sponsored by