• 正文
  • 相关推荐
申请入驻 产业图谱

手把手教你:泰凌微 TLSR8258 C 代码实现BLE RPA私有地址 Hash校验

06/11 11:24
190
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

前一篇文章“手把手教你:通过AES128解析私有地址”,是通过python代码来进行hash的验证,本篇会通过c代码来进行hash的验证。

二、阅读说明

1、泰凌微芯片学习者,前期使用过该芯片。

2、能够知道怎么进行创建工程,下载代码。

3、有一块开发板,板上的芯片可以是8251,8253或者8258。

4、需使用蓝牙抓包工具52840 Sniffer和协议分析软件Wireshark

三、正文

1、使用的SDK

使用的sdk和demo为该篇文章描述的“手把手教你:将广播的公共地址更改为可解析的私有地址”,微信公众号文章链接为:如何使用TLSR8258芯片进行蓝牙广播

2、定义相关变量

unsigned char my_local_Irk[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};unsigned char my_prand[3] = {0x00, 0x00, 0x00};unsigned char local_hash[3] = {0x00, 0x00, 0x00};

my_local_Irk:定义数组用来存储生成的临时irk(身份解析密钥)

my_prand;定义数组用来存储mac地址的高3位

local_hash:定义数组用来存储计算出来的hash值

3、编写计算hash的函数

void cal_local_hash(u8 *prand, u8 *irk, u8 *hash){    unsigned char data[16];    memset(data, 0, 16);    data[13] = prand[0];    data[14] = prand[1];    data[15] = prand[2];    aes_encrypt(irk, data, hash);}

该函数需要传入prand,irk,之后会通过aes128来进行加密计算出得到hash值。

该函数的三个参数都是16字节的,其中irk是秘钥,data是需要加密的数据,可以看到data的最后三个字节是prand的值,请注意这种写法是强制性的,见蓝牙协议文件,如下文件描述,最后的参数是计算出来的hash值,该值也是16字节的,有效的字节在最后的三字节。

4、编写交换高低字节的函数

void copy_tmp_local_irk_to_my_local_Irk(const u8 *tmp_local_irk, u8 *local_irk){    int i;    for(i = 0; i < 16; i++){        local_irk[i] = tmp_local_irk[15 - i];    }}

因为我们从代码中得到的irk是反向的,所以这里需要将该值反向且赋值给local_irk。

5、打印相关参数

void print_para(void){    static unsigned int time_cnt = 0;    static unsigned char first_enter = 0;    unsigned char data[16];    if((first_enter == 0) && (blc_ll_getCurrentState() == BLS_LINK_STATE_CONN)){        first_enter = 1;        time_cnt = clock_time();    }    if((first_enter == 1) && clock_time_exceed(time_cnt, 2000000)){        first_enter = 2;        time_cnt = clock_time();        cal_local_hash(my_prand, my_local_Irk, data);        memcpy(local_hash, &data[13], 3);        tlkapi_send_string_data(APP_LOG_EN,"my_prand",my_prand, 3);        tlkapi_send_string_data(APP_LOG_EN,"my_local_Irk",my_local_Irk, 16);        tlkapi_send_string_data(APP_LOG_EN,"localHash",local_hash, 3);    }    if(blc_ll_getCurrentState() != BLS_LINK_STATE_CONN)    {        first_enter = 0;    }}

该函数的作用在连接完成2s之后,打印出my_prand,my_local_Irk,local_hash。

6、在controller_event_callback()中给my_prand赋值

my_prand[0] = pEvt->localRslvPrivAddr[5];my_prand[1] = pEvt->localRslvPrivAddr[4];my_prand[2] = pEvt->localRslvPrivAddr[3];

该代码的作用为将可解析地址的高三位赋值给my_prand,蓝牙协议描述如下:

备注:可解析私有地址只有在连接后才能得到,在广播的情况下理论上也是能得到的,不过泰凌的SDK中没有给出相应的api进行调用,但在广播中得到可解析的私有地址也确实没什么作用。

7、在app_configAdvParam函数中,增加如下函数

copy_tmp_local_irk_to_my_local_Irk(tmp_local_irk, my_local_Irk);

注意该函数我放在了第一次广播私有地址中,如果读者已经和当前的设备进行配对绑定了,则当前的广播流程是不会走到这里的,会直接走绑定那边的广播流程,所以本次的程序不考虑绑定后的情况,如果读者进行了绑定,则程序需要擦除后,再进行测试,绑定的广播流程如下图所示。

8、将打印函数放入主循环里面

9、用nRf Connect软件搜索“feature”的广播包,然后进行连接

广播mac地址为41:5B:F9:66:08:E5

如上图所示,点击connect进行连接,注意第一次连接会弹出配对的对话框,大家点击确认就好了

10、串口输出

如上图所示,可以看到计算得到hash值为 66 08 e5,和广播的低3位是一样的,并且和打印出来的localRpa中的数字也是一样的。

五、结尾

本篇结合C代码,讲解了如何计算可解析私有地址(RPA)的hash值,下一篇将将讲解下如何提高蓝牙的传输效率。

另外我开了一个手写广播设备的合集,该合集的内容为不依赖商业的蓝牙协议栈,里面的内容主要是结合蓝牙协议文件,分析一个完整的广播数据帧结构,然后通过编写底层代码(不依赖泰凌微蓝牙协议栈),来实现自己的广播设备,之后会结合蓝牙广播要求对代码进行优化,做到可以三通道发送。

泰凌微电子

泰凌微电子

泰凌微电子(上海)股份有限公司成立于2010年6月,是一家专业的集成电路设计企业, 主要从事无线物联网系统级芯片的研发、设计及销售,专注于无线物联网芯片领域的前沿技术开发与突破。 通过多年的持续攻关和研发积累,已成为全球该细分领域产品种类最为齐全的代表性企业之一。

泰凌微电子(上海)股份有限公司成立于2010年6月,是一家专业的集成电路设计企业, 主要从事无线物联网系统级芯片的研发、设计及销售,专注于无线物联网芯片领域的前沿技术开发与突破。 通过多年的持续攻关和研发积累,已成为全球该细分领域产品种类最为齐全的代表性企业之一。收起

查看更多

相关推荐