// SPDX-FileCopyrightText: 2021 Heiko Schaefer // SPDX-License-Identifier: MIT OR Apache-2.0 use anyhow::Result; use std::env; use std::error::Error; use sequoia_openpgp::parse::Parse; use sequoia_openpgp::policy::StandardPolicy; use sequoia_openpgp::Cert; use openpgp_card::card_do::Sex; use openpgp_card::KeyType; use openpgp_card_pcsc::PcscClient; use openpgp_card_sequoia::card::Open; use openpgp_card_sequoia::sq_util; // Filename of test key and test message to use // const TEST_KEY_PATH: &str = "example/test4k.sec"; // const TEST_ENC_MSG: &str = "example/encrypted_to_rsa4k.asc"; // const TEST_KEY_PATH: &str = "example/nist521.sec"; // const TEST_KEY_PATH: &str = "example/nist521.sec"; // const TEST_ENC_MSG: &str = "example/encrypted_to_nist521.asc"; const TEST_KEY_PATH: &str = "example/test25519.sec"; const TEST_ENC_MSG: &str = "example/encrypted_to_25519.asc"; fn main() -> Result<(), Box> { env_logger::init(); // Ident of an OpenPGP card to use for these tests let test_card_ident = env::var("TEST_CARD_IDENT"); if let Ok(test_card_ident) = test_card_ident { let mut card = PcscClient::open_by_ident(&test_card_ident)?; let mut open = Open::new(&mut card)?; // card metadata let app_id = open.application_identifier()?; println!("{:x?}\n", app_id); let eli = open.extended_length_information()?; println!("extended_length_info: {:?}\n", eli); let hist = open.historical_bytes()?; println!("{:#x?}\n", hist); let ext = open.extended_capabilities()?; println!("{:#x?}\n", ext); let pws = open.pw_status_bytes()?; println!("{:#x?}\n", pws); // cardholder let ch = open.cardholder_related_data()?; println!("{:#x?}\n", ch); // crypto-ish metadata let fp = open.fingerprints()?; println!("Fingerprint {:#x?}\n", fp); match open.algorithm_information() { Ok(Some(ai)) => println!("Algorithm information:\n{}", ai), Ok(None) => println!("No Algorithm information found"), Err(e) => println!("Error getting Algorithm information: {:?}", e), } println!("Current algorithm attributes on card:"); let algo = open.algorithm_attributes(KeyType::Signing)?; println!("Sig: {}", algo); let algo = open.algorithm_attributes(KeyType::Decryption)?; println!("Dec: {}", algo); let algo = open.algorithm_attributes(KeyType::Authentication)?; println!("Aut: {}", algo); println!(); // --------------------------------------------- // CAUTION: Write commands ahead! // Try not to overwrite your production cards. // --------------------------------------------- assert_eq!(app_id.ident(), test_card_ident.to_ascii_uppercase()); let check = open.check_admin_verified(); println!("has admin (pw3) been verified yet?\n{:x?}\n", check); println!("factory reset\n"); open.factory_reset()?; open.verify_admin("12345678")?; println!("verify for admin ok"); let check = open.check_user_verified(); println!("has user (pw1/82) been verified yet? {:x?}", check); // Use Admin access to card let mut admin = open.admin_card().expect("just verified"); println!(); let res = admin.set_name("Bar<