Handle key import when a card doesn't support the "Algorithm Information" command.

This commit is contained in:
Heiko Schaefer 2021-08-05 21:10:18 +02:00
parent 3effe39aa1
commit f42596f2f5
2 changed files with 32 additions and 5 deletions

View file

@ -529,7 +529,15 @@ impl CardApp {
key: Box<dyn CardUploadableKey>, key: Box<dyn CardUploadableKey>,
key_type: KeyType, key_type: KeyType,
) -> Result<(), OpenpgpCardError> { ) -> Result<(), OpenpgpCardError> {
let algo_list = self.list_supported_algo()?; let algo_list = self.list_supported_algo();
let algo_list = if algo_list.is_ok() {
algo_list.unwrap()
} else {
// An error is ok - it's fine if a card doesn't offer a list of
// supported algorithms
None
};
key_upload::upload_key(self, key, key_type, algo_list) key_upload::upload_key(self, key, key_type, algo_list)
} }

View file

@ -32,10 +32,29 @@ pub(crate) fn upload_key(
let rsa_bits = let rsa_bits =
(((rsa_key.get_n().len() * 8 + 31) / 32) * 32) as u16; (((rsa_key.get_n().len() * 8 + 31) / 32) * 32) as u16;
// FIXME: deal with absence of algo list (don't just unwrap!) // Get suitable algorithm from card's list, or try to derive it
// Get suitable algorithm from card's list // from the current algo settings on the card
let algo = let algo = if let Some(algo_list) = algo_list {
get_card_algo_rsa(algo_list.unwrap(), key_type, rsa_bits); get_card_algo_rsa(algo_list, key_type, rsa_bits)
} else {
// Get current settings for this KeyType and adjust the bit
// length.
// FIXME: caching?
let ard = card_app.get_app_data()?;
let algo = CardApp::get_algorithm_attributes(&ard, key_type)?;
if let Algo::Rsa(mut rsa) = algo {
rsa.len_n = rsa_bits;
rsa
} else {
// We don't expect a card to support non-RSA algos when
// it can't provide an algorithm list.
unimplemented!("Unexpected: current algo is not RSA");
}
};
let algo_cmd = rsa_algo_attrs_cmd(key_type, rsa_bits, &algo)?; let algo_cmd = rsa_algo_attrs_cmd(key_type, rsa_bits, &algo)?;
let key_cmd = rsa_key_cmd(key_type, rsa_key, &algo)?; let key_cmd = rsa_key_cmd(key_type, rsa_key, &algo)?;