1#ifdef BTN_SETUP 2// * Man in Middle Attack 3// 4// -Attacker<- 5// / \ 6// / \ 7// V \ 8// AP <----x---- Client 9// ==> the same as 10// AP <--------- Anonymous Client 11// ==> solved by using in very short range 12// 13// * Key generation(Diffie-Hellman) 14// 15// AP 16// p: random in 100 predefined primes 17// q: 5 18// public_ap/private_ap: DH_generate_key(p, q, private) 19// 20// Client 21// p: random in 100 predfined primses, rand in SSID 22// q: 5 23// public_client/private_client: DH_generate_key(p, q, private) 24// 25// * Process 26// 27// (a1) Press Button for 3 seconds 28// 29// (a2) Generate Public Key by using: 30// CreatePubPrivKey() 31// 32// (a3) Change SSID to 33// ASUS_OTSx_zzz_iiii 34// x : setting in default or not 35// zzz : rand seed for primes number 36// iiii : default ip, if no dhcp server is provided 37// 38// (c1) Survey AP with OTS.... 39// (c2) Generate Public Key by using: 40// CreatePubPrivKey() 41// (c3) Start Session one with PackSetPubKey 42// <-----OTSInit(SetPubKey)--------- 43// (a4) UnpackSetPubKey 44// (a5) For other connection, set into log 45// 46// (a6) PackSetPubKeyRes 47// ------OTSInitAck(SetPubKeyRes)--> 48// (c4) UnpackSetPubKeyAck 49// (c5) Close Session one socket 50// 51// (a7) CreateSharedKey() (c6) CreateSharedKey 52// (a8) Set to WPA-PSK w/ 53// CreateSharedKey 54// 55// (c7) Start Session Two w/ PackSetInfoGWQuick 56// <---- OTSExchange(SetInfoGWQuick)- 57// (a9) UnpackSetInfoGWQuick 58// (a10) For other connection, set into log 59// 60// (a11-1) PackSetInfoGWQuickRes: 61// Apply Setting with QuickFlag = None 62// 63// ----- OTSExchangeRes(SetInfoGWQuickRes) -> Client 64// (c8) UnpackSetInfoGWQuickRes 65// 66// (a11-2) PackSetInfoGWQuickRes 67// Response Setting with QuickFlag = Wireless 68// 69// ----- OTSExchangeRes(SetInfoGWQuickRes) -> Client 70// (c8) UnpackSetInfoGWQuickRes 71// (c9) close sesson two socket 72// 73// (a12) save setting and reboot 74// 75// * Timer 76// - 120 seconds, button is pressed and no action is performed. 77// - 20 seconds, button is pressed and OTSInit is sent 78// 79// * Functions 80// DH *DH_new(); 81// int CreatePubPrivKey(DH *dh, int rand, char *pub, char *priv); 82// int CreateSharedKey(DH *dh, char *pub, char *shared); 83// int DH_free(DH *dh); 84// 85// Fully Support: ASUS cards, WZC 86// Alert to WZC(WPA) : Centrino or other cards in XP SP2 87// Alert to WZC(WEP) : Centrino or other cards in XP SP1 88// Alert to Ethernet : Other cards in 98/ME/..... 89// 90 91#include <stdio.h> 92#include <stdlib.h> 93#include <string.h> 94#include <signal.h> 95#include <unistd.h> 96#include <errno.h> 97#include <sys/fcntl.h> 98#include <dirent.h> 99#include <sys/mount.h> 100#include <bcmnvram.h> 101#include <netconf.h> 102#include <shutils.h> 103#include <rc.h> 104#include <syslog.h> 105#include <iboxcom.h> 106 107#define logs(fmt, arg...) //syslog(LOG_NOTICE, fmt, ##arg) 108#include <openssl/dh.h> 109#include "crypto.c" 110DH *dh; 111 112typedef union { 113 struct sockaddr sa; 114 struct sockaddr_in sa_in; 115} usockaddr; 116 117#ifdef FULL_EZSETUP // Added by Chen-I 20080201 118#define ENCRYPTION 1 119#endif 120 121#define BTNSETUP_INIT_TIMEOUT 120 // 3 minute 122#define BTNSETUP_EXCHANGE_TIMEOUT 300 // 3 minutes 123#define MAX_DHKEY_LEN 192 124#define WEP64_LEN 10 125#define WEP128_LEN 26 126#define WPAPSK_LEN 63 127 128PKT_SET_INFO_GW_QUICK pkt; 129unsigned char pubkey[MAX_DHKEY_LEN]; 130unsigned char cpubkey[MAX_DHKEY_LEN]; 131unsigned char sharedkey[MAX_DHKEY_LEN]; 132char sharedkeystr[MAX_DHKEY_LEN*2+1]; 133TEMP_WIRELESS *tw; // Point to sharedkeystr 134 135 136char ssid[32+1]; 137int bs_mode; 138time_t bs_time; 139int bs_timeout; 140int bs_auth; 141int bs_encrypt; 142//#define OTS_LOG 1 143//#define OTS_SIMU 1 144 145#ifdef OTS_SIMU 146int ots_simu(int stage) 147{ 148 printf("ots check: %d %d\n", stage, atoi(nvram_safe_get("ots_simu_stage"))); 149 if(stage==atoi(nvram_safe_get("ots_simu_stage"))) 150 { 151 nvram_set("ots_simu_stage", ""); 152 return 0; 153 } 154 return 1; 155} 156#endif 157 158#ifdef OTS_LOG 159char ots_buf[1024]; 160 161void ots_log(unsigned int flag, int save) 162{ 163 if(flag==0) 164 { 165 ots_buf[0]=0; 166 nvram_set("ots_log", "0"); 167 } 168 else 169 { 170 if (save>1) 171 sprintf(ots_buf, "%s;[%02x]", nvram_safe_get("ots_log"), flag); 172 else 173 sprintf(ots_buf, "%s;%02x", nvram_safe_get("ots_log"), flag); 174 nvram_set("ots_log", ots_buf); 175 } 176 177 if(save==1) nvram_commit(); 178} 179#endif 180 181int is_ots() 182{ 183 char *ptr=nvram_safe_get("sharedkeystr"); 184 185 if(strlen(ptr)) return 1; 186 else return 0; 187} 188 189#ifdef ENCRYPTION 190#define BLOCKLEN 16 191 192void Encrypt(int klen, unsigned char *key, unsigned char *ptext, int tlen, unsigned char *ctext) 193{ 194 unsigned char *pptr, *cptr; 195 int i; 196 197 i = 0; 198 pptr = ptext; 199 cptr = ctext; 200 201 while(1) 202 { 203 aes_encrypt(klen, key, pptr, cptr); 204 i+=16; 205 if(i>=tlen) break; 206 pptr+=16; 207 cptr+=16; 208 } 209} 210 211void Decrypt(int klen, unsigned char *key, unsigned char *ptext, int tlen, unsigned char *ctext) 212{ 213 unsigned char *pptr, *cptr; 214 int i; 215 216 i = 0; 217 pptr = ptext; 218 cptr = ctext; 219 220 while(1) 221 { 222 aes_decrypt(klen, key, pptr, cptr); 223 i+=16; 224 if(i>=tlen) break; 225 pptr+=16; 226 cptr+=16; 227 } 228} 229#endif 230 231// some utility 232void nvram_set_ip(char *nvram_name, DWORD ip) 233{ 234 struct in_addr in; 235 236 if (ip!=0) 237 { 238 in.s_addr = ip; 239 nvram_set(nvram_name, (char *)inet_ntoa(in)); 240 } 241 else nvram_set(nvram_name, ""); 242} 243 244void nvram_set_str(char *nvram_name, char *value, int size) 245{ 246 char tmpbuf[256]; 247 248 tmpbuf[size] = 0; 249 memcpy(tmpbuf, value, size); 250 nvram_set(nvram_name, tmpbuf); 251} 252 253int 254start_sdhcpd(void) 255{ 256 FILE *fp; 257 char *dhcpd_argv[] = {"udhcpd", "/tmp/udhcpd.conf", NULL, NULL}; 258 char *slease = "/tmp/udhcpd-br0.sleases"; 259 pid_t pid; 260 261 if (nvram_match("lan_proto", "dhcp")) return 0; 262 //ifconfig(nvram_safe_get("lan_ifname"), IFUP, 263 // nvram_safe_get("lan_ipaddr"), "255.255.255.0"); 264 //dprintf("%s %s %s %s\n", 265 // nvram_safe_get("lan_ifname"), 266 // nvram_safe_get("dhcp_start"), 267 // nvram_safe_get("dhcp_end"), 268 // nvram_safe_get("lan_lease")); 269 270 if (!(fp = fopen("/tmp/udhcpd-br0.leases", "a"))) { 271 perror("/tmp/udhcpd-br0.leases"); 272 return errno; 273 } 274 fclose(fp); 275 276 /* Write configuration file based on current information */ 277 if (!(fp = fopen("/tmp/udhcpd.conf", "w"))) { 278 perror("/tmp/udhcpd.conf"); 279 return errno; 280 } 281 282 fprintf(fp, "pidfile /var/run/udhcpd-br0.pid\n"); 283 fprintf(fp, "start %s\n", nvram_safe_get("dhcp_start")); 284 fprintf(fp, "end %s\n", nvram_safe_get("dhcp_end")); 285 fprintf(fp, "interface %s\n", nvram_safe_get("lan_ifname")); 286 fprintf(fp, "remaining yes\n"); 287 fprintf(fp, "lease_file /tmp/udhcpd-br0.leases\n"); 288 fprintf(fp, "option subnet %s\n", nvram_safe_get("lan_netmask")); 289 fprintf(fp, "option router %s\n", nvram_safe_get("lan_ipaddr")); 290 fprintf(fp, "option lease 3600\n"); 291 fclose(fp); 292 293 _eval(dhcpd_argv, NULL, 0, &pid); 294 //dprintf("done\n"); 295 return 0; 296} 297 298int btn_setup_get_setting(PKT_SET_INFO_GW_QUICK *pkt) 299{ 300 char tmpbuf[256]; 301 int ret=0; 302 303 memset(pkt, 0, sizeof(pkt)); 304 305 pkt->QuickFlag=QFCAP_WIRELESS; 306 strcpy(tmpbuf, nvram_safe_get("wl_ssid")); 307 memcpy(pkt->WSetting.SSID, tmpbuf, sizeof(pkt->WSetting.SSID)); 308 309 if(nvram_match("wl_auth_mode", "open")) 310 { 311 pkt->WSetting.Auth=AUTHENTICATION_OPEN; 312 pkt->WSetting.Encrypt=atoi(nvram_safe_get("wl_wep_x")); 313 if (pkt->WSetting.Encrypt>ENCRYPTION_DISABLE) 314 { 315 pkt->WSetting.DefaultKey = atoi(nvram_safe_get("wl_key")); 316 sprintf(tmpbuf, "wl_key%d", pkt->WSetting.DefaultKey); 317 strcpy(pkt->WSetting.Key, nvram_safe_get(tmpbuf)); 318 } 319 } 320 else if(nvram_match("wl_auth_mode", "shared")) 321 { 322 pkt->WSetting.Auth=AUTHENTICATION_SHARED; 323 pkt->WSetting.Encrypt=atoi(nvram_safe_get("wl_wep_x")); 324 if (pkt->WSetting.Encrypt>ENCRYPTION_DISABLE) 325 { 326 pkt->WSetting.DefaultKey = atoi(nvram_safe_get("wl_key")); 327 sprintf(tmpbuf, "wl_key%d", pkt->WSetting.DefaultKey); 328 strcpy(pkt->WSetting.Key, nvram_safe_get(tmpbuf)); 329 } 330 } 331 else if(nvram_match("wl_auth_mode", "psk")) // add "wl_wpa_mode" matching by Jiahao for WL-520gu 332 { 333// 2008.06 James. { 334 /*if(nvram_match("wl_wpa_mode", "1")) 335 { 336 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK; 337 pkt->WSetting.Encrypt=ENCRYPTION_TKIP; 338 } 339 else if(nvram_match("wl_wpa_mode", "2")) 340 { 341 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2; 342 pkt->WSetting.Encrypt=ENCRYPTION_AES; 343 } 344 else 345 { 346 if (nvram_match("wl_crypto", "aes")) 347 { 348 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2; 349 pkt->WSetting.Encrypt=ENCRYPTION_AES; 350 } 351 else 352 { 353 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK; 354 pkt->WSetting.Encrypt=ENCRYPTION_TKIP; 355 } 356 }//*/ 357 if(nvram_match("wl_crypto", "aes")){ 358 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2; 359 pkt->WSetting.Encrypt=ENCRYPTION_AES; 360 } 361 else{ 362 pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK; 363 pkt->WSetting.Encrypt=ENCRYPTION_TKIP; 364 } 365// 2008.06 James. } 366 strcpy(tmpbuf, nvram_safe_get("wl_wpa_psk")); 367 memcpy(pkt->WSetting.Key, tmpbuf, sizeof(pkt->WSetting.Key)); 368 pkt->WSetting.DefaultKey=DEFAULT_KEY_1; 369 } 370 else goto fail; 371 372 ret = 1; 373fail: 374 return ret; 375} 376 377void btn_setup_save_setting(PKT_SET_INFO_GW_QUICK *pkt) 378{ 379 char tmpbuf[256]; 380 char sr_name[32]; 381 char sr_num[1]; 382 char idx = 0, idx1 = 0; 383 char start_num; 384 char end_num; 385 DWORD dhcp_tmp; 386 387 if (pkt->QuickFlag&QFCAP_WIRELESS) 388 { 389 //printf("Wireless\n"); 390 if (!(pkt->QuickFlag&QFCAP_GET)) 391 { 392 printf("Set\n"); 393 // assign automatic generate value 394 if (pkt->WSetting.SSID[0]==0) 395 { 396 strncpy(pkt->WSetting.SSID, tw->u.WirelessStruct.SuggestSSID, sizeof(pkt->WSetting.SSID)); 397 } 398 // assign automatic generate value 399 if (pkt->WSetting.Key[0]==0) 400 { 401 strncpy(pkt->WSetting.Key, tw->u.WirelessStruct.SuggestKey, sizeof(pkt->WSetting.Key)); 402 } 403 404 if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64) 405 pkt->WSetting.Key[WEP64_LEN] = 0; 406 else if (pkt->WSetting.Encrypt==ENCRYPTION_WEP128) 407 pkt->WSetting.Key[WEP128_LEN] = 0; 408 409 // wireless setting 410 // 1. ssid 411 nvram_set_str("wl_ssid", pkt->WSetting.SSID, sizeof(pkt->WSetting.SSID)); 412 memset(tmpbuf, 0, sizeof(tmpbuf)); 413 char_to_ascii(tmpbuf, nvram_safe_get("wl_ssid")); 414 nvram_set_str("wl_ssid2", tmpbuf, sizeof(tmpbuf)); 415 416 if (pkt->WSetting.Auth==AUTHENTICATION_OPEN) 417 { 418 nvram_set("wl_auth_mode", "open"); 419 if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64|| 420 pkt->WSetting.Encrypt==ENCRYPTION_WEP128) 421 { 422 sprintf(tmpbuf, "%d", pkt->WSetting.Encrypt); 423 nvram_set("wl_wep_x", tmpbuf); 424 425 if(pkt->WSetting.DefaultKey>DEFAULT_KEY_4|| 426 pkt->WSetting.DefaultKey<DEFAULT_KEY_1) 427 pkt->WSetting.DefaultKey=DEFAULT_KEY_1; 428 429 if(pkt->WSetting.DefaultKey==DEFAULT_KEY_1) 430 nvram_set_str("wl_key1", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 431 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_2) 432 nvram_set_str("wl_key2", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 433 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_3) 434 nvram_set_str("wl_key3", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 435 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_4) 436 nvram_set_str("wl_key4", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 437 sprintf(tmpbuf,"%d", pkt->WSetting.DefaultKey); 438 nvram_set("wl_key", tmpbuf); 439 } 440 else 441 { 442 nvram_set("wl_key", "1"); 443 nvram_set("wl_key1", ""); 444 nvram_set("wl_key2", ""); 445 nvram_set("wl_key3", ""); 446 nvram_set("wl_key4", ""); 447 } 448 nvram_set("wl_wpa_psk","");/* Cherry Cho added for removing temporary key used by WSC in 2007/3/8. */ 449 } 450 else if(pkt->WSetting.Auth==AUTHENTICATION_SHARED) 451 { 452 nvram_set("wl_auth_mode", "shared"); 453 if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64 || 454 pkt->WSetting.Encrypt==ENCRYPTION_WEP128) 455 { 456 sprintf(tmpbuf, "%d", pkt->WSetting.Encrypt); 457 nvram_set("wl_wep_x", tmpbuf); 458 if(pkt->WSetting.DefaultKey>DEFAULT_KEY_4 || 459 pkt->WSetting.DefaultKey<DEFAULT_KEY_1) 460 pkt->WSetting.DefaultKey=DEFAULT_KEY_1; 461 if(pkt->WSetting.DefaultKey==DEFAULT_KEY_1) 462 nvram_set_str("wl_key1", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 463 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_2) 464 nvram_set_str("wl_key2", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 465 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_3) 466 nvram_set_str("wl_key3", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 467 else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_4) 468 nvram_set_str("wl_key4", pkt->WSetting.Key, sizeof(pkt->WSetting.Key)); 469 else goto fail; 470 sprintf(tmpbuf,"%d", pkt->WSetting.DefaultKey); 471 nvram_set("wl_key", tmpbuf); 472 } 473 nvram_set("wl_wpa_psk","");/* Cherry Cho added for removing temporary key used by WSC in 2007/3/8. */ 474 } 475 else if(pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK||pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK2) 476 { 477 nvram_set("wl_auth_mode", "psk"); 478 if(pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK) 479 { 480 nvram_set("wl_wpa_mode", "1"); 481 } 482 else 483 { 484 nvram_set("wl_wpa_mode", "2"); 485 } 486 nvram_set("wl_crypto", "tkip+aes"); 487 nvram_set("wl_wep_x", "0"); 488 nvram_set_str("wl_wpa_psk", pkt->WSetting.Key, WPAPSK_LEN); 489 nvram_set("wl_key", "1"); 490 nvram_set("wl_key1", ""); 491 nvram_set("wl_key2", ""); 492 nvram_set("wl_key3", ""); 493 nvram_set("wl_key4", ""); 494 } 495 else goto fail; 496 497 nvram_set("x_Setting", "1"); 498 nvram_set("x_EZSetup", "1"); 499 nvram_set("wsc_config_state", "1"); 500 } 501 } 502 503 if (pkt->QuickFlag&QFCAP_ISP) 504 { 505 // ISP setting 506 if(pkt->ISPSetting.ISPType==ISP_TYPE_DHCPCLIENT) 507 { 508 nvram_set("wan_proto", "dhcp"); 509 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 510 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 511 nvram_set_str("wan_heartbeat_x", "", sizeof(pkt->ISPSetting.BPServer)); 512 } 513 else if(pkt->ISPSetting.ISPType==ISP_TYPE_PPPOE) 514 { 515 nvram_set("wan_proto", "pppoe"); 516 nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName)); 517 nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password)); 518// 2010.03 James. For Russia. { 519 nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr); 520 nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask); 521 nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway); 522// 2010.03 James. } 523// 2009.09 James. For Russia. { 524 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 525 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 526 nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer)); 527// 2009.09 James. } 528 } 529 else if(pkt->ISPSetting.ISPType==ISP_TYPE_PPTP) 530 { 531 nvram_set("wan_proto", "pptp"); 532 nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName)); 533 nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password)); 534 nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr); 535 nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask); 536 nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway); 537// 2009.12 James. For Russia. { 538 if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_NOENCRYPT) 539 nvram_set("wan_pptp_options_x", "-mppc"); 540 else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE40) 541 nvram_set("wan_pptp_options_x", "+mppe-40"); 542 else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE56) 543 nvram_set("wan_pptp_options_x", "+mppe-56"); 544 else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE128) 545 nvram_set("wan_pptp_options_x", "+mppe-128"); 546// 2010.03 James. For Russia. { 547 else 548 nvram_set("wan_pptp_options_x", ""); 549// 2010.03 James. } 550 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 551 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 552 nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer)); 553 //if ((pkt->ISPSetting.LAN_IPAddr) != 0) 554 // nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr); 555 if ((pkt->ISPSetting.LAN_IPAddr) != 0) 556 { 557 nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr); 558 dhcp_tmp = pkt->ISPSetting.LAN_IPAddr; 559 dhcp_tmp = (dhcp_tmp&0x00ffffff); 560 dhcp_tmp = (dhcp_tmp|0x02000000); 561 nvram_set_ip("dhcp_start", dhcp_tmp); 562 dhcp_tmp =(dhcp_tmp|0xfe000000); 563 nvram_set_ip("dhcp_end", dhcp_tmp); 564 } 565// 2009.12 James. } 566 } 567 else if(pkt->ISPSetting.ISPType==ISP_TYPE_L2TP) 568 { 569 nvram_set("wan_proto", "l2tp"); 570 nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName)); 571 nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password)); 572 nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr); 573 nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask); 574 nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway); 575// 2009.12 James. For Russia. { 576 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 577 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 578 nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer)); 579// 2009.12 James. } 580 } 581 else if(pkt->ISPSetting.ISPType==ISP_TYPE_STATICIP) 582 { 583 nvram_set("wan_proto", "static"); 584 nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr); 585 nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask); 586 nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway); 587// 2009.12 James. For Russia. { 588 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 589 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 590 nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer)); 591 if ((pkt->ISPSetting.LAN_IPAddr) != 0) 592 { 593 nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr); 594 dhcp_tmp = pkt->ISPSetting.LAN_IPAddr; 595 dhcp_tmp = (dhcp_tmp&0x00ffffff); 596 dhcp_tmp = (dhcp_tmp|0x02000000); 597 nvram_set_ip("dhcp_start", dhcp_tmp); 598 dhcp_tmp =(dhcp_tmp|0xfe000000); 599 nvram_set_ip("dhcp_end", dhcp_tmp); 600 } 601// 2009.12 James. } 602 } 603#ifdef BIGPOND 604 else if(pkt->ISPSetting.ISPType==ISP_TYPE_BIGPOND) 605 { 606 nvram_set("wan_proto", "bigpond"); 607 nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName)); 608 nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password)); 609 nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr); 610 nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName)); 611 nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC)); 612 nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer)); 613 } 614#endif 615 616// 2009.12 James. For Russia. { 617 /*if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_NOENCRYPT) 618 nvram_set("wan_pptp_options_x", "-mppc"); 619 else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE40) 620 nvram_set("wan_pptp_options_x", "+mppe-40"); 621 else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE56) 622 nvram_set("wan_pptp_options_x", "+mppe-56"); 623 else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE128) 624 nvram_set("wan_pptp_options_x", "+mppe-128"); 625 else 626 nvram_set("wan_pptp_options_x", "");//*/ 627 628 if(pkt->ISPSetting.IPAddr != 0) 629 nvram_set("x_DHCPClient","0"); 630 else 631 nvram_set("x_DHCPClient","1"); 632 633 if(pkt->ISPSetting.ISPType==ISP_TYPE_STATICIP 634 || pkt->ISPSetting.ISPType==ISP_TYPE_PPTP 635 || pkt->ISPSetting.ISPType==ISP_TYPE_PPPOE) 636 { 637 if(pkt->ISPSetting.PacketNum == SR_PACKET_1 || pkt->ISPSetting.PacketNum == SR_PACKET_2) 638 { 639 if(pkt->ISPSetting.PacketNum == SR_PACKET_1) 640 { 641 start_num = 0; 642 if(pkt->ISPSetting.SRNum<13) 643 end_num = pkt->ISPSetting.SRNum; 644 else 645 end_num = 12; 646 idx1 = 0; 647 } 648 649 if(pkt->ISPSetting.PacketNum == SR_PACKET_2) 650 { 651 start_num = 0; 652 end_num = (pkt->ISPSetting.SRNum - 12); 653 idx1 = 12; 654 } 655 656 sprintf(sr_num,"%d",pkt->ISPSetting.SRNum); 657 nvram_set("sr_num_x",sr_num); 658 659 for(idx=start_num;idx<end_num;idx++) 660 { 661 memset(sr_name, 0, sizeof(sr_name)); 662 sprintf(sr_name,"%s%d", "sr_if_x", (idx+idx1)); 663 nvram_set_str(sr_name, "WAN", 3); 664 sprintf(sr_name,"%s%d", "sr_ipaddr_x", (idx+idx1)); 665 nvram_set_ip(sr_name, pkt->ISPSetting.SR_IPAddr[idx]); 666 sprintf(sr_name,"%s%d", "sr_netmask_x", (idx+idx1)); 667 nvram_set_ip(sr_name, pkt->ISPSetting.SR_Mask[idx]); 668 sprintf(sr_name,"%s%d", "sr_gateway_x", (idx+idx1)); 669 nvram_set(sr_name, "0.0.0.0"); 670 } 671 } 672 } 673// 2009.12 James. } 674 675 if (pkt->ISPSetting.DNSServer1==0 && pkt->ISPSetting.DNSServer2==0) 676 { 677 nvram_set("wan_dnsenable_x", "1"); 678 } 679 else 680 { 681 nvram_set("wan_dnsenable_x", "0"); 682 nvram_set_ip("wan_dns1_x", pkt->ISPSetting.DNSServer1); 683 nvram_set_ip("wan_dns2_x", pkt->ISPSetting.DNSServer2); 684 } 685 686 if(pkt->ISPSetting.DHCPRoute == 0x01) 687 nvram_set("dr_enable_x", "1"); 688 else 689 nvram_set("dr_enable_x", "0"); 690 691 if(pkt->ISPSetting.MulticastRoute == 0x01) 692 nvram_set("mr_enable_x", "1"); 693 else 694 nvram_set("mr_enable_x", "0"); 695 696 if(pkt->ISPSetting.StaticRoute == 0x01) 697 nvram_set("sr_enable_x", "1"); 698 else 699 nvram_set("sr_enable_x", "0"); 700 701 if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_NONE) 702 nvram_set("wan_stb_x", "0"); 703 else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN1) 704 nvram_set("wan_stb_x", "1"); 705 else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN2) 706 nvram_set("wan_stb_x", "2"); 707 else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN3) 708 nvram_set("wan_stb_x", "3"); 709 else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN4) 710 nvram_set("wan_stb_x", "4"); 711 else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN3LAN4) 712 nvram_set("wan_stb_x", "5"); 713 else 714 nvram_set("wan_stb_x", "0"); 715 716 if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_AUTO) 717 nvram_set("wl_mrate", "0"); 718 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_1) 719 nvram_set("wl_mrate", "1000000"); 720 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_2) 721 nvram_set("wl_mrate", "2000000"); 722 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_5) 723 nvram_set("wl_mrate", "5500000"); 724 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_6) 725 nvram_set("wl_mrate", "6000000"); 726 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_9) 727 nvram_set("wl_mrate", "9000000"); 728 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_11) 729 nvram_set("wl_mrate", "11000000"); 730 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_12) 731 nvram_set("wl_mrate", "12000000"); 732 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_18) 733 nvram_set("wl_mrate", "18000000"); 734 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_24) 735 nvram_set("wl_mrate", "24000000"); 736 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_36) 737 nvram_set("wl_mrate", "36000000"); 738 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_48) 739 nvram_set("wl_mrate", "48000000"); 740 else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_54) 741 nvram_set("wl_mrate", "54000000"); 742 else 743 nvram_set("wl_mrate", "0"); 744 745 nvram_set("time_zone", pkt->ISPSetting.TimeZone); 746 nvram_set("x_Setting", "1"); 747 } 748 if (pkt->QuickFlag&QFCAP_FINISH) 749 { 750 nvram_set("sharedkeystr", ""); 751 } 752 else if(pkt->QuickFlag&QFCAP_REBOOT) 753 { 754 nvram_set("sharedkeystr", sharedkeystr); 755 } 756 //convert_asus_values(); 757 //nvram_commit(); 758fail: 759} 760 761 762int OTSStart(int flag) 763{ 764 // stop other service 765 766 if (flag) 767 { 768 //stop_service_main(1); 769 start_sdhcpd(); 770 strcpy(sharedkeystr, nvram_safe_get("sharedkeystr")); 771 tw = (TEMP_WIRELESS *)sharedkeystr; 772 nvram_set("sharedkeystr", ""); 773 nvram_commit(); 774 time(&bs_time); 775 bs_mode=BTNSETUP_DATAEXCHANGE_EXTEND; 776 bs_timeout = BTNSETUP_EXCHANGE_TIMEOUT; 777 } 778 else 779 { 780#ifdef FULL_EZSETUP // Added by Chen-I, 20080201 781 stop_service_main(1); 782 start_sdhcpd(); 783 784 BN_register_RAND(ots_rand); 785 786 dh = NULL; 787 dh = DH_init(p1536, 192, 5); 788 if (!DH_generate_key(pubkey,dh)) goto err; 789 790 /* Start button setup process */ 791 /* SSID : [ProductID]_OTS[Default]_[Prime]*/ 792 if (nvram_match("x_Setting", "1")) // not in default 793 sprintf(ssid, "%s_OTS1", nvram_safe_get("productid")); 794 else sprintf(ssid, "%s_OTS0", nvram_safe_get("productid")); 795 796 /* +++ Cherry Cho modified in 2007/2/12. +++ */ 797 /*eval("wlconf","wsec","off"); 798 eval("wlconf","auth", "0"); 799 eval("wlconf","wpa_auth", "off"); 800 eval("wlconf","eap","off"); 801 eval("wlconf","ssid", "ASUS_OTS");//*/ 802 eval("wl","wsec","off"); // 2008.05 James. use "wl" in WL-500gP V2. 803 eval("wl","auth", "0"); 804 eval("wl","wpa_auth", "0"); 805 eval("wl","eap","off"); 806 eval("wl","ssid", "ASUS_OTS");//*/ 807 /* --- Cherry Cho modified in 2007/2/12. --- */ 808 809 // reduce power 810 // eval("wl", "txpwr", "1"); 811 bs_mode = BTNSETUP_START; 812#else 813 bs_mode = BTNSETUP_DATAEXCHANGE; 814#endif 815 bs_timeout = BTNSETUP_INIT_TIMEOUT; 816 time(&bs_time); 817 } 818 return 1; 819 820err: 821 if (dh) 822 { 823 DH_free(dh); 824 dh=NULL; 825 } 826 return 0; 827} 828 829int 830OTSExchange(int auth, int encrypt) 831{ 832 int ret = 0; 833 int i; 834 char SSID[32+1]; 835 char Key[64+1]; 836 837 if (auth==-1&&encrypt==-1) 838 { 839 return ret; 840 } 841 842 // generate shared key 843 if (!DH_compute_key(sharedkey, cpubkey, MAX_DHKEY_LEN, dh)) 844 { 845 goto err; 846 } 847 848 sharedkeystr[0] = 0; 849 for(i=0;i<MAX_DHKEY_LEN;i++) 850 { 851 sprintf(sharedkeystr, "%s%02X", sharedkeystr, (unsigned char )sharedkey[i]); 852 } 853 854 tw = sharedkeystr; 855 strncpy(SSID, tw->u.WirelessStruct.TempSSID, sizeof(SSID)); 856 SSID[32]=0; 857 strncpy(Key, tw->u.WirelessStruct.TempKey, sizeof(Key)); 858 Key[64]=0; 859 860#ifdef ENCRYPTION 861 // using layer 3 encryption 862#else 863 if(auth==AUTHENTICATION_SHARED) 864 eval("wl", "auth", "shared"); 865 else if(auth==AUTHENTICATION_WPA_PSK) 866 eval("wl", "auth", "psk"); 867 else 868 eval("wl", "auth", "open"); 869 870 if (encrypt==ENCRYPTION_WEP64) 871 { 872 Key[WEP64_LEN]=0; 873 eval("wl","wep", Key); 874 } 875 else if (encrypt==ENCRYPTION_WEP128) 876 { 877 Key[WEP128_LEN]=0; 878 eval("wl","wep", Key); 879 } 880 else if (encrypt==ENCRYPTION_TKIP) 881 { 882 Key[WPAPSK_LEN] = 0; 883 eval("wl", "tkip", Key); 884 } 885 886 eval("wl","ssid", SSID); 887 888#endif 889 ret = 1; 890 return ret; 891err: 892 if (dh) 893 { 894 DH_free(dh); 895 dh=NULL; 896 } 897 return ret; 898} 899 900static int 901OTS_socket_init( usockaddr* usaP ) 902{ 903 int listen_fd; 904 int i; 905 906 memset( usaP, 0, sizeof(usockaddr) ); 907 usaP->sa.sa_family = AF_INET; 908 usaP->sa_in.sin_addr.s_addr = htonl( INADDR_ANY ); 909 usaP->sa_in.sin_port = htons(OTSPORT); 910 911 listen_fd = socket( usaP->sa.sa_family, SOCK_STREAM, 0 ); 912 913 if ( listen_fd < 0 ) 914 { 915 perror( "socket" ); 916 return -1; 917 } 918 919 i = 1; 920 if ( setsockopt( listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*) &i, sizeof(i) ) < 0 ) 921 { 922 perror( "setsockopt" ); 923 return -1; 924 } 925 if ( bind( listen_fd, &usaP->sa, sizeof(struct sockaddr_in) ) < 0 ) 926 { 927 perror( "bind" ); 928 return -1; 929 } 930 if ( listen( listen_fd, 5) < 0 ) 931 { 932 perror( "listen" ); 933 return -1; 934 } 935 return listen_fd; 936} 937 938void OTSFinish(int fd, int flag) 939{ 940 shutdown(fd, 2); 941 close(fd); 942 943 //if (flag) kill(1, SIGHUP); 944 //else kill(1, SIGTERM); 945 kill(1, SIGTERM); 946} 947 948char pdubuf[INFO_PDU_LENGTH]; 949char pdubuf_res[INFO_PDU_LENGTH]; 950 951static int 952waitsock(int fd, int sec, int usec) 953{ 954 struct timeval tv; 955 fd_set fdvar; 956 int res; 957 958 FD_ZERO(&fdvar); 959 FD_SET(fd, &fdvar); 960 tv.tv_sec = sec; 961 tv.tv_usec = usec; 962 res = select(fd+1, &fdvar, NULL, NULL, &tv); 963 964 return res; 965} 966 967int OTSPacketHandler(int sockfd) 968{ 969 IBOX_COMM_PKT_HDR_EX *phdr; 970 IBOX_COMM_PKT_RES_EX *phdr_res; 971 char tmpbuf[INFO_PDU_LENGTH]; 972 973 int i, len; 974 char *buf; 975 976 if (waitsock(sockfd, 2, 0)<=0) 977 { 978 syslog(LOG_NOTICE, "Connect Timeout %x\n", bs_mode); 979 close(sockfd); 980 return 0; 981 } 982 983 buf = pdubuf; 984 len = sizeof(pdubuf); 985 /* Parse headers */ 986 987 while ((i=read(sockfd, buf, len))&&len>0) 988 { 989 len-=i; 990 buf+=i; 991 } 992 993#ifdef DEBUG 994 dprintf("recv: %x\n", len); 995 for(i=0;i<sizeof(pdubuf);i++) 996 { 997 if(i%16==0) dprintf("\n"); 998 dprintf("%02x ", (unsigned char *)pdubuf[i]); 999 } 1000#endif 1001 1002#ifdef ENCRYPTION 1003 phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf; 1004 phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res; 1005 1006 if (bs_mode>BTNSETUP_START && 1007 !( bs_mode==BTNSETUP_DATAEXCHANGE && 1008 phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&//Second Chance,2005/07/18 1009 phdr->PacketType==NET_PACKET_TYPE_CMD && 1010 (phdr->OpCode==NET_CMD_ID_EZPROBE || phdr->OpCode==NET_CMD_ID_SETKEY_EX) 1011 ) 1012) 1013 { 1014 Decrypt(sizeof(tw->u.WirelessStruct.TempKey), 1015 tw->u.WirelessStruct.TempKey, 1016 pdubuf, INFO_PDU_LENGTH, 1017 tmpbuf); 1018 1019 phdr = (IBOX_COMM_PKT_HDR_EX *)tmpbuf; 1020 phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res; 1021 } 1022 else 1023 { 1024 phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf; 1025 phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res; 1026 } 1027#else 1028 phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf; 1029 phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res; 1030#endif 1031 1032 //syslog(LOG_NOTICE, "Data Packet XXX %x %x %x %x\n", phdr->ServiceID, phdr->PacketType, bs_mode, phdr->OpCode); 1033 1034 if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO && 1035 phdr->PacketType==NET_PACKET_TYPE_CMD) 1036 { 1037 phdr_res->ServiceID=NET_SERVICE_ID_IBOX_INFO; 1038 phdr_res->PacketType=NET_PACKET_TYPE_RES; 1039 phdr_res->OpCode =phdr->OpCode; 1040 phdr_res->Info = phdr->Info; 1041 memcpy(phdr_res->MacAddress, phdr->MacAddress, sizeof(phdr_res->MacAddress)); 1042#ifdef OTS_LOG 1043 if (phdr->OpCode!=NET_CMD_ID_EZPROBE) 1044 ots_log(phdr->OpCode+0x90, 0); 1045#endif 1046 //syslog(LOG_NOTICE, "Data Packet %x %x\n", bs_mode, phdr->OpCode); 1047 1048 switch(phdr->OpCode) 1049 { 1050 case NET_CMD_ID_EZPROBE: 1051 { 1052 PKT_EZPROBE_INFO *ezprobe_res; 1053 1054 ezprobe_res = (PKT_EZPROBE_INFO *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); 1055 1056 ezprobe_res->isNotDefault = atoi(nvram_safe_get("x_Setting")) | atoi(nvram_safe_get("wsc_config_state")); // for EZSetup to coexist w/ WSC 1057 ezprobe_res->isSetByOts = atoi(nvram_safe_get("x_EZSetup")); 1058 ezprobe_res->isWAN = is_phyconnected(nvram_safe_get("wan_ifname")); 1059 ezprobe_res->isDHCP = 0; 1060 ezprobe_res->isPPPOE = 0; 1061 1062 if (nvram_match("wl_auth_mode", "shared")) 1063 ezprobe_res->Auth = AUTHENTICATION_SHARED; 1064 else if (nvram_match("wl_auth_mode", "psk")) 1065 ezprobe_res->Auth = AUTHENTICATION_WPA_PSK; 1066 else if (nvram_match("wl_auth_mode", "wpa")) 1067 ezprobe_res->Auth = AUTHENTICATION_WPA; 1068 else if (nvram_match("wl_auth_mode", "radius")) 1069 ezprobe_res->Auth = AUTHENTICATION_8021X; 1070 else ezprobe_res->Auth = AUTHENTICATION_OPEN; 1071 1072 if (nvram_match("wl_macmode", "allow")) 1073 ezprobe_res->Acl = ACL_MODE_ACCEPT; 1074 else if (nvram_match("wl_macmode", "deny")) 1075 ezprobe_res->Acl = ACL_MODE_REJECT; 1076 else ezprobe_res->Acl = ACL_MODE_DISABLE; 1077 1078 if (nvram_match("wl_mode_x", "1")) 1079 ezprobe_res->Wds = WDS_MODE_WDS_ONLY; 1080 else if (nvram_match("wl_mode_x", "2")) 1081 ezprobe_res->Wds = WDS_MODE_HYBRID; 1082 else ezprobe_res->Wds = WDS_MODE_AP_ONLY; 1083 1084 strcpy(ezprobe_res->ProductID, nvram_safe_get("productid")); 1085 strcpy(ezprobe_res->FirmwareVersion, nvram_safe_get("firmver")); 1086 time(&bs_time); // reset timer only 1087 bs_auth=-1; 1088 bs_encrypt=-1; 1089 1090#ifdef OTS_SIMU 1091 if(!ots_simu(1)) return INFO_PDU_LENGTH; 1092#endif 1093 send(sockfd, pdubuf_res, sizeof(pdubuf_res), NULL); 1094 return INFO_PDU_LENGTH; 1095 } 1096 case NET_CMD_ID_SETKEY_EX: 1097 { 1098 PKT_SET_INFO_GW_QUICK_KEY *pkey; 1099 PKT_SET_INFO_GW_QUICK_KEY *pkey_res; 1100 1101 if (bs_mode!=BTNSETUP_START 1102 && bs_mode != BTNSETUP_DATAEXCHANGE // allow second change, 2005/07/18, Chen-I 1103 ) 1104 { 1105 bs_auth=-1; 1106 bs_encrypt=-1; 1107 return 0; 1108 } 1109 1110 pkey=(PKT_SET_INFO_GW_QUICK_KEY *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); 1111 pkey_res = (PKT_SET_INFO_GW_QUICK_KEY *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); 1112 1113 if(pkey->KeyLen==0) return 0; 1114 else memcpy(cpubkey, pkey->Key, MAX_DHKEY_LEN); 1115 1116 bs_mode = BTNSETUP_DATAEXCHANGE; 1117 time(&bs_time); 1118 bs_timeout=BTNSETUP_EXCHANGE_TIMEOUT; 1119 bs_auth=pkey->Auth; 1120 bs_encrypt=pkey->Encrypt; 1121 pkey_res->Auth = pkey->Auth; 1122 pkey_res->Encrypt = pkey->Encrypt; 1123 pkey_res->KeyLen = MAX_DHKEY_LEN; 1124 memcpy(pkey_res->Key, pubkey, MAX_DHKEY_LEN); 1125#ifdef OTS_SIMU 1126 if(!ots_simu(2)) return INFO_PDU_LENGTH; 1127#endif 1128 send(sockfd, pdubuf_res, sizeof(pdubuf_res), NULL); 1129 return INFO_PDU_LENGTH; 1130 } 1131 case NET_CMD_ID_QUICKGW_EX: 1132 { 1133 PKT_SET_INFO_GW_QUICK *gwquick; 1134 PKT_SET_INFO_GW_QUICK *gwquick_res; 1135 1136 if (bs_mode!=BTNSETUP_DATAEXCHANGE && bs_mode!=BTNSETUP_DATAEXCHANGE_EXTEND) 1137 { 1138 return 0; 1139 } 1140#ifdef ENCRYPTION 1141 gwquick=(PKT_SET_INFO_GW_QUICK *)(tmpbuf+sizeof(IBOX_COMM_PKT_HDR_EX)); 1142#else 1143 gwquick=(PKT_SET_INFO_GW_QUICK *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)); 1144#endif 1145 1146 gwquick_res = (PKT_SET_INFO_GW_QUICK *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)); 1147 1148 //printf("Flag: %x\n", gwquick->QuickFlag); 1149 btn_setup_save_setting(gwquick); 1150 1151#ifdef OTS_LOG 1152 if (phdr->OpCode!=NET_CMD_ID_EZPROBE) 1153 ots_log(phdr->OpCode + gwquick->QuickFlag, 2); 1154#endif 1155 1156 if((gwquick->QuickFlag&QFCAP_WIRELESS)&& 1157 (gwquick->QuickFlag&QFCAP_GET)) // get setting 1158 { 1159 btn_setup_get_setting(gwquick_res); 1160 gwquick_res->QuickFlag = QFCAP_WIRELESS; 1161 } 1162 else 1163 { 1164 memcpy(gwquick_res, gwquick, sizeof(PKT_SET_INFO_GW_QUICK)); 1165 } 1166 1167 if((gwquick->QuickFlag&QFCAP_FINISH)) // finish 1168 { 1169 bs_mode = BTNSETUP_FINISH; 1170 bs_timeout=0; 1171#ifdef OTS_SIMU 1172 if(!ots_simu(3)) return INFO_PDU_LENGTH; 1173#endif 1174 } 1175 else if((gwquick->QuickFlag&QFCAP_REBOOT)) //reboot 1176 { 1177 bs_mode = BTNSETUP_DATAEXCHANGE_FINISH; 1178 bs_timeout=BTNSETUP_EXCHANGE_TIMEOUT; 1179#ifdef OTS_SIMU 1180 if(!ots_simu(4)) return INFO_PDU_LENGTH; 1181#endif 1182 } 1183 else 1184 { 1185#ifdef OTS_SIMU 1186 if(!ots_simu(5)) return INFO_PDU_LENGTH; 1187#endif 1188 } 1189 time(&bs_time); 1190 1191#ifdef OTS_LOG 1192 if (phdr->OpCode!=NET_CMD_ID_EZPROBE) 1193 ots_log(phdr->OpCode + gwquick->QuickFlag, 3); 1194#endif 1195 1196 1197#ifdef ENCRYPTION 1198 Encrypt(sizeof(tw->u.WirelessStruct.TempKey), 1199 tw->u.WirelessStruct.TempKey, 1200 pdubuf_res, INFO_PDU_LENGTH, 1201 tmpbuf); 1202 i=send(sockfd, tmpbuf, INFO_PDU_LENGTH, 0); 1203 1204#else 1205 i=send(sockfd, pdubuf_res, INFO_PDU_LENGTH, 0); 1206#endif 1207 1208#ifdef OTS_LOG 1209 if(i>=0) ots_log(i, 4); 1210 else ots_log(errno, 4); 1211#endif 1212 1213 return INFO_PDU_LENGTH; 1214 } 1215 default: 1216 return 0; 1217 } 1218 } 1219 return 0; 1220} 1221 1222int 1223start_ots(void) 1224{ 1225 char *ots_argv[] = {"ots", NULL}; 1226 pid_t pid; 1227 1228 _eval(ots_argv, NULL, 0, &pid); 1229 return 0; 1230} 1231 1232int 1233stop_ots(void) 1234{ 1235 int ret1 = eval("killall", "ots"); 1236 dprintf("done\n"); 1237 return(ret1); 1238} 1239 1240int 1241ots_main(int argc, char *argv[]) 1242{ 1243 FILE *fp; 1244 usockaddr usa; 1245 int listen_fd; 1246 int conn_fd; 1247 socklen_t sz = sizeof(usa); 1248 IBOX_COMM_PKT_HDR* phdr; 1249 int iLen , iRes , iCount , iRcv; 1250 int fromlen; 1251 char *hdr; 1252 char pdubuf[INFO_PDU_LENGTH]; 1253 struct sockaddr_in from_addr; 1254 time_t now; 1255 int flag=0; 1256 int ret; 1257 1258 /* write pid */ 1259 if ((fp=fopen("/var/run/ots.pid", "w"))!=NULL) 1260 { 1261 fprintf(fp, "%d", getpid()); 1262 fclose(fp); 1263 } 1264 1265 if (nvram_invmatch("sharedkeystr", "")) 1266 { 1267 OTSStart(1); 1268 } 1269 else 1270 { 1271#ifdef OTS_LOG 1272 ots_log(0, 0); 1273#endif 1274 OTSStart(0); 1275 } 1276 1277 /* Initialize listen socket */ 1278 if ((listen_fd = OTS_socket_init(&usa)) < 0) { 1279 fprintf(stderr, "can't bind to any address\n" ); 1280 return 0; 1281 } 1282 1283 /* Loop forever handling requests */ 1284 for (;;) 1285 { 1286 ret=waitsock(listen_fd, bs_timeout, 0); 1287 1288#ifdef FULL_EZSETUP 1289 if (ret==0) goto finish; 1290 else if(ret<0) continue; 1291#else 1292 if (ret<=0) continue; 1293#endif 1294 1295 if ((conn_fd = accept(listen_fd, &usa.sa, &sz)) < 0) { 1296 perror("accept"); 1297#ifdef OTS_LOG 1298 ots_log(bs_mode+0x10, 0); 1299#endif 1300 continue; 1301 //return errno; 1302 } 1303 1304 if (!OTSPacketHandler(conn_fd)) 1305 { 1306 syslog(LOG_NOTICE, "Error Packets: %x %x %x", bs_mode, bs_auth, bs_encrypt); 1307 } 1308 1309 if (bs_mode==BTNSETUP_DATAEXCHANGE) 1310 { 1311 if(!OTSExchange(bs_auth, bs_encrypt)) 1312 { 1313 //continue; 1314 } 1315 } 1316 else if(bs_mode==BTNSETUP_DATAEXCHANGE_FINISH) 1317 { 1318 sleep(2); 1319 flag = 1; 1320 goto finish; 1321 } 1322 time(&now); 1323 if (bs_mode>=BTNSETUP_FINISH) goto finish; 1324#ifdef FULL_EZSETUP // Added by Chen-I 200802012 1325 if ((now-bs_time)>bs_timeout) goto finish; 1326#endif 1327 } 1328finish: 1329 if (bs_mode==BTNSETUP_FINISH) 1330 { 1331#ifdef OTS_LOG 1332 ots_log(bs_mode + 0x30, 0); 1333#endif 1334 if (dh) 1335 { 1336 DH_free(dh); 1337 dh=NULL; 1338 } 1339#ifdef FULL_EZSETUP 1340 shutdown(listen_fd, 2); 1341 close(listen_fd); 1342 nvram_set("bs_mode", "1"); 1343 bs_mode=BTNSETUP_NONE; 1344 sleep(2); 1345 1346 stop_wan(); 1347 stop_dhcpd(); 1348 convert_asus_values(1); 1349 nvram_commit(); 1350 start_dhcpd(); 1351 start_wan(); 1352#else 1353 convert_asus_values(1); 1354 nvram_commit(); 1355 OTSFinish(listen_fd, flag); 1356#endif 1357 } 1358 else 1359 { 1360#ifdef OTS_LOG 1361 ots_log(bs_mode + 0x40, 1); 1362#endif 1363 if (dh) 1364 { 1365 DH_free(dh); 1366 dh=NULL; 1367 } 1368 1369 convert_asus_values(1); 1370 nvram_commit(); 1371 OTSFinish(listen_fd, flag); 1372 } 1373 return 1; 1374} 1375#endif 1376