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 ‘ );

}

}