18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * WPA Supplicant - ASCII passphrase to WPA PSK tool 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "common.h" 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "crypto/sha1.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint main(int argc, char *argv[]) 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned char psk[32]; 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int i; 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *ssid, *passphrase, buf[64], *pos; 20293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt size_t len; 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("usage: wpa_passphrase <ssid> [passphrase]\n" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\nIf passphrase is left out, it will be read from " 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "stdin\n"); 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = argv[1]; 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 2) { 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt passphrase = argv[2]; 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("# reading passphrase from stdin\n"); 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (fgets(buf, sizeof(buf), stdin) == NULL) { 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Failed to read passphrase\n"); 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\r' || *pos == '\n') { 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt passphrase = buf; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 51293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt len = os_strlen(passphrase); 52293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt if (len < 8 || len > 63) { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Passphrase must be 8..63 characters\n"); 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 56293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt if (has_ctrl_char((u8 *) passphrase, len)) { 57293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt printf("Invalid passphrase character\n"); 58293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt return 1; 59293335998d38c497293b1c41f7ad8342b507d458Dmitry Shmidt } 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 6161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pbkdf2_sha1(passphrase, (u8 *) ssid, os_strlen(ssid), 4096, psk, 32); 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("network={\n"); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\tssid=\"%s\"\n", ssid); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\t#psk=\"%s\"\n", passphrase); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\tpsk="); 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 32; i++) 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%02x", psk[i]); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("}\n"); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 74