opgpcard: rename/reorder 'status' fields to reflect common terminology and logical structure of the fields.

Temporarily remove key_statuses and ca_fingerprints from machine-readable output. These fields should be stabilized before adding them to JSON.
This commit is contained in:
Heiko Schaefer 2022-10-31 12:44:49 +01:00
parent 535c9e6e0a
commit 5f715647c9
No known key found for this signature in database
GPG key ID: 4A849A1904CCBD7D
2 changed files with 36 additions and 36 deletions

View file

@ -56,7 +56,7 @@ pub fn print_status(
// Cardholder Name // Cardholder Name
if let Some(name) = card.cardholder_name()? { if let Some(name) = card.cardholder_name()? {
output.card_holder(name); output.cardholder_name(name);
} }
// We ignore the Cardholder "Sex" field, because it's silly and mostly unhelpful // We ignore the Cardholder "Sex" field, because it's silly and mostly unhelpful
@ -64,7 +64,7 @@ pub fn print_status(
// Certificate URL // Certificate URL
let url = card.url()?; let url = card.url()?;
if !url.is_empty() { if !url.is_empty() {
output.url(url); output.certificate_url(url);
} }
// Language Preference // Language Preference
@ -90,7 +90,7 @@ pub fn print_status(
} }
signature_key.algorithm(format!("{}", card.algorithm_attributes(KeyType::Signing)?)); signature_key.algorithm(format!("{}", card.algorithm_attributes(KeyType::Signing)?));
if let Some(kgt) = kgt.signature() { if let Some(kgt) = kgt.signature() {
signature_key.created(format!("{}", kgt.to_datetime())); signature_key.creation_time(format!("{}", kgt.to_datetime()));
} }
if let Some(uif) = card.uif_signing()? { if let Some(uif) = card.uif_signing()? {
signature_key.touch_policy(format!("{}", uif.touch_policy())); signature_key.touch_policy(format!("{}", uif.touch_policy()));
@ -120,7 +120,7 @@ pub fn print_status(
card.algorithm_attributes(KeyType::Decryption)? card.algorithm_attributes(KeyType::Decryption)?
)); ));
if let Some(kgt) = kgt.decryption() { if let Some(kgt) = kgt.decryption() {
decryption_key.created(format!("{}", kgt.to_datetime())); decryption_key.creation_time(format!("{}", kgt.to_datetime()));
} }
if let Some(uif) = card.uif_decryption()? { if let Some(uif) = card.uif_decryption()? {
decryption_key.touch_policy(format!("{}", uif.touch_policy())); decryption_key.touch_policy(format!("{}", uif.touch_policy()));
@ -145,7 +145,7 @@ pub fn print_status(
card.algorithm_attributes(KeyType::Authentication)? card.algorithm_attributes(KeyType::Authentication)?
)); ));
if let Some(kgt) = kgt.authentication() { if let Some(kgt) = kgt.authentication() {
authentication_key.created(format!("{}", kgt.to_datetime())); authentication_key.creation_time(format!("{}", kgt.to_datetime()));
} }
if let Some(uif) = card.uif_authentication()? { if let Some(uif) = card.uif_authentication()? {
authentication_key.touch_policy(format!("{}", uif.touch_policy())); authentication_key.touch_policy(format!("{}", uif.touch_policy()));
@ -169,7 +169,7 @@ pub fn print_status(
attestation_key.algorithm(format!("{}", algo)); attestation_key.algorithm(format!("{}", algo));
} }
if let Ok(Some(kgt)) = card.attestation_key_generation_time() { if let Ok(Some(kgt)) = card.attestation_key_generation_time() {
attestation_key.created(format!("{}", kgt.to_datetime())); attestation_key.creation_time(format!("{}", kgt.to_datetime()));
} }
if let Some(uif) = card.uif_attestation()? { if let Some(uif) = card.uif_attestation()? {
attestation_key.touch_policy(format!("{}", uif.touch_policy())); attestation_key.touch_policy(format!("{}", uif.touch_policy()));

View file

@ -11,15 +11,15 @@ pub struct Status {
verbose: bool, verbose: bool,
ident: String, ident: String,
card_version: String, card_version: String,
card_holder: Option<String>, cardholder_name: Option<String>,
url: Option<String>,
language_preferences: Vec<String>, language_preferences: Vec<String>,
certificate_url: Option<String>,
signature_key: KeySlotInfo, signature_key: KeySlotInfo,
signature_count: u32, signature_count: u32,
user_pin_valid_for_only_one_signature: bool,
decryption_key: KeySlotInfo, decryption_key: KeySlotInfo,
authentication_key: KeySlotInfo, authentication_key: KeySlotInfo,
attestation_key: Option<KeySlotInfo>, attestation_key: Option<KeySlotInfo>,
user_pin_valid_for_only_one_signature: bool,
user_pin_remaining_attempts: u8, user_pin_remaining_attempts: u8,
admin_pin_remaining_attempts: u8, admin_pin_remaining_attempts: u8,
reset_code_remaining_attempts: u8, reset_code_remaining_attempts: u8,
@ -40,18 +40,18 @@ impl Status {
self.card_version = card_version; self.card_version = card_version;
} }
pub fn card_holder(&mut self, card_holder: String) { pub fn cardholder_name(&mut self, card_holder: String) {
self.card_holder = Some(card_holder); self.cardholder_name = Some(card_holder);
}
pub fn url(&mut self, url: String) {
self.url = Some(url);
} }
pub fn language_preference(&mut self, pref: String) { pub fn language_preference(&mut self, pref: String) {
self.language_preferences.push(pref); self.language_preferences.push(pref);
} }
pub fn certificate_url(&mut self, url: String) {
self.certificate_url = Some(url);
}
pub fn signature_key(&mut self, key: KeySlotInfo) { pub fn signature_key(&mut self, key: KeySlotInfo) {
self.signature_key = key; self.signature_key = key;
} }
@ -60,6 +60,10 @@ impl Status {
self.signature_count = count; self.signature_count = count;
} }
pub fn user_pin_valid_for_only_one_signature(&mut self, sign_pin_valid_once: bool) {
self.user_pin_valid_for_only_one_signature = sign_pin_valid_once;
}
pub fn decryption_key(&mut self, key: KeySlotInfo) { pub fn decryption_key(&mut self, key: KeySlotInfo) {
self.decryption_key = key; self.decryption_key = key;
} }
@ -72,10 +76,6 @@ impl Status {
self.attestation_key = Some(key); self.attestation_key = Some(key);
} }
pub fn user_pin_valid_for_only_one_signature(&mut self, sign_pin_valid_once: bool) {
self.user_pin_valid_for_only_one_signature = sign_pin_valid_once;
}
pub fn user_pin_remaining_attempts(&mut self, count: u8) { pub fn user_pin_remaining_attempts(&mut self, count: u8) {
self.user_pin_remaining_attempts = count; self.user_pin_remaining_attempts = count;
} }
@ -105,16 +105,16 @@ impl Status {
)); ));
let mut nl = false; let mut nl = false;
if let Some(name) = &self.card_holder { if let Some(name) = &self.cardholder_name {
if !name.is_empty() { if !name.is_empty() {
s.push_str(&format!("Cardholder: {}\n", name)); s.push_str(&format!("Cardholder: {}\n", name));
nl = true; nl = true;
} }
} }
if let Some(url) = &self.url { if let Some(url) = &self.certificate_url {
if !url.is_empty() { if !url.is_empty() {
s.push_str(&format!("URL: {}\n", url)); s.push_str(&format!("Certificate URL: {}\n", url));
nl = true; nl = true;
} }
} }
@ -190,9 +190,9 @@ impl Status {
schema_version: StatusV0::VERSION, schema_version: StatusV0::VERSION,
ident: self.ident.clone(), ident: self.ident.clone(),
card_version: self.card_version.clone(), card_version: self.card_version.clone(),
card_holder: self.card_holder.clone(), cardholder_name: self.cardholder_name.clone(),
url: self.url.clone(),
language_preferences: self.language_preferences.clone(), language_preferences: self.language_preferences.clone(),
certificate_url: self.certificate_url.clone(),
signature_key: self.signature_key.clone(), signature_key: self.signature_key.clone(),
signature_count: self.signature_count, signature_count: self.signature_count,
decryption_key: self.decryption_key.clone(), decryption_key: self.decryption_key.clone(),
@ -202,8 +202,8 @@ impl Status {
user_pin_remaining_attempts: self.user_pin_remaining_attempts, user_pin_remaining_attempts: self.user_pin_remaining_attempts,
admin_pin_remaining_attempts: self.admin_pin_remaining_attempts, admin_pin_remaining_attempts: self.admin_pin_remaining_attempts,
reset_code_remaining_attempts: self.reset_code_remaining_attempts, reset_code_remaining_attempts: self.reset_code_remaining_attempts,
key_statuses: self.key_statuses.clone(), // key_statuses: self.key_statuses.clone(),
ca_fingerprints: self.ca_fingerprints.clone(), // ca_fingerprints: self.ca_fingerprints.clone(),
}) })
} }
} }
@ -239,20 +239,20 @@ pub struct StatusV0 {
schema_version: OutputVersion, schema_version: OutputVersion,
ident: String, ident: String,
card_version: String, card_version: String,
card_holder: Option<String>, cardholder_name: Option<String>,
url: Option<String>,
language_preferences: Vec<String>, language_preferences: Vec<String>,
certificate_url: Option<String>,
signature_key: KeySlotInfo, signature_key: KeySlotInfo,
signature_count: u32, signature_count: u32,
user_pin_valid_for_only_one_signature: bool,
decryption_key: KeySlotInfo, decryption_key: KeySlotInfo,
authentication_key: KeySlotInfo, authentication_key: KeySlotInfo,
attestation_key: Option<KeySlotInfo>, attestation_key: Option<KeySlotInfo>,
user_pin_valid_for_only_one_signature: bool,
user_pin_remaining_attempts: u8, user_pin_remaining_attempts: u8,
admin_pin_remaining_attempts: u8, admin_pin_remaining_attempts: u8,
reset_code_remaining_attempts: u8, reset_code_remaining_attempts: u8,
key_statuses: Vec<(u8, String)>, // key_statuses: Vec<(u8, String)>, // TODO: add to JSON output after clarifying the content
ca_fingerprints: Vec<String>, // ca_fingerprints: Vec<String>, // TODO: add to JSON output after clarifying the content
} }
impl OutputVariant for StatusV0 { impl OutputVariant for StatusV0 {
@ -262,8 +262,8 @@ impl OutputVariant for StatusV0 {
#[derive(Debug, Default, Clone, Serialize)] #[derive(Debug, Default, Clone, Serialize)]
pub struct KeySlotInfo { pub struct KeySlotInfo {
fingerprint: Option<String>, fingerprint: Option<String>,
creation_time: Option<String>,
algorithm: Option<String>, algorithm: Option<String>,
created: Option<String>,
touch_policy: Option<String>, touch_policy: Option<String>,
touch_features: Option<String>, touch_features: Option<String>,
status: Option<String>, status: Option<String>,
@ -279,8 +279,8 @@ impl KeySlotInfo {
self.algorithm = Some(algorithm); self.algorithm = Some(algorithm);
} }
pub fn created(&mut self, created: String) { pub fn creation_time(&mut self, created: String) {
self.created = Some(created); self.creation_time = Some(created);
} }
pub fn touch_policy(&mut self, policy: String) { pub fn touch_policy(&mut self, policy: String) {
@ -299,7 +299,7 @@ impl KeySlotInfo {
self.public_key_material = Some(material); self.public_key_material = Some(material);
} }
fn format(&self, verbose: bool) -> Vec<String> { fn format(&self, verbose: bool, pkm: bool) -> Vec<String> {
let mut lines = vec![]; let mut lines = vec![];
if let Some(fp) = &self.fingerprint { if let Some(fp) = &self.fingerprint {
@ -308,7 +308,7 @@ impl KeySlotInfo {
if let Some(a) = &self.algorithm { if let Some(a) = &self.algorithm {
lines.push(format!("Algorithm: {}", a)); lines.push(format!("Algorithm: {}", a));
} }
if let Some(ts) = &self.created { if let Some(ts) = &self.creation_time {
lines.push(format!("Created: {}", ts)); lines.push(format!("Created: {}", ts));
} }