22 个版本 (稳定)

2.8.2 2023年12月23日
2.8.0 2022年12月28日
2.7.0 2022年2月15日
2.6.0 2021年8月24日
0.1.0 2017年2月6日

#1 in #smart

Download history 3089/week @ 2024-04-08 3316/week @ 2024-04-15 2522/week @ 2024-04-22 2769/week @ 2024-04-29 2842/week @ 2024-05-06 2740/week @ 2024-05-13 2665/week @ 2024-05-20 2727/week @ 2024-05-27 3366/week @ 2024-06-03 2750/week @ 2024-06-10 3932/week @ 2024-06-17 3925/week @ 2024-06-24 2988/week @ 2024-07-01 3765/week @ 2024-07-08 3169/week @ 2024-07-15 3458/week @ 2024-07-22

13,532 每月下载量
44 个crate(19 个直接) 中使用

MIT 许可证

92KB
1.5K SLoC

pcsc-rust

crates.io docs.rs license

Linux, macOS, Windows:

Rust对智能卡通信的PC/SC API的绑定。

  • 优秀的、安全的API。
  • 已在Linux、Windows、macOS上测试。
  • 几乎零开销。

有关更多详细信息,请参阅文档

有关一些常见任务的示例,请参阅pcsc/examples目录。

内容

pcsc-sys crate 包含对C API的直接、低级绑定。

pcsc crate 包含高级Rust包装器。

使用方法

在您的 Cargo.toml

[dependencies]
pcsc = "2"

示例

连接到第一个可用的读卡器中的卡,向卡发送APDU命令,打印APDU响应。

use pcsc::*;

fn main() {
    // Establish a PC/SC context.
    let ctx = match Context::establish(Scope::User) {
        Ok(ctx) => ctx,
        Err(err) => {
            eprintln!("Failed to establish context: {}", err);
            std::process::exit(1);
        }
    };

    // List available readers.
    let mut readers_buf = [0; 2048];
    let mut readers = match ctx.list_readers(&mut readers_buf) {
        Ok(readers) => readers,
        Err(err) => {
            eprintln!("Failed to list readers: {}", err);
            std::process::exit(1);
        }
    };

    // Use the first reader.
    let reader = match readers.next() {
        Some(reader) => reader,
        None => {
            println!("No readers are connected.");
            return;
        }
    };
    println!("Using reader: {:?}", reader);

    // Connect to the card.
    let card = match ctx.connect(reader, ShareMode::Shared, Protocols::ANY) {
        Ok(card) => card,
        Err(Error::NoSmartcard) => {
            println!("A smartcard is not present in the reader.");
            return;
        }
        Err(err) => {
            eprintln!("Failed to connect to card: {}", err);
            std::process::exit(1);
        }
    };

    // Send an APDU command.
    let apdu = b"\x00\xa4\x04\x00\x0A\xA0\x00\x00\x00\x62\x03\x01\x0C\x06\x01";
    println!("Sending APDU: {:?}", apdu);
    let mut rapdu_buf = [0; MAX_BUFFER_SIZE];
    let rapdu = match card.transmit(apdu, &mut rapdu_buf) {
        Ok(rapdu) => rapdu,
        Err(err) => {
            eprintln!("Failed to transmit APDU command to card: {}", err);
            std::process::exit(1);
        }
    };
    println!("APDU response: {:?}", rapdu);
}

示例输出

$ ./target/debug/examples/readme
Using reader: "SCM Microsystems Inc. SCR 355 [CCID Interface] 00 00"
Sending APDU: [0, 164, 4, 0, 10, 160, 0, 0, 0, 98, 3, 1, 12, 6, 1]
APDU response: [106, 130]

许可证

MIT许可证。

依赖关系

~110KB