X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fpw_encrypt.c;h=469e71f6ccdc9606a8f895d9db2d07127a17419f;hb=08ea11ab0749a7977e6d47cd0fa7b3c9cc10af32;hp=e9cf4e3b8ec5f8d0c49145e7d5e5a8f011b031e6;hpb=91e149a3736ddc357950252c02d758515074447f;p=oweals%2Fbusybox.git diff --git a/libbb/pw_encrypt.c b/libbb/pw_encrypt.c index e9cf4e3b8..469e71f6c 100644 --- a/libbb/pw_encrypt.c +++ b/libbb/pw_encrypt.c @@ -8,12 +8,51 @@ */ #include "libbb.h" -#include -char *pw_encrypt(const char *clear, const char *salt) +#if ENABLE_USE_BB_CRYPT + +/* + * DES and MD5 crypt implementations are taken from uclibc. + * They were modified to not use static buffers. + */ +/* 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* FAST_FUNC pw_encrypt(const char *clear, const char *salt, int cleanup) { - /* Was static char[BIGNUM]. Malloced thing works as well */ - static char *cipher; + char *encrypted; #if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */ if (strncmp(salt, "$2$", 3) == 0) { @@ -21,7 +60,25 @@ char *pw_encrypt(const char *clear, const char *salt) } #endif - free(cipher); - cipher = xstrdup(crypt(clear, salt)); - return cipher; + encrypted = my_crypt(clear, salt); + + if (cleanup) + my_crypt_cleanup(); + + return encrypted; +} + +#else /* if !ENABLE_USE_BB_CRYPT */ + +char* FAST_FUNC pw_encrypt(const char *clear, const char *salt, int cleanup) +{ +#if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */ + if (strncmp(salt, "$2$", 3) == 0) { + return xstrdup(sha1_crypt(clear)); + } +#endif + + return xstrdup(crypt(clear, salt)); } + +#endif