是否有可能保存键以保留RAM而不是EEPROM,从而避免在一个非常简单的应用程序中需要EEPROM ?有这样的库函数吗?如果不是,涉及什么?
谢谢,汤姆
是的,但重启芯片后就会丢失,但我猜你已经知道了。最简单的方法是将它们存储在带有属性的变量中__attribute__((部分(“retention_mem_area0”),zero_init)).您应该将它们存储为((rand_nb, ediv), (ltk, ltk_length))对。也许还包括mac地址或irk在键。有一个可以存储多个对的数组。
__attribute__((部分(“retention_mem_area0”),zero_init))
流程如下:
当生成ltk时,将调用函数app_send_ltk_exch_func。这个函数调用app_sec_gen_ltk,它生成一个随机密钥。(注意,默认实现使用只使用32位种子的伪数字生成器rand()。如果希望安全,则应该使用新的trng api)。密钥大小至少为7字节,最多为16字节。此密钥存储在app_sec_env中,稍后将其发送给主服务器。
你应该在app_paired_func函数中存储app_sec_env。rand_nb app_sec_env。ediv app_sec_env。ltk app_sec_env。将key_size值存储到永久存储中(例如EEPROM或在case retention ram中)。
然后,您需要使用值param->rand_nb和param->ediv在app_validate_encrypt_req_func中进行查找。如果在永久存储中找到匹配,则将值写入app_sec_env。rand_nb app_sec_env。ediv app_sec_env。ltk app_sec_env。Ltk_size,并返回true。否则返回假。
请注意,“just works”版本的配对机制是不安全的,如果有人在配对过程中嗅探到空中交通,因为长期密钥是明文通过空中发送(但仅在配对阶段),所以尽量避免这种模式。
您还可以查看键盘参考源,在app_kbd_project .c中查看这些函数是如何实现的。您可能还想阅读下面的注释:“我们可能在从一个未绑定的主机获得一个LL_ENC_REQ,并将EDIV和RAND设置为0之后到达这一点。”Reject the Host in case of MITM since no Pairing has been performed ."和app_paired_func后面的代码。
注意,在默认情况下,最新的密钥总是存储在app_sec_env(在保留ram中)中,而app_validate_encrypt_req_func默认情况下只返回true,因此如果您只连接到一个设备,则总是加载正确的ltk。
看起来可以用写保留ram的类似调用来替代多bond中的eeprom调用。有没有更简单的实现,只允许一个单独的bond?
我认为许多BLE应用需要绑定(心率、键盘、遥控器等)。雷竞技安卓下载必须添加EEPROM在某种程度上破坏了使用内部OTP的简单性。如果我使用键盘应用程序作为一个例子和一个大的EEPROM,有什么原因我不能在它存储代码和键通过重定位键到高内存?最好使用SPI flash并保留两个页面作为键值(如果需要multibond的话,允许从一个页面复制到另一个页面)。
据我所知,flash和eeprom都不能被映射到da14580上。因此,您需要使用驱动程序代码来读写外部内存。otp是一次性可编程的,所以你不能在里面存储键。
如果我使用外部SPI flash存储代码(不使用OTP),有任何原因,我将不能也存储键?我会保留一页或两页的flash,并修改多键代码。
嗨tcrussell,
您可以使用SPI来在SPI flash中存储bonding键。键盘应用程序通过一个EEPROM内存实现了这一点。
由于MT_dialog
是的,但重启芯片后就会丢失,但我猜你已经知道了。
最简单的方法是将它们存储在带有属性的变量中
__attribute__((部分(“retention_mem_area0”),zero_init))
.您应该将它们存储为((rand_nb, ediv), (ltk, ltk_length))对。也许还包括mac地址或irk在键。有一个可以存储多个对的数组。
流程如下:
当生成ltk时,将调用函数app_send_ltk_exch_func。这个函数调用app_sec_gen_ltk,它生成一个随机密钥。(注意,默认实现使用只使用32位种子的伪数字生成器rand()。如果希望安全,则应该使用新的trng api)。密钥大小至少为7字节,最多为16字节。此密钥存储在app_sec_env中,稍后将其发送给主服务器。
你应该在app_paired_func函数中存储app_sec_env。rand_nb app_sec_env。ediv app_sec_env。ltk app_sec_env。将key_size值存储到永久存储中(例如EEPROM或在case retention ram中)。
然后,您需要使用值param->rand_nb和param->ediv在app_validate_encrypt_req_func中进行查找。如果在永久存储中找到匹配,则将值写入app_sec_env。rand_nb app_sec_env。ediv app_sec_env。ltk app_sec_env。Ltk_size,并返回true。否则返回假。
请注意,“just works”版本的配对机制是不安全的,如果有人在配对过程中嗅探到空中交通,因为长期密钥是明文通过空中发送(但仅在配对阶段),所以尽量避免这种模式。
您还可以查看键盘参考源,在app_kbd_project .c中查看这些函数是如何实现的。您可能还想阅读下面的注释:“我们可能在从一个未绑定的主机获得一个LL_ENC_REQ,并将EDIV和RAND设置为0之后到达这一点。”Reject the Host in case of MITM since no Pairing has been performed ."和app_paired_func后面的代码。
注意,在默认情况下,最新的密钥总是存储在app_sec_env(在保留ram中)中,而app_validate_encrypt_req_func默认情况下只返回true,因此如果您只连接到一个设备,则总是加载正确的ltk。
看起来可以用写保留ram的类似调用来替代多bond中的eeprom调用。有没有更简单的实现,只允许一个单独的bond?
我认为许多BLE应用需要绑定(心率、键盘、遥控器等)。雷竞技安卓下载必须添加EEPROM在某种程度上破坏了使用内部OTP的简单性。如果我使用键盘应用程序作为一个例子和一个大的EEPROM,有什么原因我不能在它存储代码和键通过重定位键到高内存?最好使用SPI flash并保留两个页面作为键值(如果需要multibond的话,允许从一个页面复制到另一个页面)。
谢谢,
汤姆
据我所知,flash和eeprom都不能被映射到da14580上。因此,您需要使用驱动程序代码来读写外部内存。otp是一次性可编程的,所以你不能在里面存储键。
如果我使用外部SPI flash存储代码(不使用OTP),有任何原因,我将不能也存储键?我会保留一页或两页的flash,并修改多键代码。
嗨tcrussell,
您可以使用SPI来在SPI flash中存储bonding键。键盘应用程序通过一个EEPROM内存实现了这一点。
由于MT_dialog