问题:Kinetis 手册里面提供了芯片的唯一序列号,编码规则是怎样的?
解答:
产品唯一ID号必须与芯片完整的数字编码一起使用;不能假定芯片编码的LSB/MSB部分将是唯一的。唯一标识在制造过程中进行编程,生成算法,该算法不能公开。如果得到一些芯片并读出这些UID寄存器,会发现它们之间没有明显的规律性。
KL系列的96位唯一编码:
K系列的唯一编码:
K60/K22的128位编码可以通过如下寄存器读到:
Unique Identification Register High (SIM_UIDH)
Unique Identification Register Mid-High (SIM_UIDMH)
Unique Identification Register Mid-Low (SIM_UIDML)
Unique Identification Register Low (SIM_UIDL)
这些寄存器都是只读寄存器,在芯片出厂测试的时候被写入到芯片中。
使用方法:
printf( "CPU Unique Identifier:\n" );
printf( "0x%08X 0x%08X 0x%08X 0x%08X\n", SIM_UIDH, SIM_UIDMH, SIM_UIDML, SIM_UIDL );
另外,在SDK包里面也能找到现成的定义:
fsl_sim.c:
void SIM_GetUniqueId(sim_uid_t *uid)
{
#if defined(SIM_UIDH)
uid->H =SIM->UIDH;
#endif
#if (defined(FSL_FEATURE_SIM_HAS_UIDM) &&
FSL_FEATURE_SIM_HAS_UIDM)
uid->M = SIM->UIDM;
#else
uid->MH = SIM->UIDMH;
uid->ML = SIM->UIDML;
#endif /* FSL_FEATURE_SIM_HAS_UIDM */
uid->L = SIM->UIDL;
}
fsl_sim.h: /*!@brief Unique ID. */
typedef struct _sim_uid
{
#if defined(SIM_UIDH)
uint32_t H; /*!< UIDH. */
#endif
#if (defined(FSL_FEATURE_SIM_HAS_UIDM) &&
FSL_FEATURE_SIM_HAS_UIDM)
uint32_t M; /*!< SIM_UIDM. */
#else
uint32_t MH; /*!< UIDMH. */
uint32_t ML; /*!< UIDML. */
#endif /* FSL_FEATURE_SIM_HAS_UIDM */
uint32_t L; /*!< UIDL. */
} sim_uid_t;
那么如何产生满足自身需要的编码呢?如下提供两种方法:
1. 为了生成一定格式的唯一密钥,使用 MCU 的ID编码作为128位AES加密算法的块输入参数。且在每次使用AES加密算法生成自身需要格式的密钥。
2.如果芯片自身的编码太长了,需要改成64位或者32位等。可以使用XORing寄存器的方式减少ID的位数。例子如下:
uint64_t idCodeShort = (((uint64_t) (SIM_UIDMH ^ SIM_UIDML)) << 32) | ((uint64_t) (SIM_UIDL ^ SIM_SDID));
或者:
uint32_t idCodeEvenShorter = (SIM_UIDMH ^ SIM_UIDML ^ SIM_UIDL ^ SIM_SDID);这有可能不一定保证ID的唯一性,但可能适合特定情况,为加密提供特定的值(种子值/等)。
备注:
如果使用AES加密,针对K22,KV11,K81具有硬件的MMCAU单元的器件,可以直接调用SDK里面的aes_security.h 和aes_security.c的代码。如果没有MMCAU的,需要使用软件的加解密,参考代码在SDK的 aes128_key_wrap_unwrap.c
MCUboot 以及集成在SDK中,可以发现参考目录如下:
SDK_2.6.0_TWR-K22F120M\middleware\mcu-boot\tools\tools\elftosb\common
AES 运行在Cortex M0+的产品占用资源:
- mbedTLS with tables in ROM 12.3k Bytes
- WolfSSL 14.6k Bytes
- OpenSSL with full loop unrolling (20% faster) 17.6k Bytes
- OpenSSL without full loop unrolling 12.8k Bytes
RAM cost is typically about 256 bytes
https://github.com/kokke/tiny-AES-c
https://www.discretix.com/accelarators/cryptographic-software-librarys/
openssl:https://www.openssl.org/