SRTP交叉编译与移植

1 SRTP源码下载

源码下载在github采用的库为libsrtp2.5.0:

weget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz

2 SRTP交叉编译

新增交叉编译脚本,这里需要支持openssl。

./configure --host=arm-linux-androideabi --prefix=$(pwd)/object --enable-openssl crypto_LIBS="-L$(pwd)/../../third_party/openssl-1.1.0h/lib" crypto_CFLAGS="-I$(pwd)/../../third_party/openssl-1.1.0h/include" && make && make install

下面是交叉编译过程

tar -xvf libsrtp-2.5.0.tar.gz
cd libsrtp-2.5.0
touch config_android.sh
./config_android.sh
./

成果物主要包括头文件和静态库:
在这里插入图片描述

3 SRTP移植

3.1 API封装设计

API设计采用handle的实现方式,init只需要进程初始化一次。srtp_app_alloc需要每次会话创建都进行一次初始化,需要传入srtp秘钥。protect和unprotect是实时进行加解密操作。

//srtp handle
typedef struct srtp_handle_t{int (*protect)(void *pthis, void *rtp, size_t *pkt_octet_len);int (*unprotect)(void *pthis, void *audio_dat, size_t *pkt_octet_len);void* priv;
}srtp_handle_t;#ifdef __cplusplus
extern "C" {
#endif
// 初始化
int srtp_app_init();
void srtp_app_denit();
//会话创建
int srtp_app_alloc(srtp_handle_t **pthis, const char *srtp_dec, const char *srtp_enc);
void srtp_app_free(srtp_handle_t *pthis);

3.2 初始化实现

初始化和反初始化,只需要在开启进程初始化一次。

int srtp_app_init()
{int ret = srtp_init();if(ret < 0)return -1;return 0;
}void srtp_app_denit()
{srtp_shutdown();
}

3.3 会话创建实现

会话创建和销毁,需要每次建立会话都要重新创建,每次的秘钥都需要采用协商的加密和解密秘钥。

static int srtp_app_set_crypto_suites(int profile, srtp_crypto_policy_t *rtp)
{if(rtp == NULL){return -1;}switch (profile){case rl_srtp_profile_aes128_cm_sha1_32:{srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32(rtp);rl_log_debug("loc srtp_profile_aes128_cm_sha1_32");break;}case rl_srtp_profile_aes128_cm_sha1_80:{srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(rtp);rl_log_debug("loc srtp_profile_aes128_cm_sha1_80");break;}case rl_srtp_profile_aes256_cm_sha1_32:{srtp_crypto_policy_set_aes_cm_256_hmac_sha1_32(rtp);rl_log_debug("loc srtp_profile_aes256_cm_sha1_32");break;}			case rl_srtp_profile_aes256_cm_sha1_80:{srtp_crypto_policy_set_aes_cm_256_hmac_sha1_80(rtp);rl_log_debug("loc srtp_profile_aes256_cm_sha1_80");break;}default:{rl_log_debug("loc policy none");break;}}return 0;}static int srtp_app_start(void *pthis, const char *srtp_dec, const char *strp_enc)
{rl_log_debug("SRTP start");srtp_config_t srtp_config_loc;srtp_config_t srtp_config_dist;srtp_handle_t *p = (srtp_handle_t *)pthis;if((!pthis || !srtp_dec || !strp_enc || strlen(srtp_dec) == 0 || strlen(strp_enc) == 0))return -1;srtp_handle_priv_t* priv = p->priv;if (!priv)return -1;	int ret = srtp_parse_config(strp_enc, &srtp_config_loc);if ( ret < 0 ){return ret;}ret = srtp_parse_config(srtp_dec, &srtp_config_dist);if ( ret < 0 ){return ret;}priv->srtp_opt = 1;	memcpy(priv->srtp_params.key_loc, srtp_config_loc.key, 30);memcpy(priv->srtp_params.key_dist, srtp_config_dist.key, 30);srtp_app_set_crypto_suites(srtp_config_loc.profile, &priv->srtp_params.policy_loc.rtp);priv->srtp_params.policy_loc.key = priv->srtp_params.key_loc;priv->srtp_params.policy_loc.next = NULL;srtp_app_set_crypto_suites(srtp_config_dist.profile, &priv->srtp_params.policy_dist.rtp);priv->srtp_params.policy_dist.ssrc.type = ssrc_any_inbound;priv->srtp_params.policy_dist.key = priv->srtp_params.key_dist;priv->srtp_params.policy_dist.next = NULL;rl_log_debug("srtp_create ret=%i", srtp_create(&priv->srtp_params.scall_session, &priv->srtp_params.policy_dist));return 0;
}static void srtp_app_stop(void *pthis)
{srtp_handle_t *p = (srtp_handle_t *)pthis;if(!pthis)return;srtp_handle_priv_t* priv = p->priv;if (!priv)return;rl_log_debug("SRTP stop\n");if (priv->srtp_opt > 0){priv->srtp_opt = 0;priv->srtp_params.prev_ssrc = 0;rl_memset(priv->srtp_params.key_loc, 0, sizeof(priv->srtp_params.key_loc));rl_memset(priv->srtp_params.key_dist, 0, sizeof(priv->srtp_params.key_dist));rl_log_debug("srtp_dealloc ret=%i", srtp_dealloc(priv->srtp_params.scall_session)); }
}int srtp_app_alloc(srtp_handle_t **pthis, const char *srtp_dec, const char *srtp_enc)
{if(!pthis)return -1;srtp_handle_t* p = (srtp_handle_t*)malloc(sizeof(srtp_handle_t));if (p == NULL){rl_log_err("[%s-%d] malloc failed.",__FUNCTION__, __LINE__);return -1;}memset(p, 0, sizeof(srtp_handle_t));p->protect = srtp_app_protect;p->unprotect = srtp_app_unprotect;p->priv = (srtp_handle_priv_t *)malloc(sizeof(srtp_handle_priv_t));if(!p->priv){free(p);return -1;}memset(p->priv , 0, sizeof(srtp_handle_priv_t));int ret = srtp_app_start(p, srtp_dec, srtp_enc);if (ret != 0){srtp_app_free(p);return -1;}*pthis = p;return 0;}void srtp_app_free(srtp_handle_t *pthis)
{if(!pthis)return;srtp_app_stop(pthis);if (pthis->priv){free(pthis->priv);pthis->priv = NULL;}free(pthis);}

3.4 加解密实现

加密和解密只需要传入rtp封装后的数据和长度即可进行加解密操作,操作后数据是直接替换原数据的。

static int srtp_app_protect(void *pthis, void *rtp, size_t *pkt_octet_len)
{	if(!pthis || !rtp || !pkt_octet_len)return -1;int ret = 0;unsigned int current_ssrc;srtp_handle_t *p = (srtp_handle_t *)pthis;srtp_handle_priv_t* priv = p->priv;if (!priv)return -1;srtp_t session = priv->srtp_params.scall_session;if(priv->srtp_opt){		current_ssrc = *((unsigned int *)((char *)rtp + 8));current_ssrc = htonl(current_ssrc);if(priv->srtp_params.prev_ssrc != current_ssrc) {if (priv->srtp_params.prev_ssrc > 0 ){srtp_app_remove_stream(priv->srtp_params.scall_session, priv->srtp_params.prev_ssrc);}priv->srtp_params.policy_loc.ssrc.type = ssrc_specific;priv->srtp_params.policy_loc.ssrc.value = current_ssrc;rl_log_debug("new ssrc 0x%x, %u", current_ssrc,current_ssrc);srtp_app_add_stream(priv->srtp_params.scall_session, &priv->srtp_params.policy_loc);priv->srtp_params.prev_ssrc = current_ssrc;}ret = srtp_protect(priv->srtp_params.scall_session, rtp, (int *)pkt_octet_len);if(ret > 0){rl_log_err("--srtp_protect problem ret=%i", ret);return -1;}}return 0;
}static int srtp_app_unprotect(void *pthis, void *audio_dat, size_t *pkt_octet_len)
{if(!pthis || !audio_dat || !pkt_octet_len)return -1;int ret = 0;srtp_handle_t *p = (srtp_handle_t *)pthis;srtp_handle_priv_t* priv = p->priv;if (!priv)return -1;srtp_t session = priv->srtp_params.scall_session;if(priv->srtp_opt){ret = srtp_unprotect(priv->srtp_params.scall_session, audio_dat, (int *)pkt_octet_len);if(ret > 0){/* If the decryption fail then d'nt give this packet to DSP throw the packets */rl_log_err("rtp_SRtpPlRecv srtp unencryption problems ret=%i", ret);return -1;}}return 0;
}

4 SRTP抓包分析

SRTP加密后可以通过wareshark抓包看到协议部分是显示SRTP,具体如下图所示。
在这里插入图片描述
其实wareshark是通过sip协商RTP/SAVP来显示srtp的标识,所以SDP协商一定要正确。在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/149551.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】_构造HTTP请求与HTTPS

目录 1. 构造HTTP请求 1.1 form标签构造HTTP请求 1.1.1 form标签构造GET请求 1.1.2 form标签构造POST请求 1.2 通过ajax构造HTTP请求 1.3 form与ajax 1.4 使用ajax构造HTTP请求 2.HTTPS 2.1 对称加密 2.2 非对称加密 2.3 证书 1. 构造HTTP请求 1.1 form标签构造HTT…

【Luckfox pico入门记录(一)】开发环境与工具链

写在前面 最近刷bilibili发现微雪电子关于luckyfox pico的介绍视频&#xff0c;感叹linux开发板居然可以把价格缩到100RMB以内&#xff0c;也正巧结束了复旦微比赛&#xff0c;受够了FM33LC046N的低性能&#xff0c;来玩点便宜又高性能的板子。   开发板型号&#xff1a;luck…

起号1个月后,我分析了一些AI数字人项目的红利期和优缺点

本期是赤辰第33期AI项目教程&#xff0c;底部准备了9月粉丝福利&#xff0c;可以免费领取。hi&#xff0c;同学们&#xff0c;AI的应用在各场景都已经呈井喷态势&#xff0c;好比就连近期的杭州亚运会开幕式都采用了数字人火炬手&#xff0c;AI技术的发展不断刷新着我们的脑洞上…

一文搞懂时间序列ARIMA模型

文章目录 1 ARIMA的定义2 差分(differencing)2.1 Order&#xff1a;差分的阶数2.2 Lag&#xff1a;差分的滞后2.3 滞后运算/滞后算子/延迟算子2.4 关于差分的两个误解 3 ARIMA的平稳性4 ACF与PACF5 时序模型的选择与评估5.1 超参数p、q、d的确定5.2 时间序列的评估指标 1 ARIMA…

前几周的阅读的论文(截图版)

目录 显著性检测DMTSCWSSODGCoNet RSI与SOD结合ACCoNetGLGCNet RSI结合分割CADA_MaskFormerSeMask-Mask2Formershunted-MaskFormer 显著性检测 DMT CVPR 2023 SCWSSOD AAAI 2021 GCoNet SCI1区 2023 RSI与SOD结合 ACCoNet SCI1区 2023 GLGCNet SCI1区 2023 …

总结三:计算机网络面经

文章目录 1、简述静态路由和动态路由&#xff1f;2、说说有哪些路由协议&#xff0c;都是如何更新的&#xff1f;3、简述域名解析过程&#xff0c;本机如何干预域名解析&#xff1f;4、简述 DNS 查询服务器的基本流程是什么&#xff1f;DNS 劫持是什么&#xff1f;5、简述网关的…

专业图像处理软件DxO PhotoLab 7 mac中文特点和功能

DxO PhotoLab 7 mac是一款专业的图像处理软件&#xff0c;它为摄影师和摄影爱好者提供了强大而全面的照片处理和编辑功能。 DxO PhotoLab 7 mac软件特点和功能 强大的RAW和JPEG格式处理能力&#xff1a;DxO PhotoLab 7可以处理来自各种相机的RAW格式图像&#xff0c;包括佳能、…

Linuxzhi6通过源代码编译安装软件

目录 一、使用源代码安装软件的优点 二、编译需求 三、安装 一、使用源代码安装软件的优点 由于自由软件的最新版本大都以源码的形式最先发布&#xff0c;编译安装可以获得软件的最新版本&#xff0c;及时修 复bug 如果当前安装的程序无法满足需求&#xff0c;用户可以根据…

国庆作业 day 2

select实现服务器并发 #include<myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.0.103" //本…

UGUI交互组件Toggle

一.Toggle对象的构造 Toggle和Button类似&#xff0c;是交互组件的一种 如果所示&#xff0c;通过菜单创建了两个Toggle&#xff0c;Toggle2中更换了背景和标记资源 对象说明Toggle含有Toggle组件的对象Background开关背景Checkmark开关选中标记Label名称文本 二.Toggle组件属…

基于SSM的在线电影评价系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

中断:ZYNQ

整个中断系统架构中&#xff0c;只包含以下三种中断&#xff1a;  软件生成中断(Software Generated Interrupts&#xff0c;SGI)  私有外设中断(Private Peripheral Interrupts&#xff0c;PPI)  共享外设中断(Shared Peripheral Interrupts&#xff0c;SPI) 每种中断…

vue-img-cutter 实现图片裁剪[vue 组件库]

借助 vue-img-cutter 可以在网页端实现图片裁剪功能&#xff0c;最终功能效果如下&#xff1a; 组件 npm 安装 npm install vue-img-cutter2 --save-dev # for vue2 npm install vue-img-cutter3 --save-dev # for vue3vue-img-cutter使用 template模板标签模块&#xff0c…

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1&#xff1a;什么叫作用域 一&#xff1a;全局作用域 1&#xff1a;全局变量的声明 2&#xff1a;变量声明和使用的顺序 3&#xff1a;方法声明和使用的顺序 前言 1&#xff1a;什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出&#xff1b; win32 api的声明如下&#xff1b; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…

论文笔记:TMN: Trajectory Matching Networks for PredictingSimilarity

2022 ICDE 1 intro 1.1 背景 轨迹相似度可以划分为&#xff1a; 非学习度量方法 通常是为一两个特定的轨迹距离度量设计的&#xff0c;因此不能与其他度量一起使用通常需要二次时间&#xff08;O(n^2)&#xff09;来计算轨迹之间的精确距离基于学习的度量方法 利用机器学习…

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…

Python(八十八)函数的参数传递

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)

本章大致内容目录&#xff1a; 1.认识回调函数 2.排序函数qsort 3.模拟实现qsort 回调函数为C语言重要知识点&#xff0c;以函数指针为主要知识&#xff1b;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。 一、回调函数 1.回调函数定义 回调函数就是一…

华为MateBook13 2021款(WRTD-WFE9)原装出厂Win10系统工厂模式安装包(含F10智能还原)

下载链接&#xff1a;https://pan.baidu.com/s/1yL7jFbklrln0UqWqxQ7fcw?pwd9nm1 系统自带一键智能还原功能、带有指纹、声卡、显卡、网卡等所有驱动、出厂主题壁纸、系统属性华为专属LOGO标志、Office办公软件、华为电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U…