opgpcard: Extract info command into module
This commit is contained in:
parent
f0ab24b040
commit
d05feec605
4 changed files with 93 additions and 76 deletions
|
@ -45,10 +45,7 @@ pub enum Command {
|
||||||
Status(commands::status::StatusCommand),
|
Status(commands::status::StatusCommand),
|
||||||
|
|
||||||
/// Show technical details about a card
|
/// Show technical details about a card
|
||||||
Info {
|
Info(commands::info::InfoCommand),
|
||||||
#[clap(name = "card ident", short = 'c', long = "card")]
|
|
||||||
ident: Option<String>,
|
|
||||||
},
|
|
||||||
|
|
||||||
/// Display a card's authentication key as an SSH public key
|
/// Display a card's authentication key as an SSH public key
|
||||||
Ssh {
|
Ssh {
|
||||||
|
|
89
tools/src/bin/opgpcard/commands/info.rs
Normal file
89
tools/src/bin/opgpcard/commands/info.rs
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
// SPDX-FileCopyrightText: 2021-2022 Heiko Schaefer <heiko@schaefer.name>
|
||||||
|
// SPDX-FileCopyrightText: 2022 Lars Wirzenius <liw@liw.fi>
|
||||||
|
// SPDX-FileCopyrightText: 2022 Nora Widdecke <mail@nora.pink>
|
||||||
|
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::Parser;
|
||||||
|
|
||||||
|
use openpgp_card_sequoia::card::Card;
|
||||||
|
|
||||||
|
use crate::output;
|
||||||
|
use crate::pick_card_for_reading;
|
||||||
|
use crate::versioned_output::{OutputBuilder, OutputFormat, OutputVersion};
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
pub struct InfoCommand {
|
||||||
|
#[clap(name = "card ident", short = 'c', long = "card")]
|
||||||
|
pub ident: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// print metadata information about a card
|
||||||
|
pub fn print_info(
|
||||||
|
format: OutputFormat,
|
||||||
|
output_version: OutputVersion,
|
||||||
|
command: InfoCommand,
|
||||||
|
) -> Result<()> {
|
||||||
|
let mut output = output::Info::default();
|
||||||
|
|
||||||
|
let backend = pick_card_for_reading(command.ident)?;
|
||||||
|
let mut card = Card::new(backend);
|
||||||
|
let mut open = card.transaction()?;
|
||||||
|
|
||||||
|
let ai = open.application_identifier()?;
|
||||||
|
|
||||||
|
output.ident(ai.ident());
|
||||||
|
|
||||||
|
let version = ai.version().to_be_bytes();
|
||||||
|
output.card_version(format!("{}.{}", version[0], version[1]));
|
||||||
|
|
||||||
|
output.application_id(ai.to_string());
|
||||||
|
output.manufacturer_id(format!("{:04X}", ai.manufacturer()));
|
||||||
|
output.manufacturer_name(ai.manufacturer_name().to_string());
|
||||||
|
|
||||||
|
if let Some(cc) = open.historical_bytes()?.card_capabilities() {
|
||||||
|
for line in cc.to_string().lines() {
|
||||||
|
let line = line.strip_prefix("- ").unwrap_or(line);
|
||||||
|
output.card_capability(line.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(csd) = open.historical_bytes()?.card_service_data() {
|
||||||
|
for line in csd.to_string().lines() {
|
||||||
|
let line = line.strip_prefix("- ").unwrap_or(line);
|
||||||
|
output.card_service_data(line.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(eli) = open.extended_length_information()? {
|
||||||
|
for line in eli.to_string().lines() {
|
||||||
|
let line = line.strip_prefix("- ").unwrap_or(line);
|
||||||
|
output.extended_length_info(line.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let ec = open.extended_capabilities()?;
|
||||||
|
for line in ec.to_string().lines() {
|
||||||
|
let line = line.strip_prefix("- ").unwrap_or(line);
|
||||||
|
output.extended_capability(line.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Algorithm information (list of supported algorithms)
|
||||||
|
if let Ok(Some(ai)) = open.algorithm_information() {
|
||||||
|
for line in ai.to_string().lines() {
|
||||||
|
let line = line.strip_prefix("- ").unwrap_or(line);
|
||||||
|
output.algorithm(line.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: print KDF info
|
||||||
|
|
||||||
|
// YubiKey specific (?) firmware version
|
||||||
|
if let Ok(ver) = open.firmware_version() {
|
||||||
|
let ver = ver.iter().map(u8::to_string).collect::<Vec<_>>().join(".");
|
||||||
|
output.firmware_version(ver);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", output.print(format, output_version)?);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -2,4 +2,5 @@
|
||||||
// SPDX-FileCopyrightText: 2022 Nora Widdecke <mail@nora.pink>
|
// SPDX-FileCopyrightText: 2022 Nora Widdecke <mail@nora.pink>
|
||||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||||
|
|
||||||
|
pub mod info;
|
||||||
pub mod status;
|
pub mod status;
|
||||||
|
|
|
@ -54,8 +54,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
cli::Command::Status(cmd) => {
|
cli::Command::Status(cmd) => {
|
||||||
commands::status::print_status(cli.output_format, cli.output_version, cmd)?;
|
commands::status::print_status(cli.output_format, cli.output_version, cmd)?;
|
||||||
}
|
}
|
||||||
cli::Command::Info { ident } => {
|
cli::Command::Info(cmd) => {
|
||||||
print_info(cli.output_format, cli.output_version, ident)?;
|
commands::info::print_info(cli.output_format, cli.output_version, cmd)?;
|
||||||
}
|
}
|
||||||
cli::Command::Ssh { ident } => {
|
cli::Command::Ssh { ident } => {
|
||||||
print_ssh(cli.output_format, cli.output_version, ident)?;
|
print_ssh(cli.output_format, cli.output_version, ident)?;
|
||||||
|
@ -607,76 +607,6 @@ fn pick_card_for_reading(ident: Option<String>) -> Result<Box<dyn CardBackend +
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// print metadata information about a card
|
|
||||||
fn print_info(
|
|
||||||
format: OutputFormat,
|
|
||||||
output_version: OutputVersion,
|
|
||||||
ident: Option<String>,
|
|
||||||
) -> Result<()> {
|
|
||||||
let mut output = output::Info::default();
|
|
||||||
|
|
||||||
let backend = pick_card_for_reading(ident)?;
|
|
||||||
let mut card = Card::new(backend);
|
|
||||||
let mut open = card.transaction()?;
|
|
||||||
|
|
||||||
let ai = open.application_identifier()?;
|
|
||||||
|
|
||||||
output.ident(ai.ident());
|
|
||||||
|
|
||||||
let version = ai.version().to_be_bytes();
|
|
||||||
output.card_version(format!("{}.{}", version[0], version[1]));
|
|
||||||
|
|
||||||
output.application_id(ai.to_string());
|
|
||||||
output.manufacturer_id(format!("{:04X}", ai.manufacturer()));
|
|
||||||
output.manufacturer_name(ai.manufacturer_name().to_string());
|
|
||||||
|
|
||||||
if let Some(cc) = open.historical_bytes()?.card_capabilities() {
|
|
||||||
for line in cc.to_string().lines() {
|
|
||||||
let line = line.strip_prefix("- ").unwrap_or(line);
|
|
||||||
output.card_capability(line.to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if let Some(csd) = open.historical_bytes()?.card_service_data() {
|
|
||||||
for line in csd.to_string().lines() {
|
|
||||||
let line = line.strip_prefix("- ").unwrap_or(line);
|
|
||||||
output.card_service_data(line.to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(eli) = open.extended_length_information()? {
|
|
||||||
for line in eli.to_string().lines() {
|
|
||||||
let line = line.strip_prefix("- ").unwrap_or(line);
|
|
||||||
output.extended_length_info(line.to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let ec = open.extended_capabilities()?;
|
|
||||||
for line in ec.to_string().lines() {
|
|
||||||
let line = line.strip_prefix("- ").unwrap_or(line);
|
|
||||||
output.extended_capability(line.to_string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Algorithm information (list of supported algorithms)
|
|
||||||
if let Ok(Some(ai)) = open.algorithm_information() {
|
|
||||||
for line in ai.to_string().lines() {
|
|
||||||
let line = line.strip_prefix("- ").unwrap_or(line);
|
|
||||||
output.algorithm(line.to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: print KDF info
|
|
||||||
|
|
||||||
// YubiKey specific (?) firmware version
|
|
||||||
if let Ok(ver) = open.firmware_version() {
|
|
||||||
let ver = ver.iter().map(u8::to_string).collect::<Vec<_>>().join(".");
|
|
||||||
output.firmware_version(ver);
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("{}", output.print(format, output_version)?);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn print_ssh(
|
fn print_ssh(
|
||||||
format: OutputFormat,
|
format: OutputFormat,
|
||||||
output_version: OutputVersion,
|
output_version: OutputVersion,
|
||||||
|
|
Loading…
Reference in a new issue