⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emmgdlg_cpp.txt

📁 数字电视加密CA系统中最重要的授权数据EMM的解码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	{ 
		dump_com_error(e);	 
		return  ;
	}  
	AfxMessageBox("更新成功");
	
	
}

void CEMMGDlg::OnClickLISTuserright(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	if(m_userright.GetSelectedCount()==0)
		return ;
	POSITION iPos=m_userright.GetFirstSelectedItemPosition();
	int nItem=0;
	if(iPos==NULL) 
		return;
	else
	{ 				
		nItem=m_userright.GetNextSelectedItem(iPos);
	}
	
	
	m_icid=m_userright.GetItemText(nItem,0);
	
	
	m_pky=m_userright.GetItemText(nItem,1);
	
	// 类型
	m_sk=m_userright.GetItemText(nItem,2); 
	
	
	m_esk=m_userright.GetItemText(nItem,3); 
	
	UpdateData(FALSE);
	*pResult = 0;
}


void CEMMGDlg::OnBUTTONStart() 
{ 
//	initClient();
//	initEMM();
	int buflen;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	char buf[2048];//@@@@@@@@@@@@@@@@@@@@@@@@@
    sockaddr_in   localaddr;
	
	UpdateData(TRUE);
	unsigned short m_recvPort=m_EMMPort;
    //section_TSpkt_flag=m_pktflag;

	if(_access(LOGFILEPATH,0)==-1)   //creat LOGFILEPATH
	{
		char sysstr[100];
		sprintf(sysstr,"mkdir %s",LOGFILEPATH);
		system(sysstr);
	}

	if ((sock1scs=socket(PF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
	{
		int iWinsockErr=WSAGetLastError();
        temp.Format("Error %d come from the socket() funtion !! \r\n",iWinsockErr);
   	    m_info.ReplaceSel(temp,EMM_LOG);
        WriteToLogfile(temp,EMM_LOG);
      	return;
	}
    else
	{
		temp.Format("socket %d create succeed\r\n",sock1scs);
		m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
	}
		
	localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(m_recvPort);
    localaddr.sin_addr.s_addr = inet_addr("192.168.9.200");
    
  if (connect(sock1scs, (struct sockaddr *)&localaddr, sizeof(localaddr))==SOCKET_ERROR)
    {
		temp.Format("%d connect failed\r\n",sock1scs);
		m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
        return;
	}
	else
	{
		temp.Format("%d connect succeed\r\n",sock1scs);
		m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
	}
    Make_Channel_Setup(buf,&buflen);
    
	EMM_WriteTo(sock1scs,buf,buflen);
       if(WSAAsyncSelect(sock1scs,m_hWnd,UM_EMM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
		{
			temp.Format("%d WSAAsyncSelect Failure id=%d\r\n",sock1scs,WSAGetLastError());
		    m_info.ReplaceSel(temp);
            WriteToLogfile(temp,EMM_LOG);
  	        closesocket(sock1scs); 
			sock1scs=0;
		}
	   (GetDlgItem(IDOK))->EnableWindow(FALSE);///////////////////////////
	
	
}
LONG CEMMGDlg::OnRecv(UINT wParam, LONG lParam)
{
	
    int buflen,i;
	char buf[2048];
  //  char *msgpkt;
	switch(WSAGETSELECTEVENT(lParam))
	{
    case FD_CONNECT:
        Make_Channel_Setup(buf,&buflen);
        EMM_WriteTo(wParam,buf,buflen);
       if(WSAAsyncSelect(sock1scs,m_hWnd,UM_EMM_SOCK,FD_READ|FD_CLOSE)==SOCKET_ERROR)
		{
			temp.Format("%d WSAAsyncSelect Failure id=%d\r\n",sock1scs,WSAGetLastError());
		    m_info.ReplaceSel(temp);
            WriteToLogfile(temp,EMM_LOG);
  	        closesocket(sock1scs); 
			sock1scs=0;
			break;
		}
    case FD_WRITE:
		WriteToLogfile("\r\n",EMM_LOG);
        EMM_WriteTo(wParam,buf,buflen);
        
	    //ReadFrom(wParam,buf,MAX_MESSAGE_LENGTH);
		
		break;
	case FD_READ:
		WriteToLogfile("\r\n",EMM_LOG);
	    ReadFrom(wParam,buf,MAX_MESSAGE_LENGTH);
		{
		   int rc=recvMsgProcess(buf,buflen);
			if(rc==1)
				 EMM_WriteTo(wParam,buf,buflen);
			  
		   else if(rc==2)
			{

			   DWORD dwEcmgThreadID;			  
			    
			     HANDLE hEcmgServe=::CreateThread(NULL,0,tSendEmmData,(PVOID)&m_info,0,&dwEcmgThreadID);  
				if(hEcmgServe==NULL)
				{
					 AfxMessageBox("fail to startup the emmg server !");					 
				} 
			}
		}
		break;
	case FD_CLOSE:
		if(wParam==sock1scs)  break;
			temp.Format("%d socket closed\r\n",wParam);
			m_info.ReplaceSel(temp);
			WriteToLogfile(temp,EMM_LOG);
			closesocket(wParam);
			sock1scs=0;
	}
	return 1;
}
short CEMMGDlg::ReadFrom(SOCKET s,char *recvbuf, int buflen)
{
	CString temp;

	UINT recvlen=recv(s,recvbuf,buflen,0);
	if(recvlen == SOCKET_ERROR)
	{
		int iWinsockErr=WSAGetLastError();
		temp.Format("%d Error %d come from the recv()!!\r\n ",s,iWinsockErr);
	    m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
        return -1;
	}
	else  if (recvlen==0)
	{
		temp.Format("%d Recv():return FAILED,connection is shut down!\r\n",s);
		m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
        return -1;
    }
	else 
	{
		temp.Format("%d Recv():return SUCCESS,packet length = %d\r\n",s,recvlen);
		m_info.ReplaceSel(temp);
        WriteToLogfile(temp,EMM_LOG);
		WriteToLogfile(recvbuf,recvlen,EMM_LOG);
		WriteToLogfile("\r\n",EMM_LOG);
	   	return recvlen;
	}
}

short CEMMGDlg::EMM_WriteTo(SOCKET s, char *sendbuf, int buflen)
{
	CString temp;

	int sendlen=send(s,sendbuf,buflen,0);
      if (sendlen==SOCKET_ERROR)
	  {
		  int iWinsockErr=WSAGetLastError();
		  temp.Format("%d Error %d come from the send()!!\r\n ",s,iWinsockErr);
	      m_info.ReplaceSel(temp);
		    WriteToLogfile(temp,EMM_LOG);
          return -1;
	  }
	  else
	  {
		  temp.Format("%d Send():return SUCCESS,packet length = %d\r\n",s,sendlen);
		  m_info.ReplaceSel(temp);		  
		  WriteToLogfile(temp,EMM_LOG);
          WriteToLogfile(sendbuf,buflen,EMM_LOG);
		  WriteToLogfile("\r\n",EMM_LOG);
		  return(sendlen);	  
	  }
}

/*
void CEMMGDlg::OnMaxtextInfo() 
{
	// TODO: Add your control notification handler code here
//	m_info.SetSel(0,-1);
}
*/


char CEMMGDlg::recvMsgProcess(char *msgpkt,int &buflen)
{
	unsigned short message_type,message_length;
	unsigned short parameter_type,parameter_length;
	char parameter_value[200];
	int pos=0;
	unsigned int value;

	protocol_version = msgpkt[0];   
	message_type = (msgpkt[1] << 8) | msgpkt[2];
	message_length = (msgpkt[3] << 8) | msgpkt[4];
	pos+=5;

	temp.Format("protocol_version:%d message_type:0x%x message_length:%d\r\n",protocol_version,message_type,message_length);
	m_info.ReplaceSel(temp);
	if(protocol_version!=0x02)  return 0;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	while(pos-5 < message_length)
	{
		parameter_type = (msgpkt[pos] << 8) | msgpkt[pos+1];    pos+=2;
		parameter_length = (msgpkt[pos] << 8) | msgpkt[pos+1];  pos+=2;
		memcpy(parameter_value,msgpkt+pos,parameter_length);
		if(parameter_type!=0x7001)  
			stoi(parameter_value,value,parameter_length);
		else  parameter_value[parameter_length]='\0';
			
		pos += parameter_length;	

		switch(parameter_type)
		{
		case 0x0001://client_id
			if(message_type == 0x0013)//channel_status 	
			Super_CAS_ID = value;  //channel_setup message
			temp.Format("EMMG/CLIENT_ID:0x%x \r\n ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0002://section_TSpkt_flag
            temp.Format("section_TSpkt_flag:0x%x \r\n ",value);
			m_info.ReplaceSel(temp);
			break;
        case 0x0003://EMM_channel_id
           // if(message_type == 0x0013)//channel_status 	
			temp.Format("EMM_channel_ID:0x%x  \r\n",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0004://EMM_stream_id
            //if(message_type == 0x0113)//stream_status 	
			temp.Format("EMM_stream_ID:0x%x  \r\n",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0005://datagram
			break;
		case 0x0006://bandwidth
            temp.Format("patameter_type:0x%x parameter_length:0x%x Bandwidth:0x%x  \r\n",parameter_type,parameter_length,value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0007://data_type
            //if(message_type == 0x0113)//stream_status 	
			temp.Format("data_type:0x%x \r\n ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0008://data_id
            //if(message_type == 0x0113)//stream_status 	
			temp.Format("data_ID:0x%x  \r\n",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x0D://access_criteria
			strcpy(access_criteria,parameter_value);
			temp.Format("access_criteria:%s  ",parameter_value);
			m_info.ReplaceSel(temp);
			break;
		
		case 0x10://nominal_CP_duration
			temp.Format("nominal_CP_duration:0x%x  ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x11://access_criteria_transfer_mode
			temp.Format("access_criteria_transfer_mode:0x%x  ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x12://CP_number
			temp.Format("CP_number:0x%x  ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x13://CP_duration
			temp.Format("CP_duration:0x%x  ",value);
			m_info.ReplaceSel(temp);
			break;
	
		case 0x7000://Error_status
			temp.Format("Error_status:0x%x \r\n ",value);
			m_info.ReplaceSel(temp);
			break;
		case 0x7001://Error_information
			temp.Format("error_information:%s  \r\n",parameter_value);
			m_info.ReplaceSel(temp);
			break;
		}
	}
	m_info.ReplaceSel("\r\n");

	switch(message_type)
	{
	case 0x11://channel_setup
		m_info.ReplaceSel("recv:channel_setup\r\n");   
		//Make_Channel_Status_Response(msgpkt,buflen);	//生成channel_status消息
		m_info.ReplaceSel("send:channel_status\r\n"); 
		//Make_Stream_Setup(msgpkt,buflen);	//生成stream_setup消息
		//m_info.ReplaceSel("send:stream_setup\r\n"); 
		return 1;
	case 0x12://channel_test
		m_info.ReplaceSel("recv:channel_test\r\n");   
//		Make_Channel_Status_Response(msgpkt,buflen);	//生成channel_status消息
		m_info.ReplaceSel("send:channel_status\r\n");   
		return 1;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	case 0x13://channel_status
		m_info.ReplaceSel("recv:channel_status\r\n");
	    Make_Stream_Setup(msgpkt,buflen);	//生成stream_setup消息
		m_info.ReplaceSel("send:stream_setup\r\n"); 
		return 1;
	case 0x14://channel_close
		m_info.ReplaceSel("recv:channel_close\r\n");		break;
	case 0x15://channel_error
		m_info.ReplaceSel("recv:channel_error\r\n");   	break;
	case 0x111://stream_setup
		m_info.ReplaceSel("recv:stream_setup\r\n");   
//		Make_Stream_Status_Response(msgpkt,buflen);	//生成stream_status消息
		m_info.ReplaceSel("send:stream_status\r\n");   
		return 1;
	case 0x112://stream_test
		m_info.ReplaceSel("recv:stream_test\r\n");   
//		Make_Stream_Status_Response(msgpkt,buflen);	//生成stream_status消息
		m_info.ReplaceSel("send:stream_status\r\n");   
		return 1;
	case 0x113://stream_status
		m_info.ReplaceSel("recv:stream_status\r\n");
		Make_BW_Request(msgpkt,buflen);
		m_info.ReplaceSel("send:stream_BW_request\r\n");   
		return 1;
	case 0x114://stream_close_request
		m_info.ReplaceSel("recv:stream_close_request\r\n");   
		message_type=0x105;             //生成Stream_close_response消息
		msgpkt[1] = message_type >> 8;
		msgpkt[2] = message_type & 0xff;
		m_info.ReplaceSel("send:stream_close_response\r\n");   
		return 1;
    case 0x115://stream_close_response
		m_info.ReplaceSel("recv:stream_close_request\r\n");   
		message_type=0x105;             //生成Stream_close_response消息
		msgpkt[1] = message_type >> 8;
		msgpkt[2] = message_type & 0xff;
		m_info.ReplaceSel("send:stream_close_response\r\n");   
		return 1;
	case 0x116://stream_error
		m_info.ReplaceSel("recv:stream_error\r\n");   
		break;
    case 0x117://stream_BW_request
		m_info.ReplaceSel("recv:stream_error\r\n");   
		break;
    case 0x118://stream_BW_allocation
		m_info.ReplaceSel("recv:stream_BW_allocation\r\n"); 
		Make_EMM_Provision(msgpkt,buflen);
        
		m_info.ReplaceSel("send:EMM_data_provision\r\n"); 
		//flag=1;//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		return 2;
	/*case 0x211://data_provision
		m_info.ReplaceSel("recv:CW_porvision\r\n");   
		Make_ECM_Response(msgpkt,buflen);   //生成ECM_response消息
		m_info.ReplaceSel("send:ECM_response\r\n");
		
		return 1;*/
	}
	return 0;
}

void CEMMGDlg::Make_Channel_Setup(char *buf,int *buflen)
{
	buf[0]=0x02;//protocol_version
	buf[1]=0x00;  buf[2]=0x11;//channel_setup
	buf[3]=0x00;  buf[4]=0x13;//下面有19个字节
    buf[5]=0x00;  buf[6]=0x01;//client_id
	buf[7]=0x00;  buf[8]=0x04;
	buf[9]=0x4A;  buf[10]=0x02;
	buf[11]=0x00; buf[12]=0x01;//
	buf[13]=0x00; buf[14]=0x03;//data_channel_id
	buf[15]=0x00; buf[16]=0x02;
	buf[17]=0x00; buf[18]=0x01;
	buf[19]=0x00; buf[20]=0x02;//section_TSpkt_flag
	buf[21]=0x00; buf[22]=0x01;
	buf[23]=0x00;
    (*buflen)=24;
}

void CEMMGDlg::Make_Stream_Setup(char *buf,int &buflen)
{
	buf[0]=0x02;//protocol_version
	buf[1]=0x01;  buf[2]=0x11;//stream_setup
	buf[3]=0x00;  buf[4]=0x1F;//下面有31个字节
    buf[5]=0x00;  buf[6]=0x01;//client_id
	buf[7]=0x00;  buf[8]=0x04;
	buf[9]=0x4A;  buf[10]=0x02;
	buf[11]=0x00; buf[12]=0x01;
    buf[13]=0x00; buf[14]=0x03;//EMM_channel_id
	buf[15]=0x00; buf[16]=0x02;
	buf[17]=0x00; buf[18]=0x01;
	buf[19]=0x00; buf[20]=0x04;//EMM_stream_id
	buf[21]=0x00; buf[22]=0x02;
	buf[23]=0x00; buf[24]=0x01;
	buf[25]=0x00; buf[26]=0x08;//data_id
	buf[27]=0x00; buf[28]=0x02;
	buf[29]=0x00; buf[30]=0x00;
	buf[31]=0x00; buf[32]=0x07;//data_type
	buf[33]=0x00; buf[34]=0x01;
	buf[35]=0x00;//表示传送EMM
	buflen=36;
}

void CEMMGDlg::Make_BW_Request(char *buf,int &buflen)
{
    buf[0]=0x02;//protocol_version
    buf[1]=0x01;  buf[2]=0x17;//stream_BW_request
    buf[3]=0x00;  buf[4]=0x14;//下面有20个字节
    buf[5]=0x00;  buf[6]=0x01;//client_id
	buf[7]=0x00;  buf[8]=0x04;
	buf[9]=0x4A;  buf[10]=0x02;
	buf[11]=0x00; buf[12]=0x01;
    buf[13]=0x00; buf[14]=0x03;//EMM_channel_id
	buf[15]=0x00; buf[16]=0x02;
	buf[17]=0x00; buf[18]=0x01;
	buf[19]=0x00; buf[20]=0x04;//EMM_stream_id
	buf[21]=0x00; buf[22]=0x02;
	buf[23]=0x00; buf[24]=0x01;
	buflen=25;
}


void CEMMGDlg::OnButtonStop() 
{
	
}

void CEMMGDlg::OnSelchangeComboSk() 
{
	// TODO: Add your control notification handler code here
	
	UpdateData();
	
	des3_context ctx3;
	unsigned char buf[8+1]="\0";
	// 用pky移字节构成三重密钥 来加密sk
	memcpy(buf,(LPSTR)(LPCSTR)m_pky,8);
	
	unsigned char DES3_keys[3][8]; 
	memcpy(DES3_keys[0],buf,8);
	
	memcpy(DES3_keys[1]+1,buf,7);
	memcpy(DES3_keys[1],buf+7,1);
	
	memcpy(DES3_keys[2]+2,buf,6);
	memcpy(DES3_keys[2],buf+6,2);
	
	
	des3_set_3keys( &ctx3, DES3_keys[0], DES3_keys[1],DES3_keys[2] );
	
	memcpy(buf,(LPSTR)(LPCSTR)m_sk,8);
	
	des3_encrypt( &ctx3, buf, buf );
	
	//des3_decrypt( &ctx3, buf, buf ); 
	m_esk.Format("%s",buf);
	UpdateData(FALSE);
	
}
void CEMMGDlg::SendEMMData(void)
{
   EMM_WriteTo(sock1scs,EmmData,EmmDataLen);
   Make_EMM_Provision( EmmData,EmmDataLen);
}

void CEMMGDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	ShowWindow(SW_HIDE);
//	CDialog::OnClose();
}

void CEMMGDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
		static int c=0;
	CString str;
	str.Format("c=%d\r\n",c++);
	m_info.ReplaceSel(str);  
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -