From a0d92d2dc43c2c44e534c846e65f1e757b7ba05e Mon Sep 17 00:00:00 2001 From: Heiko Schaefer Date: Sat, 7 Aug 2021 19:27:24 +0200 Subject: [PATCH] Refactor: add a set_fingerprint() method to CardApp. Use that method instead of manually calling the apdu command. Change type of fingerprint in CardUploadableKey to [u8; 20]. --- openpgp-card-sequoia/src/lib.rs | 8 ++++++-- openpgp-card/src/card_app.rs | 13 +++++++++++++ openpgp-card/src/keys.rs | 12 ++++-------- openpgp-card/src/lib.rs | 2 +- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/openpgp-card-sequoia/src/lib.rs b/openpgp-card-sequoia/src/lib.rs index df60cd5..38d7a8f 100644 --- a/openpgp-card-sequoia/src/lib.rs +++ b/openpgp-card-sequoia/src/lib.rs @@ -5,6 +5,7 @@ //! sequoia_openpgp data structures. use std::convert::TryFrom; +use std::convert::TryInto; use std::error::Error; use std::io; use std::time::SystemTime; @@ -171,8 +172,11 @@ impl CardUploadableKey for SequoiaKey { ts.into() } - fn get_fp(&self) -> Vec { - self.key.fingerprint().as_bytes().to_vec() + fn get_fp(&self) -> [u8; 20] { + let fp = self.key.fingerprint(); + assert_eq!(fp.as_bytes().len(), 20); + + fp.as_bytes().try_into().unwrap() } } diff --git a/openpgp-card/src/card_app.rs b/openpgp-card/src/card_app.rs index 809f01a..19479ab 100644 --- a/openpgp-card/src/card_app.rs +++ b/openpgp-card/src/card_app.rs @@ -546,6 +546,19 @@ impl CardApp { apdu::send_command(&mut self.card_client, time_cmd, false) } + pub fn set_fingerprint( + &mut self, + fp: [u8; 20], + key_type: KeyType, + ) -> Result { + let fp_cmd = commands::put_data( + &[key_type.get_fingerprint_put_tag()], + fp.to_vec(), + ); + + apdu::send_command(self.card(), fp_cmd, true) + } + /// Set algorithm attributes [4.4.3.9 Algorithm Attributes] pub fn set_algorithm_attributes( &mut self, diff --git a/openpgp-card/src/keys.rs b/openpgp-card/src/keys.rs index e465c4b..522566a 100644 --- a/openpgp-card/src/keys.rs +++ b/openpgp-card/src/keys.rs @@ -40,10 +40,7 @@ pub(crate) fn gen_key_with_metadata( // calculate/store fingerprint let fp = fp_from_pub(&pubkey, time)?; - let fp_cmd = - commands::put_data(&[key_type.get_fingerprint_put_tag()], fp.to_vec()); - - apdu::send_command(card_app.card(), fp_cmd, true)?.check_ok()?; + card_app.set_fingerprint(fp, key_type)?.check_ok()?; Ok(()) } @@ -442,12 +439,10 @@ fn copy_key_to_card( card_app: &mut CardApp, key_type: KeyType, ts: u32, - fp: Vec, + fp: [u8; 20], algo: &Algo, key_cmd: Command, ) -> Result<(), OpenpgpCardError> { - let fp_cmd = commands::put_data(&[key_type.get_fingerprint_put_tag()], fp); - // Send all the commands // FIXME: Only write algo attributes to the card if "extended @@ -457,7 +452,8 @@ fn copy_key_to_card( .check_ok()?; apdu::send_command(card_app.card(), key_cmd, false)?.check_ok()?; - apdu::send_command(card_app.card(), fp_cmd, false)?.check_ok()?; + + card_app.set_fingerprint(fp, key_type)?.check_ok()?; card_app.set_creation_time(ts, key_type)?.check_ok()?; diff --git a/openpgp-card/src/lib.rs b/openpgp-card/src/lib.rs index 1e08fe9..a46a23f 100644 --- a/openpgp-card/src/lib.rs +++ b/openpgp-card/src/lib.rs @@ -124,7 +124,7 @@ pub trait CardUploadableKey { fn get_ts(&self) -> u32; /// fingerprint - fn get_fp(&self) -> Vec; + fn get_fp(&self) -> [u8; 20]; } /// Algorithm-independent container for public key material retrieved from