/*
 * Written by Solar Designer <solar at openwall.com> in 2000-2011.
 * No copyright is claimed, and the software is hereby placed in the public
 * domain.  In case this attempt to disclaim copyright and place the software
 * in the public domain is deemed null and void, then the software is
 * Copyright (c) 2000-2011 Solar Designer and it is hereby released to the
 * general public under the following terms:
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted.
 *
 * There's ABSOLUTELY NO WARRANTY, express or implied.
 *
 * See crypt_blowfish.c for more information.
 */

#ifndef _CRYPT_BLOWFISH_H
#define _CRYPT_BLOWFISH_H

#include "apr.h" /* for apr_size_t */

extern int _crypt_output_magic(const char *setting, char *output, apr_size_t size);
extern char *_crypt_blowfish_rn(const char *key, const char *setting,
                                char *output, apr_size_t size);
extern char *_crypt_gensalt_blowfish_rn(const char *prefix, unsigned long count,
                                        const char *input, apr_size_t size,
                                        char *output, apr_size_t output_size);

#endif
