9个版本 (5个稳定版)

1.2.1 2024年4月18日
1.2.0 2019年11月25日
1.1.0 2019年9月3日
1.0.1 2018年2月25日
0.1.0 2017年2月6日

#721 in 硬件支持

Download history 2835/week @ 2024-04-27 2930/week @ 2024-05-04 2785/week @ 2024-05-11 2655/week @ 2024-05-18 2643/week @ 2024-05-25 3644/week @ 2024-06-01 2730/week @ 2024-06-08 3827/week @ 2024-06-15 4048/week @ 2024-06-22 3004/week @ 2024-06-29 3749/week @ 2024-07-06 3241/week @ 2024-07-13 3666/week @ 2024-07-20 3846/week @ 2024-07-27 3947/week @ 2024-08-03 3151/week @ 2024-08-10

每月15,170次下载
48 个Crates中使用 (直接使用3个)

MIT 许可证

21KB
361

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许可证。


lib.rs:

对PCSC C API的底层绑定。

以下平台受支持

  • 在Windows上,内置的WinSCard.dll库和"Smart Card"服务。请参阅MSDN以获取实现API的文档。

  • 在macOS上,内置的PCSC框架。

  • 在Linux、BSD和其他(希望)系统上,PCSC lite库和pcscd守护进程。请参阅pcsclite以获取实现API的文档。

    pcsclite在构建时使用pkg-config检测。请参阅pkg-config crate以获取更多信息。

    如果您不想使用pkg-config,您可以在构建crate时导出以下环境变量

    • PCSC_LIB_DIR:搜索实现PCSC API的动态库的目录。
    • PCSC_LIB_NAME:库的名称。默认为 pcsclite

依赖项