#smartcard #apdu #iso7816 #no-std #t1

no-std iso7816_tx

ISO7816智能卡T=1传输协议

3个版本

0.1.2 2023年11月30日
0.1.1 2023年11月27日
0.1.0 2023年11月27日

#375 in 嵌入式开发

MIT/Apache

36KB
928

iso7816_tx

实现ISO7816智能卡T=1传输协议

T=1协议通常被称为ISO协议。它们主要基于ISO/IEC 7816标准系列的规定

许可

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交给作品的所有贡献,应按上述方式双重许可,无任何附加条款或条件。

用法

基本APDU传输

fn main() {
    use iso7816_tx::TransmissionBuilder;

    let mut buf = [0u8; 258];
    let mut t = TransmissionBuilder::new()
        .set_init_cb(open)
        .set_release_cb(close)
        .set_reset_cb(reset)
        .set_read_cb(read)
        .set_write_cb(write)
        .set_sleep_cb(sleep)
        .set_nad(15, 51)
        .build();

    let atr = t.atr().expect("Failed to get ATR");

    let capdu = &[0x80, 0xca, 0x9f, 0x7f];
    let rapdu = t.transmit(capdu, &mut buf).expect("Failed to transmit");
}

fn open() -> Result<Option<Interface>, Error> {
    // Initialize connection interface
    // ...

    Ok(Some(Interface::default()))
}

fn close(interface: Option<&Interface>) -> Result<Option<Interface>, Error> {
    // Release connection interface
    // ...

    Ok(None)
}

fn reset(interface: Option<&Interface>) -> Result<(), Error> {
    // Cold reset implementation
    // ...

    Ok(())
}

fn read(interface: Option<&Interface>, buf: &mut [u8]) -> Result<usize, Error> {
    // Read data from connection interface
    // ...

    Ok(0)
}

fn write(interface: Option<&Interface>, buf: &[u8]) -> Result<usize, Error> {
    // Write data to connection interface
    // ...

    Ok(0)
}

fn sleep(ms: u32) {
    // Sleep implementation
    // ...
}

// Connection interface context
#[derive(Default)]
struct Interface{}

// Interface errors
#[derive(Debug)]
enum Error {}

无运行时依赖