Re-organize log levels.
- card operations are logged at "info" level - APDU command/response are logged at "debug" - other log output is at "trace"
This commit is contained in:
parent
63b47cffdc
commit
93baf42b84
7 changed files with 147 additions and 56 deletions
|
@ -29,6 +29,8 @@ pub(crate) fn send_command<C>(
|
||||||
where
|
where
|
||||||
C: CardTransaction + ?Sized,
|
C: CardTransaction + ?Sized,
|
||||||
{
|
{
|
||||||
|
log::debug!(" -> full APDU command: {:x?}", cmd);
|
||||||
|
|
||||||
let mut resp = RawResponse::try_from(send_command_low_level(
|
let mut resp = RawResponse::try_from(send_command_low_level(
|
||||||
card_tx,
|
card_tx,
|
||||||
cmd.clone(),
|
cmd.clone(),
|
||||||
|
@ -45,7 +47,7 @@ where
|
||||||
|
|
||||||
while let StatusBytes::OkBytesAvailable(bytes) = resp.status() {
|
while let StatusBytes::OkBytesAvailable(bytes) = resp.status() {
|
||||||
// More data is available for this command from the card
|
// More data is available for this command from the card
|
||||||
log::debug!(" chained response, getting more data");
|
log::trace!(" chained response, getting more data");
|
||||||
|
|
||||||
// Get next chunk of data
|
// Get next chunk of data
|
||||||
let next = RawResponse::try_from(send_command_low_level(
|
let next = RawResponse::try_from(send_command_low_level(
|
||||||
|
@ -56,7 +58,7 @@ where
|
||||||
|
|
||||||
match next.status() {
|
match next.status() {
|
||||||
StatusBytes::OkBytesAvailable(_) | StatusBytes::Ok => {
|
StatusBytes::OkBytesAvailable(_) | StatusBytes::Ok => {
|
||||||
log::debug!(" appending {} bytes to response", next.raw_data().len());
|
log::trace!(" appending {} bytes to response", next.raw_data().len());
|
||||||
|
|
||||||
// Append new data to resp.data and overwrite status.
|
// Append new data to resp.data and overwrite status.
|
||||||
resp.raw_mut_data().extend_from_slice(next.raw_data());
|
resp.raw_mut_data().extend_from_slice(next.raw_data());
|
||||||
|
@ -66,7 +68,11 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log::debug!(" final response len: {}", resp.raw_data().len());
|
log::debug!(
|
||||||
|
" <- APDU response [len {}]: {:x?}",
|
||||||
|
resp.raw_data().len(),
|
||||||
|
resp
|
||||||
|
);
|
||||||
|
|
||||||
Ok(resp)
|
Ok(resp)
|
||||||
}
|
}
|
||||||
|
@ -86,7 +92,7 @@ where
|
||||||
{
|
{
|
||||||
let (ext_support, chaining_support, mut max_cmd_bytes, max_rsp_bytes) =
|
let (ext_support, chaining_support, mut max_cmd_bytes, max_rsp_bytes) =
|
||||||
if let Some(caps) = card_tx.card_caps() {
|
if let Some(caps) = card_tx.card_caps() {
|
||||||
log::debug!("found card caps data!");
|
log::trace!("found card caps data!");
|
||||||
|
|
||||||
(
|
(
|
||||||
caps.ext_support,
|
caps.ext_support,
|
||||||
|
@ -95,7 +101,7 @@ where
|
||||||
caps.max_rsp_bytes as usize,
|
caps.max_rsp_bytes as usize,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
log::debug!("found NO card caps data!");
|
log::trace!("found NO card caps data!");
|
||||||
|
|
||||||
// default settings
|
// default settings
|
||||||
(false, false, 255, 255)
|
(false, false, 255, 255)
|
||||||
|
@ -110,7 +116,7 @@ where
|
||||||
max_cmd_bytes = usize::min(max_cmd_bytes, max_card_cmd_bytes);
|
max_cmd_bytes = usize::min(max_cmd_bytes, max_card_cmd_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
log::debug!(
|
log::trace!(
|
||||||
"ext le/lc {}, chaining {}, max cmd {}, max rsp {}",
|
"ext le/lc {}, chaining {}, max cmd {}, max rsp {}",
|
||||||
ext_support,
|
ext_support,
|
||||||
chaining_support,
|
chaining_support,
|
||||||
|
@ -128,8 +134,6 @@ where
|
||||||
// key data from cards?)
|
// key data from cards?)
|
||||||
let ext_len = ext_support && (max_cmd_bytes > 0xFF);
|
let ext_len = ext_support && (max_cmd_bytes > 0xFF);
|
||||||
|
|
||||||
log::debug!(" -> full APDU command: {:x?}", cmd);
|
|
||||||
|
|
||||||
let buf_size = if !ext_len {
|
let buf_size = if !ext_len {
|
||||||
MAX_BUFFER_SIZE
|
MAX_BUFFER_SIZE
|
||||||
} else {
|
} else {
|
||||||
|
@ -141,7 +145,7 @@ where
|
||||||
if chaining_support && !cmd.data().is_empty() {
|
if chaining_support && !cmd.data().is_empty() {
|
||||||
// Send command in chained mode
|
// Send command in chained mode
|
||||||
|
|
||||||
log::debug!("chained command mode");
|
log::trace!("chained command mode");
|
||||||
|
|
||||||
// Break up payload into chunks that fit into one command, each
|
// Break up payload into chunks that fit into one command, each
|
||||||
let chunks: Vec<_> = cmd.data().chunks(max_cmd_bytes).collect();
|
let chunks: Vec<_> = cmd.data().chunks(max_cmd_bytes).collect();
|
||||||
|
@ -154,11 +158,11 @@ where
|
||||||
|
|
||||||
let serialized = partial.serialize(ext_len, expect_response)?;
|
let serialized = partial.serialize(ext_len, expect_response)?;
|
||||||
|
|
||||||
log::debug!(" -> chained APDU command: {:x?}", &serialized);
|
log::trace!(" -> chained APDU command: {:x?}", &serialized);
|
||||||
|
|
||||||
let resp = card_tx.transmit(&serialized, buf_size)?;
|
let resp = card_tx.transmit(&serialized, buf_size)?;
|
||||||
|
|
||||||
log::debug!(" <- APDU response: {:x?}", &resp);
|
log::trace!(" <- APDU response: {:x?}", &resp);
|
||||||
|
|
||||||
if resp.len() < 2 {
|
if resp.len() < 2 {
|
||||||
return Err(Error::ResponseLength(resp.len()));
|
return Err(Error::ResponseLength(resp.len()));
|
||||||
|
@ -196,11 +200,11 @@ where
|
||||||
return Err(Error::CommandTooLong(serialized.len()));
|
return Err(Error::CommandTooLong(serialized.len()));
|
||||||
}
|
}
|
||||||
|
|
||||||
log::debug!(" -> APDU command: {:x?}", &serialized);
|
log::trace!(" -> APDU command: {:x?}", &serialized);
|
||||||
|
|
||||||
let resp = card_tx.transmit(&serialized, buf_size)?;
|
let resp = card_tx.transmit(&serialized, buf_size)?;
|
||||||
|
|
||||||
log::debug!(" <- APDU response: {:x?}", resp);
|
log::trace!(" <- APDU response: {:x?}", resp);
|
||||||
|
|
||||||
Ok(resp)
|
Ok(resp)
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ impl ApplicationRelatedData {
|
||||||
let hist = self.0.find(&[0x5f, 0x52].into());
|
let hist = self.0.find(&[0x5f, 0x52].into());
|
||||||
|
|
||||||
if let Some(hist) = hist {
|
if let Some(hist) = hist {
|
||||||
log::debug!("Historical bytes: {:x?}", hist);
|
log::trace!("Historical bytes: {:x?}", hist);
|
||||||
(hist.serialize().as_slice()).try_into()
|
(hist.serialize().as_slice()).try_into()
|
||||||
} else {
|
} else {
|
||||||
Err(Error::NotFound(
|
Err(Error::NotFound(
|
||||||
|
@ -65,7 +65,7 @@ impl ApplicationRelatedData {
|
||||||
// get from cached "application related data"
|
// get from cached "application related data"
|
||||||
let eli = self.0.find(&[0x7f, 0x66].into());
|
let eli = self.0.find(&[0x7f, 0x66].into());
|
||||||
|
|
||||||
log::debug!("Extended length information: {:x?}", eli);
|
log::trace!("Extended length information: {:x?}", eli);
|
||||||
|
|
||||||
if let Some(eli) = eli {
|
if let Some(eli) = eli {
|
||||||
// The card has returned extended length information
|
// The card has returned extended length information
|
||||||
|
@ -130,7 +130,7 @@ impl ApplicationRelatedData {
|
||||||
if let Some(psb) = psb {
|
if let Some(psb) = psb {
|
||||||
let pws = (&psb.serialize()[..]).try_into()?;
|
let pws = (&psb.serialize()[..]).try_into()?;
|
||||||
|
|
||||||
log::debug!("PW Status: {:x?}", pws);
|
log::trace!("PW Status: {:x?}", pws);
|
||||||
|
|
||||||
Ok(pws)
|
Ok(pws)
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,7 +149,7 @@ impl ApplicationRelatedData {
|
||||||
if let Some(fp) = fp {
|
if let Some(fp) = fp {
|
||||||
let fp: KeySet<Fingerprint> = (&fp.serialize()[..]).try_into()?;
|
let fp: KeySet<Fingerprint> = (&fp.serialize()[..]).try_into()?;
|
||||||
|
|
||||||
log::debug!("Fp: {:x?}", fp);
|
log::trace!("Fp: {:x?}", fp);
|
||||||
|
|
||||||
Ok(fp)
|
Ok(fp)
|
||||||
} else {
|
} else {
|
||||||
|
@ -164,7 +164,7 @@ impl ApplicationRelatedData {
|
||||||
if let Some(kg) = kg {
|
if let Some(kg) = kg {
|
||||||
let kg: KeySet<KeyGenerationTime> = (&kg.serialize()[..]).try_into()?;
|
let kg: KeySet<KeyGenerationTime> = (&kg.serialize()[..]).try_into()?;
|
||||||
|
|
||||||
log::debug!("Key generation: {:x?}", kg);
|
log::trace!("Key generation: {:x?}", kg);
|
||||||
|
|
||||||
Ok(kg)
|
Ok(kg)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -125,6 +125,8 @@ pub(crate) fn generate_asymmetric_key_pair(
|
||||||
card_tx: &mut OpenPgpTransaction,
|
card_tx: &mut OpenPgpTransaction,
|
||||||
key_type: KeyType,
|
key_type: KeyType,
|
||||||
) -> Result<Tlv, Error> {
|
) -> Result<Tlv, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: generate_asymmetric_key_pair");
|
||||||
|
|
||||||
// generate key
|
// generate key
|
||||||
let crt = control_reference_template(key_type)?;
|
let crt = control_reference_template(key_type)?;
|
||||||
let gen_key_cmd = commands::gen_key(crt.serialize().to_vec());
|
let gen_key_cmd = commands::gen_key(crt.serialize().to_vec());
|
||||||
|
@ -147,6 +149,8 @@ pub(crate) fn public_key(
|
||||||
card_tx: &mut OpenPgpTransaction,
|
card_tx: &mut OpenPgpTransaction,
|
||||||
key_type: KeyType,
|
key_type: KeyType,
|
||||||
) -> Result<PublicKeyMaterial, Error> {
|
) -> Result<PublicKeyMaterial, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: public_key");
|
||||||
|
|
||||||
// get current algo
|
// get current algo
|
||||||
let ard = card_tx.application_related_data()?; // FIXME: caching
|
let ard = card_tx.application_related_data()?; // FIXME: caching
|
||||||
let algo = ard.algorithm_attributes(key_type)?;
|
let algo = ard.algorithm_attributes(key_type)?;
|
||||||
|
@ -175,6 +179,8 @@ pub(crate) fn key_import(
|
||||||
key_type: KeyType,
|
key_type: KeyType,
|
||||||
algo_info: Option<AlgoInfo>,
|
algo_info: Option<AlgoInfo>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: key_import");
|
||||||
|
|
||||||
// FIXME: caching?
|
// FIXME: caching?
|
||||||
let ard = card_tx.application_related_data()?;
|
let ard = card_tx.application_related_data()?;
|
||||||
|
|
||||||
|
|
|
@ -100,6 +100,7 @@ pub trait CardTransaction {
|
||||||
|
|
||||||
/// Select the OpenPGP card application
|
/// Select the OpenPGP card application
|
||||||
fn select(&mut self) -> Result<Vec<u8>, Error> {
|
fn select(&mut self) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("CardTransaction: select");
|
||||||
let select_openpgp = commands::select_openpgp();
|
let select_openpgp = commands::select_openpgp();
|
||||||
apdu::send_command(self, select_openpgp, false)?.try_into()
|
apdu::send_command(self, select_openpgp, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -114,7 +115,7 @@ pub trait CardTransaction {
|
||||||
let resp = apdu::send_command(self, ad, true)?;
|
let resp = apdu::send_command(self, ad, true)?;
|
||||||
let value = Value::from(resp.data()?, true)?;
|
let value = Value::from(resp.data()?, true)?;
|
||||||
|
|
||||||
log::debug!(" ARD value: {:x?}", value);
|
log::trace!(" ARD value: {:x?}", value);
|
||||||
|
|
||||||
Ok(ApplicationRelatedData(Tlv::new(Tag::from([0x6E]), value)))
|
Ok(ApplicationRelatedData(Tlv::new(Tag::from([0x6E]), value)))
|
||||||
}
|
}
|
||||||
|
@ -171,7 +172,7 @@ pub trait CardTransaction {
|
||||||
pw3_max_len: pw3_max,
|
pw3_max_len: pw3_max,
|
||||||
};
|
};
|
||||||
|
|
||||||
log::debug!("init_card_caps to: {:x?}", caps);
|
log::trace!("init_card_caps to: {:x?}", caps);
|
||||||
|
|
||||||
self.init_card_caps(caps);
|
self.init_card_caps(caps);
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// it are needed regularly, and it does not usually change during
|
/// it are needed regularly, and it does not usually change during
|
||||||
/// normal use of a card.)
|
/// normal use of a card.)
|
||||||
pub fn application_related_data(&mut self) -> Result<ApplicationRelatedData, Error> {
|
pub fn application_related_data(&mut self) -> Result<ApplicationRelatedData, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: application_related_data");
|
||||||
|
|
||||||
self.tx.application_related_data()
|
self.tx.application_related_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +119,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
|
|
||||||
/// Get URL (5f50)
|
/// Get URL (5f50)
|
||||||
pub fn url(&mut self) -> Result<Vec<u8>, Error> {
|
pub fn url(&mut self) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: url");
|
||||||
|
|
||||||
let resp = apdu::send_command(self.tx(), commands::url(), true)?;
|
let resp = apdu::send_command(self.tx(), commands::url(), true)?;
|
||||||
|
|
||||||
Ok(resp.data()?.to_vec())
|
Ok(resp.data()?.to_vec())
|
||||||
|
@ -124,6 +128,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
|
|
||||||
/// Get cardholder related data (65)
|
/// Get cardholder related data (65)
|
||||||
pub fn cardholder_related_data(&mut self) -> Result<CardholderRelatedData, Error> {
|
pub fn cardholder_related_data(&mut self) -> Result<CardholderRelatedData, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: cardholder_related_data");
|
||||||
|
|
||||||
let crd = commands::cardholder_related_data();
|
let crd = commands::cardholder_related_data();
|
||||||
let resp = apdu::send_command(self.tx(), crd, true)?;
|
let resp = apdu::send_command(self.tx(), crd, true)?;
|
||||||
resp.check_ok()?;
|
resp.check_ok()?;
|
||||||
|
@ -133,6 +139,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
|
|
||||||
/// Get security support template (7a)
|
/// Get security support template (7a)
|
||||||
pub fn security_support_template(&mut self) -> Result<SecuritySupportTemplate, Error> {
|
pub fn security_support_template(&mut self) -> Result<SecuritySupportTemplate, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: security_support_template");
|
||||||
|
|
||||||
let sst = commands::security_support_template();
|
let sst = commands::security_support_template();
|
||||||
let resp = apdu::send_command(self.tx(), sst, true)?;
|
let resp = apdu::send_command(self.tx(), sst, true)?;
|
||||||
resp.check_ok()?;
|
resp.check_ok()?;
|
||||||
|
@ -164,12 +172,16 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// certificate (if the card supports multiple certificates).
|
/// certificate (if the card supports multiple certificates).
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn cardholder_certificate(&mut self) -> Result<Vec<u8>, Error> {
|
pub fn cardholder_certificate(&mut self) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: cardholder_certificate");
|
||||||
|
|
||||||
let cmd = commands::cardholder_certificate();
|
let cmd = commands::cardholder_certificate();
|
||||||
apdu::send_command(self.tx(), cmd, true)?.try_into()
|
apdu::send_command(self.tx(), cmd, true)?.try_into()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get "Algorithm Information"
|
/// Get "Algorithm Information"
|
||||||
pub fn algorithm_information(&mut self) -> Result<Option<AlgoInfo>, Error> {
|
pub fn algorithm_information(&mut self) -> Result<Option<AlgoInfo>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: algorithm_information");
|
||||||
|
|
||||||
let resp = apdu::send_command(self.tx(), commands::algo_info(), true)?;
|
let resp = apdu::send_command(self.tx(), commands::algo_info(), true)?;
|
||||||
resp.check_ok()?;
|
resp.check_ok()?;
|
||||||
|
|
||||||
|
@ -179,6 +191,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
|
|
||||||
/// Firmware Version (YubiKey specific (?))
|
/// Firmware Version (YubiKey specific (?))
|
||||||
pub fn firmware_version(&mut self) -> Result<Vec<u8>, Error> {
|
pub fn firmware_version(&mut self) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: firmware_version");
|
||||||
|
|
||||||
let resp = apdu::send_command(self.tx(), commands::firmware_version(), true)?;
|
let resp = apdu::send_command(self.tx(), commands::firmware_version(), true)?;
|
||||||
|
|
||||||
Ok(resp.data()?.into())
|
Ok(resp.data()?.into())
|
||||||
|
@ -189,6 +203,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// <https://docs.nitrokey.com/start/linux/multiple-identities.html>
|
/// <https://docs.nitrokey.com/start/linux/multiple-identities.html>
|
||||||
/// <https://github.com/Nitrokey/nitrokey-start-firmware/pull/33/>]
|
/// <https://github.com/Nitrokey/nitrokey-start-firmware/pull/33/>]
|
||||||
pub fn set_identity(&mut self, id: u8) -> Result<Vec<u8>, Error> {
|
pub fn set_identity(&mut self, id: u8) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_identity");
|
||||||
|
|
||||||
let resp = apdu::send_command(self.tx(), commands::set_identity(id), false);
|
let resp = apdu::send_command(self.tx(), commands::set_identity(id), false);
|
||||||
|
|
||||||
// Apparently it's normal to get "NotTransacted" from pcsclite when
|
// Apparently it's normal to get "NotTransacted" from pcsclite when
|
||||||
|
@ -203,6 +219,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// SELECT DATA ("select a DO in the current template",
|
/// SELECT DATA ("select a DO in the current template",
|
||||||
/// e.g. for cardholder certificate)
|
/// e.g. for cardholder certificate)
|
||||||
pub fn select_data(&mut self, num: u8, tag: &[u8]) -> Result<Vec<u8>, Error> {
|
pub fn select_data(&mut self, num: u8, tag: &[u8]) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: select_data");
|
||||||
|
|
||||||
let tlv = Tlv::new(
|
let tlv = Tlv::new(
|
||||||
[0x60],
|
[0x60],
|
||||||
Value::C(vec![Tlv::new([0x5c], Value::S(tag.to_vec()))]),
|
Value::C(vec![Tlv::new([0x5c], Value::S(tag.to_vec()))]),
|
||||||
|
@ -220,6 +238,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
///
|
///
|
||||||
/// `num` must be between 1 and 4.
|
/// `num` must be between 1 and 4.
|
||||||
pub fn private_use_do(&mut self, num: u8) -> Result<Vec<u8>, Error> {
|
pub fn private_use_do(&mut self, num: u8) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: private_use_do");
|
||||||
|
|
||||||
assert!((1..=4).contains(&num));
|
assert!((1..=4).contains(&num));
|
||||||
|
|
||||||
let cmd = commands::private_use_do(num);
|
let cmd = commands::private_use_do(num);
|
||||||
|
@ -236,6 +256,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// - 1/3 need PW1 (82)
|
/// - 1/3 need PW1 (82)
|
||||||
/// - 2/4 need PW3
|
/// - 2/4 need PW3
|
||||||
pub fn set_private_use_do(&mut self, num: u8, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
pub fn set_private_use_do(&mut self, num: u8, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_private_use_do");
|
||||||
|
|
||||||
assert!((1..=4).contains(&num));
|
assert!((1..=4).contains(&num));
|
||||||
|
|
||||||
let cmd = commands::put_private_use_do(num, data);
|
let cmd = commands::put_private_use_do(num, data);
|
||||||
|
@ -262,9 +284,12 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Gnuk needs to be built with the `--enable-factory-reset`
|
/// Gnuk needs to be built with the `--enable-factory-reset`
|
||||||
/// option to the `configure` script to enable this functionality).
|
/// option to the `configure` script to enable this functionality).
|
||||||
pub fn factory_reset(&mut self) -> Result<(), Error> {
|
pub fn factory_reset(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: factory_reset");
|
||||||
|
|
||||||
// send 4 bad requests to verify pw1
|
// send 4 bad requests to verify pw1
|
||||||
// [apdu 00 20 00 81 08 40 40 40 40 40 40 40 40]
|
// [apdu 00 20 00 81 08 40 40 40 40 40 40 40 40]
|
||||||
for _ in 0..4 {
|
for _ in 0..4 {
|
||||||
|
log::info!(" verify_pw1_81");
|
||||||
let verify = commands::verify_pw1_81([0x40; 8].to_vec());
|
let verify = commands::verify_pw1_81([0x40; 8].to_vec());
|
||||||
let resp = apdu::send_command(self.tx(), verify, false)?;
|
let resp = apdu::send_command(self.tx(), verify, false)?;
|
||||||
if !(resp.status() == StatusBytes::SecurityStatusNotSatisfied
|
if !(resp.status() == StatusBytes::SecurityStatusNotSatisfied
|
||||||
|
@ -280,6 +305,7 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
// send 4 bad requests to verify pw3
|
// send 4 bad requests to verify pw3
|
||||||
// [apdu 00 20 00 83 08 40 40 40 40 40 40 40 40]
|
// [apdu 00 20 00 83 08 40 40 40 40 40 40 40 40]
|
||||||
for _ in 0..4 {
|
for _ in 0..4 {
|
||||||
|
log::info!(" verify_pw3");
|
||||||
let verify = commands::verify_pw3([0x40; 8].to_vec());
|
let verify = commands::verify_pw3([0x40; 8].to_vec());
|
||||||
let resp = apdu::send_command(self.tx(), verify, false)?;
|
let resp = apdu::send_command(self.tx(), verify, false)?;
|
||||||
|
|
||||||
|
@ -294,11 +320,13 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// terminate_df [apdu 00 e6 00 00]
|
// terminate_df [apdu 00 e6 00 00]
|
||||||
|
log::info!(" terminate_df");
|
||||||
let term = commands::terminate_df();
|
let term = commands::terminate_df();
|
||||||
let resp = apdu::send_command(self.tx(), term, false)?;
|
let resp = apdu::send_command(self.tx(), term, false)?;
|
||||||
resp.check_ok()?;
|
resp.check_ok()?;
|
||||||
|
|
||||||
// activate_file [apdu 00 44 00 00]
|
// activate_file [apdu 00 44 00 00]
|
||||||
|
log::info!(" activate_file");
|
||||||
let act = commands::activate_file();
|
let act = commands::activate_file();
|
||||||
let resp = apdu::send_command(self.tx(), act, false)?;
|
let resp = apdu::send_command(self.tx(), act, false)?;
|
||||||
resp.check_ok()?;
|
resp.check_ok()?;
|
||||||
|
@ -314,6 +342,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// access condition is only valid for one PSO:CDS command or remains
|
/// access condition is only valid for one PSO:CDS command or remains
|
||||||
/// valid for several attempts.
|
/// valid for several attempts.
|
||||||
pub fn verify_pw1_sign(&mut self, pin: &[u8]) -> Result<(), Error> {
|
pub fn verify_pw1_sign(&mut self, pin: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw1_sign");
|
||||||
|
|
||||||
let verify = commands::verify_pw1_81(pin.to_vec());
|
let verify = commands::verify_pw1_81(pin.to_vec());
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -326,6 +356,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// access condition is only valid for one PSO:CDS command or remains
|
/// access condition is only valid for one PSO:CDS command or remains
|
||||||
/// valid for several attempts.
|
/// valid for several attempts.
|
||||||
pub fn verify_pw1_sign_pinpad(&mut self) -> Result<(), Error> {
|
pub fn verify_pw1_sign_pinpad(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw1_sign_pinpad");
|
||||||
|
|
||||||
let res = self.tx().pinpad_verify(PinType::Sign)?;
|
let res = self.tx().pinpad_verify(PinType::Sign)?;
|
||||||
RawResponse::try_from(res)?.try_into()
|
RawResponse::try_from(res)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -339,6 +371,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// - some cards that don't support this instruction may decrease the pin's error count,
|
/// - some cards that don't support this instruction may decrease the pin's error count,
|
||||||
/// eventually requiring the user to reset the pin)
|
/// eventually requiring the user to reset the pin)
|
||||||
pub fn check_pw1_sign(&mut self) -> Result<(), Error> {
|
pub fn check_pw1_sign(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: check_pw1_sign");
|
||||||
|
|
||||||
let verify = commands::verify_pw1_81(vec![]);
|
let verify = commands::verify_pw1_81(vec![]);
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -346,6 +380,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Verify PW1 (user).
|
/// Verify PW1 (user).
|
||||||
/// (For operations except signing, mode 82).
|
/// (For operations except signing, mode 82).
|
||||||
pub fn verify_pw1_user(&mut self, pin: &[u8]) -> Result<(), Error> {
|
pub fn verify_pw1_user(&mut self, pin: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw1_user");
|
||||||
|
|
||||||
let verify = commands::verify_pw1_82(pin.to_vec());
|
let verify = commands::verify_pw1_82(pin.to_vec());
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -355,6 +391,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// an error is returned.
|
/// an error is returned.
|
||||||
|
|
||||||
pub fn verify_pw1_user_pinpad(&mut self) -> Result<(), Error> {
|
pub fn verify_pw1_user_pinpad(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw1_user_pinpad");
|
||||||
|
|
||||||
let res = self.tx().pinpad_verify(PinType::User)?;
|
let res = self.tx().pinpad_verify(PinType::User)?;
|
||||||
RawResponse::try_from(res)?.try_into()
|
RawResponse::try_from(res)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -369,12 +407,16 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// - some cards that don't support this instruction may decrease the pin's error count,
|
/// - some cards that don't support this instruction may decrease the pin's error count,
|
||||||
/// eventually requiring the user to reset the pin)
|
/// eventually requiring the user to reset the pin)
|
||||||
pub fn check_pw1_user(&mut self) -> Result<(), Error> {
|
pub fn check_pw1_user(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: check_pw1_user");
|
||||||
|
|
||||||
let verify = commands::verify_pw1_82(vec![]);
|
let verify = commands::verify_pw1_82(vec![]);
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verify PW3 (admin).
|
/// Verify PW3 (admin).
|
||||||
pub fn verify_pw3(&mut self, pin: &[u8]) -> Result<(), Error> {
|
pub fn verify_pw3(&mut self, pin: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw3");
|
||||||
|
|
||||||
let verify = commands::verify_pw3(pin.to_vec());
|
let verify = commands::verify_pw3(pin.to_vec());
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -382,6 +424,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Verify PW3 (admin) using a pinpad on the card reader. If no usable
|
/// Verify PW3 (admin) using a pinpad on the card reader. If no usable
|
||||||
/// pinpad is found, an error is returned.
|
/// pinpad is found, an error is returned.
|
||||||
pub fn verify_pw3_pinpad(&mut self) -> Result<(), Error> {
|
pub fn verify_pw3_pinpad(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: verify_pw3_pinpad");
|
||||||
|
|
||||||
let res = self.tx().pinpad_verify(PinType::Admin)?;
|
let res = self.tx().pinpad_verify(PinType::Admin)?;
|
||||||
RawResponse::try_from(res)?.try_into()
|
RawResponse::try_from(res)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -395,6 +439,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// - some cards that don't support this instruction may decrease the pin's error count,
|
/// - some cards that don't support this instruction may decrease the pin's error count,
|
||||||
/// eventually requiring the user to reset the pin)
|
/// eventually requiring the user to reset the pin)
|
||||||
pub fn check_pw3(&mut self) -> Result<(), Error> {
|
pub fn check_pw3(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: check_pw3");
|
||||||
|
|
||||||
let verify = commands::verify_pw3(vec![]);
|
let verify = commands::verify_pw3(vec![]);
|
||||||
apdu::send_command(self.tx(), verify, false)?.try_into()
|
apdu::send_command(self.tx(), verify, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -403,6 +449,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
///
|
///
|
||||||
/// The current value of PW1 must be presented in `old` for authorization.
|
/// The current value of PW1 must be presented in `old` for authorization.
|
||||||
pub fn change_pw1(&mut self, old: &[u8], new: &[u8]) -> Result<(), Error> {
|
pub fn change_pw1(&mut self, old: &[u8], new: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: change_pw1");
|
||||||
|
|
||||||
let mut data = vec![];
|
let mut data = vec![];
|
||||||
data.extend(old);
|
data.extend(old);
|
||||||
data.extend(new);
|
data.extend(new);
|
||||||
|
@ -414,6 +462,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Change the value of PW1 (0x81) using a pinpad on the
|
/// Change the value of PW1 (0x81) using a pinpad on the
|
||||||
/// card reader. If no usable pinpad is found, an error is returned.
|
/// card reader. If no usable pinpad is found, an error is returned.
|
||||||
pub fn change_pw1_pinpad(&mut self) -> Result<(), Error> {
|
pub fn change_pw1_pinpad(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: change_pw1_pinpad");
|
||||||
|
|
||||||
// Note: for change PW, only 0x81 and 0x83 are used!
|
// Note: for change PW, only 0x81 and 0x83 are used!
|
||||||
// 0x82 is implicitly the same as 0x81.
|
// 0x82 is implicitly the same as 0x81.
|
||||||
let res = self.tx().pinpad_modify(PinType::Sign)?;
|
let res = self.tx().pinpad_modify(PinType::Sign)?;
|
||||||
|
@ -424,6 +474,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
///
|
///
|
||||||
/// The current value of PW3 must be presented in `old` for authorization.
|
/// The current value of PW3 must be presented in `old` for authorization.
|
||||||
pub fn change_pw3(&mut self, old: &[u8], new: &[u8]) -> Result<(), Error> {
|
pub fn change_pw3(&mut self, old: &[u8], new: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: change_pw3");
|
||||||
|
|
||||||
let mut data = vec![];
|
let mut data = vec![];
|
||||||
data.extend(old);
|
data.extend(old);
|
||||||
data.extend(new);
|
data.extend(new);
|
||||||
|
@ -435,6 +487,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Change the value of PW3 (admin password) using a pinpad on the
|
/// Change the value of PW3 (admin password) using a pinpad on the
|
||||||
/// card reader. If no usable pinpad is found, an error is returned.
|
/// card reader. If no usable pinpad is found, an error is returned.
|
||||||
pub fn change_pw3_pinpad(&mut self) -> Result<(), Error> {
|
pub fn change_pw3_pinpad(&mut self) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: change_pw3_pinpad");
|
||||||
|
|
||||||
let res = self.tx().pinpad_modify(PinType::Admin)?;
|
let res = self.tx().pinpad_modify(PinType::Admin)?;
|
||||||
RawResponse::try_from(res)?.try_into()
|
RawResponse::try_from(res)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -451,6 +505,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
new_pw1: &[u8],
|
new_pw1: &[u8],
|
||||||
resetting_code: Option<&[u8]>,
|
resetting_code: Option<&[u8]>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: reset_retry_counter_pw1");
|
||||||
|
|
||||||
let reset = commands::reset_retry_counter_pw1(resetting_code, new_pw1);
|
let reset = commands::reset_retry_counter_pw1(resetting_code, new_pw1);
|
||||||
apdu::send_command(self.tx(), reset, false)?.try_into()
|
apdu::send_command(self.tx(), reset, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -498,6 +554,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// (consider using the `decipher()` method if you don't want to create
|
/// (consider using the `decipher()` method if you don't want to create
|
||||||
/// the data field manually)
|
/// the data field manually)
|
||||||
pub fn pso_decipher(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
pub fn pso_decipher(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: pso_decipher");
|
||||||
|
|
||||||
// The OpenPGP card is already connected and PW1 82 has been verified
|
// The OpenPGP card is already connected and PW1 82 has been verified
|
||||||
let dec_cmd = commands::decryption(data);
|
let dec_cmd = commands::decryption(data);
|
||||||
let resp = apdu::send_command(self.tx(), dec_cmd, true)?;
|
let resp = apdu::send_command(self.tx(), dec_cmd, true)?;
|
||||||
|
@ -529,6 +587,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// (consider using the `signature_for_hash()` method if you don't
|
/// (consider using the `signature_for_hash()` method if you don't
|
||||||
/// want to create the data field manually)
|
/// want to create the data field manually)
|
||||||
pub fn pso_compute_digital_signature(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
pub fn pso_compute_digital_signature(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: pso_compute_digital_signature");
|
||||||
|
|
||||||
let cds_cmd = commands::signature(data);
|
let cds_cmd = commands::signature(data);
|
||||||
|
|
||||||
let resp = apdu::send_command(self.tx(), cds_cmd, true)?;
|
let resp = apdu::send_command(self.tx(), cds_cmd, true)?;
|
||||||
|
@ -558,6 +618,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// (consider using the `authenticate_for_hash()` method if you don't
|
/// (consider using the `authenticate_for_hash()` method if you don't
|
||||||
/// want to create the data field manually)
|
/// want to create the data field manually)
|
||||||
pub fn internal_authenticate(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
pub fn internal_authenticate(&mut self, data: Vec<u8>) -> Result<Vec<u8>, Error> {
|
||||||
|
log::info!("OpenPgpTransaction: internal_authenticate");
|
||||||
|
|
||||||
let ia_cmd = commands::internal_authenticate(data);
|
let ia_cmd = commands::internal_authenticate(data);
|
||||||
let resp = apdu::send_command(self.tx(), ia_cmd, true)?;
|
let resp = apdu::send_command(self.tx(), ia_cmd, true)?;
|
||||||
|
|
||||||
|
@ -567,11 +629,15 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
// --- admin ---
|
// --- admin ---
|
||||||
|
|
||||||
pub fn set_name(&mut self, name: &[u8]) -> Result<(), Error> {
|
pub fn set_name(&mut self, name: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_name");
|
||||||
|
|
||||||
let put_name = commands::put_name(name.to_vec());
|
let put_name = commands::put_name(name.to_vec());
|
||||||
apdu::send_command(self.tx(), put_name, false)?.try_into()
|
apdu::send_command(self.tx(), put_name, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_lang(&mut self, lang: &[Lang]) -> Result<(), Error> {
|
pub fn set_lang(&mut self, lang: &[Lang]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_lang");
|
||||||
|
|
||||||
let bytes: Vec<u8> = lang
|
let bytes: Vec<u8> = lang
|
||||||
.iter()
|
.iter()
|
||||||
.flat_map(|&l| Into::<Vec<u8>>::into(l))
|
.flat_map(|&l| Into::<Vec<u8>>::into(l))
|
||||||
|
@ -582,11 +648,15 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_sex(&mut self, sex: Sex) -> Result<(), Error> {
|
pub fn set_sex(&mut self, sex: Sex) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_sex");
|
||||||
|
|
||||||
let put_sex = commands::put_sex((&sex).into());
|
let put_sex = commands::put_sex((&sex).into());
|
||||||
apdu::send_command(self.tx(), put_sex, false)?.try_into()
|
apdu::send_command(self.tx(), put_sex, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_url(&mut self, url: &[u8]) -> Result<(), Error> {
|
pub fn set_url(&mut self, url: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_url");
|
||||||
|
|
||||||
let put_url = commands::put_url(url.to_vec());
|
let put_url = commands::put_url(url.to_vec());
|
||||||
apdu::send_command(self.tx(), put_url, false)?.try_into()
|
apdu::send_command(self.tx(), put_url, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -596,6 +666,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
time: KeyGenerationTime,
|
time: KeyGenerationTime,
|
||||||
key_type: KeyType,
|
key_type: KeyType,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_creation_time");
|
||||||
|
|
||||||
// Timestamp update
|
// Timestamp update
|
||||||
let time_value: Vec<u8> = time
|
let time_value: Vec<u8> = time
|
||||||
.get()
|
.get()
|
||||||
|
@ -611,6 +683,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_fingerprint(&mut self, fp: Fingerprint, key_type: KeyType) -> Result<(), Error> {
|
pub fn set_fingerprint(&mut self, fp: Fingerprint, key_type: KeyType) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_fingerprint");
|
||||||
|
|
||||||
let fp_cmd = commands::put_data(&[key_type.fingerprint_put_tag()], fp.as_bytes().to_vec());
|
let fp_cmd = commands::put_data(&[key_type.fingerprint_put_tag()], fp.as_bytes().to_vec());
|
||||||
|
|
||||||
apdu::send_command(self.tx(), fp_cmd, false)?.try_into()
|
apdu::send_command(self.tx(), fp_cmd, false)?.try_into()
|
||||||
|
@ -632,6 +706,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
pw_status: &PWStatusBytes,
|
pw_status: &PWStatusBytes,
|
||||||
long: bool,
|
long: bool,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_pw_status_bytes");
|
||||||
|
|
||||||
let data = pw_status.serialize_for_put(long);
|
let data = pw_status.serialize_for_put(long);
|
||||||
|
|
||||||
let cmd = commands::put_pw_status(data);
|
let cmd = commands::put_pw_status(data);
|
||||||
|
@ -643,6 +719,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Call select_data() before calling this fn, to select a particular
|
/// Call select_data() before calling this fn, to select a particular
|
||||||
/// certificate (if the card supports multiple certificates).
|
/// certificate (if the card supports multiple certificates).
|
||||||
pub fn set_cardholder_certificate(&mut self, data: Vec<u8>) -> Result<(), Error> {
|
pub fn set_cardholder_certificate(&mut self, data: Vec<u8>) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_cardholder_certificate");
|
||||||
|
|
||||||
let cmd = commands::put_cardholder_certificate(data);
|
let cmd = commands::put_cardholder_certificate(data);
|
||||||
apdu::send_command(self.tx(), cmd, false)?.try_into()
|
apdu::send_command(self.tx(), cmd, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
@ -654,6 +732,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
key_type: KeyType,
|
key_type: KeyType,
|
||||||
algo: &Algo,
|
algo: &Algo,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_algorithm_attributes");
|
||||||
|
|
||||||
// Command to PUT the algorithm attributes
|
// Command to PUT the algorithm attributes
|
||||||
let cmd = commands::put_data(&[key_type.algorithm_tag()], algo.to_data_object()?);
|
let cmd = commands::put_data(&[key_type.algorithm_tag()], algo.to_data_object()?);
|
||||||
|
|
||||||
|
@ -663,6 +743,8 @@ impl<'a> OpenPgpTransaction<'a> {
|
||||||
/// Set resetting code
|
/// Set resetting code
|
||||||
/// (4.3.4 Resetting Code)
|
/// (4.3.4 Resetting Code)
|
||||||
pub fn set_resetting_code(&mut self, resetting_code: &[u8]) -> Result<(), Error> {
|
pub fn set_resetting_code(&mut self, resetting_code: &[u8]) -> Result<(), Error> {
|
||||||
|
log::info!("OpenPgpTransaction: set_resetting_code");
|
||||||
|
|
||||||
let cmd = commands::put_data(&[0xd3], resetting_code.to_vec());
|
let cmd = commands::put_data(&[0xd3], resetting_code.to_vec());
|
||||||
apdu::send_command(self.tx(), cmd, false)?.try_into()
|
apdu::send_command(self.tx(), cmd, false)?.try_into()
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ impl<'b> PcscTransaction<'b> {
|
||||||
// A transaction has been successfully started
|
// A transaction has been successfully started
|
||||||
|
|
||||||
if was_reset {
|
if was_reset {
|
||||||
log::debug!("start_tx: card was reset, select!");
|
log::trace!("start_tx: card was reset, select!");
|
||||||
|
|
||||||
let mut txc = Self {
|
let mut txc = Self {
|
||||||
tx,
|
tx,
|
||||||
|
@ -113,7 +113,7 @@ impl<'b> PcscTransaction<'b> {
|
||||||
|
|
||||||
c = c_;
|
c = c_;
|
||||||
|
|
||||||
log::debug!("start_tx: do reconnect");
|
log::trace!("start_tx: do reconnect");
|
||||||
|
|
||||||
{
|
{
|
||||||
c.reconnect(mode, pcsc::Protocols::ANY, Disposition::ResetCard)
|
c.reconnect(mode, pcsc::Protocols::ANY, Disposition::ResetCard)
|
||||||
|
@ -125,12 +125,12 @@ impl<'b> PcscTransaction<'b> {
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
|
|
||||||
log::debug!("start_tx: reconnected.");
|
log::trace!("start_tx: reconnected.");
|
||||||
|
|
||||||
// -> try opening a transaction again
|
// -> try opening a transaction again
|
||||||
}
|
}
|
||||||
Err((_, e)) => {
|
Err((_, e)) => {
|
||||||
log::debug!("start_tx: error {:?}", e);
|
log::trace!("start_tx: error {:?}", e);
|
||||||
break Err(Error::Smartcard(SmartcardError::Error(format!(
|
break Err(Error::Smartcard(SmartcardError::Error(format!(
|
||||||
"Error: {:?}",
|
"Error: {:?}",
|
||||||
e
|
e
|
||||||
|
@ -212,8 +212,6 @@ impl CardTransaction for PcscTransaction<'_> {
|
||||||
_ => Error::Smartcard(SmartcardError::Error(format!("Transmit failed: {:?}", e))),
|
_ => Error::Smartcard(SmartcardError::Error(format!("Transmit failed: {:?}", e))),
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
log::debug!(" <- APDU response: {:x?}", resp);
|
|
||||||
|
|
||||||
Ok(resp.to_vec())
|
Ok(resp.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +300,7 @@ impl CardTransaction for PcscTransaction<'_> {
|
||||||
// 19 abData BYTE[] Data to send to the ICC
|
// 19 abData BYTE[] Data to send to the ICC
|
||||||
send.extend(ab_data);
|
send.extend(ab_data);
|
||||||
|
|
||||||
log::debug!("pcsc pinpad_verify send: {:x?}", send);
|
log::trace!("pcsc pinpad_verify send: {:x?}", send);
|
||||||
|
|
||||||
let mut recv = vec![0xAA; 256];
|
let mut recv = vec![0xAA; 256];
|
||||||
|
|
||||||
|
@ -321,7 +319,7 @@ impl CardTransaction for PcscTransaction<'_> {
|
||||||
Error::Smartcard(SmartcardError::Error(format!("pcsc Error: {:?}", e)))
|
Error::Smartcard(SmartcardError::Error(format!("pcsc Error: {:?}", e)))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
log::debug!(" <- pcsc pinpad_verify result: {:x?}", res);
|
log::trace!(" <- pcsc pinpad_verify result: {:x?}", res);
|
||||||
|
|
||||||
Ok(res.to_vec())
|
Ok(res.to_vec())
|
||||||
}
|
}
|
||||||
|
@ -405,7 +403,7 @@ impl CardTransaction for PcscTransaction<'_> {
|
||||||
// 19 abData BYTE[] Data to send to the ICC
|
// 19 abData BYTE[] Data to send to the ICC
|
||||||
send.extend(ab_data);
|
send.extend(ab_data);
|
||||||
|
|
||||||
log::debug!("pcsc pinpad_modify send: {:x?}", send);
|
log::trace!("pcsc pinpad_modify send: {:x?}", send);
|
||||||
|
|
||||||
let mut recv = vec![0xAA; 256];
|
let mut recv = vec![0xAA; 256];
|
||||||
|
|
||||||
|
@ -424,7 +422,7 @@ impl CardTransaction for PcscTransaction<'_> {
|
||||||
Error::Smartcard(SmartcardError::Error(format!("pcsc Error: {:?}", e)))
|
Error::Smartcard(SmartcardError::Error(format!("pcsc Error: {:?}", e)))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
log::debug!(" <- pcsc pinpad_modify result: {:x?}", res);
|
log::trace!(" <- pcsc pinpad_modify result: {:x?}", res);
|
||||||
|
|
||||||
Ok(res.to_vec())
|
Ok(res.to_vec())
|
||||||
}
|
}
|
||||||
|
@ -442,29 +440,29 @@ impl PcscBackend {
|
||||||
/// A list of "raw" opened PCSC Cards (without selecting the OpenPGP card
|
/// A list of "raw" opened PCSC Cards (without selecting the OpenPGP card
|
||||||
/// application)
|
/// application)
|
||||||
fn raw_pcsc_cards(mode: pcsc::ShareMode) -> Result<Vec<pcsc::Card>, SmartcardError> {
|
fn raw_pcsc_cards(mode: pcsc::ShareMode) -> Result<Vec<pcsc::Card>, SmartcardError> {
|
||||||
log::debug!("raw_pcsc_cards start");
|
log::trace!("raw_pcsc_cards start");
|
||||||
|
|
||||||
let ctx = match pcsc::Context::establish(pcsc::Scope::User) {
|
let ctx = match pcsc::Context::establish(pcsc::Scope::User) {
|
||||||
Ok(ctx) => ctx,
|
Ok(ctx) => ctx,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::debug!("Context::establish failed: {:?}", err);
|
log::trace!("Context::establish failed: {:?}", err);
|
||||||
return Err(SmartcardError::ContextError(err.to_string()));
|
return Err(SmartcardError::ContextError(err.to_string()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
log::debug!("raw_pcsc_cards got context");
|
log::trace!("raw_pcsc_cards got context");
|
||||||
|
|
||||||
// List available readers.
|
// List available readers.
|
||||||
let mut readers_buf = [0; 2048];
|
let mut readers_buf = [0; 2048];
|
||||||
let readers = match ctx.list_readers(&mut readers_buf) {
|
let readers = match ctx.list_readers(&mut readers_buf) {
|
||||||
Ok(readers) => readers,
|
Ok(readers) => readers,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::debug!("list_readers failed: {:?}", err);
|
log::trace!("list_readers failed: {:?}", err);
|
||||||
return Err(SmartcardError::ReaderError(err.to_string()));
|
return Err(SmartcardError::ReaderError(err.to_string()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
log::debug!(" readers: {:?}", readers);
|
log::trace!(" readers: {:?}", readers);
|
||||||
|
|
||||||
let mut found_reader = false;
|
let mut found_reader = false;
|
||||||
|
|
||||||
|
@ -475,13 +473,13 @@ impl PcscBackend {
|
||||||
// We've seen at least one smartcard reader
|
// We've seen at least one smartcard reader
|
||||||
found_reader = true;
|
found_reader = true;
|
||||||
|
|
||||||
log::debug!("Checking reader: {:?}", reader);
|
log::trace!("Checking reader: {:?}", reader);
|
||||||
|
|
||||||
// Try connecting to card in this reader
|
// Try connecting to card in this reader
|
||||||
let card = match ctx.connect(reader, mode, pcsc::Protocols::ANY) {
|
let card = match ctx.connect(reader, mode, pcsc::Protocols::ANY) {
|
||||||
Ok(card) => card,
|
Ok(card) => card,
|
||||||
Err(pcsc::Error::NoSmartcard) => {
|
Err(pcsc::Error::NoSmartcard) => {
|
||||||
log::debug!("No Smartcard");
|
log::trace!("No Smartcard");
|
||||||
|
|
||||||
continue; // try next reader
|
continue; // try next reader
|
||||||
}
|
}
|
||||||
|
@ -492,7 +490,7 @@ impl PcscBackend {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
log::debug!("Found card");
|
log::trace!("Found card");
|
||||||
|
|
||||||
cards.push(card);
|
cards.push(card);
|
||||||
}
|
}
|
||||||
|
@ -512,8 +510,8 @@ impl PcscBackend {
|
||||||
let mut cards: Vec<Self> = vec![];
|
let mut cards: Vec<Self> = vec![];
|
||||||
|
|
||||||
for mut card in Self::raw_pcsc_cards(mode).map_err(Error::Smartcard)? {
|
for mut card in Self::raw_pcsc_cards(mode).map_err(Error::Smartcard)? {
|
||||||
log::debug!("cards_filter: next card");
|
log::trace!("cards_filter: next card");
|
||||||
log::debug!(" status: {:x?}", card.status2_owned());
|
log::trace!(" status: {:x?}", card.status2_owned());
|
||||||
|
|
||||||
let mut store_card = false;
|
let mut store_card = false;
|
||||||
{
|
{
|
||||||
|
@ -523,11 +521,11 @@ impl PcscBackend {
|
||||||
|
|
||||||
{
|
{
|
||||||
if let Err(e) = PcscTransaction::select(&mut txc) {
|
if let Err(e) = PcscTransaction::select(&mut txc) {
|
||||||
log::debug!(" select error: {:?}", e);
|
log::trace!(" select error: {:?}", e);
|
||||||
} else {
|
} else {
|
||||||
// successfully opened the OpenPGP application
|
// successfully opened the OpenPGP application
|
||||||
log::debug!(" select ok, will read ARD");
|
log::trace!(" select ok, will read ARD");
|
||||||
log::debug!(" status: {:x?}", txc.tx.status2_owned());
|
log::trace!(" status: {:x?}", txc.tx.status2_owned());
|
||||||
|
|
||||||
if let Some(ident) = ident {
|
if let Some(ident) = ident {
|
||||||
if let Ok(ard) = PcscTransaction::application_related_data(&mut txc) {
|
if let Ok(ard) = PcscTransaction::application_related_data(&mut txc) {
|
||||||
|
@ -535,12 +533,12 @@ impl PcscBackend {
|
||||||
|
|
||||||
if aid.ident() == ident.to_ascii_uppercase() {
|
if aid.ident() == ident.to_ascii_uppercase() {
|
||||||
// FIXME: handle multiple cards with matching ident
|
// FIXME: handle multiple cards with matching ident
|
||||||
log::debug!(" will use: {:?}", ident);
|
log::info!(" found card: {:?} (will use)", ident);
|
||||||
|
|
||||||
// we want to return this one card
|
// we want to return this one card
|
||||||
store_card = true;
|
store_card = true;
|
||||||
} else {
|
} else {
|
||||||
log::debug!(" won't use {:?}", aid.ident());
|
log::info!(" found card: {:?} (won't use)", aid.ident());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// couldn't read ARD for this card.
|
// couldn't read ARD for this card.
|
||||||
|
@ -564,7 +562,7 @@ impl PcscBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log::debug!("cards_filter: found {} cards", cards.len());
|
log::trace!("cards_filter: found {} cards", cards.len());
|
||||||
|
|
||||||
Ok(cards)
|
Ok(cards)
|
||||||
}
|
}
|
||||||
|
@ -581,7 +579,7 @@ impl PcscBackend {
|
||||||
/// A fully initialized PcscCard is returned: the OpenPGP application has
|
/// A fully initialized PcscCard is returned: the OpenPGP application has
|
||||||
/// been selected, card_caps and reader_caps have been initialized.
|
/// been selected, card_caps and reader_caps have been initialized.
|
||||||
pub fn open_by_ident(ident: &str, mode: Option<pcsc::ShareMode>) -> Result<Self, Error> {
|
pub fn open_by_ident(ident: &str, mode: Option<pcsc::ShareMode>) -> Result<Self, Error> {
|
||||||
log::debug!("open_by_ident for {:?}", ident);
|
log::trace!("open_by_ident for {:?}", ident);
|
||||||
|
|
||||||
let mut cards = Self::cards_filter(Some(ident), default_mode(mode))?;
|
let mut cards = Self::cards_filter(Some(ident), default_mode(mode))?;
|
||||||
|
|
||||||
|
@ -609,7 +607,7 @@ impl PcscBackend {
|
||||||
/// - Obtain and store feature lists from reader (pinpad functionality).
|
/// - Obtain and store feature lists from reader (pinpad functionality).
|
||||||
/// - Get ARD from card, set CardCaps based on ARD.
|
/// - Get ARD from card, set CardCaps based on ARD.
|
||||||
fn initialize_card(mut self) -> Result<Self, Error> {
|
fn initialize_card(mut self) -> Result<Self, Error> {
|
||||||
log::debug!("pcsc initialize_card");
|
log::trace!("pcsc initialize_card");
|
||||||
|
|
||||||
let mut h: HashMap<u8, Tlv> = HashMap::default();
|
let mut h: HashMap<u8, Tlv> = HashMap::default();
|
||||||
|
|
||||||
|
@ -618,7 +616,7 @@ impl PcscBackend {
|
||||||
// Get Features from reader (pinpad verify/modify)
|
// Get Features from reader (pinpad verify/modify)
|
||||||
if let Ok(feat) = txc.features() {
|
if let Ok(feat) = txc.features() {
|
||||||
for tlv in feat {
|
for tlv in feat {
|
||||||
log::debug!(" Found reader feature {:?}", tlv);
|
log::trace!(" Found reader feature {:?}", tlv);
|
||||||
h.insert(tlv.tag().into(), tlv);
|
h.insert(tlv.tag().into(), tlv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ impl ScdBackend {
|
||||||
self.send2(send)?;
|
self.send2(send)?;
|
||||||
|
|
||||||
while let Some(response) = rt.block_on(self.agent.next()) {
|
while let Some(response) = rt.block_on(self.agent.next()) {
|
||||||
log::debug!("init res: {:x?}", response);
|
log::trace!("init res: {:x?}", response);
|
||||||
|
|
||||||
if let Ok(Response::Status { .. }) = response {
|
if let Ok(Response::Status { .. }) = response {
|
||||||
// drop remaining lines
|
// drop remaining lines
|
||||||
|
@ -172,7 +172,7 @@ impl ScdBackend {
|
||||||
let mut rt = RT.lock().unwrap();
|
let mut rt = RT.lock().unwrap();
|
||||||
|
|
||||||
while let Some(response) = rt.block_on(self.agent.next()) {
|
while let Some(response) = rt.block_on(self.agent.next()) {
|
||||||
log::debug!("select res: {:x?}", response);
|
log::trace!("select res: {:x?}", response);
|
||||||
|
|
||||||
if response.is_err() {
|
if response.is_err() {
|
||||||
return Err(Error::Smartcard(SmartcardError::CardNotFound(
|
return Err(Error::Smartcard(SmartcardError::CardNotFound(
|
||||||
|
@ -183,7 +183,7 @@ impl ScdBackend {
|
||||||
if let Ok(Response::Status { .. }) = response {
|
if let Ok(Response::Status { .. }) = response {
|
||||||
// drop remaining lines
|
// drop remaining lines
|
||||||
while let Some(_drop) = rt.block_on(self.agent.next()) {
|
while let Some(_drop) = rt.block_on(self.agent.next()) {
|
||||||
log::debug!("select drop: {:x?}", _drop);
|
log::trace!("select drop: {:x?}", _drop);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
@ -201,7 +201,7 @@ impl ScdBackend {
|
||||||
let mut rt = RT.lock().unwrap();
|
let mut rt = RT.lock().unwrap();
|
||||||
|
|
||||||
while let Some(response) = rt.block_on(self.agent.next()) {
|
while let Some(response) = rt.block_on(self.agent.next()) {
|
||||||
log::debug!("select res: {:x?}", response);
|
log::trace!("select res: {:x?}", response);
|
||||||
|
|
||||||
if let Err(e) = response {
|
if let Err(e) = response {
|
||||||
return Err(Error::Smartcard(SmartcardError::Error(format!("{:?}", e))));
|
return Err(Error::Smartcard(SmartcardError::Error(format!("{:?}", e))));
|
||||||
|
@ -210,7 +210,7 @@ impl ScdBackend {
|
||||||
if let Ok(..) = response {
|
if let Ok(..) = response {
|
||||||
// drop remaining lines
|
// drop remaining lines
|
||||||
while let Some(_drop) = rt.block_on(self.agent.next()) {
|
while let Some(_drop) = rt.block_on(self.agent.next()) {
|
||||||
log::debug!(" drop: {:x?}", _drop);
|
log::trace!(" drop: {:x?}", _drop);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
@ -251,7 +251,7 @@ impl CardTransaction for ScdTransaction<'_> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let send = format!("SCD APDU {}{}\n", ext, hex);
|
let send = format!("SCD APDU {}{}\n", ext, hex);
|
||||||
log::debug!("SCDC command: '{}'", send);
|
log::trace!("SCDC command: '{}'", send);
|
||||||
|
|
||||||
if send.len() > ASSUAN_LINELENGTH {
|
if send.len() > ASSUAN_LINELENGTH {
|
||||||
return Err(Error::Smartcard(SmartcardError::Error(format!(
|
return Err(Error::Smartcard(SmartcardError::Error(format!(
|
||||||
|
@ -265,7 +265,7 @@ impl CardTransaction for ScdTransaction<'_> {
|
||||||
let mut rt = RT.lock().unwrap();
|
let mut rt = RT.lock().unwrap();
|
||||||
|
|
||||||
while let Some(response) = rt.block_on(self.scd.agent.next()) {
|
while let Some(response) = rt.block_on(self.scd.agent.next()) {
|
||||||
log::debug!("res: {:x?}", response);
|
log::trace!("res: {:x?}", response);
|
||||||
if response.is_err() {
|
if response.is_err() {
|
||||||
return Err(Error::Smartcard(SmartcardError::Error(format!(
|
return Err(Error::Smartcard(SmartcardError::Error(format!(
|
||||||
"Unexpected error response from SCD {:?}",
|
"Unexpected error response from SCD {:?}",
|
||||||
|
|
Loading…
Reference in a new issue