wpa_passphrase: Disable terminal echo when reading from stdin

Disable terminal echo using tcgetattr() and tcsetattr() when reading a
passphrase from stdin.

Signed-off-by: Abhiram V <abhi.raa.man.v@gmail.com>
This commit is contained in:
Abhiram V 2022-11-21 22:00:27 +05:30 committed by Jouni Malinen
parent 86ab282170
commit 5102d7411f

View file

@ -7,6 +7,7 @@
*/ */
#include "includes.h" #include "includes.h"
#include <termios.h>
#include "common.h" #include "common.h"
#include "crypto/sha1.h" #include "crypto/sha1.h"
@ -14,6 +15,7 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct termios term;
unsigned char psk[32]; unsigned char psk[32];
int i; int i;
char *ssid, *passphrase, buf[64], *pos; char *ssid, *passphrase, buf[64], *pos;
@ -31,11 +33,28 @@ int main(int argc, char *argv[])
if (argc > 2) { if (argc > 2) {
passphrase = argv[2]; passphrase = argv[2];
} else { } else {
bool ctrl_echo;
fprintf(stderr, "# reading passphrase from stdin\n"); fprintf(stderr, "# reading passphrase from stdin\n");
if (tcgetattr(STDIN_FILENO, &term) < 0) {
perror("tcgetattr");
return 1;
}
ctrl_echo = term.c_lflag & ECHO;
term.c_lflag &= ~ECHO;
if (ctrl_echo && tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0) {
perror("tcsetattr:error disabling echo");
return 1;
}
if (fgets(buf, sizeof(buf), stdin) == NULL) { if (fgets(buf, sizeof(buf), stdin) == NULL) {
fprintf(stderr, "Failed to read passphrase\n"); fprintf(stderr, "Failed to read passphrase\n");
return 1; return 1;
} }
term.c_lflag |= ECHO;
if (ctrl_echo && tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0) {
perror("tcsetattr:error enabling echo");
return 1;
}
buf[sizeof(buf) - 1] = '\0'; buf[sizeof(buf) - 1] = '\0';
pos = buf; pos = buf;
while (*pos != '\0') { while (*pos != '\0') {