Skip to content
Snippets Groups Projects
Commit 2ee0dcfc authored by Dave Storey's avatar Dave Storey
Browse files

Added salted MD5 and SHA support. (SSHA,SMD5)

parent 22e3ddaa
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,8 @@
#include "portable.h"
#include <stdlib.h>
#include <ac/string.h>
#include <ac/unistd.h>
......@@ -70,6 +72,66 @@ lutil_passwd(
return( strcmp(p, base64digest) );
} else if (strncasecmp(passwd, "{SSHA}", sizeof("{SSHA}") - 1) == 0) {
lutil_SHA1_CTX SHA1context;
unsigned char SHA1digest[20];
const char *p = passwd + (sizeof("{SSHA}") - 1);
int pw_len = strlen(p);
int rc;
unsigned char *orig_pass = NULL;
/* base64 un-encode password */
orig_pass = (unsigned char *)malloc(pw_len * 0.75 + 1);
if ((rc = lutil_b64_pton(p, orig_pass, pw_len)) < 0)
{
free(orig_pass);
return ( 1 );
}
/* hash credentials with salt */
lutil_SHA1Init(&SHA1context);
lutil_SHA1Update(&SHA1context,
(const unsigned char *) cred, strlen(cred));
lutil_SHA1Update(&SHA1context,
(const unsigned char *) orig_pass + sizeof(SHA1digest),
rc - sizeof(SHA1digest));
lutil_SHA1Final(SHA1digest, &SHA1context);
/* compare */
rc = strncmp((char *)orig_pass, (char *)SHA1digest, sizeof(SHA1digest));
free(orig_pass);
return(rc);
} else if (strncasecmp(passwd, "{SMD5}", sizeof("{SMD5}") - 1) == 0) {
lutil_MD5_CTX MD5context;
unsigned char MD5digest[16];
const char *p = passwd + (sizeof("{SMD5}") - 1);
int pw_len = strlen(p);
int rc;
unsigned char *orig_pass = NULL;
/* base64 un-encode password */
orig_pass = (unsigned char *)malloc(pw_len * 0.75 + 1);
if ((rc = lutil_b64_pton(p, orig_pass, pw_len)) < 0)
{
free(orig_pass);
return ( 1 );
}
/* hash credentials with salt */
lutil_MD5Init(&MD5context);
lutil_MD5Update(&MD5context,
(const unsigned char *) cred, strlen(cred));
lutil_MD5Update(&MD5context,
(const unsigned char *) orig_pass + sizeof(MD5digest),
rc - sizeof(MD5digest));
lutil_MD5Final(MD5digest, &MD5context);
/* compare */
rc = strncmp((char *)orig_pass, (char *)MD5digest, sizeof(MD5digest));
free(orig_pass);
return ( rc );
#ifdef SLAPD_CRYPT
} else if (strncasecmp(passwd, "{CRYPT}", sizeof("{CRYPT}") - 1) == 0 ) {
const char *p = passwd + (sizeof("{CRYPT}") - 1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment