1.(uint32_t* ) p 3,
根据计算原理,指针指向的地址向下移动到三个位置。 因为地址是4字节的类型,所以向下移动3个。 也就是说,移动3*4=12字节,指针移动到新地址
2.(enc_start-) uint 32 _ t * (HDR ) 2
32=12
指针的地址差向左移动了2位,得到的结果正好是12
3. Srtp的加密区域为172-12=160字节,即去除头部长度
4 .用于从验证器、RTP报头地址hdr存储最终验证值的地址是报头地址加上长度172的地址,并且是存储奇偶校验位的地址
auth_start=(uint32_t* ) hdr;
auth_tag=(uint8_t* ) hdr *pkt_octet_len;
5. Srtp_protect function
加密部分从除去起始地址12字节的地方开始
char * hexstr;
hexstr=octet _ string _ hex _ string (enc _ start,enc_octet_len );
写日志(‘ Hexstr1=% s ‘,hexstr ); //加密前的原文
if(enc_start ) {
status=cipher _ encrypt (stream-RTP _ cipher,
(uint8_t * ) enc_start,enc_octet_len );
是if (状态)
return err_status_cipher_fail;
}
memset(Hexstr,0,sizeof ) (Hexstr );
hexstr=octet _ string _ hex _ string (enc _ start,enc_octet_len );
写日志(‘ Hexstr2=% s ‘,hexstr ); //加密的密文长度不变
检查部分,从头开始检查
if(auth_tag ) {
writelog(SRTPauthtag:%s ),octet_string_hex_string ) auth_tag,tag_len );
/* increasethepacketlengthbythelengthoftheauthtag * /
*pkt_octet_len =tag_len;
写日志(srtpauthtagnewlength : % d ),*pkt_octet_len ); //长度增加
}
调用srtp_protect
SRTP_protect(sender_srtp_CTX,rtp.header,nLen );
a. msg.header,rtp标头地址
b. nLen,加密前的数据长度
c .做两件事
从除去标题长度的地址开始进行加密,加密后的长度不变
从头开始进行检查,生成auth tag,连接到数据的末尾
数据长度改变自动标记len、nLen
7 .发送数据
write_to () rtp、nLen、m_remote_addr、m_remote_data_port ) ) ) ) ) ) ) ) ) )。
发送到(软盘,
(const char * ) buf,nLen,0,) struct sockAddr * ) sockaddr,sizeof(structsockaddr_in );
8. Srtp_unprotect
a .决定检查的开始位置,从头开始
b .确定要解码的开始位置和结束位置,去除第一个字节的地址,然后在自动标记之前结束
检查部分
status=auth _ compute (stream-RTP _ auth,(uint8_t * ) est,4,tmp_tag );
write log (computedauthtag : % s )、octet _ string _ hex _ string (tmp _ tag,tag_len ) ); //tag_len=4
writelog(packetauthtag:%s ),octet_string_hex_string ) auth_tag,tag_len;
解码部分
writelog(Begindecrypt,enc_octet_len=%d ‘,enc_octet_len ); //160
写日志(‘ content=% s ‘,octet_string_hex_string ) enc_start,enc_octet_len );
if(enc_start ) {
status=cipher _ encrypt (stream-RTP _ cipher,
(uint8_t * ) enc_start,enc_octet_len );
写日志(‘ content=% s ‘,octet_string_hex_string ) enc_start,enc_octet_len );
是if (状态)
return err_status_cipher_fail;
}
9 .写日志
静态文件* err _ file=null;
语音写入程序(char * format,) )。
va_list args;
va_start(Args,格式);
if(err_file==null ) {
ERR_file=fopen(‘/srtp.log ‘,’ w ‘ );
}
if(err_file!=空) {
vfprintf(err_file,format,args );
fprintf(err_file,’\n ‘ );
}
}