STATIC void node_dump(Linear_s *t, Blknum_t blknum, int indent) { Buf_s *buf; Node_s *node; Blknum_t overflow; if (!blknum) return; buf = t_get(t, blknum); node = buf->d; Hrec_s rec; unint i; if (Dump_buf) { pr_buf(buf, indent); } pr_head(node, indent); for (i = 0; i < node->numrecs; i++) { rec = get_rec(node, i); pr_indent(indent); printf("%ld. ", i); rec_dump(rec); } overflow = node->overflow; buf_put(&buf); if (overflow) { node_dump(t, overflow, indent+1); } }
void prof_pmk(char *essid) { TIME_STRUCT p1,p2; char key[16][128]; unsigned char pmk_sol[16][40]; unsigned char pmk_fast[16][40]; int i,j; for(i=0;i<16;i++) { strcpy(key[i],"atest"); key[i][0]+=i; } p1 = t_start(); for(i=0;i<16;i++) calc_pmk(key[i],essid,pmk_sol[i]); //key값과 essid로부터 pmk 값을 계산함 t_end(&p1); p2 = t_start(); calc_16pmk(key,essid,pmk_fast); t_end(&p2); //diff for(i=0;i<16;i++) { if(memcmp(pmk_sol[i],pmk_fast[i],sizeof(pmk_sol[i])) != 0) { printf("* %d wrong case (key:%s)\n",i,key[i]); dump_key("pmk_sol",pmk_sol[i],sizeof(pmk_sol[i])); dump_key("pmk_fst",pmk_fast[i],sizeof(pmk_fast[i])); } } printf("original : %0.2lf ms\n",t_get(p1)/1000); printf("simd ver : %0.2lf ms\n",t_get(p2)/1000); printf("performance : x%0.2lf\n",t_get(p1)/t_get(p2)); }
void crack_wpa(char *fn) { hccap_t hc; int res, i, itr; unsigned char pmk[128]; unsigned char pke[100]; unsigned char ptk[80]; unsigned char mic[20]; char key[128]; // passphase 키값 int keylen; memset(key,0,sizeof(key)); strcpy(key,"dekdekdek"); keylen = strlen(key); // load from file if((res = hccap_load(fn,&hc))) { printf("hashcat file load failed! code : %d\n",res); return ; } memcpy( pke,"Pairwise key expansion", 23); if(memcmp(hc.mac2,hc.mac1,6) < 0) { memcpy( pke + 23, hc.mac2, 6); memcpy( pke + 29, hc.mac1,6 ); } else { memcpy(pke + 23, hc.mac1, 6); memcpy(pke + 29, hc.mac2, 6); } if( memcmp( hc.nonce1,hc.nonce2, 32) < 0 ) { memcpy(pke + 35, hc.nonce1,32); memcpy(pke + 67, hc.nonce2,32); } else { memcpy(pke + 35, hc.nonce2,32); memcpy(pke + 67, hc.nonce1,32); } #pragma omp parallel #pragma omp master printf("Initializing ... %d/%d threads\n",omp_get_num_threads(),omp_get_max_threads()); prof_pmk(hc.essid); return; //#pragma omp parallel for private(i) shared(key,hc,pmk,pke,mic) { char key[16][128]; unsigned char pmk_sol[16][40]; unsigned char pmk_fast[16][40]; TIME_STRUCT p1; int i,j; for(i=0;i<16;i++) { strcpy(key[i],"atest"); key[i][0]+=i; } p1 = t_start(); #pragma omp parallel for for(itr=0;itr<16000;itr+=16) { calc_16pmk(key,hc.essid,pmk_fast); //key값과 essid로부터 pmk 값을 계산함 //t_end(&p1); // p2 = t_start(); for(i=0;i<4;i++) { pke[99] = i; HMAC(EVP_sha1(), pmk, 32, pke, 100, ptk + i * 20, NULL); } if(hc.keyver == 1) HMAC(EVP_md5(), ptk, 16,hc.eapol,hc.eapol_size,mic,NULL); else HMAC(EVP_sha1(), ptk, 16, hc.eapol,hc.eapol_size,mic,NULL); // show_wpa_stats(key,keylen,pmk,ptk,mic); if(memcmp(mic,hc.keymic,16) == 0) { // printf("success\n"); // return ; } // t_end(&p2); } t_end(&p1); printf("time : %0.2lf ms\n",t_get(p1)/1000); } // printf("failed\n"); return; }