diff --git a/card-functionality/src/cards.rs b/card-functionality/src/cards.rs index 9a27459..6ccb59d 100644 --- a/card-functionality/src/cards.rs +++ b/card-functionality/src/cards.rs @@ -8,7 +8,6 @@ use anyhow::Result; use serde_derive::Deserialize; use std::collections::BTreeMap; -use openpgp_card::CardClient; use openpgp_card_pcsc::PcscClient; use openpgp_card_scdc::ScdClient; diff --git a/card-functionality/src/tests.rs b/card-functionality/src/tests.rs index 7df97ed..0c9cefe 100644 --- a/card-functionality/src/tests.rs +++ b/card-functionality/src/tests.rs @@ -16,7 +16,7 @@ use openpgp_card; use openpgp_card::algorithm::AlgoSimple; use openpgp_card::card_do::{KeyGenerationTime, Sex}; use openpgp_card::{CardApp, CardClient, Error, KeyType, StatusBytes}; -use openpgp_card_pcsc::{PcscClient, PcscTxClient}; +use openpgp_card_pcsc::PcscTxClient; use openpgp_card_sequoia::card::Open; use openpgp_card_sequoia::util::{ make_cert, public_key_material_to_key, public_to_fingerprint, @@ -702,12 +702,13 @@ pub fn run_test( use anyhow::anyhow; use openpgp_card::SmartcardError; - use openpgp_card_pcsc::PcscTxClient; use pcsc::Transaction; + let card_caps = card_client.card_caps(); + let mut tx: Transaction = openpgp_card_pcsc::start_tx!(card_client.card()) .map_err(|e| anyhow!(e))?; - let mut txc = PcscTxClient::new(&mut tx); + let mut txc = PcscTxClient::new(&mut tx, card_caps); t(&mut txc, param) } diff --git a/pcsc/src/lib.rs b/pcsc/src/lib.rs index ddd7b5c..3193654 100644 --- a/pcsc/src/lib.rs +++ b/pcsc/src/lib.rs @@ -7,9 +7,7 @@ use anyhow::{anyhow, Result}; use iso7816_tlv::simple::Tlv; -use pcsc::{ - Card, Context, Disposition, Protocols, Scope, ShareMode, Transaction, -}; +use pcsc::{Card, Context, Protocols, Scope, ShareMode, Transaction}; use std::collections::HashMap; use std::convert::TryInto; @@ -22,10 +20,7 @@ const FEATURE_MODIFY_PIN_DIRECT: u8 = 0x07; #[macro_export] macro_rules! start_tx { ($card:expr) => {{ - use pcsc::{ - Card, Context, Disposition, Protocols, Scope, ShareMode, - Transaction, - }; + use pcsc::{Disposition, Protocols, ShareMode}; let mut was_reset = false; @@ -41,7 +36,7 @@ macro_rules! start_tx { "start_tx: card was reset, select() openpgp" ); - let mut txc = PcscTxClient::new(&mut tx); + let mut txc = PcscTxClient::new(&mut tx, None); PcscTxClient::select(&mut txc)?; } @@ -94,11 +89,15 @@ pub struct PcscClient { pub struct PcscTxClient<'a, 'b> { tx: &'a mut Transaction<'b>, + card_caps: Option, } impl<'a, 'b> PcscTxClient<'a, 'b> { - pub fn new(tx: &'a mut Transaction<'b>) -> Self { - PcscTxClient { tx } + pub fn new( + tx: &'a mut Transaction<'b>, + card_caps: Option, + ) -> Self { + PcscTxClient { tx, card_caps } } } @@ -156,7 +155,7 @@ impl CardClient for PcscTxClient<'_, '_> { } fn card_caps(&self) -> Option<&CardCaps> { - None + self.card_caps.as_ref() } fn feature_pinpad_verify(&self) -> bool { @@ -263,7 +262,7 @@ impl PcscClient { log::debug!("1"); let mut tx: Transaction = start_tx!(card)?; - let mut txc = PcscTxClient::new(&mut tx); + let mut txc = PcscTxClient::new(&mut tx, None); log::debug!("3"); { if let Err(e) = PcscTxClient::select(&mut txc) { @@ -416,6 +415,10 @@ impl PcscClient { Ok(Tlv::parse_all(res)) } + + pub fn card_caps(&self) -> Option { + self.card_caps + } } impl CardClient for PcscClient { @@ -430,7 +433,7 @@ impl CardClient for PcscClient { let mut tx: Transaction = start_tx!(self.card)?; log::debug!("PcscClient transmit 2"); - let mut txc = PcscTxClient::new(&mut tx); + let mut txc = PcscTxClient::new(&mut tx, self.card_caps); log::debug!("PcscClient transmit 3 (got TxClient!)"); let res = txc.transmit(cmd, buf_size);