Skip to main content

detect_card/
detect_card.rs

1//! Diagnostic tool: reports whether an Estonian ID card is currently
2//! connected, using the actual PKCS#11 module and reader on this machine.
3//!
4//! Run with:
5//!   cargo run -p esteid-cryptoki --example detect_card
6
7use esteid_cryptoki::{modules, EstEidError, IdCard};
8
9fn main() {
10    println!("Scanning for connected Estonian ID cards...\n");
11
12    match resolve_module() {
13        Some(path) => println!("Using PKCS#11 module: {}\n", path.display()),
14        None => println!("Warning: no OpenSC PKCS#11 module found at any known path."),
15    }
16
17    match IdCard::find() {
18        Ok(card) => print_card(&card),
19        Err(EstEidError::NoCard) => {
20            println!(
21                "No Estonian ID card detected.\n  Make sure a card is inserted into the reader."
22            );
23        }
24        Err(EstEidError::IncompleteCard(missing)) => {
25            println!("A token was found, but it is missing {missing}.");
26        }
27        Err(EstEidError::MultipleCards(cards)) => {
28            println!("Multiple Estonian ID cards detected; pin one by slot id:");
29            for card in cards {
30                println!("  - {card}");
31            }
32        }
33        Err(EstEidError::Token(source)) => {
34            println!("Failed to talk to the PKCS#11 module: {source}");
35        }
36    }
37}
38
39fn resolve_module() -> Option<std::path::PathBuf> {
40    modules()
41        .into_iter()
42        .find_map(|spec| spec.paths.into_iter().find(|p| p.exists()))
43}
44
45fn print_card(card: &IdCard) {
46    println!("Detected ID card {}", card.document_number());
47    println!("  Auth token: {}", card.auth.token_label);
48    println!("  Sign token: {}", card.sign.token_label);
49    match card.auth.algorithm() {
50        Ok(alg) => println!("  Algorithm : {alg:?}"),
51        Err(e) => println!("  Algorithm : unknown ({e})"),
52    }
53}