static const unsigned char crypt64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890./";
+#ifdef SLAPD_CRYPT
+static char *salt_format = NULL;
+#endif
+
struct pw_scheme;
typedef int (*PASSWD_CHK_FUNC)(
const struct berval *passwd,
const struct berval *cred );
+#ifdef LUTIL_SHA1_BYTES
static int chk_ssha1(
const struct pw_scheme *scheme,
const struct berval *passwd,
const struct pw_scheme *scheme,
const struct berval *passwd,
const struct berval *cred );
+#endif
#ifdef SLAPD_LMHASH
static int chk_lanman(
#endif
+#ifdef LUTIL_SHA1_BYTES
/* password hash routines */
static struct berval *hash_sha1(
const struct pw_scheme *scheme,
static struct berval *hash_ssha1(
const struct pw_scheme *scheme,
const struct berval *passwd );
+#endif
static struct berval *hash_smd5(
const struct pw_scheme *scheme,
static const struct pw_scheme pw_schemes[] =
{
+#ifdef LUTIL_SHA1_BYTES
{ {sizeof("{SSHA}")-1, "{SSHA}"}, chk_ssha1, hash_ssha1 },
{ {sizeof("{SHA}")-1, "{SHA}"}, chk_sha1, hash_sha1 },
+#endif
{ {sizeof("{SMD5}")-1, "{SMD5}"}, chk_smd5, hash_smd5 },
{ {sizeof("{MD5}")-1, "{MD5}"}, chk_md5, hash_md5 },
return (sc->hash_fn)( sc, passwd );
}
+/* pw_string is only called when SLAPD_LMHASH or SLAPD_CRYPT is defined */
+#if defined(SLAPD_LMHASH) || defined(SLAPD_CRYPT)
static struct berval * pw_string(
const struct pw_scheme *sc,
const struct berval *passwd )
pw->bv_val[pw->bv_len] = '\0';
return pw;
}
+#endif /* SLAPD_LMHASH || SLAPD_CRYPT */
static struct berval * pw_string64(
const struct pw_scheme *sc,
/* PASSWORD CHECK ROUTINES */
+#ifdef LUTIL_SHA1_BYTES
static int chk_ssha1(
const struct pw_scheme *sc,
const struct berval * passwd,
ber_memfree(orig_pass);
return rc ? 1 : 0;
}
+#endif
static int chk_smd5(
const struct pw_scheme *sc,
/* PASSWORD GENERATION ROUTINES */
+#ifdef LUTIL_SHA1_BYTES
static struct berval *hash_ssha1(
const struct pw_scheme *scheme,
const struct berval *passwd )
return pw_string64( scheme, &digest, NULL);
}
+#endif
static struct berval *hash_smd5(
const struct pw_scheme *scheme,
const struct berval *passwd )
{
struct berval hash;
- unsigned char salt[9]; /* salt suitable for anything */
+ unsigned char salt[32]; /* salt suitable for most anything */
int i;
for( i=0; i<passwd->bv_len; i++) {
return NULL; /* passwd must behave like a string */
}
- if( lutil_entropy( salt, 8) < 0 ) {
+ if( lutil_entropy( salt, sizeof( salt ) ) < 0 ) {
return NULL;
}
- for( i=0; i<8; i++ ) {
+ for( i=0; i< ( sizeof(salt) - 1 ); i++ ) {
salt[i] = crypt64[ salt[i] % (sizeof(crypt64)-1) ];
}
- salt[8] = '\0';
+ salt[sizeof( salt ) - 1 ] = '\0';
+
+ if( salt_format != NULL ) {
+ /* copy the salt we made into entropy before snprintfing
+ it back into the salt */
+ char entropy[sizeof(salt)];
+ strcpy( entropy, salt );
+ snprintf( salt, sizeof(entropy), salt_format, entropy );
+ }
hash.bv_val = crypt( passwd->bv_val, salt );
return pw_string( scheme, &hash );
}
#endif
+
+int lutil_salt_format(const char *format)
+{
+#ifdef SLAPD_CRYPT
+ free( salt_format );
+
+ salt_format = format != NULL ? strdup( format ) : NULL;
+#endif
+
+ return 0;
+}