ID 单元

ID Unit 是一款加密协处理器,具备基于硬件的安全密钥存储功能,集成 ATECC608B 硬件加密芯片,并采用 I2C 通信接口。该芯片内置 10Kb EEPROM,用于存储密钥、证书、数据、消耗记录以及安全配置。

支持以下产品:

IDUnit

MicroPython 应用示例

import os, sys, io
import M5
from M5 import *
from hardware import *
from unit import IDUnit


i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000)
id_0 = IDUnit(i2c0)
print(id_0.get_sha256_hash('Hello M5', 1))
print(id_0.get_generate_key(0, False))
print(id_0.randrange(500, 1000, 5))

UiFlow2 应用示例

example.png

cores3_id_example.m5f2

class IDUnit

Constructors

class IDUnit(i2c)

创建一个 IDUnit 对象

参数:

i2c (object) – I2C 对象。

UiFlow2

init.png

Methods

IDUnit.get_revision_number() int

返回 ATECC608B 修订版本号。修订版本号是指用于表示硬件设计特定迭代或更新的版本标识。该修订版本号有助于区分同一芯片型号的不同版本。

  • 返回:int:十六进制

UiFlow2

get_revision_number.png

IDUnit.get_serial_number() str

返回 ATECC 序列号。

9 字节序列号的结构如下:

前 4 字节:这些字节是序列号的第一部分,包含固定模式以及设备唯一部分的一部分。接下来的 2 字节:这些字节为保留字段,通常设置为 0x00 或其他保留值。最后 3 字节:这些字节是序列号的最后一部分,且对该设备是唯一的。

  • Return:string

UiFlow2

get_serial_number.png

IDUnit.randint(min, max) int

返回随机数(4 字节)。使用其基于硬件的随机数生成器(RNG)生成真随机数。该 RNG 常用于需要高质量随机性的安全应用中,例如密钥生成。

参数:
  • min (int) – 0 ~ 4294967295。

  • max (int) – 0 ~ 4294967295。

  • 返回值:int:0 ~ 4294967295

UiFlow2

randint.png

IDUnit.random() float

返回范围为 [0.0 ~ 1.0] 的随机浮点数。

  • 返回:float:0.0 ~ 1.0

UiFlow2

random.png

IDUnit.randrange(min, max, step) int

第一种形式会从 range(0, max) 范围内返回一个随机整数。第二种形式会以 step 为步长,从 range(min, max, step) 范围内返回一个随机整数。例如,调用 randrange(1, 10, 2) 将返回 1 到 9(含)之间的奇数。

参数:
  • min (int) – 0 ~ 4294967295。

  • max (int) – 0 ~ 4294967295。

  • step (int) – 0 ~ 4294967295。

  • 返回:int:0 ~ 4294967295

UiFlow2

randrange_max.png randrange.png

IDUnit.uniform(min, max) float

返回一个随机浮点数 N,使得当 min <= max 时满足 min <= N <= max,当 max < min 时满足 max <= N <= min。

参数:
  • Return: float:

UiFlow2

uniform.png

IDUnit.get_generate_key(slot_num, private_key) bytearray

返回生成的私钥或公钥。私钥是一段机密数据,用于在密码学中执行各种功能。公钥是在公钥密码学中与私钥配对的加密密钥。

参数:
  • slot_num (int) – 0 ~ 4

  • private_key (bool) – True or False

  • 返回:bytearray

UiFlow2

get_generate_key.png

IDUnit.get_ecdsa_sign(slot, message) bytearray

返回 ECDSA 签名。ECDSA 广泛用于数字签名,以确保消息和文档的真实性与完整性。

参数:
  • slot (int) – 0 ~ 4

  • messagestringlistbytearray

  • 返回:bytearray

UiFlow2

get_ecdsa_sign.png

IDUnit.get_verify_ecdsa_sign(message, sign, key) bool

返回验证 ECDSA 签名的状态。椭圆曲线数字签名算法(ECDSA)中的签名验证,是检查给定的数字签名是否有效,并且确实由对应私钥或公钥的持有者生成的过程。该过程可确保消息或数据。

参数:
  • messagestringlistbytearray

  • signbytearray

  • keybytearray

  • 返回:bool:True 或 False

UiFlow2

get_verify_ecdsa_sign.png

IDUnit.get_sha256_hash(message, format) str

获取生成的 SHA-256 哈希值。SHA-256(Secure Hash Algorithm 256-bit)是一种加密哈希函数,无论输入数据大小如何,都会生成固定大小的 256 位(32 字节)哈希值。

参数:
  • message – string

  • format – 0:十六进制,1:base64

  • Return: string:

UiFlow2

get_sha256_hash.png

IDUnit.set_certificate_signing_request(slot_num, private_key, country, state_prov, city, org, org_unit, file_path) None

证书签名请求(CSR)是一段经过编码的文本块,当您申请 SSL/TLS 证书时会将其发送给证书颁发机构(CA)。它包含 CA 用于创建证书的信息,包括您的公钥以及有关您组织的一些信息。

参数:
  • slot_num (int) – 0 ~ 4

  • private_key (bool) – True or False

  • country (str) – 国家名称示例:China

  • state_prov (str) – 州或省名称

  • city (str) – 城市名称

  • org (str) – 组织或公司名称

  • org_unit (str) – 组织或公司单位名称

  • file_path (str) – 将文件保存到 flash 或 SD

UiFlow2

set_certificate_signing_request.png

IDUnit.aes_ecb_encrypt(position, data) bytearray

对数据执行 AES-ECB 模式加密。AES 密钥存储在芯片的 slot 9 中。

参数:
  • position (int) – 加密操作的位置(在左移 6 位后使用)

  • data (bytearray) – 要加密的数据,必须为 16 字节

  • 返回:bytearray:返回 16 字节的加密数据

IDUnit.aes_ecb_decrypt(position, data) bytearray

对数据执行 AES-ECB 模式解密。AES 密钥存储在芯片的 slot 9 中。

参数:
  • position (int) – 解密操作的位置(在左移 6 位之后使用)

  • data (bytearray) – 要解密的数据,必须为 16 字节

  • 返回:bytearray:返回 16 字节的解密数据

IDUnit.aes_gfm_encrypt(data) bytearray

在 AES-GCM 模式下执行伽罗瓦域乘法(GFM)加密操作。

参数:

data (bytearray) – 要加密的数据,必须为 16 字节

  • 返回:bytearray:返回 16 字节的加密数据

IDUnit.ecdh_stored_key(slot_num, mode, external_public_key=None) bytearray

使用存储的密钥执行 ECDH 密钥交换操作。

参数:
  • slot_num (int) – 密钥槽编号

  • mode (int) – ECDH 操作模式

  • external_public_key (bytearray) – 外部公钥,必须为 64 字节。如果未提供,将生成新的公钥。

  • 返回:bytearray:当模式为 0x0C 或 0x08 时,返回 32 字节共享密钥;