feat: parse pgp cert works
This commit is contained in:
12
src/cmd.rs
12
src/cmd.rs
@@ -1,4 +1,4 @@
|
|||||||
use clap::{ArgMatches, App, Arg};
|
use clap::{ArgMatches, App};
|
||||||
use rust_util::XResult;
|
use rust_util::XResult;
|
||||||
|
|
||||||
pub type CommandError = XResult<()>;
|
pub type CommandError = XResult<()>;
|
||||||
@@ -14,13 +14,11 @@ pub struct DefaultCommandImpl;
|
|||||||
|
|
||||||
impl DefaultCommandImpl {
|
impl DefaultCommandImpl {
|
||||||
pub fn process_command<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
|
pub fn process_command<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
|
||||||
app.arg(Arg::with_name("verbose").long("verbose").short("v").multiple(true).help("Show verbose info"))
|
app
|
||||||
|
// app.arg(Arg::with_name("verbose").long("verbose").short("v").multiple(true).help("Show verbose info"))
|
||||||
}
|
}
|
||||||
pub fn run(arg_matches: &ArgMatches) -> CommandError {
|
pub fn run(_arg_matches: &ArgMatches) -> CommandError {
|
||||||
let verbose_count = arg_matches.occurrences_of("verbose");
|
information!("WebAuthn(OpenPGP) cli, use --help for help");
|
||||||
information!("Verbose count: {}", verbose_count);
|
|
||||||
information!("This is default command cli ...");
|
|
||||||
// TODO ...
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
10
src/fido.rs
10
src/fido.rs
@@ -94,9 +94,9 @@ impl U2fV2Challenge {
|
|||||||
pub fn new_random<S>(app_id: S) -> Self where S: Into<String> {
|
pub fn new_random<S>(app_id: S) -> Self where S: Into<String> {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let mut rand_bytes = [0_u8; 32];
|
let mut rand_bytes = [0_u8; 32];
|
||||||
for i in 0..32 {
|
for c in &mut rand_bytes {
|
||||||
let b: u8 = rng.gen();
|
let b: u8 = rng.gen();
|
||||||
rand_bytes[i] = b;
|
*c = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
let challenge = base64::encode_config(&rand_bytes, URL_SAFE_NO_PAD);
|
let challenge = base64::encode_config(&rand_bytes, URL_SAFE_NO_PAD);
|
||||||
@@ -143,11 +143,11 @@ pub fn to_pem(bs: &[u8], sub: &str, w: usize) -> String {
|
|||||||
s.push_str(&format!("-----BEGIN {}-----", sub));
|
s.push_str(&format!("-----BEGIN {}-----", sub));
|
||||||
let b64 = base64::encode(bs).chars().collect::<Vec<char>>();
|
let b64 = base64::encode(bs).chars().collect::<Vec<char>>();
|
||||||
let mut b64 = b64.as_slice();
|
let mut b64 = b64.as_slice();
|
||||||
while b64.len() > 0 {
|
while !b64.is_empty() {
|
||||||
s.push('\n');
|
s.push('\n');
|
||||||
if b64.len() >= w {
|
if b64.len() >= w {
|
||||||
for i in 0..w {
|
for c in b64.iter().take(w) {
|
||||||
s.push(b64[i]);
|
s.push(*c);
|
||||||
}
|
}
|
||||||
b64 = &b64[w..];
|
b64 = &b64[w..];
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ mod fido;
|
|||||||
mod digest;
|
mod digest;
|
||||||
mod register;
|
mod register;
|
||||||
mod sign;
|
mod sign;
|
||||||
|
mod pgp;
|
||||||
mod pgpcardlist;
|
mod pgpcardlist;
|
||||||
|
|
||||||
use clap::{App, AppSettings};
|
use clap::{App, AppSettings};
|
||||||
@@ -16,6 +17,7 @@ fn main() -> CommandError {
|
|||||||
let commands: Vec<Box<dyn Command>> = vec![
|
let commands: Vec<Box<dyn Command>> = vec![
|
||||||
Box::new(register::CommandImpl),
|
Box::new(register::CommandImpl),
|
||||||
Box::new(sign::CommandImpl),
|
Box::new(sign::CommandImpl),
|
||||||
|
Box::new(pgp::CommandImpl),
|
||||||
Box::new(pgpcardlist::CommandImpl),
|
Box::new(pgpcardlist::CommandImpl),
|
||||||
];
|
];
|
||||||
let mut app = App::new(env!("CARGO_PKG_NAME"))
|
let mut app = App::new(env!("CARGO_PKG_NAME"))
|
||||||
|
|||||||
116
src/pgp.rs
Normal file
116
src/pgp.rs
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
use clap::{ArgMatches, SubCommand, App, Arg};
|
||||||
|
use crate::cmd::{Command, CommandError};
|
||||||
|
use sequoia_openpgp::parse::Parse;
|
||||||
|
use sequoia_openpgp::parse::{PacketParser, PacketParserResult};
|
||||||
|
|
||||||
|
pub struct CommandImpl;
|
||||||
|
|
||||||
|
impl Command for CommandImpl {
|
||||||
|
fn name(&self) -> &str { "pgp" }
|
||||||
|
|
||||||
|
fn subcommand<'a>(&self) -> App<'a, 'a> {
|
||||||
|
SubCommand::with_name(self.name()).about("OpenPGP Card List subcommand")
|
||||||
|
// .arg(Arg::with_name("app-id").long("app-id").default_value("https://example.com").help("App id"))
|
||||||
|
// .arg(Arg::with_name("timeout").long("timeout").default_value("10").help("Timeout in seconds"))
|
||||||
|
.arg(Arg::with_name("json").long("json").help("JSON output"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run(&self, _arg_matches: &ArgMatches, _sub_arg_matches: &ArgMatches) -> CommandError {
|
||||||
|
let p = PacketParser::from_bytes(b"-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Comment: GPGTools - https://gpgtools.org
|
||||||
|
|
||||||
|
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
|
||||||
|
=HzsD
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----");
|
||||||
|
// TODO ...
|
||||||
|
let mut ppr = p.unwrap();
|
||||||
|
|
||||||
|
while let PacketParserResult::Some(pp) = ppr {
|
||||||
|
success!(">> >> {:?}", &pp.packet);
|
||||||
|
// Start parsing the next packet, recursing.
|
||||||
|
ppr = pp.recurse()?.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let PacketParserResult::EOF(eof) = ppr {
|
||||||
|
// information!("{:?}", eof);
|
||||||
|
if eof.is_message().is_ok() {
|
||||||
|
information!("IS MESSAGE");
|
||||||
|
} else if eof.is_cert().is_ok() {
|
||||||
|
information!("IS CERT");
|
||||||
|
} else if eof.is_keyring().is_ok() {
|
||||||
|
information!("IS KEYRING");
|
||||||
|
} else {
|
||||||
|
information!("IS OTHER");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -54,10 +54,10 @@ impl Command for CommandImpl {
|
|||||||
manager.register(
|
manager.register(
|
||||||
flags,
|
flags,
|
||||||
timeout_ms,
|
timeout_ms,
|
||||||
chall_bytes.clone(),
|
chall_bytes,
|
||||||
app_bytes.clone(),
|
app_bytes,
|
||||||
vec![],
|
vec![],
|
||||||
status_tx.clone(),
|
status_tx,
|
||||||
callback,
|
callback,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user