blob: 5982c4c9abc7db638b9c949c905ad37a03824f02 [file] [log] [blame]
Rich Felkercdf51502012-06-29 00:56:37 -04001#include <crypt.h>
2#include "libc.h"
3
4struct crypt_data;
5
6char *__crypt_des(const char *, const char *, char *);
7char *__crypt_md5(const char *, const char *, char *);
Rich Felkera02bf5f2012-08-10 00:20:00 -04008char *__crypt_blowfish(const char *, const char *, char *);
Rich Felker88bf5a82012-08-29 12:41:29 -04009char *__crypt_sha256(const char *, const char *, char *);
10char *__crypt_sha512(const char *, const char *, char *);
Rich Felkercdf51502012-06-29 00:56:37 -040011
12char *__crypt_r(const char *key, const char *salt, struct crypt_data *data)
13{
Rich Felker71ae0c72013-04-20 14:07:01 -040014 /* Per the crypt_r API, the caller has provided a pointer to
15 * struct crypt_data; however, this implementation does not
16 * use the structure to store any internal state, and treats
17 * it purely as a char buffer for storing the result. */
Rich Felkercdf51502012-06-29 00:56:37 -040018 char *output = (char *)data;
Rich Felkera02bf5f2012-08-10 00:20:00 -040019 if (salt[0] == '$' && salt[1] && salt[2]) {
Rich Felkera02bf5f2012-08-10 00:20:00 -040020 if (salt[1] == '1' && salt[2] == '$')
21 return __crypt_md5(key, salt, output);
Rich Felkera02bf5f2012-08-10 00:20:00 -040022 if (salt[1] == '2' && salt[3] == '$')
23 return __crypt_blowfish(key, salt, output);
Rich Felker88bf5a82012-08-29 12:41:29 -040024 if (salt[1] == '5' && salt[2] == '$')
25 return __crypt_sha256(key, salt, output);
26 if (salt[1] == '6' && salt[2] == '$')
27 return __crypt_sha512(key, salt, output);
Rich Felkera02bf5f2012-08-10 00:20:00 -040028 }
Rich Felkercdf51502012-06-29 00:56:37 -040029 return __crypt_des(key, salt, output);
30}
31
32weak_alias(__crypt_r, crypt_r);