xref: /dflybsd-src/contrib/wpa_supplicant/wpa_supplicant/wpa_passphrase.c (revision 3a84a4273475ed07d0ab1c2dfeffdfedef35d9cd)
16d49e1aeSJan Lentfer /*
26d49e1aeSJan Lentfer  * WPA Supplicant - ASCII passphrase to WPA PSK tool
36d49e1aeSJan Lentfer  * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
46d49e1aeSJan Lentfer  *
53ff40c12SJohn Marino  * This software may be distributed under the terms of the BSD license.
63ff40c12SJohn Marino  * See README for more details.
76d49e1aeSJan Lentfer  */
86d49e1aeSJan Lentfer 
96d49e1aeSJan Lentfer #include "includes.h"
106d49e1aeSJan Lentfer 
116d49e1aeSJan Lentfer #include "common.h"
123ff40c12SJohn Marino #include "crypto/sha1.h"
136d49e1aeSJan Lentfer 
146d49e1aeSJan Lentfer 
main(int argc,char * argv[])156d49e1aeSJan Lentfer int main(int argc, char *argv[])
166d49e1aeSJan Lentfer {
176d49e1aeSJan Lentfer 	unsigned char psk[32];
186d49e1aeSJan Lentfer 	int i;
196d49e1aeSJan Lentfer 	char *ssid, *passphrase, buf[64], *pos;
20*a1157835SDaniel Fojt 	size_t len;
216d49e1aeSJan Lentfer 
226d49e1aeSJan Lentfer 	if (argc < 2) {
236d49e1aeSJan Lentfer 		printf("usage: wpa_passphrase <ssid> [passphrase]\n"
246d49e1aeSJan Lentfer 			"\nIf passphrase is left out, it will be read from "
256d49e1aeSJan Lentfer 			"stdin\n");
266d49e1aeSJan Lentfer 		return 1;
276d49e1aeSJan Lentfer 	}
286d49e1aeSJan Lentfer 
296d49e1aeSJan Lentfer 	ssid = argv[1];
306d49e1aeSJan Lentfer 
316d49e1aeSJan Lentfer 	if (argc > 2) {
326d49e1aeSJan Lentfer 		passphrase = argv[2];
336d49e1aeSJan Lentfer 	} else {
346d49e1aeSJan Lentfer 		printf("# reading passphrase from stdin\n");
356d49e1aeSJan Lentfer 		if (fgets(buf, sizeof(buf), stdin) == NULL) {
366d49e1aeSJan Lentfer 			printf("Failed to read passphrase\n");
376d49e1aeSJan Lentfer 			return 1;
386d49e1aeSJan Lentfer 		}
396d49e1aeSJan Lentfer 		buf[sizeof(buf) - 1] = '\0';
406d49e1aeSJan Lentfer 		pos = buf;
416d49e1aeSJan Lentfer 		while (*pos != '\0') {
426d49e1aeSJan Lentfer 			if (*pos == '\r' || *pos == '\n') {
436d49e1aeSJan Lentfer 				*pos = '\0';
446d49e1aeSJan Lentfer 				break;
456d49e1aeSJan Lentfer 			}
466d49e1aeSJan Lentfer 			pos++;
476d49e1aeSJan Lentfer 		}
486d49e1aeSJan Lentfer 		passphrase = buf;
496d49e1aeSJan Lentfer 	}
506d49e1aeSJan Lentfer 
51*a1157835SDaniel Fojt 	len = os_strlen(passphrase);
52*a1157835SDaniel Fojt 	if (len < 8 || len > 63) {
536d49e1aeSJan Lentfer 		printf("Passphrase must be 8..63 characters\n");
546d49e1aeSJan Lentfer 		return 1;
556d49e1aeSJan Lentfer 	}
56*a1157835SDaniel Fojt 	if (has_ctrl_char((u8 *) passphrase, len)) {
57*a1157835SDaniel Fojt 		printf("Invalid passphrase character\n");
58*a1157835SDaniel Fojt 		return 1;
59*a1157835SDaniel Fojt 	}
606d49e1aeSJan Lentfer 
613ff40c12SJohn Marino 	pbkdf2_sha1(passphrase, (u8 *) ssid, os_strlen(ssid), 4096, psk, 32);
626d49e1aeSJan Lentfer 
636d49e1aeSJan Lentfer 	printf("network={\n");
646d49e1aeSJan Lentfer 	printf("\tssid=\"%s\"\n", ssid);
656d49e1aeSJan Lentfer 	printf("\t#psk=\"%s\"\n", passphrase);
666d49e1aeSJan Lentfer 	printf("\tpsk=");
676d49e1aeSJan Lentfer 	for (i = 0; i < 32; i++)
686d49e1aeSJan Lentfer 		printf("%02x", psk[i]);
696d49e1aeSJan Lentfer 	printf("\n");
706d49e1aeSJan Lentfer 	printf("}\n");
716d49e1aeSJan Lentfer 
726d49e1aeSJan Lentfer 	return 0;
736d49e1aeSJan Lentfer }
74