diff options
author | Denis Vlasenko | 2008-06-12 16:55:59 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-06-12 16:55:59 +0000 |
commit | 4ea83bf562c44a6792e7c77e7d87cba91f86f763 (patch) | |
tree | 64dba9163b29724e282c1e94027001a11978e74b /libbb/pw_encrypt.c | |
parent | 9de462205542547694299e9fe2bc321088ab79aa (diff) | |
download | busybox-4ea83bf562c44a6792e7c77e7d87cba91f86f763.zip busybox-4ea83bf562c44a6792e7c77e7d87cba91f86f763.tar.gz |
uclibc insists on having 70k static buffer for crypt.
For bbox it's not acceptable. Roll our own des and md5 crypt
implementation. Against older uclibc:
text data bss dec hex filename
759945 604 6684 767233 bb501 busybox_old
759766 604 6684 767054 bb44e busybox_unstripped
so, we still save on code size.
Diffstat (limited to 'libbb/pw_encrypt.c')
-rw-r--r-- | libbb/pw_encrypt.c | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c index e9cf4e3..d439fc3 100644 --- a/libbb/pw_encrypt.c +++ b/libbb/pw_encrypt.c @@ -8,11 +8,52 @@ */ #include "libbb.h" -#include <crypt.h> -char *pw_encrypt(const char *clear, const char *salt) +/* + * DES and MD5 crypt implementations are taken from uclibc. + * They were modified to not use static buffers. + * Comparison with uclibc (before uclibc had 70k staic buffers reinstated): + * text data bss dec hex filename + * 759909 604 6684 767197 bb4dd busybox_old + * 759579 604 6684 766867 bb393 busybox_unstripped + */ +/* Common for them */ +static const uint8_t ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +#include "pw_encrypt_des.c" +#include "pw_encrypt_md5.c" + + +static struct const_des_ctx *des_cctx; +static struct des_ctx *des_ctx; + +/* my_crypt returns malloc'ed data */ +static char *my_crypt(const char *key, const char *salt) +{ + /* First, check if we are supposed to be using the MD5 replacement + * instead of DES... */ + if (salt[0] == '$' && salt[1] == '1' && salt[2] == '$') { + return md5_crypt(xzalloc(MD5_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); + } + + { + if (!des_cctx) + des_cctx = const_des_init(); + des_ctx = des_init(des_ctx, des_cctx); + return des_crypt(des_ctx, xzalloc(DES_OUT_BUFSIZE), (unsigned char*)key, (unsigned char*)salt); + } +} + +/* So far nobody wants to have it public */ +static void my_crypt_cleanup(void) +{ + free(des_cctx); + free(des_ctx); + des_cctx = NULL; + des_ctx = NULL; +} + +char *pw_encrypt(const char *clear, const char *salt, int cleanup) { - /* Was static char[BIGNUM]. Malloced thing works as well */ static char *cipher; #if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */ @@ -22,6 +63,10 @@ char *pw_encrypt(const char *clear, const char *salt) #endif free(cipher); - cipher = xstrdup(crypt(clear, salt)); + cipher = my_crypt(clear, salt); + + if (cleanup) + my_crypt_cleanup(); + return cipher; } |