diff -ur gq-0.4.0.orig/AUTHORS gq-0.4.0/AUTHORS
--- gq-0.4.0.orig/AUTHORS	Thu Jan 17 19:20:56 2002
+++ gq-0.4.0/AUTHORS	Thu Jan 17 19:19:44 2002
@@ -1,4 +1,5 @@
 Bert Vermeulen <bert@biot.com>
 
 Keith Garner <kgarner@kgarner.com> - helped add openldap friendly md5 and sha
+                                   - added openldap friendly smd5 and ssha
 Dave Dribin <dave@dribin.org> - helped add openldap friendly md5 and sha
diff -ur gq-0.4.0.orig/src/encode.c gq-0.4.0/src/encode.c
--- gq-0.4.0.orig/src/encode.c	Thu Jan 17 19:20:56 2002
+++ gq-0.4.0/src/encode.c	Thu Jan 17 19:19:25 2002
@@ -81,6 +81,12 @@
 		    case FLAG_ENCODE_SHA:
 			 encode_password_sha1(form);
 			 break;
+			case FLAG_ENCODE_SMD5:
+			 encode_password_smd5(form);
+			 break;
+			case FLAG_ENCODE_SSHA:
+			 encode_password_ssha(form);
+			 break;
 		    default:
 
 		    }
@@ -146,6 +152,60 @@
      g_free(form->values->data);
      form->values->data = g_strdup(password_out);
 
+}
+
+void encode_password_ssha(struct formfill *form)
+{
+     unsigned char *password, salt[4],
+	 				password_out[64],
+					tmp_pout[64],
+					ssha_out[SHA_DIGEST_LENGTH+4];
+	 SHA_CTX SHAcontext;
+
+     password = form->values->data;
+
+	 RAND_bytes(salt, 4);
+	 SHA1_Init(&SHAcontext);
+	 SHA1_Update(&SHAcontext, password, strlen(password));
+	 SHA1_Update(&SHAcontext, salt, 4);
+	 SHA1_Final(ssha_out, &SHAcontext);
+
+	 memcpy(ssha_out + SHA_DIGEST_LENGTH, salt, 4);
+
+	 base64_encode(tmp_pout, sizeof(tmp_pout), ssha_out, SHA_DIGEST_LENGTH+4);
+
+     strcpy(password_out, "{SSHA}");
+	 strncat(password_out, tmp_pout, 64 - 6);
+
+     g_free(form->values->data);
+     form->values->data = g_strdup(password_out);
+}
+
+void encode_password_smd5(struct formfill *form)
+{
+     unsigned char *password, salt[4],
+	 				password_out[64],
+					tmp_pout[64],
+					smd5_out[MD5_DIGEST_LENGTH+4];
+	 MD5_CTX MD5context;
+
+     password = form->values->data;
+
+	 RAND_bytes(salt, 4);
+	 MD5_Init(&MD5context);
+	 MD5_Update(&MD5context, password, strlen(password));
+	 MD5_Update(&MD5context, salt, 4);
+	 MD5_Final(smd5_out, &MD5context);
+
+	 memcpy(smd5_out + MD5_DIGEST_LENGTH, salt, 4);
+
+	 base64_encode(tmp_pout, 64, smd5_out, MD5_DIGEST_LENGTH+4);
+
+     strcpy(password_out, "{SMD5}");
+	 strncat(password_out, tmp_pout, 64 - 6);
+
+     g_free(form->values->data);
+     form->values->data = g_strdup(password_out);
 }
 
 static void base64_encode(char *dest, int dest_max_length, const char *src,
diff -ur gq-0.4.0.orig/src/encode.h gq-0.4.0/src/encode.h
--- gq-0.4.0.orig/src/encode.h	Mon Feb 19 19:08:43 2001
+++ gq-0.4.0/src/encode.h	Thu Jan 17 19:19:25 2002
@@ -26,3 +26,5 @@
 void encode_password_crypt(struct formfill *form);
 void encode_password_md5(struct formfill *form);
 void encode_password_sha1(struct formfill *form);
+void encode_password_ssha(struct formfill *form);
+void encode_password_smd5(struct formfill *form);
diff -ur gq-0.4.0.orig/src/formfill.h gq-0.4.0/src/formfill.h
--- gq-0.4.0.orig/src/formfill.h	Mon Feb 19 19:09:27 2001
+++ gq-0.4.0/src/formfill.h	Thu Jan 17 19:19:25 2002
@@ -31,8 +31,10 @@
 #define FLAG_ENCODE_CRYPT	0x10
 #define FLAG_ENCODE_MD5		0x20
 #define FLAG_ENCODE_SHA		0x40
+#define FLAG_ENCODE_SMD5	0x80
+#define FLAG_ENCODE_SSHA	0x100
 
-#define ENCODING_MASK           ( FLAG_ENCODE_CRYPT | FLAG_ENCODE_MD5 | FLAG_ENCODE_SHA )
+#define ENCODING_MASK           ( FLAG_ENCODE_CRYPT | FLAG_ENCODE_MD5 | FLAG_ENCODE_SHA | FLAG_ENCODE_SMD5 | FLAG_ENCODE_SSHA )
 
 
 struct formfill {
diff -ur gq-0.4.0.orig/src/input.c gq-0.4.0/src/input.c
--- gq-0.4.0.orig/src/input.c	Mon Feb 19 19:09:47 2001
+++ gq-0.4.0/src/input.c	Thu Jan 17 19:19:25 2002
@@ -49,6 +49,8 @@
      { FLAG_ENCODE_CRYPT, "Crypt" },
      { FLAG_ENCODE_MD5,   "MD5"   },
      { FLAG_ENCODE_SHA,   "SHA"   },
+	 { FLAG_ENCODE_SMD5,  "SMD5"  },
+	 { FLAG_ENCODE_SSHA,  "SSHA"  },
 #endif
      { 0, "" }
 };
