亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? newcamd-client.cpp

?? Example Dreambox CAM source code
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// implements the newcamd protocol (versions 5.20 & 5.25)

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/poll.h>

#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

#include "newcamd-client.h"

#define COMPILE_DATE 20080802

unsigned short int _htons(unsigned short int hostshort)
{
	unsigned short int netshort;
	((unsigned char *)(&netshort))[0] = (hostshort >> 8) & 0xFF;
	((unsigned char *)(&netshort))[1] = (hostshort >> 0) & 0xFF;
	return netshort;
}

// ------------------------------- newcamd client class member implementation ------------------------------

newcamd_client::newcamd_client(char *server_url, unsigned int timeout, protocol_version_t version)
{
	set_protocol_version( version );
	
	status = 0;
	status_description[0] = 0;
	ready = false;
	network_timeout = timeout;
	
	sent_sequence_id = 0;
	received_sequence_id = 0;

	memset(cw_0, 0, sizeof(cw_0));
	memset(cw_1, 0, sizeof(cw_1));
	
	strcpy(url, server_url);
	memset(username, 0, sizeof(username));
	memset(password, 0, sizeof(password));
	memset(hostname, 0, sizeof(hostname));
	port = 0;
	
	user_id = -1;
	card_caid = 0;
	card_provider_id_count = 0;
	memset(cam_id, 0, sizeof(cam_id));
	
	memset(random_key, 0, sizeof(random_key));
	memset(des_key, 0, sizeof(des_key));
	memset(login_key, 0, sizeof(login_key));
	memset(session_key, 0, sizeof(session_key));
	
	memset(expanded_login_key, 0, sizeof(expanded_login_key));
	memset(expanded_session_key, 0, sizeof(expanded_session_key));
	
	parse_url();
	server_connect();
	if( status ) return;
	server_login();
	ready = true;
	
	dbg = 0;
}

bool newcamd_client::is_ready( void )
{
	return ready;
}

void newcamd_client::set_protocol_version( protocol_version_t version )
{
	protocol_version = version;
	switch( version )
	{
		case VERSION_520:
			custom_data_length = 4;
			break;
			
		case VERSION_525:
			custom_data_length = 8;
			break;
		
		default:
			custom_data_length = 8;
			break;
	}
	
	set_sid( 0x0666 ); //rqcamd client id
}

void newcamd_client::set_sid( unsigned short int sid )
{
	memset(custom_data, 0, sizeof(custom_data));
	switch( protocol_version )
	{
		case VERSION_520:
			custom_data[2] = sid >> 8;
			custom_data[3] = sid & 0xFF;
			break;
			
		case VERSION_525:
			custom_data[0] = sid >> 8;
			custom_data[1] = sid & 0xFF;
			break;
		
		default:
			custom_data[0] = sid >> 8;
			custom_data[1] = sid & 0xFF;
			break;
	}
}

void newcamd_client::parse_url( void )
{
	char config_key[29];
	char emm_config[4];
	unsigned char config_key_byte_count = sizeof(des_key);
	int des_key_byte;
	
	memset(config_key, 0, sizeof(config_key));
	sscanf(url, "newcamd://%[^:]:%[^@]@%[^:]:%d/%28s/%3s", username, password, hostname, &port, config_key, emm_config);
	
	while( config_key_byte_count-- )
	{
		sscanf(&config_key[config_key_byte_count * 2], "%02X", &des_key_byte);
		des_key[config_key_byte_count] = (unsigned char)des_key_byte;
	}
	des_key[config_key_byte_count] = 0;
	
	if( !strcmp(emm_config, "EMM") )
		process_emms = true;
	else
		process_emms = false;
}
	
newcamd_client::~newcamd_client( void )
{
	server_disconnect();
}

