diff -u -r ../dropbear-2019.77/svr-authpasswd.c ./svr-authpasswd.c
--- ../dropbear-2019.77/svr-authpasswd.c	2019-03-23 13:46:29.000000000 +0000
+++ ./svr-authpasswd.c	2019-03-24 22:40:59.586161245 +0000
@@ -33,28 +33,13 @@
 
 #if DROPBEAR_SVR_PASSWORD_AUTH
 
-/* not constant time when strings are differing lengths. 
- string content isn't leaked, and crypt hashes are predictable length. */
-static int constant_time_strcmp(const char* a, const char* b) {
-	size_t la = strlen(a);
-	size_t lb = strlen(b);
-
-	if (la != lb) {
-		return 1;
-	}
-
-	return constant_time_memcmp(a, b, la);
-}
+#include <termux-auth.h>
 
 /* Process a password auth request, sending success or failure messages as
  * appropriate */
 void svr_auth_password(int valid_user) {
-	
-	char * passwdcrypt = NULL; /* the crypt from /etc/passwd or /etc/shadow */
-	char * testcrypt = NULL; /* crypt generated from the user's password sent */
-	char * password = NULL;
-	unsigned int passwordlen;
-	unsigned int changepw;
+	char *password;
+	unsigned int changepw, passwordlen;
 
 	/* check if client wants to change password */
 	changepw = buf_getbool(ses.payload);
@@ -65,47 +50,9 @@
 	}
 
 	password = buf_getstring(ses.payload, &passwordlen);
-	if (valid_user && passwordlen <= DROPBEAR_MAX_PASSWORD_LEN) {
-		/* the first bytes of passwdcrypt are the salt */
-		passwdcrypt = ses.authstate.pw_passwd;
-		testcrypt = crypt(password, passwdcrypt);
-	}
-	m_burn(password, passwordlen);
-	m_free(password);
-
-	/* After we have got the payload contents we can exit if the username
-	is invalid. Invalid users have already been logged. */
-	if (!valid_user) {
-		send_msg_userauth_failure(0, 1);
-		return;
-	}
-
-	if (passwordlen > DROPBEAR_MAX_PASSWORD_LEN) {
-		dropbear_log(LOG_WARNING,
-				"Too-long password attempt for '%s' from %s",
-				ses.authstate.pw_name,
-				svr_ses.addrstring);
-		send_msg_userauth_failure(0, 1);
-		return;
-	}
-
-	if (testcrypt == NULL) {
-		/* crypt() with an invalid salt like "!!" */
-		dropbear_log(LOG_WARNING, "User account '%s' is locked",
-				ses.authstate.pw_name);
-		send_msg_userauth_failure(0, 1);
-		return;
-	}
-
-	/* check for empty password */
-	if (passwdcrypt[0] == '\0') {
-		dropbear_log(LOG_WARNING, "User '%s' has blank password, rejected",
-				ses.authstate.pw_name);
-		send_msg_userauth_failure(0, 1);
-		return;
-	}
 
-	if (constant_time_strcmp(testcrypt, passwdcrypt) == 0) {
+	/* check if password is valid */
+	if (termux_auth(ses.authstate.pw_name, password)) {
 		/* successful authentication */
 		dropbear_log(LOG_NOTICE, 
 				"Password auth succeeded for '%s' from %s",