#ifndef PASSWORD_SCHEME_H
#define PASSWORD_SCHEME_H
enum password_encoding {
PW_ENCODING_NONE,
PW_ENCODING_BASE64,
PW_ENCODING_HEX
};
struct password_scheme {
const char *name;
enum password_encoding default_encoding;
unsigned int raw_password_len;
bool (*password_verify)(const char *plaintext, const char *user,
const unsigned char *raw_password, size_t size);
void (*password_generate)(const char *plaintext, const char *user,
const unsigned char **raw_password_r,
size_t *size_r);
};
ARRAY_DEFINE_TYPE(password_scheme_p, const struct password_scheme *);
extern ARRAY_TYPE(password_scheme_p) password_schemes;
int password_verify(const char *plaintext, const char *user, const char *scheme,
const unsigned char *raw_password, size_t size);
const char *password_get_scheme(const char **password);
int password_decode(const char *password, const char *scheme,
const unsigned char **raw_password_r, size_t *size_r,
const char **error_r);
bool password_generate(const char *plaintext, const char *user,
const char *scheme,
const unsigned char **raw_password_r, size_t *size_r);
bool password_generate_encoded(const char *plaintext, const char *user,
const char *scheme, const char **password_r);
bool password_scheme_is_alias(const char *scheme1, const char *scheme2);
const char *
password_scheme_detect(const char *plain_password, const char *crypted_password,
const char *user);
void password_scheme_register(const struct password_scheme *scheme);
void password_scheme_unregister(const struct password_scheme *scheme);
void password_schemes_init(void);
void password_schemes_deinit(void);
void password_set_encryption_rounds(unsigned int rounds);
const char *password_generate_salt(size_t len);
const char *password_generate_md5_crypt(const char *pw, const char *salt);
const char *password_generate_otp(const char *pw, const char *state,
unsigned int algo);
void password_generate_rpa(const char *pw, unsigned char result[]);
bool crypt_verify(const char *plaintext, const char *user,
const unsigned char *raw_password, size_t size);
void password_scheme_register_crypt(void);
#endif