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].
This commit is contained in:
Heiko Schaefer 2021-08-07 19:27:24 +02:00
parent 260c38ef25
commit a0d92d2dc4
4 changed files with 24 additions and 11 deletions

View file

@ -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<u8> {
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()
}
}

View file

@ -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<Response, OpenpgpCardError> {
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,

View file

@ -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<u8>,
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()?;

View file

@ -124,7 +124,7 @@ pub trait CardUploadableKey {
fn get_ts(&self) -> u32;
/// fingerprint
fn get_fp(&self) -> Vec<u8>;
fn get_fp(&self) -> [u8; 20];
}
/// Algorithm-independent container for public key material retrieved from