示例#1
0
	void set_hide(bool hide) { if (hide) set_hide_mode(); else unset_hide_mode(); }
static void receive_call_result_data(struct ubus_request *req, int type, struct blob_attr *msg)
{
	struct blob_attr *tb[__INIT_MAX];
	char *token, *ssid, *ssid_pwd;
	int len, ret;

	if (!msg)
		return;

	ret = 0;

	blobmsg_parse(init_policy, __INIT_MAX, tb,
			blob_data(msg), blob_len(msg));

	if(tb[INIT_TOKEN] && tb[INIT_SSID] && tb[INIT_SSID_PWD]){
		token    = blobmsg_data(tb[INIT_TOKEN]);
		ssid     = blobmsg_data(tb[INIT_SSID]);
		ssid_pwd = blobmsg_data(tb[INIT_SSID_PWD]);
		// todo
		dlog("recv token[%s], ssid[%s] ssid_pwd[%s]\n",
			token, ssid, ssid_pwd);
		// printf("recv token[%s], ssid[%s] ssid_pwd[%s]\n", token, ssid, ssid_pwd);

        char *base64 = malloc(MAX_ALLOC_LEN);
        char *router_key_iv = malloc(MAX_ALLOC_LEN);
        char *r_ssid = malloc(MAX_ALLOC_LEN);
        char *r_pwd = malloc(MAX_ALLOC_LEN);

        char base64_ssid[MAX_ALLOC_LEN] = {0};
        char base64_pwd[MAX_ALLOC_LEN] = {0};

        // get router key, iv
        memset(base64, 0, MAX_ALLOC_LEN);
        int base64_length = base64Decode(base64, token, strlen(token));
        // printf("json base64 len: %d\n", base64_length);

        AES128_CBC_decrypt_buffer(router_key_iv, base64, base64_length, repeater_key, repeater_iv);
        memcpy(router_key, router_key_iv, 16);
        memcpy(router_iv, router_key_iv+16, 16);

        // ssid
        memset(base64_ssid, 0, MAX_ALLOC_LEN);
        memset(r_ssid, 0, MAX_ALLOC_LEN);
        memset(rr_ssid, 0, MAX_ALLOC_LEN);
        base64_length = base64Decode(base64_ssid, ssid, strlen(ssid));
        AES128_CBC_decrypt_buffer(r_ssid, base64_ssid, base64_length, router_key, router_iv);
        memcpy(rr_ssid, r_ssid, strlen(r_ssid));
        // printf("rr_ssid:%s\n", rr_ssid);

        // ssid pwd
        memset(base64_pwd, 0, MAX_ALLOC_LEN);
        memset(r_pwd, 0, MAX_ALLOC_LEN);
        memset(rr_pwd, 0, MAX_ALLOC_LEN);
        base64_length = base64Decode(base64_pwd, ssid_pwd, strlen(ssid_pwd));
        AES128_CBC_decrypt_buffer(r_pwd, base64_pwd, base64_length, router_key, router_iv);
        memcpy(rr_pwd, r_pwd, strlen(r_pwd));
        // printf("rr_pwd:%s\n", rr_pwd);

        flag_ssid_pwd = 1;
	/* Succeed to get password and ssid, so clear hide_mode flag */
	set_hide_mode(0);

        if (router_key_iv)
            free(router_key_iv);
        if (base64)
            free(base64);
        if (r_ssid)
            free(r_ssid);
        if (r_pwd)
            free(r_pwd);
	}else{
		dlog("recv DATA INVALID\n");
		ret = 1;
	}

	if (ret){
        printf("ecos pair verify failed!\n");
		dlog("ret:%d wait %d try again\n", ret,
				TRAFFICD_INIT_LOOP_TIME / 1000);
		uloop_timeout_set(&sd->timeout_init, TRAFFICD_INIT_LOOP_TIME);
	}else{
	printf("ssid:%s\n", rr_ssid);
        printf("ecos pair verify ok!\n");
#ifdef __ECOS
        #if 0
		CFG_set(CFG_TRAFFIC_INIT, 0);
		sys->init_mode = 0;
		uloop_timeout_set(&sd->timeout_mat, TRAFFICD_WIFIAP_LOOP_TIME);
        #endif
#endif
	}
}