7 个版本

0.1.6 2024年8月13日
0.1.5 2024年6月6日
0.1.4 2024年5月28日
0.1.3 2024年4月11日
0.0.0-未发布2023年8月17日

142硬件支持

Download history 27/week @ 2024-05-04 28/week @ 2024-05-11 39/week @ 2024-05-18 223/week @ 2024-05-25 241/week @ 2024-06-01 66/week @ 2024-06-08 88/week @ 2024-06-15 72/week @ 2024-06-22 52/week @ 2024-06-29 35/week @ 2024-07-06 25/week @ 2024-07-13 21/week @ 2024-07-20 67/week @ 2024-07-27 23/week @ 2024-08-03 162/week @ 2024-08-10 22/week @ 2024-08-17

每月276 次下载

LGPL-3.0-only

335KB
8K SLoC

SE05X 驱动程序

本crate包含NXP SE05X系列安全元素的Rust驱动程序。它包含T=1协议的实现和用于与se05x通信的ISO7816-4 APDU。

use se05x::se05x::commands::*;
use se05x::se05x::policies::*;
use se05x::se05x::*;
let i2c = get_i2c();
let delay = get_delay();
let address = 0x48;
let mut se05x = Se05X::new(i2c, address, delay);
let user_id = ObjectId([0x01, 0x00, 0x00, 0x00]);
let object_id = ObjectId([0x01, 0x02, 0x03, 0x04]);
let buf = &mut [0; 128];

let atr = se05x.enable();

// Running a WriteUserId command:
se05x.run_command(
    &WriteUserId::builder()
        .object_id(user_id)
        .data(b"Some value")
        .build(),
    buf,
)?;

// Creating a file with a policy
let policy = &[Policy {
    object_id: user_id,
    access_rule: ObjectAccessRule::from_flags(ObjectPolicyFlags::ALLOW_READ),
}];

se05x.run_command(
    &WriteBinary::builder()
        .policy(PolicySet(policy))
        .object_id(object_id)
        .file_length(9.into())
        .data(b"Some data")
        .build(),
    buf,
)?;

// Opening a session with teh UserID
let session_id = se05x
    .run_command(&CreateSession { object_id: user_id }, buf)?
    .session_id;

// Verifying the UserId
se05x.run_session_command(
    session_id,
    &VerifySessionUserId {
        user_id: b"Some value",
    },
    buf,
)?;
// Reading the data with the verified session
let data = se05x.run_session_command(
    session_id,
    &ReadObject::builder()
        .object_id(object_id)
        .offset(0.into())
        .length(9.into())
        .build(),
    buf,
)?;

架构

T=1

该驱动程序通过I2C上的T=1协议与se05x通信,如UM11225中所述。

为此并与大多数嵌入式控制器兼容,它依赖于ReadWriteembedded-hal。然而,这些特性并不暴露足够的信息,因为T=1协议需要检测I2C NACKs,而此协议中没有暴露。

NACKs在各个HALcrate的错误类型中暴露。因此,定义了一个扩展到embedded-hal特性的扩展I2CErrorNack,以暴露缺失的信息。它在src/t1/i2cimpl.rs中实现了NRF和LPC55 HAL,分别通过nrflpc55特性门控。

这可能不是未来embedded-hal版本中必需的,它添加了缺失的信息

Iso7816

该驱动程序使用iso7816 crate来实现APDU的序列化。

命令生成

为了简化实现,所有支持的se05x APDU都描述在src/se05x/commands.toml中。Python脚本generate_commands.py解析command.toml文件并生成src/se05x/commands.rs,该文件实现了所有APDU。

资助

Logo NLnet: abstract logo of four people seen from above Logo NGI Assure: letterlogo shaped like a tag

本项目由NGI Assure基金资助,该基金由NLnet设立,并获得欧洲委员会Next Generation Internet计划的财政支持,在DG Communications Networks, Content and Technology的指导下,根据项目协议编号957073。

依赖项

~1–4MB
~98K SLoC