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; 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc < 2) { 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("usage: wpa_passphrase <ssid> [passphrase]\n" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "\nIf passphrase is left out, it will be read from " 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "stdin\n"); 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ssid = argv[1]; 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (argc > 2) { 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt passphrase = argv[2]; 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("# reading passphrase from stdin\n"); 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (fgets(buf, sizeof(buf), stdin) == NULL) { 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Failed to read passphrase\n"); 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf[sizeof(buf) - 1] = '\0'; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos = buf; 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*pos != '\0') { 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*pos == '\r' || *pos == '\n') { 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *pos = '\0'; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt pos++; 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt passphrase = buf; 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strlen(passphrase) < 8 || os_strlen(passphrase) > 63) { 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Passphrase must be 8..63 characters\n"); 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 1; 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt pbkdf2_sha1(passphrase, (u8 *) ssid, os_strlen(ssid), 4096, psk, 32); 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("network={\n"); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\tssid=\"%s\"\n", ssid); 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\t#psk=\"%s\"\n", passphrase); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\tpsk="); 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (i = 0; i < 32; i++) 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("%02x", psk[i]); 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("\n"); 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("}\n"); 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 68