diff -urN cyrus-sasl-2.1.21.orig/lib/checkpw.c cyrus-sasl-2.1.21/lib/checkpw.c --- cyrus-sasl-2.1.21.orig/lib/checkpw.c 2005-08-24 11:36:23.000000000 +0200 +++ cyrus-sasl-2.1.21/lib/checkpw.c 2005-08-24 11:36:07.000000000 +0200 @@ -103,10 +103,12 @@ #define PASSWORD_FORMAT_CLEARTEXT 1 #define PASSWORD_FORMAT_CRYPT 2 #define PASSWORD_FORMAT_CRYPTTRAD 3 +#define PASSWORD_FORMAT_MD5 4 #define PASSWORD_SALT_BUF_LEN 22 /* weeds out crypt(3) password's salt */ int _sasl_get_salt (char *dest, char *src, int format); +const char *_sasl_md5sum(const char *src); /****************************** * crypt(3) patch stop * @@ -192,6 +194,9 @@ /* traditional crypt(3) */ else if (strncmp(p, "crypt_trad", 11) == 0) password_format = PASSWORD_FORMAT_CRYPTTRAD; + /* md5sum like hash */ + else if (strncmp(p, "md5", 11) == 0) + password_format = PASSWORD_FORMAT_MD5; /* cleartext password */ else password_format = PASSWORD_FORMAT_CLEARTEXT; @@ -250,13 +255,20 @@ _sasl_get_salt(salt, (char *) auxprop_values[0].values[0], password_format); /* crypt(3)-ed password? */ - if (password_format != PASSWORD_FORMAT_CLEARTEXT) { + if (password_format == PASSWORD_FORMAT_CRYPT || password_format == PASSWORD_FORMAT_CRYPTTRAD) { /* compare password */ if (auxprop_values[0].name && auxprop_values[0].values && auxprop_values[0].values[0] && strcmp(crypt(passwd, salt), auxprop_values[0].values[0]) == 0) return SASL_OK; else ret = SASL_BADAUTH; } + /* md5 hash password */ + else if (password_format == PASSWORD_FORMAT_MD5) { + if (auxprop_values[0].name && auxprop_values[0].values && auxprop_values[0].values[0] && strcasecmp(auxprop_values[0].values[0], _sasl_md5sum(passwd)) == 0) + return SASL_OK; + else + ret = SASL_BADAUTH; + } else if (password_format == PASSWORD_FORMAT_CLEARTEXT) { /* compare passwords */ if (auxprop_values[0].name && auxprop_values[0].values && auxprop_values[0].values[0] && strcmp(auxprop_values[0].values[0], passwd) == 0) @@ -1087,3 +1099,24 @@ return 1; } + +const char *_sasl_md5sum(const char *src) { + static char md5sum[33]; + const char hex[] = "0123456789abcdef"; + char md5[16]; + MD5_CTX ctx; + int i = 0; + int j = 0; + + _sasl_MD5Init(&ctx); + _sasl_MD5Update(&ctx, src, strlen(src)); + _sasl_MD5Final(&md5, &ctx); + + for(i=0; i<16; i++) { + md5sum[j++] = hex[md5[i] >> 4]; + md5sum[j++] = hex[md5[i] & 0x0F]; + } + + md5sum[j] = 0; + return(md5sum); +}