OpenBSD does NOT require -lcrypt, DES encryption is part of the standard libc.

unbreak hash generation
http://lists.askja.de/pipermail/ldapvi/2007-October/000041.html

Index: parse.c
--- parse.c.orig
+++ parse.c
@@ -16,7 +16,9 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include <unistd.h>
+#ifndef __OpenBSD__
 #include <crypt.h>
+#endif
 #include "common.h"
 
 #define fast_g_string_append_c(gstring, c)				\
@@ -144,7 +146,7 @@ static char *
 cryptdes(char *key)
 {
 	unsigned char salt[2];
-	int fd = open("/dev/random", 2);
+	int fd = open("/dev/random", O_RDONLY);
 	if (fd == -1) {
 		puts("Sorry, crypt not available: Cannot open /dev/random.");
 		return 0;
@@ -162,7 +164,7 @@ cryptmd5(char *key)
 	char *result;
 	unsigned char salt[11];
 	int i;
-	int fd = open("/dev/random", 2);
+	int fd = open("/dev/random", O_RDONLY);
 	if (fd == -1) {
 		puts("Sorry, MD5 not available: Cannot open /dev/random.");
 		return 0;
@@ -261,21 +263,29 @@ read_line1(FILE *s, GString *name, GString *value)
 		g_string_assign(value, "{CRYPT}");
 		g_string_append(value, hash);
 	} else if (!strcasecmp(encoding, "sha")) {
-		if (read_ldif_attrval(s, value) == -1) return -1;
+		GString *cleartext = g_string_new("");
+		if (read_ldif_attrval(s, cleartext) == -1) return -1;
 		g_string_assign(value, "{SHA}");
-		if (!g_string_append_sha(value, value->str)) return -1;
+		if (!g_string_append_sha(value, cleartext->str)) return -1;
+		g_string_free(cleartext, TRUE);
 	} else if (!strcasecmp(encoding, "ssha")) {
-		if (read_ldif_attrval(s, value) == -1) return -1;
+		GString *cleartext = g_string_new("");
+		if (read_ldif_attrval(s, cleartext) == -1) return -1;
 		g_string_assign(value, "{SSHA}");
-		if (!g_string_append_ssha(value, value->str)) return -1;
+		if (!g_string_append_ssha(value, cleartext->str)) return -1;
+		g_string_free(cleartext, TRUE);
 	} else if (!strcasecmp(encoding, "md5")) {
-		if (read_ldif_attrval(s, value) == -1) return -1;
+		GString *cleartext = g_string_new("");
+		if (read_ldif_attrval(s, cleartext) == -1) return -1;
 		g_string_assign(value, "{MD5}");
-		if (!g_string_append_md5(value, value->str)) return -1;
+		if (!g_string_append_md5(value, cleartext->str)) return -1;
+		g_string_free(cleartext, TRUE);
 	} else if (!strcasecmp(encoding, "smd5")) {
-		if (read_ldif_attrval(s, value) == -1) return -1;
+		GString *cleartext = g_string_new("");
+		if (read_ldif_attrval(s, cleartext) == -1) return -1;
 		g_string_assign(value, "{SMD5}");
-		if (!g_string_append_smd5(value, value->str)) return -1;
+		if (!g_string_append_smd5(value, cleartext->str)) return -1;
+		g_string_free(cleartext, TRUE);
 	} else {
 		char *ptr;
 		int n = strtol(encoding, &ptr, 10);
