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