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

no-std iso7816_tx

ISO7816 Smart Card T=1 Transmission protocol

3 releases

0.1.2 Nov 30, 2023
0.1.1 Nov 27, 2023
0.1.0 Nov 27, 2023

#222 in Embedded development

50 downloads per month

MIT/Apache

36KB
928 lines

iso7816_tx

Implement ISO7816 Smart Card T=1 Transmission protocol

The T=1 protocol are commonly called the ISO protocols. They are primarily based on the provisions of the ISO/IEC 7816 family of standards

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Usage

Basic APDU Transmission

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 {}

No runtime deps