是否可以将键保存到保留RAM而不是EEPROM,从而避免在非常简单的应用程序中需要EEPROM?是否有库函数来执行此操作?如果没有,涉及什么?
谢谢,汤姆
是的,但是当你重新启动芯片时你会失去它们,但我想你知道。最简单的方法是将它们存储在具有属性的变量中__属性_uuu((节(“保留\u mem\u area0”),零\u init)).您应该将它们存储为两对(rand_unb,ediv),(ltk,ltk_length))。可能还包括mac地址或irk在密钥中。有一个数组,您可以存储多对。
__属性_uuu((节(“保留\u mem\u area0”),零\u init))
流量如下:
当生成ltk时,将调用函数app send_ultk_uexch_ufunc。此函数调用生成随机密钥的应用程序\u sec_uGen_uLTK(注意,默认实现使用的伪数字生成器rand()仅使用32位种子。如果您想安全,应该使用新的trngapi)。密钥大小至少为7字节,最多16字节。此密钥存储在app_usec_uenv中,后者随后发送给主控程序。
它在功能app成对的func中,您应该将应用程序\u sec\u env.rand_nb、app sec\u env.ediv、app sec\u env.ltk和app sec\u env.key_size值存储到永久存储区(例如EEPROM或在您的保留ram中)。
然后,您需要使用param->rand_unb和param->ediv值在app validate\u encrypt\u req\u func中进行查找。如果在永久存储中找到匹配项,请将值写入应用程序\u sec\u env.rand_unb、app sec\u env.ediv、app sec\u env.ltk和app sec\u env.ltk_size,然后返回true。否则返回false。
请注意,如果在配对期间有人嗅到空中交通,配对机制的“公正工作”版本是不安全的,因为长期密钥是通过空中明文发送的(但仅在配对阶段),因此尽可能避免这种模式。
您还可以查看键盘参考源,在app kbd_uproj.c中,这些函数是如何实现的。您可能还想阅读注释“我们可能在从EDIV和RAND设置为零的未绑定主机获得LL\ENC\u REQ之后达到此点。如果出现MITM,则拒绝主机,因为没有配对被执行。“并且在应用程序中的代码\u pairated\u func中之后。
注意,默认情况下,最新密钥始终存储在应用程序\u sec\u env(保留ram中)中,而app validate\u encrypt\u req\u func默认情况下只返回true,因此如果仅连接到一个设备,则始终会加载正确的ltk。
看起来,人们可以用类似的调用来替换多键的eeprom调用来编写保留ram。是否有一个简单的实现,只允许一个键?
我想很多BLE应用程序需要键(心率、键盘、遥控器等)。必雷竞技安卓下载须添加EEPROM会有点挫败了使用内部OTP的简单性。如果我使用键盘应用程序作为示例和一个大的EEPROM,有没有任何原因我不能存储代码和键在它中,通过重新定位键到高内存?最好使用SPI flash并为键保留两页(如果需要mulibond,则允许从一个页面复制到另一页)。
据我所知,闪存和eeprom都不能映射到da14580上。因此,您需要使用驱动程序代码来编写或读取外部内存。otp是一次性可编程的,所以您不能在其中存储键。
如果我使用外部SPI闪存来存储代码(不使用OTP),有没有理由我也无法在那里存储键?我会保留一两页flash,修改多键代码。
嗨,特鲁塞尔,
您可以使用SPI将键存储在SPI闪存中。键盘应用程序使用EEPROM内存实现此功能。
谢谢你的对话
是的,但是当你重新启动芯片时你会失去它们,但我想你知道。
最简单的方法是将它们存储在具有属性的变量中
__属性_uuu((节(“保留\u mem\u area0”),零\u init))
.您应该将它们存储为两对(rand_unb,ediv),(ltk,ltk_length))。可能还包括mac地址或irk在密钥中。有一个数组,您可以存储多对。
流量如下:
当生成ltk时,将调用函数app send_ultk_uexch_ufunc。此函数调用生成随机密钥的应用程序\u sec_uGen_uLTK(注意,默认实现使用的伪数字生成器rand()仅使用32位种子。如果您想安全,应该使用新的trngapi)。密钥大小至少为7字节,最多16字节。此密钥存储在app_usec_uenv中,后者随后发送给主控程序。
它在功能app成对的func中,您应该将应用程序\u sec\u env.rand_nb、app sec\u env.ediv、app sec\u env.ltk和app sec\u env.key_size值存储到永久存储区(例如EEPROM或在您的保留ram中)。
然后,您需要使用param->rand_unb和param->ediv值在app validate\u encrypt\u req\u func中进行查找。如果在永久存储中找到匹配项,请将值写入应用程序\u sec\u env.rand_unb、app sec\u env.ediv、app sec\u env.ltk和app sec\u env.ltk_size,然后返回true。否则返回false。
请注意,如果在配对期间有人嗅到空中交通,配对机制的“公正工作”版本是不安全的,因为长期密钥是通过空中明文发送的(但仅在配对阶段),因此尽可能避免这种模式。
您还可以查看键盘参考源,在app kbd_uproj.c中,这些函数是如何实现的。您可能还想阅读注释“我们可能在从EDIV和RAND设置为零的未绑定主机获得LL\ENC\u REQ之后达到此点。如果出现MITM,则拒绝主机,因为没有配对被执行。“并且在应用程序中的代码\u pairated\u func中之后。
注意,默认情况下,最新密钥始终存储在应用程序\u sec\u env(保留ram中)中,而app validate\u encrypt\u req\u func默认情况下只返回true,因此如果仅连接到一个设备,则始终会加载正确的ltk。
看起来,人们可以用类似的调用来替换多键的eeprom调用来编写保留ram。是否有一个简单的实现,只允许一个键?
我想很多BLE应用程序需要键(心率、键盘、遥控器等)。必雷竞技安卓下载须添加EEPROM会有点挫败了使用内部OTP的简单性。如果我使用键盘应用程序作为示例和一个大的EEPROM,有没有任何原因我不能存储代码和键在它中,通过重新定位键到高内存?最好使用SPI flash并为键保留两页(如果需要mulibond,则允许从一个页面复制到另一页)。
谢谢,
汤姆
据我所知,闪存和eeprom都不能映射到da14580上。因此,您需要使用驱动程序代码来编写或读取外部内存。otp是一次性可编程的,所以您不能在其中存储键。
如果我使用外部SPI闪存来存储代码(不使用OTP),有没有理由我也无法在那里存储键?我会保留一两页flash,修改多键代码。
嗨,特鲁塞尔,
您可以使用SPI将键存储在SPI闪存中。键盘应用程序使用EEPROM内存实现此功能。
谢谢你的对话