phy芯片测试寄存器_使用芯片的唯一序列号作为产品编码

问题:Kinetis 手册里面提供了芯片的唯一序列号,编码规则是怎样的?

解答:

产品唯一ID号必须与芯片完整的数字编码一起使用;不能假定芯片编码的LSB/MSB部分将是唯一的。唯一标识在制造过程中进行编程,生成算法,该算法不能公开。如果得到一些芯片并读出这些UID寄存器,会发现它们之间没有明显的规律性。

KL系列的96位唯一编码:

f4fba6ec22c386e3b94f85b56368e448.png

K系列的唯一编码:

K60/K22的128位编码可以通过如下寄存器读到:

ccbda52abda75cd6aea4311a4fec65c2.png

  • 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值