Rich Felker | cdf5150 | 2012-06-29 00:56:37 -0400 | [diff] [blame] | 1 | #include <crypt.h> |
| 2 | #include "libc.h" |
| 3 | |
| 4 | struct crypt_data; |
| 5 | |
| 6 | char *__crypt_des(const char *, const char *, char *); |
| 7 | char *__crypt_md5(const char *, const char *, char *); |
Rich Felker | a02bf5f | 2012-08-10 00:20:00 -0400 | [diff] [blame] | 8 | char *__crypt_blowfish(const char *, const char *, char *); |
Rich Felker | 88bf5a8 | 2012-08-29 12:41:29 -0400 | [diff] [blame] | 9 | char *__crypt_sha256(const char *, const char *, char *); |
| 10 | char *__crypt_sha512(const char *, const char *, char *); |
Rich Felker | cdf5150 | 2012-06-29 00:56:37 -0400 | [diff] [blame] | 11 | |
| 12 | char *__crypt_r(const char *key, const char *salt, struct crypt_data *data) |
| 13 | { |
Rich Felker | 71ae0c7 | 2013-04-20 14:07:01 -0400 | [diff] [blame] | 14 | /* 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 Felker | cdf5150 | 2012-06-29 00:56:37 -0400 | [diff] [blame] | 18 | char *output = (char *)data; |
Rich Felker | a02bf5f | 2012-08-10 00:20:00 -0400 | [diff] [blame] | 19 | if (salt[0] == '$' && salt[1] && salt[2]) { |
Rich Felker | a02bf5f | 2012-08-10 00:20:00 -0400 | [diff] [blame] | 20 | if (salt[1] == '1' && salt[2] == '$') |
| 21 | return __crypt_md5(key, salt, output); |
Rich Felker | a02bf5f | 2012-08-10 00:20:00 -0400 | [diff] [blame] | 22 | if (salt[1] == '2' && salt[3] == '$') |
| 23 | return __crypt_blowfish(key, salt, output); |
Rich Felker | 88bf5a8 | 2012-08-29 12:41:29 -0400 | [diff] [blame] | 24 | 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 Felker | a02bf5f | 2012-08-10 00:20:00 -0400 | [diff] [blame] | 28 | } |
Rich Felker | cdf5150 | 2012-06-29 00:56:37 -0400 | [diff] [blame] | 29 | return __crypt_des(key, salt, output); |
| 30 | } |
| 31 | |
| 32 | weak_alias(__crypt_r, crypt_r); |