From 566fd6f9a0678320309a79891dce0ffeda60e770 Mon Sep 17 00:00:00 2001 From: Heiko Schaefer Date: Mon, 28 Aug 2023 20:38:19 +0200 Subject: [PATCH] card-functionality: Perform the full set of tests in a single Card --- card-functionality/src/import.rs | 14 ++++--- card-functionality/src/keygen.rs | 12 +++--- card-functionality/src/other.rs | 3 +- card-functionality/src/tests.rs | 65 +++++++++++++++----------------- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/card-functionality/src/import.rs b/card-functionality/src/import.rs index 925a46f..07de36f 100644 --- a/card-functionality/src/import.rs +++ b/card-functionality/src/import.rs @@ -28,16 +28,18 @@ fn main() -> Result<()> { let mut c: Card = card.get_card()?; println!(" -> Card opened"); + let mut tx = c.transaction()?; + println!(" started transaction"); println!("Reset"); - let _ = run_test(&mut c, test_reset, &[])?; + let _ = run_test(&mut tx, test_reset, &[])?; print!("Set user data"); - let userdata_out = run_test(&mut c, test_set_user_data, &[])?; + let userdata_out = run_test(&mut tx, test_set_user_data, &[])?; println!(" {userdata_out:x?}"); println!("Set login data"); - let login_data_out = run_test(&mut c, test_set_login_data, &[])?; + let login_data_out = run_test(&mut tx, test_set_login_data, &[])?; println!(" {login_data_out:x?}"); let key_files = { @@ -52,7 +54,7 @@ fn main() -> Result<()> { for key_file in &key_files { // upload keys print!("Upload key '{key_file}'"); - let upload_res = run_test(&mut c, test_upload_keys, &[key_file]); + let upload_res = run_test(&mut tx, test_upload_keys, &[key_file]); if let Err(TestError::KeyUploadError(_file, err)) = &upload_res { // The card doesn't support this key type, so skip to the @@ -74,13 +76,13 @@ fn main() -> Result<()> { let cert = Cert::from_str(&key)?; let ciphertext = util::encrypt_to("Hello world!\n", &cert)?; - let dec_out = run_test(&mut c, test_decrypt, &[&key, &ciphertext])?; + let dec_out = run_test(&mut tx, test_decrypt, &[&key, &ciphertext])?; println!(" {dec_out:x?}"); // sign print!(" Sign"); - let sign_out = run_test(&mut c, test_sign, &[&key])?; + let sign_out = run_test(&mut tx, test_sign, &[&key])?; println!(" {sign_out:x?}"); } diff --git a/card-functionality/src/keygen.rs b/card-functionality/src/keygen.rs index ec4005a..7684c4e 100644 --- a/card-functionality/src/keygen.rs +++ b/card-functionality/src/keygen.rs @@ -28,6 +28,8 @@ fn main() -> Result<()> { let mut c: Card = card.get_card()?; println!(" -> Card opened"); + let mut tx = c.transaction()?; + println!(" started transaction"); // println!("Get pubkey"); // let _ = run_test(&mut card, test_get_pub, &[])?; @@ -39,14 +41,14 @@ fn main() -> Result<()> { // // continue; // only print caps println!("Reset"); - let _ = run_test(&mut c, test_reset, &[])?; + let _ = run_test(&mut tx, test_reset, &[])?; // println!("Algo info"); // let _ = run_test(&mut card, test_print_algo_info, &[])?; // Set user data because keygen expects a name (for the user id) println!("Set user data"); - let _ = run_test(&mut c, test_set_user_data, &[])?; + let _ = run_test(&mut tx, test_set_user_data, &[])?; let algos = { let config = card.get_config(); @@ -60,12 +62,12 @@ fn main() -> Result<()> { for algo in algos { println!("Generate key [{algo}]"); - let res = run_test(&mut c, test_keygen, &[&algo])?; + let res = run_test(&mut tx, test_keygen, &[&algo])?; if let TestResult::Text(cert_str) = &res[0] { // sign print!(" Sign"); - let sign_out = run_test(&mut c, test_sign, &[cert_str])?; + let sign_out = run_test(&mut tx, test_sign, &[cert_str])?; println!(" {sign_out:x?}"); // decrypt @@ -73,7 +75,7 @@ fn main() -> Result<()> { let ciphertext = util::encrypt_to("Hello world!\n", &cert)?; print!(" Decrypt"); - let dec_out = run_test(&mut c, test_decrypt, &[cert_str, &ciphertext])?; + let dec_out = run_test(&mut tx, test_decrypt, &[cert_str, &ciphertext])?; println!(" {dec_out:x?}"); } else { panic!("Didn't get back a Cert from test_keygen"); diff --git a/card-functionality/src/other.rs b/card-functionality/src/other.rs index e6278a7..4672a28 100644 --- a/card-functionality/src/other.rs +++ b/card-functionality/src/other.rs @@ -18,6 +18,7 @@ fn main() -> Result<()> { println!("** Run tests on card '{}' **", card.get_name()); let mut c: Card = card.get_card()?; + let mut tx = c.transaction()?; // println!("Caps"); // let _ = run_test(&mut card, test_print_caps, &[])?; @@ -27,7 +28,7 @@ fn main() -> Result<()> { // let _ = run_test(&mut card, test_print_algo_info, &[])?; println!("Reset"); - let _ = run_test(&mut c, test_reset, &[])?; + let _ = run_test(&mut tx, test_reset, &[])?; // --- diff --git a/card-functionality/src/tests.rs b/card-functionality/src/tests.rs index 8d89e5d..8660e17 100644 --- a/card-functionality/src/tests.rs +++ b/card-functionality/src/tests.rs @@ -10,7 +10,7 @@ use openpgp_card::algorithm::AlgoSimple; use openpgp_card::card_do::{KeyGenerationTime, Sex}; use openpgp_card::{Error, KeyType, OpenPgp, StatusBytes}; use openpgp_card_sequoia::sq_util; -use openpgp_card_sequoia::state::{Admin, Open}; +use openpgp_card_sequoia::state::{Admin, Open, Transaction}; use openpgp_card_sequoia::util::{ make_cert, public_key_material_and_fp_to_key, public_key_material_to_key, }; @@ -52,7 +52,7 @@ pub enum TestError { } /// Run after each "upload keys", if key *was* uploaded (?) -pub fn test_decrypt(card: &mut Card, param: &[&str]) -> Result { +pub fn test_decrypt(tx: &mut Card, param: &[&str]) -> Result { assert_eq!( param.len(), 2, @@ -63,9 +63,7 @@ pub fn test_decrypt(card: &mut Card, param: &[&str]) -> Result, param: &[&str]) -> Result, param: &[&str]) -> Result { +pub fn test_sign(tx: &mut Card, param: &[&str]) -> Result { assert_eq!(param.len(), 1, "test_sign needs a filename for 'cert'"); let cert = Cert::from_str(param[0])?; - let mut transaction = card.transaction()?; - - let mut sign = transaction.to_signing_card("123456").unwrap(); + let mut sign = tx.to_signing_card("123456").unwrap(); let s = sign.signer(&|| {})?; let msg = "Hello world, I am signed."; @@ -178,9 +174,10 @@ pub fn test_print_algo_info(pgp: &mut OpenPgp, _param: &[&str]) -> Result, param: &[&str]) -> Result { - let mut transaction = card.transaction()?; - +pub fn test_upload_keys( + tx: &mut Card, + param: &[&str], +) -> Result { assert_eq!( param.len(), 1, @@ -190,7 +187,7 @@ pub fn test_upload_keys(card: &mut Card, param: &[&str]) -> Result, param: &[&str]) -> Result, param: &[&str]) -> Result { - let mut transaction = card.transaction()?; - let mut admin = transaction +pub fn test_keygen(tx: &mut Card, param: &[&str]) -> Result { + let mut admin = tx .to_admin_card("12345678") .expect("Couldn't get Admin card"); @@ -233,9 +229,11 @@ pub fn test_keygen(card: &mut Card, param: &[&str]) -> Result, _param: &[&str]) -> Result, _param: &[&str]) -> Result { - let mut transaction = card.transaction()?; - - transaction.factory_reset()?; +pub fn test_reset(tx: &mut Card, _param: &[&str]) -> Result { + tx.factory_reset()?; Ok(vec![]) } @@ -308,10 +304,11 @@ pub fn test_reset(card: &mut Card, _param: &[&str]) -> Result, _param: &[&str]) -> Result { - let mut transaction = card.transaction()?; - - let mut admin = transaction.to_admin_card("12345678")?; +pub fn test_set_user_data( + tx: &mut Card, + _param: &[&str], +) -> Result { + let mut admin = tx.to_admin_card("12345678")?; // name admin.set_name("Bar<, _param: &[&str]) -> Result, _param: &[&str]) -> Result, + tx: &mut Card, _params: &[&str], ) -> std::result::Result { - let mut transaction = card.transaction()?; - - let mut admin = transaction.to_admin_card("12345678")?; + let mut admin = tx.to_admin_card("12345678")?; let test_login = "someone@somewhere.com"; admin.set_login_data(test_login)?; // Read the previously set login data - let read_login_data = transaction.login_data()?; + let read_login_data = tx.login_data()?; assert_eq!(read_login_data, test_login); @@ -677,8 +672,8 @@ pub fn test_reset_retry_counter( } pub fn run_test( - card: &mut Card, - t: fn(&mut Card, &[&str]) -> Result, + card: &mut Card, + t: fn(&mut Card, &[&str]) -> Result, param: &[&str], ) -> Result { t(card, param)