password-scheme.c revision 8e0265f999e2fb4be4add5437df12f780a89b44e
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen/* Copyright (c) 2003-2011 Dovecot authors, see the included COPYING file */
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainenstatic const char salt_chars[] =
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
202a34580f6204672d9b0d6a0756f35a3c4cdef6Timo SirainenARRAY_TYPE(password_scheme_p) password_schemes;
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainenstatic const struct password_scheme *
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen const struct password_scheme *scheme = *schemes;
202a34580f6204672d9b0d6a0756f35a3c4cdef6Timo Sirainen/* Lookup scheme and encoding by given name. The encoding is taken from
202a34580f6204672d9b0d6a0756f35a3c4cdef6Timo Sirainen ".base64", ".b64" or ".hex" suffix if it exists, otherwise the default
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen encoding is used. */
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainenstatic const struct password_scheme *
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainenpassword_scheme_lookup(const char *name, enum password_encoding *encoding_r)
cbb79ea1b1a49255c6edc46409a544666b22788fTimo Sirainen for (scheme_len = 0; name[scheme_len] != '\0'; scheme_len++) {
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen /* unknown encoding. treat as invalid scheme. */
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainenint password_verify(const char *plaintext, const char *user, const char *scheme,
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen const unsigned char *raw_password, size_t size,
cbb79ea1b1a49255c6edc46409a544666b22788fTimo Sirainen const char **error_r)
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen const struct password_scheme *s;
3157f61431f19e01173e2e0d270c28af86dc97aaTimo Sirainen const unsigned char *generated;
if (s == NULL) {
error_r);
const char *p, *scheme;
return NULL;
if (p != NULL) {
if (p != NULL)
return NULL;
if (p == NULL)
return NULL;
return scheme;
const char **error_r)
const struct password_scheme *s;
unsigned int len;
bool guessed_encoding;
if (s == NULL) {
switch (encoding) {
case PW_ENCODING_NONE:
case PW_ENCODING_HEX:
if (!guessed_encoding) {
case PW_ENCODING_BASE64:
const char *scheme,
const struct password_scheme *s;
if (s == NULL)
return FALSE;
return TRUE;
const struct password_scheme *s;
const unsigned char *raw_password;
if (s == NULL)
return FALSE;
switch (encoding) {
case PW_ENCODING_NONE:
case PW_ENCODING_BASE64:
case PW_ENCODING_HEX:
return TRUE;
char *salt;
for (i = 0; i < len; i++)
return salt;
return TRUE;
const char *user)
unsigned int i, count;
const unsigned char *raw_password;
const char *error;
for (i = 0; i < count; i++) {
&error) <= 0)
&error) > 0)
return NULL;
const char **error_r)
if (size == 0) {
const unsigned char *md5_password;
const char *password;
unsigned char *digest;
unsigned char *digest;
unsigned char *digest;
const char **error_r)
const char **error_r)
const char **error_r)
const char **error_r)
const char **error_r)
for (i = 0; i < size; i++) {
unsigned char *context_digest;
unsigned char *digest;
realm++;
unsigned char *digest;
unsigned char *digest;
unsigned char *digest;
unsigned char *digest;
const char **error_r)
const char *password;
i_unreached();
const char *password;
i_unreached();
unsigned char *digest;
unsigned int idx;
void password_schemes_init(void)
void password_schemes_deinit(void)