因为每一个Bit都有其特殊含义,理解起来非常困难,有一个Bit配置不对,都有可能导致508A不work,而且此时芯片Lock住也不能改了(囧),所以单开篇博客详细解析一下下~~
Ps.: 其实两年前就想着重写这一块,但苦于公司Security的保密Policy没有发布,但现在我重新删减整理了下(本文都是测试用数据哦),针对典型应用作为案例,希望让大家更好理解508A的配置使用。
开过过程中, 因为16个Slot/KeyConfig每一个Bit去配置,再去计算相应的数据太麻烦,所以我做了一个小Excel Tools,里面集合了整个508A的数据区解释/配置…
在配置数据时,只需判断某Bit是否使能,在Tools中通过SlotConfig/KeyConfig Generator置位该Bit,就自动算出代码中所用的Config数据,嗯,用过的都说好~。
Tools 中的SlotConfig Generator(所有数据均为写博客用的测试Demo)
KeyConfig Generator
Tools全览
Tools获取:
需要的话还是留言邮箱吧,虽然里面删减后只剩测试数据,但还是涉及Secret,不敢Publish(Secrurity政策猛于虎 哎)
SlotConfig配置DataZone中每一个Slot所存储的数据、以及相应的权限,里面详细的设定了每一个Slot需要存储哪一种Secret、是否支持加密读写、数据是否具有可读可写权限等。
根据Datasheet,每个Slot都有16Bit的功能选项去选择,最后生成的ConfigData在Provisioning中写入508A,然后在程序里将ConfigZone Lock完成配置。(SlotConfig数据是在ConfigZone的第20-51Byte)
SlotConfig中某些功能之间还会相互影响,以下针对每一个Bit详细讲解:
注意只有DataZone Lock后这些配置才会生效。、
ReadKey(0-3Bit),是配置该Slot存储数据的可读权限,实际就是配置的508A Read命令在该Slot的执行权限,0-3BIt全配置为0,则读该Slot没有任何限制
如果该Slot配置为存储私钥PriKey,则默认永远不可读,这种case下配置ReadKey各Bit的含义如下:
该Slot存储的数据实际是否可读与IsSecret和EncryptedRead的设置都非常相关。。。并且如果设置Slot存储的是ECC 私钥Private keys,则该Slot是永远不能被读取的。
每个Bit相应的功能在Tools中也已经加了Comments:
Bit4:使能禁用Mac命令,1则针对508A的MAC/HMAC命令都不能执行了,0则所有命令都能执行
这个Bit一般默认为0就行了,安全级别要求跟高也可以设为1将MAC指令禁用。
有些Key存储后,可以限制其使用次数,超出次数该Slot就会disable掉,一般也设置为0就行了。
我们该功能没有使用过,具体可以看下面Datasheet说明:
Bit6:使能加密读,设为0可以明文读。设为1为加密读,如果设为1,则该Slot的IsSecret Bit7也要设为1
必须使能EncryptedRead才能使用加密读,否则与508芯片通信都是明文传输
Bit7:该slot存储的数据是否是Confidential Secret(隐私数据)
如果slot存储的是key就设为1吧,如果设为0,则GenKey、Sign命令都不能在该Slot执行了。
可以说IsSecret与EncryptedRead共同决定了某一Slot具备的读权限,之间关系如下:
WriteKey根据WriteConfig配置该Slot支持怎样的Write,默认我都设置的0,Write命令配置包括Configuration/OTA/Data Zone的写操作,具体的有兴趣的看下Datasheet吧
配置了该Slot的Write Permissions,既Write命令可执行的权限:
有5种权限如下:
Bit12-Bit15全部设为0,对应的就是Always模式,可以支持明文写入,Datasheet上也建议,如果存储Key的话,不要设置为该模式。
如果存储的是私钥等Secret,建议WriteConfig设置为Never,既该Slot永远不能被Write
该参数其他对应的Config Table如下:
针对DeriveKey :
针对PrivWrite:
KeyConfig配置了每个slot存储的Key的功能权限,是在ConfigZone的第96 - 127 Byte,也是只有DataZone Lock后这些配置才会生效。
设为1则该Slot存储ECC私钥,相应就可以执行一些ECC私钥相关功能,如Sign、GenKey等。。
设置0则相反,如果存储公钥、HMAC/SHA的key或者对称加密的Key,就设置为0
Bit1:
Bit2-4:ECC私钥类型,
508A目前只支持P256 NIST 类型的ECC PriKey…
如下图,ECC key则KeyType设置为 1 0 0 (既4),不是ECC Key则设为 1 1 1 (既7)
Bit5:使能Slot Lock,
该Bit就是设置Slot是否支持单独锁定功能,1则使能该功能,Lock后也是不能数据被改动
Bit6:使能Nonce是否需要随机数
针对一些命令,Nonce可以是固定的,也可以是随机数,这一项就是这个功能。开启后安全性更高一些,但是个人感觉没太大必要
Bit7:使能Key操作之前的认证功能
508A有这个功能,是说在对slot存储的Key执行操作时,可以先对这个Key进行认证。怎么认证呢?是根据Bit8-11中指向的认证密钥来做。
该功能我们没有用过,因为Prikey一般在存储时已经进行了安全管控,在使用上一般不做这类Check,如果另有安全要求可以使能,但要相应配置下面的AuthKey参数:。
Bit8-11:如果使能Bit7,则AuthKey表明了相应认证用的Key在哪个Slot
AuthKey指向的认证密钥是用来Verify该Key的合法性,一般指向另一个Slot存储的Key。
Bit12:使能禁用该Slot所有命令(除了GenKey命令)
设为1的话,相当于该Slot除了GenKey命令,其他命令接受了都不会执行了,这个功能我个人理解和Lock还不一样,相当于更改了执行权限。
一般用的很少
Bit14-15:PubKey是否遵循X509格式
如果不为0,则代表存储的PubKey是遵循X509格式,那么用该PubKey去验证证书的签名,需要明确证书长度、PubKey位置等。
如果为0,则代表PubKey可以验证任一格式的签名,或者该Slot不存储PubKey
这个我们也没怎么用过,不多介绍了
KeyConfig介绍完毕。。。写博客比写代码都累。。
总结下实际应用案例数据,仅供参考
SlotConfig数据:
SlotConfig Data | Usage |
---|---|
0x8780 | 存储ECC PriKey |
0x8720 | 存储ECC PriKey 并需要该Key执行ECDH、GenKey |
0xC780 | 存储ECC PriKey 使用IIC加密读 |
0x0F00 | 存储PubKey、Signature等普通Secret数据(非私钥) |
KeyConfig数据:
KeyConfig Data | Usage |
---|---|
0x3300 | 存储ECC PriKey |
0x3C00 | 存储PubKey、Signature等普通Secret数据(非私钥) |
欢迎转载,Howie原创作品,本文地址
http://blog.csdn.net/HowieXue/article/details/92433541
谢谢