diff --git a/Cargo.lock b/Cargo.lock index 471b234..e16fda5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -332,7 +332,7 @@ dependencies = [ [[package]] name = "card-cli" -version = "1.8.2" +version = "1.8.3" dependencies = [ "authenticator", "base64 0.21.5", diff --git a/Cargo.toml b/Cargo.toml index d097855..2db2f29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "card-cli" -version = "1.8.2" +version = "1.8.3" authors = ["Hatter Jiang "] edition = "2018" diff --git a/src/cmd_pivmeta.rs b/src/cmd_pivmeta.rs index 3c992b8..0684f0e 100644 --- a/src/cmd_pivmeta.rs +++ b/src/cmd_pivmeta.rs @@ -7,10 +7,10 @@ use rust_util::util_msg; use rust_util::util_msg::MessageType; use x509_parser::parse_x509_certificate; use yubikey::{Key, YubiKey}; -use yubikey::piv::{AlgorithmId, metadata, Origin}; +use yubikey::piv::{AlgorithmId, metadata}; use crate::pivutil; -use crate::pivutil::{get_algorithm_id, slot_equals, ToStr}; +use crate::pivutil::{get_algorithm_id_by_certificate, slot_equals, ToStr}; use crate::pkiutil::bytes_to_pem; pub struct CommandImpl; @@ -57,11 +57,7 @@ impl Command for CommandImpl { } } - let origin_str = match meta.origin { - None => "none", - Some(Origin::Imported) => "imported", - Some(Origin::Generated) => "generated", - }; + let origin_str = meta.origin.to_str(); if json_output { json.insert("origin", origin_str.to_string()); } else { @@ -77,7 +73,7 @@ impl Command for CommandImpl { let cert = &k.certificate().cert.tbs_certificate; let slot_str = format!("{:x}", Into::::into(k.slot())); if slot_equals(&slot_id, &slot_str) { - if let Ok(algorithm_id) = get_algorithm_id(&k.certificate().cert.tbs_certificate.subject_public_key_info) { + if let Ok(algorithm_id) = get_algorithm_id_by_certificate(k.certificate()) { let algorithm_str = algorithm_id.to_str(); json.insert("algorithm", algorithm_str.to_string()); diff --git a/src/cmd_pivsummary.rs b/src/cmd_pivsummary.rs index b0e03ed..d340add 100644 --- a/src/cmd_pivsummary.rs +++ b/src/cmd_pivsummary.rs @@ -8,7 +8,7 @@ use x509_parser::parse_x509_certificate; use yubikey::{Certificate, YubiKey}; use yubikey::piv::{metadata, SlotId}; -use crate::pivutil::{get_algorithm_id, ORDERED_SLOTS, ToStr}; +use crate::pivutil::{get_algorithm_id_by_certificate, ORDERED_SLOTS, ToStr}; const NA: &str = "N/A"; @@ -120,7 +120,7 @@ fn print_summary_info(yubikey: &mut YubiKey, slot: SlotId, piv_slots: &mut Vec

{ @@ -80,7 +80,7 @@ impl Command for CommandImpl { AlgorithmId::Rsa1024 | AlgorithmId::Rsa2048 => { let pk_rsa = public_key_bit_string.raw_bytes(); - let keypair = opt_result!(Rsa::public_key_from_der_pkcs1(&pk_rsa), "Parse RSA failed: {}"); + let keypair = opt_result!(Rsa::public_key_from_der_pkcs1(pk_rsa), "Parse RSA failed: {}"); // let pub_key_der = opt_result!(keypair.public_key_to_der(), "RSA public key to der failed: {}"); // let pub_key_fingerprint = hex::encode(sha256_bytes(&pub_key_der)); let mut dmesg = vec![0; ((keypair.n().num_bits() + 7) / 8) as usize]; diff --git a/src/pivutil.rs b/src/pivutil.rs index 1b38126..c89de54 100644 --- a/src/pivutil.rs +++ b/src/pivutil.rs @@ -3,7 +3,7 @@ use spki::{ObjectIdentifier, SubjectPublicKeyInfoOwned}; use spki::der::{Decode, Encode}; use x509_parser::prelude::FromDer; use x509_parser::public_key::RSAPublicKey; -use yubikey::{PinPolicy, TouchPolicy}; +use yubikey::{Certificate, PinPolicy, TouchPolicy}; use yubikey::piv::{AlgorithmId, ManagementAlgorithmId, ManagementSlotId, Origin, RetiredSlotId}; use yubikey::piv::SlotId; @@ -106,6 +106,20 @@ impl ToStr for Origin { } } +impl ToStr for Option { + fn to_str(&self) -> &str { + match self { + None => "none", + Some(origin) => origin.to_str(), + } + } +} + +pub fn get_algorithm_id_by_certificate(certificate: &Certificate) -> XResult { + let tbs_certificate = &certificate.cert.tbs_certificate; + get_algorithm_id(&tbs_certificate.subject_public_key_info) +} + pub fn get_algorithm_id(public_key_info: &SubjectPublicKeyInfoOwned) -> XResult { if public_key_info.algorithm.oid == RSA { let rsa_public_key = opt_result!(