detect_card/
detect_card.rs1use 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}