diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-10 18:52:35 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-10 18:52:35 +0000 |
commit | 2211d5268cc6fc5575f758a9835070fae5ffc405 (patch) | |
tree | 46b23253b2be2c2c5bcdb6909a740e894a93ae07 /libbb/pw_encrypt.c | |
parent | 56dceb9b7722193ef53fb1afb981f1289eecb0b0 (diff) | |
download | busybox-w32-2211d5268cc6fc5575f758a9835070fae5ffc405.tar.gz busybox-w32-2211d5268cc6fc5575f758a9835070fae5ffc405.tar.bz2 busybox-w32-2211d5268cc6fc5575f758a9835070fae5ffc405.zip |
libbb: add optionl support for SHA256/512 encrypted passwords
function old new delta
sha_crypt - 2423 +2423
cryptpw_main 128 183 +55
to64 - 29 +29
pw_encrypt 974 1000 +26
str_rounds - 11 +11
login_main 1532 1541 +9
packed_usage 25215 25200 -15
__md5_to64 29 - -29
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 3/1 up/down: 2553/-44) Total: 2509 bytes
Diffstat (limited to 'libbb/pw_encrypt.c')
-rw-r--r-- | libbb/pw_encrypt.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c index 0b826f48d..572591ea9 100644 --- a/libbb/pw_encrypt.c +++ b/libbb/pw_encrypt.c | |||
@@ -15,16 +15,27 @@ | |||
15 | * DES and MD5 crypt implementations are taken from uclibc. | 15 | * DES and MD5 crypt implementations are taken from uclibc. |
16 | * They were modified to not use static buffers. | 16 | * They were modified to not use static buffers. |
17 | */ | 17 | */ |
18 | /* Common for them */ | 18 | |
19 | /* Used by pw_encrypt_XXX.c */ | ||
19 | static const uint8_t ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 20 | static const uint8_t ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
21 | static char* | ||
22 | to64(char *s, unsigned v, int n) | ||
23 | { | ||
24 | while (--n >= 0) { | ||
25 | *s++ = ascii64[v & 0x3f]; | ||
26 | v >>= 6; | ||
27 | } | ||
28 | return s; | ||
29 | } | ||
30 | |||
20 | #include "pw_encrypt_des.c" | 31 | #include "pw_encrypt_des.c" |
21 | #include "pw_encrypt_md5.c" | 32 | #include "pw_encrypt_md5.c" |
33 | #if ENABLE_USE_BB_CRYPT_SHA | ||
34 | #include "pw_encrypt_sha.c" | ||
35 | #endif | ||
22 | 36 | ||
23 | /* Other advanced crypt ids: */ | 37 | /* Other advanced crypt ids (TODO?): */ |
24 | /* $2$ or $2a$: Blowfish */ | 38 | /* $2$ or $2a$: Blowfish */ |
25 | /* $5$: SHA-256 */ | ||
26 | /* $6$: SHA-512 */ | ||
27 | /* TODO: implement SHA - http://people.redhat.com/drepper/SHA-crypt.txt */ | ||
28 | 39 | ||
29 | static struct const_des_ctx *des_cctx; | 40 | static struct const_des_ctx *des_cctx; |
30 | static struct des_ctx *des_ctx; | 41 | static struct des_ctx *des_ctx; |
@@ -32,18 +43,20 @@ static struct des_ctx *des_ctx; | |||
32 | /* my_crypt returns malloc'ed data */ | 43 | /* my_crypt returns malloc'ed data */ |
33 | static char *my_crypt(const char *key, const char *salt) | 44 | static char *my_crypt(const char *key, const char *salt) |
34 | { | 45 | { |
35 | /* First, check if we are supposed to be using the MD5 replacement | 46 | /* MD5 or SHA? */ |
36 | * instead of DES... */ | 47 | if (salt[0] == '$' && salt[1] && salt[2] == '$') { |
37 | if (salt[0] == '$' && salt[1] == '1' && salt[2] == '$') { | 48 | if (salt[1] == '1') |
38 | return md5_crypt(xzalloc(MD5_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); | 49 | return md5_crypt(xzalloc(MD5_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); |
50 | #if ENABLE_USE_BB_CRYPT_SHA | ||
51 | if (salt[1] == '5' || salt[1] == '6') | ||
52 | return sha_crypt((char*)key, (char*)salt); | ||
53 | #endif | ||
39 | } | 54 | } |
40 | 55 | ||
41 | { | 56 | if (!des_cctx) |
42 | if (!des_cctx) | 57 | des_cctx = const_des_init(); |
43 | des_cctx = const_des_init(); | 58 | des_ctx = des_init(des_ctx, des_cctx); |
44 | des_ctx = des_init(des_ctx, des_cctx); | 59 | return des_crypt(des_ctx, xzalloc(DES_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); |
45 | return des_crypt(des_ctx, xzalloc(DES_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); | ||
46 | } | ||
47 | } | 60 | } |
48 | 61 | ||
49 | /* So far nobody wants to have it public */ | 62 | /* So far nobody wants to have it public */ |