📄 udptortp.cpp
字号:
#include "stdafx.h"
#include "Aes.h"
#include "UDPTORTP.h"
#define SRTP_PORT 0
#define MIKEY_PORT 2269
#define RTP_PORT 2
//////////////////////////////////////////////////////////////////////////
//解UDP包
///////////////////////////////////////////////////////////////////////////
void UDPTORTP::MDPC_MTKD_DeUDP(char* p,int lenth)
{
char *put;
put=new char[lenth];
memcpy(put,p,lenth);
char *out;
out=new char[lenth];
switch(port)
{
case SRTP_PORT:
{
MDPC_MTKD_BMTK(put,lenth);
MDPC_MTKD_DeRTP(put,lenth,out);
}
break;
case MIKEY_PORT: //2269 MIKEY
{
MDPC_MTKD_BMTK(put,lenth);
}
break;
case RTP_PORT:
MDPC_MTKD_DeRTP(put,lenth,out);
break;
default:
printf("error\n");
break;
}
}
////////////////////////////////////////////////////////////////////////////////
//解MIKEY消息
///////////////////////////////////////////////////////////////////////////////
void UDPTORTP::MDPC_MTKD_BMTK(char* data,int lenth)
{
unsigned long i=0;
int value=0;
int keylen=0,saltlen=0,Len=0;
//初始化MIKEY包
MikeyNum.Version=data[0];
MikeyNum.Data_type=data[1];
MikeyNum.Next_payload=data[2];
MikeyNum.HDRNum.Version=data[3];
MikeyNum.HDRNum.Data_type=data[4];
MikeyNum.HDRNum.Next_payload=data[5];
MikeyNum.HDRNum.V_Prf_func=data[6];
temp=data[10];
MikeyNum.HDRNum.Csb_id=temp<<24;
temp=0;
temp=data[9];
MikeyNum.HDRNum.Csb_id += temp<<16;
temp=0;
temp=data[8];
MikeyNum.HDRNum.Csb_id += temp<<8;
temp=0;
temp=data[8];
MikeyNum.HDRNum.Csb_id +=temp;
//MikeyNum.HDRNum.Csb_id=data[7]+data[8]<<8+data[9]<<16+data[10]<<24;
MikeyNum.HDRNum.Cs=data[11];
MikeyNum.HDRNum.Cs_type=data[12];
for(i=0;i<(unsigned long)MikeyNum.HDRNum.Cs;i++)
{
MikeyNum.HDRNum.SRTP_IDNum.Policy_no_i=data[13];
temp=0;
temp=data[16];
MikeyNum.HDRNum.SRTP_IDNum.SSRC_i=temp<<24;
temp=0;
temp=data[15];
MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp<<16;
temp=0;
temp=data[14];
MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp<<8;
temp=0;
temp=data[13];
MikeyNum.HDRNum.SRTP_IDNum.SSRC_i+=temp;
//MikeyNum.HDRNum.p_srtp_id->SSRC_i=data[13]+data[14]<<8+data[15]<<16+data[16]<<24;
temp=0;
temp=data[16];
MikeyNum.HDRNum.SRTP_IDNum.ROC_i=temp<<24;
temp=0;
temp=data[15];
MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp<<16;
temp=0;
temp=data[14];
MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp<<8;
temp=0;
temp=data[13];
MikeyNum.HDRNum.SRTP_IDNum.ROC_i+=temp;
//MikeyNum.HDRNum.p_srtp_id->ROC_i=data[17]+data[18]<<8+data[19]<<16+data[20]<<24;
}
//类似循环链表//////////////////////////////////////////
value=data[5];
for(i=20;value;)
{
switch(value)
{
case 1:
{
MikeyNum.PayloadNum.KEMACNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.KEMACNum.Encr_alg=data[i+2];
MikeyNum.PayloadNum.KEMACNum.Encr_data_len=data[i+3];
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Next_payload=data[i+4];
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Type_kv=data[i+5];
temp=0;
temp=data[i+7];
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len=temp<<8;
temp=0;
temp=data[i+6];
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len+=temp;
//MikeyNum.U_Payload.KEMACNum.KEYSUBNum.Key_data_len=data[i+6]+data[i+7]<<8;
keylen=MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_len;
memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Key_data_buffer,data+i+8,keylen);
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Salt_len=data[i+8+keylen];
saltlen=data[i+8+keylen];
memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.Salt_data_buffer,data+i+9+keylen,saltlen);
Len=keylen+saltlen;
int Len_spi=0,Len_in=0;
switch(data[i+5]&0x0f)
{
case 0:
i=Len+9+i;
break;
case 1:
{
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_spiNum.SPI_len=data[i+10+Len];
Len_spi=data[i+10+Len];
memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_spiNum.SPI_data_buffer,data+i+11+Len,Len_spi);
i=Len_spi+Len+11+i;
}
break;
case 3:
{
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.VF_lenth=data[i+10+Len];
Len_in=data[i+10+Len];
memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.From,data+i+11+Len,Len_in);
Len=Len_in+Len;
MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.VT_lenth=data[i+12+Len];
Len_in=data[i+12+Len];
memcpy(MikeyNum.PayloadNum.KEMACNum.KEYSUBNum.KVNum.Kv_inNum.To,data+i+13+Len,Len_in);
i=Len+Len_in+13+i;
}
break;
default:
{
i=Len+9+i;
printf("Error");
}
break;
}
value=MikeyNum.PayloadNum.KEMACNum.Next_payload;
}
break;
case 4:
{
temp=0;
temp=data[i+2];
MikeyNum.PayloadNum.SignNum.S_sign_len=temp<<8;
temp=0;
temp=data[i+1];
MikeyNum.PayloadNum.SignNum.S_sign_len=temp+MikeyNum.PayloadNum.SignNum.S_sign_len;
//MikeyNum.U_Payload.SignNum.S_sign_len=data[i+1]+data[i+2]<<8;
Len=MikeyNum.PayloadNum.SignNum.S_sign_len;
memcpy(MikeyNum.PayloadNum.SignNum.Sdata,data+i+3,Len);
i=Len+3+i;
value=0;
}
break;
case 5:
{
MikeyNum.PayloadNum.TimestampNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.TimestampNum.Ts_type=data[i+2];
if(data[i+2]==2)
{
memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,4);
i=i+3+4;
}
if(data[i+2]==1)
{
memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,8);
i=i+3+8;
}
if(data[i+2]==0)
{
memcpy(MikeyNum.PayloadNum.TimestampNum.Ts_value,data+i+3,8);
i=i+3+8;
}
value=MikeyNum.PayloadNum.TimestampNum.Next_payload;
}
break;
case 6:
{
MikeyNum.PayloadNum.IDNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.IDNum.Itype=data[i+2];
temp=0;
temp=data[i+4];
MikeyNum.PayloadNum.IDNum.len=temp<<8;
temp=0;
temp=data[i+3];
MikeyNum.PayloadNum.IDNum.len=temp+MikeyNum.PayloadNum.IDNum.len;
//MikeyNum.U_Payload.IDNum.len=data[i+3]+data[i+4]<<8;
Len=MikeyNum.PayloadNum.IDNum.len;
memcpy(MikeyNum.PayloadNum.IDNum.data,data+i+5,Len);
i=Len+i+5;
value=MikeyNum.PayloadNum.IDNum.Next_payload;
}
break;
case 7:
{
MikeyNum.PayloadNum.CertNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.CertNum.Itype=data[i+2];
temp=0;
temp=data[i+4];
MikeyNum.PayloadNum.CertNum.len=temp<<8;
temp=0;
temp=data[i+3];
MikeyNum.PayloadNum.CertNum.len=temp+MikeyNum.PayloadNum.CertNum.len;
//MikeyNum.U_Payload.CertNum.len=data[i+3]+data[i+4]<<8;
Len=MikeyNum.PayloadNum.CertNum.len;
memcpy(MikeyNum.PayloadNum.CertNum.data,data+i+5,Len);
i=Len+i+5;
value=MikeyNum.PayloadNum.CertNum.Next_payload;
}
break;
case 8:
{
MikeyNum.PayloadNum.HashNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.HashNum.Func=data[i+2];
if (data[i+2]==0)
{
memcpy(MikeyNum.PayloadNum.HashNum.data,data+i+3,20);
i=i+3+20;
}
else
if(data[i+2]==1)
{
memcpy(MikeyNum.PayloadNum.HashNum.data,data+i+3,16);
i=i+3+16;
}
value=MikeyNum.PayloadNum.HashNum.Next_payload;
}
break;
case 9:
{
MikeyNum.PayloadNum.VNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.VNum.Auth=data[i+2];
Len=data[i+2];
memcpy(MikeyNum.PayloadNum.VNum.data,data+i+3,Len);
i=i+3+Len;
value=MikeyNum.PayloadNum.VNum.Next_payload;
}
break;
case 10:
{
MikeyNum.PayloadNum.SPNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.SPNum.Policy_no=data[i+2];
MikeyNum.PayloadNum.SPNum.Prot_type=data[i+3];
temp=0;
temp=data[i+5];
MikeyNum.PayloadNum.SPNum.Param_len=temp<<8;
temp=0;
temp=data[i+4];
MikeyNum.PayloadNum.SPNum.Param_len=temp+MikeyNum.PayloadNum.SPNum.Param_len;
//MikeyNum.U_Payload.SPNum.Param_len=data[i+4]+data[i+5]<<8;
MikeyNum.PayloadNum.SPNum.ParamNum.Type=data[i+6];
MikeyNum.PayloadNum.SPNum.ParamNum.Len=data[i+7];
Len=data[i+7];
memcpy(MikeyNum.PayloadNum.SPNum.ParamNum.Value,data+i+8,Len);
i=i+8+Len;
value=MikeyNum.PayloadNum.SPNum.Next_payload;
}
break;
case 11:
{
MikeyNum.PayloadNum.RandNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.RandNum.Rand_Len=data[i+2];
Len=data[i+2];
memcpy(MikeyNum.PayloadNum.RandNum.data,data+i+2,Len);
i=i+2+Len;
value=MikeyNum.PayloadNum.RandNum.Next_payload;
}
break;
case 12:
{
MikeyNum.PayloadNum.ErrNum.Next_payload=data[i+1];
MikeyNum.PayloadNum.ErrNum.Err_no=data[i+2];
temp=0;
temp=data[i+4];
MikeyNum.PayloadNum.ErrNum.Reserved=temp<<8;
temp=0;
temp=data[i+3];
MikeyNum.PayloadNum.ErrNum.Reserved=temp+MikeyNum.PayloadNum.ErrNum.Reserved;
//MikeyNum.U_Payload.ErrNum.Reserved=data[i+3]+data[i+4]<<8;
i=i+4;
value=MikeyNum.PayloadNum.ErrNum.Next_payload;
}
break;
case 20:
{
MikeyNum.PayloadNum.KEYNum.Next_payload=data[i+4];
MikeyNum.PayloadNum.KEYNum.Type_kv=data[i+5];
temp=0;
temp=data[i+7];
MikeyNum.PayloadNum.KEYNum.Key_data_len=temp<<8;
temp=0;
temp=data[i+6];
MikeyNum.PayloadNum.KEYNum.Key_data_len=temp+MikeyNum.PayloadNum.KEYNum.Key_data_len;
//MikeyNum.U_Payload.KEYNum.Key_data_len=data[i+6]+data[i+7]<<8;
keylen=MikeyNum.PayloadNum.KEYNum.Key_data_len;
memcpy(MikeyNum.PayloadNum.KEYNum.Key_data_buffer,data+i+8,keylen);
MikeyNum.PayloadNum.KEYNum.Salt_len=data[i+8+keylen];
saltlen=data[i+8+keylen];
memcpy(MikeyNum.PayloadNum.KEYNum.Salt_data_buffer,data+i+9+keylen,saltlen);
Len=keylen+saltlen;
int Len_spi=0,Len_in=0;
switch(data[i+5]&0x0f)
{
case 0:
i=Len+9+i;
break;
case 1:
{
MikeyNum.PayloadNum.KEYNum.KVNum.Kv_spiNum.SPI_len=data[i+10+Len];
Len_spi=data[i+10+Len];
memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_spiNum.SPI_data_buffer,data+i+11+Len,Len_spi);
i=Len_spi+Len+11+i;
}
break;
case 3:
{
MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.VF_lenth=data[i+10+Len];
Len_in=data[i+10+Len];
memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.From,data+i+11+Len,Len_in);
Len=Len_in+Len;
MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.VT_lenth=data[i+12+Len];
Len_in=data[i+12+Len];
memcpy(MikeyNum.PayloadNum.KEYNum.KVNum.Kv_inNum.To,data+i+13+Len,Len_in);
i=Len+Len_in+13+i;
}
break;
default:printf("Error");
break;
}
value=MikeyNum.PayloadNum.KEYNum.Next_payload;
}
break;
case 21:
{
MikeyNum.PayloadNum.Gen_ext.Next_payload=data[i+1];
MikeyNum.PayloadNum.Gen_ext.Type=data[i+2];
temp=0;
temp=data[i+4];
MikeyNum.PayloadNum.Gen_ext.Len=temp<<8;
temp=0;
temp=data[i+3];
MikeyNum.PayloadNum.Gen_ext.Len=temp+MikeyNum.PayloadNum.Gen_ext.Len;
//MikeyNum.U_Payload.Gen_ext.Len=data[i+3]+data[i+4]<<8;
Len=MikeyNum.PayloadNum.Gen_ext.Len;
memcpy(MikeyNum.PayloadNum.Gen_ext.data,data+i+5,Len);
i=i+5+Len;
value=MikeyNum.PayloadNum.Gen_ext.Next_payload;
}
break;
default:
{
i=20;
printf("Error");
}
break;
}
}
////////////////////////////////////////////////////////
temp=0;
temp=data[i+4];
MikeyNum.Mac_Signature=temp<<24;
temp=0;
temp=data[i+3];
MikeyNum.Mac_Signature+=temp<<16;
temp=0;
temp=data[i+2];
MikeyNum.Mac_Signature+=temp<<8;
temp=0;
temp=data[i+1];
MikeyNum.Mac_Signature+=temp;
//MikeyNum.Mac_Signature=data[i+1]+data[i+2]<<8+data[i+3]<<16+data[i+4]<<24;
//////////////////////////////////////////////////////////////////////////////////
//MIKEY包初始化完成
//////////////////////////////////////////////////////////////////////////////////
/*
MiNum.Version=data[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -