26个稳定版本 (3个主要版本)

3.5.1 2024年3月24日
3.5.0 2023年5月5日
3.4.2 2022年9月11日
3.4.1 2022年7月10日
0.4.0 2020年10月3日

#37身份验证


用于 2 crates

MIT 许可证

195KB
4.5K SLoC

license macOS Windows Raspberry-Pi

ctap-hid-fido2

Rust FIDO2 CTAP库 (以及cli工具 ctapcli )。

使用符合FIDO2规范的安全密钥(例如Yubikey)进行身份验证是可能的。

功能

  • 注册和身份验证。
  • 注册或更改PIN。
  • 指纹的注册和删除。
  • 管理安全密钥中记录的凭证。

版本

Ver 3.5.1

  • 依赖项更新。

Ver 3.5.0

  • 在MakeCredentialArgsBuilder中指定多个key_types。
  • 支持ED25519。
  • 更新依赖项 → base64, x509-parser, hidapi, clap, env_logger
  • 删除依赖项 → serde_json, ihex, base64-url

Ver 3.4.2

  • 更新依赖项 → aes, cbc, x509-parser, rpassword
  • 删除依赖项 → block-modes

Ver 3.4.1

  • 错误修复

Ver 3.4.0

Ver 3.3.1

Ver 3.3.0

Ver 3.2.0

版本 3.1.0

版本 3.0.0

如何使用注册和身份验证

use ctap_hid_fido2::{
    fidokey::{GetAssertionArgsBuilder, MakeCredentialArgsBuilder},
    verifier, Cfg, FidoKeyHidFactory,
};

fn main() {
    let rpid = "reg-auth-example-app";
    let pin = get_input_with_message("input PIN:");

    println!("Register");
    // create `challenge`
    let challenge = verifier::create_challenge();

    // create `MakeCredentialArgs`
    let make_credential_args = MakeCredentialArgsBuilder::new(rpid, &challenge)
        .pin(&pin)
        .build();

    // create `FidoKeyHid`
    let device = FidoKeyHidFactory::create(&Cfg::init()).unwrap();

    // get `Attestation` Object
    let attestation = device
        .make_credential_with_args(&make_credential_args)
        .unwrap();
    println!("- Register Success");

    // verify `Attestation` Object
    let verify_result = verifier::verify_attestation(rpid, &challenge, &attestation);
    if !verify_result.is_success {
        println!("- ! Verify Failed");
        return;
    }

    // store Credential Id and Publickey
    let userdata_credential_id = verify_result.credential_id;
    let userdata_credential_public_key = verify_result.credential_public_key;

    println!("Authenticate");
    // create `challenge`
    let challenge = verifier::create_challenge();

    // create `GetAssertionArgs`
    let get_assertion_args = GetAssertionArgsBuilder::new(rpid, &challenge)
        .pin(&pin)
        .credential_id(&userdata_credential_id)
        .build();

    // get `Assertion` Object
    let assertions = device.get_assertion_with_args(&get_assertion_args).unwrap();
    println!("- Authenticate Success");

    // verify `Assertion` Object
    if !verifier::verify_assertion(
        rpid,
        &userdata_credential_public_key,
        &challenge,
        &assertions[0],
    ) {
        println!("- ! Verify Assertion Failed");
    }
}

pub fn get_input() -> String {
    let mut word = String::new();
    std::io::stdin().read_line(&mut word).ok();
    return word.trim().to_string();
}

pub fn get_input_with_message(message: &str) -> String {
    println!("{}", message);
    let input = get_input();
    println!();
    input
}
  • 参见 [如何使用](#How to use) 和 示例 以获取详细说明。

描述

ctap-hid-fido2 是一个实现 CTAP 2.0 和 2.1 的 crate,允许直接控制符合 FIDO2 的身份验证器,如 Yubikey。
有关 FIDO 的更多信息,请参阅 FIDO 协会页面

作者

gebo

构建和运行

macOS

使用它没有特别需要注意的事项。

Windows

  • 以管理员身份运行

在 Windows 中,除非执行的可执行文件具有管理员权限,否则无法访问通过 HID 的安全密钥。

树莓派

  • 安装 libusblibudev 软件包

(对于 Linux,如 Ubuntu,可能也如此)

如果您在 libusb-1.0 依赖项下遇到以下错误并且无法构建,您可以按照以下步骤解决问题。

sudo apt install -y libusb-1.0-0-dev libudev-dev

如何使用

必须设置 PIN

除非以下示例中另有说明,否则必须在身份验证器中设置 PIN。

创建 FidoKeyHid 对象

首先,使用 FidoKeyHidFactory::create 创建设备对象。

如果无法在 HID 设备上检测到身份验证器,则会导致错误。

use ctap_hid_fido2::{Cfg, FidoKeyHidFactory};
...

let device = match FidoKeyHidFactory::create(&Cfg::init()) {
  Ok(d) => d,
  Err(e) => {
      println!("error: {:?}", e);
      return;
  }
};

如果检测到多个身份验证器,则会导致错误。有关 多身份验证器支持 的说明,请参见以下描述。

Cfg

使用 Cfg 的参数默认值,您可以使用 init() 创建,但您可以根据需要对其进行自定义以更改行为,请参阅 Cfg 定义

FidoKeyHid

使用 FidoKeyHid 中实现的方法使用身份验证器。
例如,可以使用 get_pin_retries() 获取 PIN 重试次数。

match device.get_pin_retries() {
    Ok(retry) => println!("{}", retry),
    Err(e) => println!("error: {:?}", e),
}

多身份验证器支持

如果您连接到 HID 的多个身份验证器,并且想要单独控制每个设备,请使用 get_fidokey_devices()create_by_params()

let devs = ctap_hid_fido2::get_fidokey_devices();
for dev in devs {
  println!("- vid=0x{:04x} , pid=0x{:04x} , info={:?}",dev.vid, dev.pid, dev.info);

  let fidokey = FidoKeyHidFactory::create_by_params(&vec![dev.param], &Cfg::init()).unwrap();
  let info = fidokey.get_info().unwrap();
  println!("{}", info);
}

示例

有关各种模式的示例,请参见以下链接。

CLI工具

可以使用CLI工具。

依赖

~11-20MB
~359K SLoC