From b6c07e9a21ba42613fc3906d3efb586dd5c9a846 Mon Sep 17 00:00:00 2001
From: nectar <nectar@FreeBSD.org>
Date: Wed, 29 Jan 2003 02:25:30 +0000
Subject: [PATCH] = Fix a bug in UI_UTIL_read_pw's error handling that caused  
 des_read_pw_string to break (and thus rather mysteriously   breaking
 utilities such as kinit).

= Enable the BSD /dev/crypto interface.

(These changes are being imported on the vendor branch, as they have
already been accepted and committed to the OpenSSL CVS repository.)
---
 crypto/openssl/crypto/engine/eng_all.c      | 12 +++----
 crypto/openssl/crypto/engine/hw_cryptodev.c | 40 +++++++++++----------
 crypto/openssl/crypto/evp/c_all.c           |  4 +--
 crypto/openssl/crypto/ui/ui_lib.c           |  2 +-
 crypto/openssl/crypto/ui/ui_util.c          |  6 ++--
 5 files changed, 34 insertions(+), 30 deletions(-)

diff --git a/crypto/openssl/crypto/engine/eng_all.c b/crypto/openssl/crypto/engine/eng_all.c
index e4d48dae8544..0f6992a40dbf 100644
--- a/crypto/openssl/crypto/engine/eng_all.c
+++ b/crypto/openssl/crypto/engine/eng_all.c
@@ -95,19 +95,19 @@ void ENGINE_load_builtin_engines(void)
 #ifndef OPENSSL_NO_HW_4758_CCA
 	ENGINE_load_4758cca();
 #endif
-#ifdef __OpenBSD__
+#if defined(__OpenBSD__) || defined(__FreeBSD__)
 	ENGINE_load_cryptodev();
 #endif
 #endif
 	}
 
