From 6d1b10b9e516bd88fa34392395b0a7c6e6f54fd7 Mon Sep 17 00:00:00 2001 From: juyin Date: Thu, 31 Mar 2022 16:45:19 +0800 Subject: [PATCH] chpasswd: add get_salt for generating salt value The function that generates the salt value is extracted separately, and it is more convenient to modify it later. Reference: https://github.com/shadow-maint/shadow/commit/a026154c6fca7c7e5d6d0723e0cc29d6cd9fa00a Conflict: The EulerOS supports SM3. As a result, the patch is different. --- src/chpasswd.c | 73 +++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/src/chpasswd.c b/src/chpasswd.c index 5dfb995..708f973 100644 --- a/src/chpasswd.c +++ b/src/chpasswd.c @@ -430,12 +430,54 @@ static void close_files (void) pw_locked = false; } +static const char *get_salt(void) +{ + if ( !eflg + && ( (NULL == crypt_method) + || (0 != strcmp (crypt_method, "NONE")))) { + void *arg = NULL; + + if (md5flg) { + crypt_method = "MD5"; + } +#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT) || defined(USE_YESCRYPT) + if (sflg) { +#if defined(USE_SHA_CRYPT) + if ( (0 == strcmp (crypt_method, "SHA256")) + || (0 == strcmp (crypt_method, "SHA512"))) { + arg = &sha_rounds; + } +#endif /* USE_SHA_CRYPT */ +#if defined(USE_BCRYPT) + if (0 == strcmp (crypt_method, "BCRYPT")) { + arg = &bcrypt_rounds; + } +#endif /* USE_BCRYPT */ +#if defined(USE_YESCRYPT) + if (0 == strcmp (crypt_method, "YESCRYPT")) { + arg = &yescrypt_cost; + } +#endif /* USE_YESCRYPT */ +#if defined(USE_SM3_CRYPT) + if (0 == strcmp (crypt_method, "SM3")) { + arg = &sm3_rounds; + } +#endif /* USE_SM3_CRYPT */ + } +#endif + return crypt_make_salt (crypt_method, arg); + } + + return NULL; +} + int main (int argc, char **argv) { char buf[BUFSIZ]; char *name; char *newpwd; char *cp; + const char *salt; #ifdef USE_PAM bool use_pam = true; @@ -545,40 +587,8 @@ int main (int argc, char **argv) const struct passwd *pw; struct passwd newpw; - if ( !eflg - && ( (NULL == crypt_method) - || (0 != strcmp (crypt_method, "NONE")))) { - void *arg = NULL; - const char *salt; - if (md5flg) { - crypt_method = "MD5"; - } -#if defined(USE_SHA_CRYPT) || defined(USE_BCRYPT) || defined(USE_YESCRYPT) - if (sflg) { -#if defined(USE_SHA_CRYPT) - if ( (0 == strcmp (crypt_method, "SHA256")) - || (0 == strcmp (crypt_method, "SHA512"))) { - arg = &sha_rounds; - } -#endif /* USE_SHA_CRYPT */ -#if defined(USE_BCRYPT) - if (0 == strcmp (crypt_method, "BCRYPT")) { - arg = &bcrypt_rounds; - } -#endif /* USE_BCRYPT */ -#if defined(USE_YESCRYPT) - if (0 == strcmp (crypt_method, "YESCRYPT")) { - arg = &yescrypt_cost; - } -#endif /* USE_YESCRYPT */ -#if defined(USE_SM3_CRYPT) - if (0 == strcmp (crypt_method, "SM3")) { - arg = &sm3_rounds; - } -#endif /* USE_SM3_CRYPT */ - } -#endif - salt = crypt_make_salt (crypt_method, arg); + salt = get_salt(); + if (salt) { cp = pw_encrypt (newpwd, salt); if (NULL == cp) { fprintf (stderr, -- 2.33.0