void newcamd_client::server_connect( void )
{
	struct hostent *host_address;
	struct sockaddr_in socket_address;
	
	host_address = gethostbyname(hostname);
	if(!host_address)
	{
		status = 1;
		printf("[Newcamd] Could not resolve hostname.\n");
		return;
	}
	
	if((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		status = 1;
		printf("[Newcamd] Could not get socket descriptor.\n");
		return;
	}
	
    socket_address.sin_family = AF_INET;
    socket_address.sin_port = _htons(port);
    socket_address.sin_addr.s_addr = ((struct in_addr *) host_address->h_addr)->s_addr;
	
	if( connect(fd, (struct sockaddr *)(&socket_address), sizeof(struct sockaddr)) < 0 )
	{
		status = 1;
		printf("[Newcamd] Failed to connect to remote server.\n");
		return;
	}
	
	status = 0;
	printf("[Newcamd] Successfully connected to server.\n");
}

void newcamd_client::server_disconnect( void )
{
	shutdown(fd, 2);
	close(fd);
}

void newcamd_client::server_login( void )
{
	unsigned char buffer[CWS_NETMSGSIZE];
	memset(buffer, 0, CWS_NETMSGSIZE);
	
	// ----------------------------------------- LOGIN --------------------------------------------------
	//server should initiate sequence with 14-byte random key. get it and create the login key
	if( network_read(random_key, sizeof(random_key)) != sizeof(random_key) )
	{
		status = 1;
		printf( "[Newcamd] Failed to receive random server key.");
		return;
	}
	create_login_key(); //xor random key with common des key
	
	//build login command data
	char *encrypted_password = crypt(password,"$1$abcdefgh$");
	unsigned short int username_length = strlen(username);
	unsigned short int password_length = strlen(encrypted_password);
  	memcpy(buffer, username, username_length + 1);
  	memcpy(buffer + username_length + 1, encrypted_password, password_length + 1);
  	
  	//send login command, if error, exit.
  	send_command(MSG_CLIENT_2_SERVER_LOGIN, buffer, username_length + 1 + password_length + 1, custom_data, LOGIN_KEY);
  	if( status ) return;
  	
  	//command sent successfully, get server response, if error, exit.	
  	int command = receive_command( NULL, LOGIN_KEY );
  	if( status ) return;
  	
  	//server response received succesfully, check if login is acknowledged, if not, exit.
  	if( command != MSG_CLIENT_2_SERVER_LOGIN_ACK )
  	{
  		status = 1;
  		printf("[Newcamd] Login request was rejected.\n");
  		return;
  	}
  	
  	// --------------------------------------- CARD DATA REQUEST -------------------------------------
  	//login was successful, now create session key
  	create_session_key( encrypted_password ); //xor password with common des key
  	
  	//from now on, all messages are encrypted with the session key
  	//request card data
  	send_command(MSG_CARD_DATA_REQ, 0, 0, custom_data, SESSION_KEY);
  	if( status ) return;
  	
  	//command sent successfully, get server response, if error, exit.	
  	receive_message(buffer, NULL, SESSION_KEY );
  	if( status ) return;
  	
  	//server response received succesfully, check if login is acknowledged, if not, exit.
  	if( buffer[0] != MSG_CARD_DATA )
  	{
  		status = 1;
  		printf( "[Newcamd] Card data request failed.\n");
  		return;
  	}
  	
  	//parse card data
  	card_caid = buffer[4] << 8 | buffer[5]; //get caid. it is stored at bytes 4 & 5 (big-endian)
  	user_id = buffer[3]; //get user id assigned by server.
  	
  	//check if cam id was provided.
  	if( memcmp(buffer + 6, "\0\0\0\0\0\0\0\0", 8) )
  	{
  		//cam id info is present, get the data according to caid
  		switch( card_caid >> 8 )
  		{
  			case 0x18: //nagra
  				memcpy(cam_id, buffer + 6 + 4, 4);
  				break;
  		}
  	}
  	
  	card_provider_id_count = buffer[14] > MAX_CARD_PROVIDER_COUNT ? MAX_CARD_PROVIDER_COUNT : buffer[14];
	//fill provider id's collection
  	for(int i=0;i<card_provider_id_count;i++)
  		card_provider_id[i] = (buffer[15 + (i * 11) + 1] << 8) | buffer[15 + (i * 11) + 2];
}

void newcamd_client::send_ecm(unsigned char *ecm_data, unsigned short int ecm_data_length, unsigned short int sid)
{
	unsigned char buffer[CWS_NETMSGSIZE];
	int bytes_received, i;
	
	//set the sid in custom data field
	set_sid( sid );
	
	//send the ecm, exit if error status
	send_message(ecm_data, ecm_data_length, custom_data, SESSION_KEY);
	if( status ) return;
	
	//this receive loop is to discard any old messages left in the socket read buffer due
	//to fast service switching (without this, fast service switching does not work properly).
	while( 1 )
	{
		bytes_received = receive_message(buffer, 0, SESSION_KEY);
		if( status ) return;

		if( received_sequence_id == sent_sequence_id ) break;

		if( received_sequence_id > sent_sequence_id )
		{
			status = 1;
			printf("[Newcamd] Future sequence id received. ECM request failed.\n");
			return;
		}

		/*
		if( received_sequence_id < sent_sequence_id )
			printf("seq id mismatch! sent: %d, recv: %d", sent_sequence_id, received_sequence_id);		
		*/
	}
	
	switch( bytes_received )
	{
		case 3 + 16: //19 bytes where received (3-byte header + 16-byte control words)
			//copy control words
			if( memcmp(buffer + 3 + 0, "\0\0\0\0", 4) ) memcpy(cw_0, buffer + 3 + 0, sizeof(cw_0));
			if( memcmp(buffer + 3 + 8, "\0\0\0\0", 4) ) memcpy(cw_1, buffer + 3 + 8, sizeof(cw_1));
			
			status = 0;
			if (dbg) 
			{
				printf( "[Newcamd] Control words received successfully.\n");
				for (i=0;i<19;i++) printf("%02x ",buffer[i]); printf("\n");
			}
			break;
			
		case 3: //only header received, no control words
			status = 1;
			printf( "[Newcamd] Control words not received.\n");
			break;
			
		default:
			status = 2;
			printf( "[Newcamd] Invalid server response (%d bytes received).\n", bytes_received);
			break;
			break;
	}
}

void newcamd_client::send_emm(unsigned char *emm_data, unsigned short int emm_data_length)
{
	unsigned char buffer[CWS_NETMSGSIZE];
	unsigned int bytes_received;
	
	if( process_emms /* && memcmp(cam_id, "\0\0\0\0", 4) */ )
	{
		send_message(emm_data, emm_data_length, 0, SESSION_KEY);
		if( status ) return;
			
		//this receive loop is to discard any old messages left in the socket read buffer due
		//to fast service switching (without this, fast service switching does not work properly).
		while( 1 )
		{
			bytes_received = receive_message(buffer, 0, SESSION_KEY);
			if( status ) return;
			
			if( received_sequence_id > sent_sequence_id )
			{
				status = 1;
				printf( "[Newcamd] Future sequence id received. EMM request failed.\n");
				return;
			}
			if( received_sequence_id == sent_sequence_id ) break;
		}
		
		if( bytes_received < 3 )
		{
			status = 1;
			printf( "[Newcamd] Invalid server response while processing EMM.\n");
		}
		else
		{
			if( buffer[1] & 0x10 )
			{
				status = 0;
				printf( "[Newcamd] EMM processed correctly by card.\n");
			}
			else
			{
				status = 1;
				printf( "[Newcamd] EMM rejected by card.\n");
			}
		}
	}
	else
	{
		status = 1;
		printf( "[Newcamd] EMM processing has been disabled.\n");
	}
}

void newcamd_client::send_command(net_msg_type_t command, unsigned char *data, unsigned short int data_length, unsigned char *custom_data, key_encryption_t key_type)
{
	unsigned char command_buffer[3 + data_length];
	command_buffer[0] = command;
	command_buffer[1] = (data_length >> 8) & 0x0F;
	command_buffer[2] = data_length & 0xFF;
	if( data ) memcpy(command_buffer + 3, data, data_length);
	
	return send_message(command_buffer, sizeof(command_buffer), custom_data, key_type);
}

net_msg_type_t newcamd_client::receive_command( unsigned char *custom_data, key_encryption_t key_type )
{
	unsigned char command_buffer[CWS_NETMSGSIZE];
	
	if( receive_message(command_buffer, custom_data, key_type) == 3 )
		return (net_msg_type_t) command_buffer[0];
	else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲bt欧美bt精品| 一区二区三区国产精品| 欧美日韩国产一区二区三区地区| 丁香另类激情小说| 成人激情午夜影院| 成人免费毛片app| 99久久久无码国产精品| 94-欧美-setu| 欧美午夜电影在线播放| 欧美日韩精品一区二区三区蜜桃| 欧洲一区二区av| 欧美日高清视频| 欧美一区二区在线免费播放| 日韩午夜激情视频| 久久精品无码一区二区三区| 国产精品丝袜黑色高跟| 亚洲欧美色图小说| 日日欢夜夜爽一区| 国产精品伊人色| 一本到不卡免费一区二区| 色婷婷综合久久| 日韩午夜激情视频| 国产精品福利在线播放| 亚洲国产成人av网| 国产九九视频一区二区三区| 99re热视频精品| 欧美丰满少妇xxxbbb| 久久久国际精品| 一区av在线播放| 国产真实精品久久二三区| 成人av免费观看| 宅男噜噜噜66一区二区66| 国产网站一区二区三区| 亚洲国产乱码最新视频| 国产精品 欧美精品| 91丨porny丨蝌蚪视频| 日韩一卡二卡三卡国产欧美| 国产精品久久免费看| 日本午夜一本久久久综合| 不卡欧美aaaaa| 日韩欧美亚洲一区二区| 亚洲欧美日韩国产成人精品影院 | 美国三级日本三级久久99| 成人国产精品免费| 日韩欧美久久一区| 一区二区三区国产精华| 成人午夜视频网站| 日韩精品影音先锋| 婷婷成人综合网| 一本久久a久久精品亚洲| 久久精品亚洲一区二区三区浴池| 亚洲成人www| 91蜜桃婷婷狠狠久久综合9色| 日韩精品在线网站| 日韩精品久久理论片| 色综合网色综合| 欧美国产日本韩| 国产一区二区三区视频在线播放| 69堂国产成人免费视频| 最新热久久免费视频| 国产大陆亚洲精品国产| 精品国产一区二区三区久久久蜜月 | 欧美另类z0zxhd电影| 中文字幕在线不卡视频| 成人永久免费视频| 国产欧美1区2区3区| 久久99精品久久久久| 91精品国产综合久久久蜜臀粉嫩| 亚洲人成亚洲人成在线观看图片| 高清不卡在线观看av| 久久久久久久精| 国产成人免费视频网站高清观看视频| 日韩一区二区三区免费看| 午夜国产精品一区| 欧美精品亚洲一区二区在线播放| 亚洲一二三四在线观看| 91国偷自产一区二区开放时间 | 日本韩国欧美在线| 亚洲欧美日韩国产综合在线| 在线观看日产精品| 亚洲三级在线播放| 91麻豆蜜桃一区二区三区| 洋洋成人永久网站入口| 欧美日韩午夜精品| 视频一区二区中文字幕| 欧美大黄免费观看| 国产精品羞羞答答xxdd| 日韩伦理av电影| 精品视频色一区| 视频一区中文字幕| 久久亚洲一级片| www.激情成人| 亚洲va韩国va欧美va精品 | 欧美一级欧美一级在线播放| 日本成人在线看| 亚洲国产精华液网站w| 色综合久久综合网| 青娱乐精品在线视频| 久久蜜桃香蕉精品一区二区三区| 国产99久久久久| 一区二区三区免费在线观看| 欧美一区二区三区婷婷月色| 国产乱子轮精品视频| 亚洲日本va午夜在线影院| 欧美肥胖老妇做爰| 国产精品88av| 亚洲国产欧美日韩另类综合 | 99久久精品国产精品久久| 亚洲成人在线观看视频| 国产色产综合色产在线视频| 在线观看日韩av先锋影音电影院| 久久99日本精品| 一区二区三区四区蜜桃| 久久先锋资源网| 欧美乱妇20p| 色综合中文综合网| 婷婷国产v国产偷v亚洲高清| 久久亚洲影视婷婷| 欧美日韩久久一区| kk眼镜猥琐国模调教系列一区二区 | 欧美国产乱子伦 | 国产精品国产三级国产| 欧美一级一级性生活免费录像| 成人毛片在线观看| 秋霞午夜鲁丝一区二区老狼| 18成人在线观看| 国产日产亚洲精品系列| 欧美一卡二卡在线| 欧美性色aⅴ视频一区日韩精品| 国产精品一区二区免费不卡| 视频一区视频二区中文| 亚洲人123区| 亚洲国产成人私人影院tom| 日韩女优毛片在线| 这里只有精品99re| 欧美三级日韩三级| 91久久精品日日躁夜夜躁欧美| 成人中文字幕合集| 国产美女视频一区| 国产麻豆视频精品| 久久电影网站中文字幕| 丝袜美腿一区二区三区| 亚洲国产日韩一级| 亚洲成人动漫精品| 午夜电影网亚洲视频| 亚洲国产精品尤物yw在线观看| 国产精品久久久久久妇女6080| 久久久影院官网| 久久久久久电影| 国产免费久久精品| 欧美激情一区二区三区蜜桃视频 | 成人一区二区在线观看| 激情文学综合丁香| 国产剧情一区在线| 成人一区二区三区中文字幕| 床上的激情91.| aaa亚洲精品| 色网综合在线观看| 欧美日韩精品电影| 91麻豆精品国产91久久久久 | 日韩女优av电影在线观看| 欧美一区国产二区| 欧美tickle裸体挠脚心vk| 久久亚洲综合色一区二区三区| 精品奇米国产一区二区三区| 丁香激情综合国产| 2024国产精品| 视频一区二区欧美| 懂色av中文一区二区三区 | 丝袜美腿亚洲一区二区图片| 不卡一区二区三区四区| 精品日韩成人av| 午夜精品一区在线观看| 99视频在线精品| 久久久久国产成人精品亚洲午夜| 亚洲大尺度视频在线观看| 成人黄色小视频| 久久精品水蜜桃av综合天堂| 免费看黄色91| 欧美色涩在线第一页| 亚洲欧美一区二区三区极速播放| 国产精品中文有码| 亚洲美女屁股眼交3| 国产黑丝在线一区二区三区| 制服丝袜在线91| 亚洲国产精品尤物yw在线观看| 成人深夜视频在线观看| 久久久亚洲精华液精华液精华液| 亚洲mv大片欧洲mv大片精品| 91福利在线看| 一区二区三区在线视频免费| 99re热这里只有精品免费视频| 欧美国产精品一区| 成人一区二区三区在线观看| 久久久另类综合| 国产成人精品午夜视频免费| 国产性色一区二区| 国产精品一区不卡| 中文字幕av在线一区二区三区| 国产成人精品免费在线|