-#ifdef __OpenBSD__
-void ENGINE_setup_openbsd(void) {
-	static int openbsd_default_loaded = 0;
-	if (!openbsd_default_loaded) {
+#if defined(__OpenBSD__) || defined(__FreeBSD__)
+void ENGINE_setup_bsd_cryptodev(void) {
+	static int bsd_cryptodev_default_loaded = 0;
+	if (!bsd_cryptodev_default_loaded) {
 		ENGINE_load_cryptodev();
 		ENGINE_register_all_complete();
 	}
-	openbsd_default_loaded=1;
+	bsd_cryptodev_default_loaded=1;
 }
 #endif
diff --git a/crypto/openssl/crypto/engine/hw_cryptodev.c b/crypto/openssl/crypto/engine/hw_cryptodev.c
index be7ed6bb3f80..40af97ac248b 100644
--- a/crypto/openssl/crypto/engine/hw_cryptodev.c
+++ b/crypto/openssl/crypto/engine/hw_cryptodev.c
@@ -33,31 +33,28 @@
 #include <openssl/engine.h>
 #include <openssl/evp.h>
 
-#ifndef __OpenBSD__
+#if (defined(__unix__) || defined(unix)) && !defined(USG)
+#include <sys/param.h>
+# if (OpenBSD >= 200112) || ((__FreeBSD_version >= 470101 && __FreeBSD_version < 500000) || __FreeBSD_version >= 500041)
+# define HAVE_CRYPTODEV
+# endif
+# if (OpenBSD >= 200110)
+# define HAVE_SYSLOG_R
+# endif
+#endif
+
+#ifndef HAVE_CRYPTODEV
 
 void
 ENGINE_load_cryptodev(void)
 {
-	/* This is a NOP unless __OpenBSD__ is defined */
+	/* This is a NOP on platforms without /dev/crypto */
 	return;
 }
 
-#else /* __OpenBSD__ */
+#else 
 
 #include <sys/types.h>
-#include <sys/param.h>
-
-#if OpenBSD < 200112
-
-void
-ENGINE_load_cryptodev(void)
-{
-	/* This is a NOP unless we have release 3.0 (released december 2001) */
-	return;
-}
-
-#else /* OpenBSD 3.0 or above */
-
 #include <crypto/cryptodev.h>
 #include <sys/ioctl.h>
 #include <errno.h>
@@ -1032,12 +1029,18 @@ static DH_METHOD cryptodev_dh = {
 static int
 cryptodev_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
 {
+#ifdef HAVE_SYSLOG_R
 	struct syslog_data sd = SYSLOG_DATA_INIT;
+#endif
 
 	switch (cmd) {
 	default:
+#ifdef HAVE_SYSLOG_R
 		syslog_r(LOG_ERR, &sd,
 		    "cryptodev_ctrl: unknown command %d", cmd);
+#else
+		syslog(LOG_ERR, "cryptodev_ctrl: unknown command %d", cmd);
+#endif
 		break;
 	}
 	return (1);
@@ -1064,7 +1067,7 @@ ENGINE_load_cryptodev(void)
 	close(fd);
 
 	if (!ENGINE_set_id(engine, "cryptodev") ||
-	    !ENGINE_set_name(engine, "OpenBSD cryptodev engine") ||
+	    !ENGINE_set_name(engine, "BSD cryptodev engine") ||
 	    !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) ||
 	    !ENGINE_set_digests(engine, cryptodev_engine_digests) ||
 	    !ENGINE_set_ctrl_function(engine, cryptodev_ctrl) ||
@@ -1126,5 +1129,4 @@ ENGINE_load_cryptodev(void)
 	ERR_clear_error();
 }
 
-#endif /* OpenBSD 3.0 or above */
-#endif /* __OpenBSD__ */
+#endif /* HAVE_CRYPTODEV */
diff --git a/crypto/openssl/crypto/evp/c_all.c b/crypto/openssl/crypto/evp/c_all.c
index 1bd54d791e3a..af3dd261629a 100644
--- a/crypto/openssl/crypto/evp/c_all.c
+++ b/crypto/openssl/crypto/evp/c_all.c
@@ -73,7 +73,7 @@ void OPENSSL_add_all_algorithms_noconf(void)
 	{
 	OpenSSL_add_all_ciphers();
 	OpenSSL_add_all_digests();
-#ifdef __OpenBSD__
-	ENGINE_setup_openbsd();
+#if defined(__OpenBSD__) || defined(__FreeBSD__)
+	ENGINE_setup_bsd_cryptodev();
 #endif
 	}
diff --git a/crypto/openssl/crypto/ui/ui_lib.c b/crypto/openssl/crypto/ui/ui_lib.c
index 1dad878ff6d8..13e5f20dcb2a 100644
--- a/crypto/openssl/crypto/ui/ui_lib.c
+++ b/crypto/openssl/crypto/ui/ui_lib.c
@@ -237,7 +237,7 @@ static int general_allocate_boolean(UI *ui,
 	return ret;
 	}
 
-/* Returns the index to the place in the stack or 0 for error.  Uses a
+/* Returns the index to the place in the stack or -1 for error.  Uses a
    direct reference to the prompt.  */
 int UI_add_input_string(UI *ui, const char *prompt, int flags,
 	char *result_buf, int minsize, int maxsize)
diff --git a/crypto/openssl/crypto/ui/ui_util.c b/crypto/openssl/crypto/ui/ui_util.c
index ee9730d5e2f8..46bc8c1a9a08 100644
--- a/crypto/openssl/crypto/ui/ui_util.c
+++ b/crypto/openssl/crypto/ui/ui_util.c
@@ -78,12 +78,14 @@ int UI_UTIL_read_pw(char *buf,char *buff,int size,const char *prompt,int verify)
 	if (ui)
 		{
 		ok = UI_add_input_string(ui,prompt,0,buf,0,size-1);
-		if (ok == 0 && verify)
+		if (ok >= 0 && verify)
 			ok = UI_add_verify_string(ui,prompt,0,buff,0,size-1,
 				buf);
-		if (ok == 0)
+		if (ok >= 0)
 			ok=UI_process(ui);
 		UI_free(ui);
 		}
+	if (ok > 0)
+		ok = 0;
 	return(ok);
 	}