libbb: move crypt_make_salt() to pw_encrypt.c, reuse bin-to-ascii64 conversion which does not require an array.
No binary (build failed)
—
(log yok)
| @@ -120,9 +120,9 @@ lib-y += xrealloc_vector.o | |
| lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o | |
| lib-$(CONFIG_LOSETUP) += loop.o | |
| lib-$(CONFIG_FEATURE_MTAB_SUPPORT) += mtab.o | |
| - | lib-$(CONFIG_PASSWD) += pw_encrypt.o crypt_make_salt.o update_passwd.o |
| - | lib-$(CONFIG_CHPASSWD) += pw_encrypt.o crypt_make_salt.o update_passwd.o |
| - | lib-$(CONFIG_CRYPTPW) += pw_encrypt.o crypt_make_salt.o |
| + | lib-$(CONFIG_PASSWD) += pw_encrypt.o update_passwd.o |
| + | lib-$(CONFIG_CHPASSWD) += pw_encrypt.o update_passwd.o |
| + | lib-$(CONFIG_CRYPTPW) += pw_encrypt.o |
| lib-$(CONFIG_SULOGIN) += pw_encrypt.o | |
| lib-$(CONFIG_FEATURE_HTTPD_AUTH_MD5) += pw_encrypt.o | |
| lib-$(CONFIG_VLOCK) += pw_encrypt.o correct_password.o | |
| @@ -1,46 +0,0 @@ | |
| - | /* vi: set sw=4 ts=4: */ |
| - | /* |
| - | * crypt_make_salt |
| - | * |
| - | * i64c was also put here, this is the only function that uses it. |
| - | * |
| - | * Lifted from loginutils/passwd.c by Thomas Lundquist <[email protected]> |
| - | * |
| - | * Licensed under GPLv2, see file LICENSE in this tarball for details. |
| - | */ |
| - | |
| - | #include "libbb.h" |
| - | |
| - | static int i64c(int i) |
| - | { |
| - | i &= 0x3f; |
| - | if (i == 0) |
| - | return '.'; |
| - | if (i == 1) |
| - | return '/'; |
| - | if (i < 12) |
| - | return ('0' - 2 + i); |
| - | if (i < 38) |
| - | return ('A' - 12 + i); |
| - | return ('a' - 38 + i); |
| - | } |
| - | |
| - | int FAST_FUNC crypt_make_salt(char *p, int cnt, int x) |
| - | { |
| - | x += getpid() + time(NULL); |
| - | do { |
| - | /* x = (x*1664525 + 1013904223) % 2^32 generator is lame |
| - | * (low-order bit is not "random", etc...), |
| - | * but for our purposes it is good enough */ |
| - | x = x*1664525 + 1013904223; |
| - | /* BTW, Park and Miller's "minimal standard generator" is |
| - | * x = x*16807 % ((2^31)-1) |
| - | * It has no problem with visibly alternating lowest bit |
| - | * but is also weak in cryptographic sense + needs div, |
| - | * which needs more code (and slower) on many CPUs */ |
| - | *p++ = i64c(x >> 16); |
| - | *p++ = i64c(x >> 22); |
| - | } while (--cnt); |
| - | *p = '\0'; |
| - | return x; |
| - | } |
| @@ -1,6 +1,6 @@ | |
| /* vi: set sw=4 ts=4: */ | |
| /* | |
| - | * Utility routine. |
| + | * Utility routines. |
| * | |
| * Copyright (C) 1999-2004 by Erik Andersen <[email protected]> | |
| * | |
| @@ -9,25 +9,62 @@ | |
| #include "libbb.h" | |
| - | #if ENABLE_USE_BB_CRYPT |
| - | |
| - | /* |
| - | * DES and MD5 crypt implementations are taken from uclibc. |
| - | * They were modified to not use static buffers. |
| + | /* static const uint8_t ascii64[] = |
| + | * "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| */ | |
| - | /* Used by pw_encrypt_XXX.c */ |
| - | static const uint8_t ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| + | static int i64c(int i) |
| + | { |
| + | i &= 0x3f; |
| + | if (i == 0) |
| + | return '.'; |
| + | if (i == 1) |
| + | return '/'; |
| + | if (i < 12) |
| + | return ('0' - 2 + i); |
| + | if (i < 38) |
| + | return ('A' - 12 + i); |
| + | return ('a' - 38 + i); |
| + | } |
| + | |
| + | int FAST_FUNC crypt_make_salt(char *p, int cnt, int x) |
| + | { |
| + | x += getpid() + time(NULL); |
| + | do { |
| + | /* x = (x*1664525 + 1013904223) % 2^32 generator is lame |
| + | * (low-order bit is not "random", etc...), |
| + | * but for our purposes it is good enough */ |
| + | x = x*1664525 + 1013904223; |
| + | /* BTW, Park and Miller's "minimal standard generator" is |
| + | * x = x*16807 % ((2^31)-1) |
| + | * It has no problem with visibly alternating lowest bit |
| + | * but is also weak in cryptographic sense + needs div, |
| + | * which needs more code (and slower) on many CPUs */ |
| + | *p++ = i64c(x >> 16); |
| + | *p++ = i64c(x >> 22); |
| + | } while (--cnt); |
| + | *p = '\0'; |
| + | return x; |
| + | } |
| + | |
| + | #if ENABLE_USE_BB_CRYPT |
| + | |
| static char* | |
| to64(char *s, unsigned v, int n) | |
| { | |
| while (--n >= 0) { | |
| - | *s++ = ascii64[v & 0x3f]; |
| + | /* *s++ = ascii64[v & 0x3f]; */ |
| + | *s++ = i64c(v); |
| v >>= 6; | |
| } | |
| return s; | |
| } | |
| + | /* |
| + | * DES and MD5 crypt implementations are taken from uclibc. |
| + | * They were modified to not use static buffers. |
| + | */ |
| + | |
| #include "pw_encrypt_des.c" | |
| #include "pw_encrypt_md5.c" | |
| #if ENABLE_USE_BB_CRYPT_SHA | |
| @@ -699,10 +699,16 @@ do_des(struct des_ctx *ctx, /*uint32_t l_in, uint32_t r_in,*/ uint32_t *l_out, u | |
| static void | |
| to64_msb_first(char *s, unsigned v) | |
| { | |
| + | #if 0 |
| *s++ = ascii64[(v >> 18) & 0x3f]; /* bits 23..18 */ | |
| *s++ = ascii64[(v >> 12) & 0x3f]; /* bits 17..12 */ | |
| *s++ = ascii64[(v >> 6) & 0x3f]; /* bits 11..6 */ | |
| - | *s = ascii64[v & 0x3f]; /* bits 5..0 */ |
| + | *s = ascii64[v & 0x3f]; /* bits 5..0 */ |
| + | #endif |
| + | *s++ = i64c(v >> 18); /* bits 23..18 */ |
| + | *s++ = i64c(v >> 12); /* bits 17..12 */ |
| + | *s++ = i64c(v >> 6); /* bits 11..6 */ |
| + | *s = i64c(v); /* bits 5..0 */ |
| } | |
| static char * | |