是否可以将键合键保存到保留RAM而不是EEPROM,从而避免在非常简单的应用中需要EEPROM?是否有库函数来执行此操作?如果没有,涉及到什么?
谢谢,汤姆
是的,但是当你重新启动芯片的时候你会失去它们,但是我想你已经意识到了。最简单的方法是将它们存储在带有属性的变量中__属性_uuuuuu((节(“retention\u mem\u area0”),zero\u init)).您应该将它们存储为成对的((rand\u nb,ediv),(ltk,ltk\u length))。也可以在密钥中包含mac地址或irk。有一个可以存储多对的数组。
__属性_uuuuuu((节(“retention\u mem\u area0”),zero\u init))
流程如下:
应生成ltk时,将调用函数app\u send\u ltk\u exch\u func。此函数调用app\u sec\u gen\u ltk,它生成一个随机密钥。(请注意,默认实现使用仅使用32位种子的伪数生成器rand()。如果您希望安全,应该改用新的trngapi)。密钥大小至少为7字节,最多为16字节。此密钥存储在app_sec_env中,稍后会发送给主机。
在函数app\u paired\u func中,您应该存储app\u sec_环境随机数,应用程序秒_环境ediv,应用程序秒_环境有限公司和应用程序秒_环境密钥大小永久存储的值(例如EEPROM或在您的情况下是retention ram)。
然后需要使用param->rand\u nb和param->ediv值在app\u validate\u encrypt\u req\u func中进行查找。如果在永久存储中找到匹配项,请将值写入app\u sec_环境随机数,应用程序秒_环境ediv,应用程序秒_环境有限公司和应用程序秒_环境有限公司大小,并返回true。否则返回false。
请注意,“just works”版本的配对机制是不安全的,如果在配对过程中有人嗅到空中通信,因为长期密钥是以明文形式通过空中发送的(但仅在配对阶段),因此尽可能避免该模式。
您还可以在app\u kbd\u proj.c中查看键盘参考源,了解这些函数是如何实现的。您可能还想阅读注释“我们可能在从EDIV和RAND设置为零的未绑定主机获得LL ENC请求之后到达这一点。如果是MITM,则拒绝主机,因为没有执行配对。”并且在应用程序\u paired \u func之后的代码。
请注意,默认情况下,最新密钥始终存储在app_sec_env(位于保留ram中)中,而app_validate_encrypt_req_func默认情况下仅返回true,因此如果您仅连接到一个设备,则始终会加载正确的ltk。
看起来可以用写保留ram的类似调用来代替multibond中的eeprom调用。有没有一个更简单的实现,只允许一个单一的债券?
我认为许多BLE应用程序需要连接(心率、键盘、遥控器等)亚博国际官网平台网址。必须添加一个EEPROM在某种程度上破坏了使用内部OTP的简单性。如果我使用键盘应用程序作为一个例子和一个大的EEPROM,有没有任何理由我不能存储代码和钥匙,通过重新定位的钥匙高内存?最好使用spiflash并为键保留两页(如果需要mulibond,允许从一页复制到另一页)。
据我所知,flash和eeprom都不能映射到da14580上。所以您需要使用驱动程序代码来编写或读取外部内存。otp是一次性可编程的,所以不能在其中存储键合键。
如果我使用外部SPI flash来存储代码(不使用OTP),有没有什么理由我不能同时在那里存储键呢?我会保留一页或两页的flash和修改多键代码。
嗨,拉塞尔,
您可以使用SPI将键合键存储在SPI闪存中。键盘应用程序通过EEPROM存储器实现这一点。
谢谢你的对话
是的,但是当你重新启动芯片的时候你会失去它们,但是我想你已经意识到了。
最简单的方法是将它们存储在带有属性的变量中
__属性_uuuuuu((节(“retention\u mem\u area0”),zero\u init))
.您应该将它们存储为成对的((rand\u nb,ediv),(ltk,ltk\u length))。也可以在密钥中包含mac地址或irk。有一个可以存储多对的数组。
流程如下:
应生成ltk时,将调用函数app\u send\u ltk\u exch\u func。此函数调用app\u sec\u gen\u ltk,它生成一个随机密钥。(请注意,默认实现使用仅使用32位种子的伪数生成器rand()。如果您希望安全,应该改用新的trngapi)。密钥大小至少为7字节,最多为16字节。此密钥存储在app_sec_env中,稍后会发送给主机。
在函数app\u paired\u func中,您应该存储app\u sec_环境随机数,应用程序秒_环境ediv,应用程序秒_环境有限公司和应用程序秒_环境密钥大小永久存储的值(例如EEPROM或在您的情况下是retention ram)。
然后需要使用param->rand\u nb和param->ediv值在app\u validate\u encrypt\u req\u func中进行查找。如果在永久存储中找到匹配项,请将值写入app\u sec_环境随机数,应用程序秒_环境ediv,应用程序秒_环境有限公司和应用程序秒_环境有限公司大小,并返回true。否则返回false。
请注意,“just works”版本的配对机制是不安全的,如果在配对过程中有人嗅到空中通信,因为长期密钥是以明文形式通过空中发送的(但仅在配对阶段),因此尽可能避免该模式。
您还可以在app\u kbd\u proj.c中查看键盘参考源,了解这些函数是如何实现的。您可能还想阅读注释“我们可能在从EDIV和RAND设置为零的未绑定主机获得LL ENC请求之后到达这一点。如果是MITM,则拒绝主机,因为没有执行配对。”并且在应用程序\u paired \u func之后的代码。
请注意,默认情况下,最新密钥始终存储在app_sec_env(位于保留ram中)中,而app_validate_encrypt_req_func默认情况下仅返回true,因此如果您仅连接到一个设备,则始终会加载正确的ltk。
看起来可以用写保留ram的类似调用来代替multibond中的eeprom调用。有没有一个更简单的实现,只允许一个单一的债券?
我认为许多BLE应用程序需要连接(心率、键盘、遥控器等)亚博国际官网平台网址。必须添加一个EEPROM在某种程度上破坏了使用内部OTP的简单性。如果我使用键盘应用程序作为一个例子和一个大的EEPROM,有没有任何理由我不能存储代码和钥匙,通过重新定位的钥匙高内存?最好使用spiflash并为键保留两页(如果需要mulibond,允许从一页复制到另一页)。
谢谢,
汤姆
据我所知,flash和eeprom都不能映射到da14580上。所以您需要使用驱动程序代码来编写或读取外部内存。otp是一次性可编程的,所以不能在其中存储键合键。
如果我使用外部SPI flash来存储代码(不使用OTP),有没有什么理由我不能同时在那里存储键呢?我会保留一页或两页的flash和修改多键代码。
嗨,拉塞尔,
您可以使用SPI将键合键存储在SPI闪存中。键盘应用程序通过EEPROM存储器实现这一点。
谢谢你的对话