password-scheme.c revision ba640f44613a259710dcfd2642c750acbe3d816a
/* Copyright (C) 2003-2007 Timo Sirainen */
#include "lib.h"
#include "array.h"
#include "base64.h"
#include "hex-binary.h"
#include "md4.h"
#include "md5.h"
#include "module-dir.h"
#include "mycrypt.h"
#include "randgen.h"
#include "sha1.h"
#include "otp.h"
#include "str.h"
#include "password-scheme.h"
static const char salt_chars[] =
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static const struct password_scheme *schemes;
#ifdef HAVE_MODULES
static struct module *scheme_modules;
#endif
{
const struct password_scheme *s;
return 0;
}
return -1;
}
{
return NULL;
}
}
{
return TRUE;
s1 = s;
s2 = s;
}
/* if they've the same verify function, they're equivalent */
}
const char *password_get_scheme(const char **password)
{
const char *p, *scheme;
return NULL;
/* $1$<salt>$<password>[$<ignored>] */
if (p != NULL) {
/* stop at next '$' after password */
if (p != NULL)
return "MD5-CRYPT";
}
}
if (**password != '{')
return NULL;
if (p == NULL)
return NULL;
*password = p + 1;
return scheme;
}
const char *scheme)
{
const struct password_scheme *s;
}
return NULL;
}
const char *user __attr_unused__)
{
}
static const char *crypt_generate(const char *plaintext,
const char *user __attr_unused__)
{
char salt[9];
}
const char *user __attr_unused__)
{
const char *str;
}
static const char *md5_crypt_generate(const char *plaintext,
const char *user __attr_unused__)
{
char salt[9];
int i;
for (i = 0; i < 8; i++)
}
static const char *sha1_generate(const char *plaintext,
const char *user __attr_unused__)
{
unsigned char digest[SHA1_RESULTLEN];
}
static const void *
{
/* hex-encoded */
return NULL;
} else {
/* base64-encoded */
return NULL;
}
}
const char *user)
{
unsigned char sha1_digest[SHA1_RESULTLEN];
const char *data;
return 0;
}
}
static const char *ssha_generate(const char *plaintext,
const char *user __attr_unused__)
{
#define SSHA_SALT_LEN 4
}
const char *user __attr_unused__)
{
unsigned char sha1_digest[SHA1_RESULTLEN];
const char *data;
/* format: base64-encoded MD5 hash and salt */
return 0;
}
if (size <= SHA1_RESULTLEN) {
return 0;
}
}
static const char *smd5_generate(const char *plaintext,
const char *user __attr_unused__)
{
#define SMD5_SALT_LEN 4
struct md5_context ctx;
}
const char *user __attr_unused__)
{
unsigned char md5_digest[MD5_RESULTLEN];
const char *data;
struct md5_context ctx;
/* format: base64-encoded MD5 hash and salt */
return 0;
}
if (size <= MD5_RESULTLEN) {
return 0;
}
}
const char *user __attr_unused__)
{
}
static const char *plain_generate(const char *plaintext,
const char *user __attr_unused__)
{
return plaintext;
}
const char *user __attr_unused__)
{
}
static const char *cram_md5_generate(const char *plaintext,
const char *user __attr_unused__)
{
return password_generate_cram_md5(plaintext);
}
const char *user)
{
unsigned char digest[MD5_RESULTLEN];
/* user:realm:passwd */
}
{
unsigned char digest[MD5_RESULTLEN];
i_fatal("digest_md5_generate(): username not given");
/* user:realm:passwd */
}
const char *user)
{
unsigned char digest[MD4_RESULTLEN];
const void *data;
i_error("plain_md4_verify(%s): Invalid password encoding",
user);
return 0;
}
}
static const char *plain_md4_generate(const char *plaintext,
const char *user __attr_unused__)
{
unsigned char digest[MD4_RESULTLEN];
}
const char *user)
{
unsigned char digest[MD5_RESULTLEN];
const void *data;
i_error("plain_md5_verify(%s): Invalid password encoding",
user);
return 0;
}
}
static const char *plain_md5_generate(const char *plaintext,
const char *user __attr_unused__)
{
unsigned char digest[MD5_RESULTLEN];
}
static const char *ldap_md5_generate(const char *plaintext,
const char *user __attr_unused__)
{
unsigned char digest[MD5_RESULTLEN];
}
const char *user __attr_unused__)
{
}
static const char *lm_generate(const char *plaintext,
const char *user __attr_unused__)
{
return password_generate_lm(plaintext);
}
const char *user __attr_unused__)
{
}
static const char *ntlm_generate(const char *plaintext,
const char *user __attr_unused__)
{
return password_generate_ntlm(plaintext);
}
const char *user __attr_unused__)
{
return strcasecmp(password,
}
static const char *otp_generate(const char *plaintext,
const char *user __attr_unused__)
{
}
static const char *skey_generate(const char *plaintext,
const char *user __attr_unused__)
{
}
const char *user __attr_unused__)
{
}
static const char *rpa_generate(const char *plaintext,
const char *user __attr_unused__)
{
return password_generate_rpa(plaintext);
}
static const struct password_scheme default_schemes[] = {
};
void password_schemes_init(void)
{
const struct password_scheme *s;
#ifdef HAVE_MODULES
const char *symbol;
#endif
sizeof(default_schemes[0]) + 4);
#ifdef HAVE_MODULES
t_push();
if (s != NULL)
t_pop();
}
#endif
(void)array_append_space(&schemes_arr);
}
void password_schemes_deinit(void)
{
#ifdef HAVE_MODULES
#endif
}