118 lines
3.2 KiB
Diff
118 lines
3.2 KiB
Diff
|
|
From 6d1b10b9e516bd88fa34392395b0a7c6e6f54fd7 Mon Sep 17 00:00:00 2001
|
||
|
|
From: juyin <zhuyan34@huawei.com>
|
||
|
|
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
|