From a8ca665ce90432f0cfa1d5fdf285ba6c0985b33a Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 10 Jul 2021 00:12:08 +0800 Subject: [PATCH] feat: parse pgp cert works --- src/cmd.rs | 12 +++-- src/fido.rs | 10 ++--- src/main.rs | 2 + src/pgp.rs | 116 ++++++++++++++++++++++++++++++++++++++++++++++++ src/register.rs | 6 +-- 5 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 src/pgp.rs diff --git a/src/cmd.rs b/src/cmd.rs index a462bfc..ca030a1 100644 --- a/src/cmd.rs +++ b/src/cmd.rs @@ -1,4 +1,4 @@ -use clap::{ArgMatches, App, Arg}; +use clap::{ArgMatches, App}; use rust_util::XResult; pub type CommandError = XResult<()>; @@ -14,13 +14,11 @@ pub struct DefaultCommandImpl; impl DefaultCommandImpl { 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 { - let verbose_count = arg_matches.occurrences_of("verbose"); - information!("Verbose count: {}", verbose_count); - information!("This is default command cli ..."); - // TODO ... + pub fn run(_arg_matches: &ArgMatches) -> CommandError { + information!("WebAuthn(OpenPGP) cli, use --help for help"); Ok(()) } } \ No newline at end of file diff --git a/src/fido.rs b/src/fido.rs index c5473fd..db1c50a 100644 --- a/src/fido.rs +++ b/src/fido.rs @@ -94,9 +94,9 @@ impl U2fV2Challenge { pub fn new_random(app_id: S) -> Self where S: Into { let mut rng = rand::thread_rng(); let mut rand_bytes = [0_u8; 32]; - for i in 0..32 { + for c in &mut rand_bytes { let b: u8 = rng.gen(); - rand_bytes[i] = b; + *c = b; } 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)); let b64 = base64::encode(bs).chars().collect::>(); let mut b64 = b64.as_slice(); - while b64.len() > 0 { + while !b64.is_empty() { s.push('\n'); if b64.len() >= w { - for i in 0..w { - s.push(b64[i]); + for c in b64.iter().take(w) { + s.push(*c); } b64 = &b64[w..]; } else { diff --git a/src/main.rs b/src/main.rs index 3019602..5137321 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod fido; mod digest; mod register; mod sign; +mod pgp; mod pgpcardlist; use clap::{App, AppSettings}; @@ -16,6 +17,7 @@ fn main() -> CommandError { let commands: Vec> = vec![ Box::new(register::CommandImpl), Box::new(sign::CommandImpl), + Box::new(pgp::CommandImpl), Box::new(pgpcardlist::CommandImpl), ]; let mut app = App::new(env!("CARGO_PKG_NAME")) diff --git a/src/pgp.rs b/src/pgp.rs new file mode 100644 index 0000000..6258b67 --- /dev/null +++ b/src/pgp.rs @@ -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 + +mQINBFbFsmEBEACvuRVhMfEWNkP2RP7D3sEaId+qXKi6UnXRxGppbBff+Zkp+h4Y +mQEOCUWct+C0eFeK8+pFKfvewJfozQcLNKr0z92uSaz8fxx5wzTxKhl1lMzRNWv9 +zzDRkDsimh16v0r/0t0akiChzepryF1jacdPAZgnndpC/fad45yDen+/Op3OCbBu +TgkuNwgyE65NSPjEzw4yeTFGnLL34aGLbZehlcPG7yZ4jY9zyMz7OlFhvTB3Tp13 +bfWbTcIrzQsDBK8ift0YUCv7FMXlcqilcdi+5P71KyGzNs/j6lKpsQdmEk5fX+iz +5Sjwop/KyJ8kEp8oJW9VaGjxAJaheCI244ndxihOF9bBSkhLVLnV6X9889KTcrb3 +mOVkA433ISzN3MocZUY6u0nt71dLEoheqEa6zZcDXh4y+FB1o6B39uxxchh7hjOq +9qq9VGINQ/xvMD7jDRy0HTD0dEUYrmVqNOf9BC+Qo/0lBebpNvYYH7CO5TfA9eEp +FaxwTNsdXAyrZaJpgfm9ZWEcjqVupdxaS9mLaBldA/KsArNRq7VnaUE3bGLZy/n7 +0km2Hmkd5u4s5Zu5/VZXidHV91I10bsYaaMb3nXD/VtOoiXM3hWXqR2it7i7jlTi +Q7hd/serxvyTzKzXTsQ2mA7uUH0ougwwUpK+Mb4Q8QXeDzLAppLyZlBf6wARAQAB +tDZIYXR0ZXIgSmlhbmcgKEhhdHRlcidzIDQwOTYgUEdQL0MpIDxqaHQ1OTQ1QGdt +YWlsLmNvbT6JAjcEEwEKACEFAlbFsmECGwMFCwkIBwMFFQoJCAsFFgIDAQACHgEC +F4AACgkQx5SxZGqIbNYG1g/+OMVm/ETLj9tPxZd3zHyVhtJXHT3PTzg/L07EIWsH +58aOYjfHNtJXG58LLGQWYWZ9A2/s8iTR68Yy9dwUZ/hFwIhblV4Yisb2aI4T7SH6 +LhoBJwP97IksY5Ywnk4MJyA+rpknoANSn/VLGz/siVpr58+F4t304PeGzi3ij/M7 +MLOPr0qu0zs+gU5YU+Ge27MRH60NgEZCnSt0HChKQk42wy/QU/Sk1XoISSjETIi+ +MAs9UAjYlQ47CLYSk8sgvsD4MzH+YieMDxNyxvzgsRMa1gub5xnJCzOIn9Dm0Lkp +PH1fvWG61F2us8wLq1tQZ9c4UOsjUYzcFV+XRatD0ELla0nkoCtrCgxiUiMLTu6D +xGIfcDDOgwK9GbrLer0mxUbWddQMLX6ieoCnU8q7tZohl8MZdYz+SHMP2D8tF007 +oYhC9rXI/iP1hQ1XkM7KRGByvdAzlR4Ev8eEJv7ADRc0+OLvlirT8kX77I2WVUKx +oDJvu5LoUDQS/PjYD42yCM1TULUopnJ+SQQ4jMKmJ8LwulLvbzBR4HDEzXAlsEjg +Y785r7CKT6FR6X25Qx77VBgSMpsjcH/SM+64y4dKNO089kJo1ol1go+HURMvwgD0 +tRCut57t2JXuOK6S47CN61z6RexsYOSgv9Q/9KrpvIZXrYznvKE3/QcpNKpcVd0b +u7O5Ag0EVsWyYQEQAKVDPDPkETFMNHSL1yEhceN4+IfQit/GPRw+pD3HN2dHQhj4 +hcu2XtDkHmz1h8lGdmJqrHcsxbjkLlfT9qccY/1iyIEamVfCZPLVobQIzjr5tDE3 +Nq4PhCR32vs4V+HhRDLI+A70ATCQ14ip6V0zP4+6DCqSFEB6n1wcLBCRy5h2Uy3h +ARGCnGV0wJrrt1ncSuY7xHNNl7doWdXwbNDPXv9hDHt7evWh+P62m4gYxdofSXXt +ecKyTMV2ggliamIWwUtAidwXY5AKjiKXKj172sYiTdaTaSvHowPUODZse6cZ737/ +oQj5Fl2Ut6/wVmfZRWXPLhK0BGweIC4JKPIzpX0Be3GKrWRLOvamPJ5yFAbKmWHw +Kfm0HdsQhUmxGQJfjq7Rs31Yw/WBTD8tNvsUYL9jdyk9yhx77lO1sa73367IT9n8 +A7htjAZZnKtbLgCsQNHGD0smo3HhKsP96IEqe+0mMeNa0/BFi5k71NAh8wrLn/zu +7A1mUX8WrQM1oQQYZygj6s4s6TkDqpvF4Qre+BX52mz6RzPV1I6ECD607LMkt3lq +sp8yYgKns+r9iytn4S+yJHC7b7eaefWPimOCOmENPYlIe5SiR0YZIE6JlLqyR4nl +RzFhRiB6HxAvp1OqRiFIdD+za9Bs+ORiU8FhnYVud1nyJo2vm+ZMMMqlIpMjABEB +AAGJAh8EGAEKAAkFAlbFsmECGwwACgkQx5SxZGqIbNY2wBAAqrHidGC5c5nz84+w ++gGlYfX+UQZU2UIHBAhEdCICCPXWmPnl5MMXP+ytXkYIcl/cSu4SUMYw4i2masIT +0+izCFYSVBqpINtwT0BCVDyqvOwgYOLkm3iB/R/TC5E/bUi2uwcXs/KARDHE2OkM +1fBvQ2y1ZWn/dJnIb08omtxZC6XODNTo9fGRI2ulqIWC9XFLt08eqUNntamUIPhB +FnVJZRNHpccrA67lng/1i3Lt311XeqEdB2Nf3FwYYD7i/NpKWY5n2DM6ozop22BD +ly+XAD6fS+UHEIagOFI9w0q+8FJ9XrJdQvE8QzP3zvFM2OOIQwd4Ec5iswCPs7Jy +PqeRxyPh8V5UYeG3V7PG/zq5bPU7xQq65/drPMpRrUV52HGSF1PQrq7hYjCgrIS3 +7dicVhOV8+YOtakAD0jQcGRW4JVSGVwxi1hYbwt4rsD5GrH2V1nWrucDJyg7FZbm +CUVQQ2d5JcRUJk2Fu0raqVLdfTEFARhbjw73RPVAI6/Na9EGPZfFwP7FPbxCdB7M +s8s+wmaIEKRk5ShWned3GKIVUOhU71z2k37geBDmPLFp+zYZXU5F6JqrasUVtiqy +l2f0qZFpp7WqvJP3IwSTgFKJ3MGxdaK76eiav9s+w0JFXD9tMCn9r0xoXm2aqIui +u1lgCI4J/S53gMfQr2gBNZW3xeq5Ag0EVsWydQEQAPCoOX4OO2IpU/8RTme8Ste0 ++O3H8M0ui/+CEbU43MoL5jlUnTiEooUMVX7MoKcYU4UUN6Y6oRRqh/S1CKa8v2vI +VnzzGWKJWMsAb3ceUulBg1HkX9sy3EWK0KPhbPaMXYcTxNOR4VpfS+TkZ+B1s0WU +pDX4ezwyjyUVGiVfObgehcr7dBhmNeKZiDWezUSy4trm2AZadwi0oe13ZXlRPP0O +oMmudNSDYV1JLLsB13T2LXFxd5flSHTHOmCU8YrxS7bo6ohAHxMGrrr/tRs7DWQz +oOiX0nPtXe4mTIsVOEayrczOe2cBl9GwCtzEHT+ok9tAzmKvwQyU1yboUAVoBOqS +A4kyReKvyH9GS8VPpMbLQBINH7g/sDoP/uFtQUp+Q94Unb1TsYI94VrT7nQFaULn +D/Cyp6uQdKMuC3Rql1wEGCdkPpZ9DfQctk/Dfz9+xzrEe8iS5fHDNhabQqKOMVYh +s5iG4q/BMmelUJqIvH6jj+MfZx+V3jQNiQlSxHNKOp+TyeCIrWGAm9DRjj0x1RRM +9qs8ZEAycUuaAuxnXVkAf6WuCatBC/XRGmwdqD8r2AQJphNB82Vi5d09ZEdXSXwF +7qoEoRXGS12tUhVKS85SYt4wEbsaGlHh5yj98XgHfKOVjwcM1zOyy+O507njWrhW +SsB7P3vceBLM0P6haNrhABEBAAGJAh8EGAEKAAkFAlbFsnUCGyAACgkQx5SxZGqI +bNYgSxAAivqcmdH1rO2AUqFG6w3788+p52yK8RhUp+jj3e6HQmzYABg5qsU/Aq7Q +kTMqsV+W12P+SetefiSdzJWvhOsyR1IivLJCQdgNQFRf6QRm0yuOJCX9I/Q9LNGQ +qwL/86jT1pM5dOx97h7VWf7wA2cpPARCIXnFftz08fG9FFJIM8zQuCWeVQqnVQ8X +be3ar+HbgDMsAm5MvBu+7Ni/1vSkevxw+EbCavSMnz5k1HmABZceHvSP/K+CSCB4 +XA6Z+GbXx/8HTqUiho6aqifsoLBkDhwxNYHGtZVIigI3N9JIu9JILgCdEtkO7LVG +EjqUEteCn41f3y3YpzQLjOmYF7LNLUIYaD3KoL6fnrOXPdbq0dYsoWHWQ4ndlNbn +mZRgfN/IatnSXcA+keRUd1bXgB4jVhv0P38jH9DsrYeb3xOmd6RSCdKFBLV4PkGZ ++6FdbJQ5ZmvmhYinyAP5yqIqig/9W6v/BnQlbocEEdDLfY1UMUl7kSB8Wz9t74BH +1rkCwHJxVp+tOfY+pCG0aVHFW6WIHFR0dFpc4D2Wksed1m4cqjmbqfPANu4G01wX +tYVrOQO08M4xbeeClpW9DqxR7toB860Hoq8aonXikmaJXxrv3V6/rLofCHInH22a +VvhSegJ3QeP4bkBgxW1X6t1QgQGRJnundzv4U+tKbltS5hPmvcU= +=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(()) + } +} diff --git a/src/register.rs b/src/register.rs index 9a5ad7a..5a3cbb4 100644 --- a/src/register.rs +++ b/src/register.rs @@ -54,10 +54,10 @@ impl Command for CommandImpl { manager.register( flags, timeout_ms, - chall_bytes.clone(), - app_bytes.clone(), + chall_bytes, + app_bytes, vec![], - status_tx.clone(), + status_tx, callback, )?;