summaryrefslogtreecommitdiffstats
path: root/tool/src/commands/dump.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tool/src/commands/dump.rs')
-rw-r--r--tool/src/commands/dump.rs266
1 files changed, 139 insertions, 127 deletions
diff --git a/tool/src/commands/dump.rs b/tool/src/commands/dump.rs
index 8fb98ffe..579b9ad7 100644
--- a/tool/src/commands/dump.rs
+++ b/tool/src/commands/dump.rs
@@ -6,6 +6,7 @@ use self::openpgp::constants::SymmetricAlgorithm;
use self::openpgp::conversions::hex;
use self::openpgp::crypto::mpis;
use self::openpgp::{Packet, Result};
+use self::openpgp::packet::prelude::*;
use self::openpgp::packet::ctb::CTB;
use self::openpgp::packet::{Header, BodyLength, Signature};
use self::openpgp::packet::signature::subpacket::{Subpacket, SubpacketValue};
@@ -250,6 +251,139 @@ impl PacketDumper {
})?;
}
+ fn dump_key<P, R>(pd: &PacketDumper,
+ output: &mut dyn io::Write, i: &str, p: &Packet,
+ k: &Key<P, R>)
+ -> Result<()>
+ where P: key::KeyParts,
+ R: key::KeyRole,
+ {
+ writeln!(output, "{}", p.tag())?;
+ writeln!(output, "{} Version: {}", i, k.version())?;
+ writeln!(output, "{} Creation time: {}", i,
+ time::strftime(TIMEFMT, k.creation_time()).unwrap())?;
+ writeln!(output, "{} Pk algo: {}", i, k.pk_algo())?;
+ if let Some(bits) = k.mpis().bits() {
+ writeln!(output, "{} Pk size: {} bits", i, bits)?;
+ }
+ if pd.mpis {
+ writeln!(output, "{}", i)?;
+ writeln!(output, "{} Public Key:", i)?;
+
+ let ii = format!("{} ", i);
+ match k.mpis() {
+ mpis::PublicKey::RSA { e, n } =>
+ pd.dump_mpis(output, &ii,
+ &[e.value(), n.value()],
+ &["e", "n"])?,
+ mpis::PublicKey::DSA { p, q, g, y } =>
+ pd.dump_mpis(output, &ii,
+ &[p.value(), q.value(), g.value(),
+ y.value()],
+ &["p", "q", "g", "y"])?,
+ mpis::PublicKey::Elgamal { p, g, y } =>
+ pd.dump_mpis(output, &ii,
+ &[p.value(), g.value(), y.value()],
+ &["p", "g", "y"])?,
+ mpis::PublicKey::EdDSA { curve, q } => {
+ writeln!(output, "{} Curve: {}", ii, curve)?;
+ pd.dump_mpis(output, &ii, &[q.value()], &["q"])?;
+ },
+ mpis::PublicKey::ECDSA { curve, q } => {
+ writeln!(output, "{} Curve: {}", ii, curve)?;
+ pd.dump_mpis(output, &ii, &[q.value()], &["q"])?;
+ },
+ mpis::PublicKey::ECDH { curve, q, hash, sym } => {
+ writeln!(output, "{} Curve: {}", ii, curve)?;
+ writeln!(output, "{} Hash algo: {}", ii, hash)?;
+ writeln!(output, "{} Symmetric algo: {}", ii,
+ sym)?;
+ pd.dump_mpis(output, &ii, &[q.value()], &["q"])?;
+ },
+ mpis::PublicKey::Unknown { mpis, rest } => {
+ let keys: Vec<String> =
+ (0..mpis.len()).map(
+ |i| format!("mpi{}", i)).collect();
+ pd.dump_mpis(
+ output, &ii,
+ &mpis.iter().map(|m| {
+ m.value().iter().as_slice()
+ }).collect::<Vec<_>>()[..],
+ &keys.iter().map(|k| k.as_str())
+ .collect::<Vec<_>>()[..],
+ )?;
+
+ pd.dump_mpis(output, &ii, &[&rest[..]], &["rest"])?;
+ },
+ }
+
+ if let Some(secrets) = k.secret() {
+ use self::openpgp::packet::key::SecretKeyMaterial;
+ writeln!(output, "{}", i)?;
+ writeln!(output, "{} Secret Key:", i)?;
+
+ let ii = format!("{} ", i);
+ match secrets {
+ SecretKeyMaterial::Unencrypted(ref u) => u.map(
+ |mpis| -> Result<()> {
+ match mpis
+ {
+ mpis::SecretKeyMaterial::RSA { d, p, q, u } =>
+ pd.dump_mpis(output, &ii,
+ &[d.value(), p.value(),
+ q.value(), u.value()],
+ &["d", "p", "q", "u"])?,
+ mpis::SecretKeyMaterial::DSA { x } =>
+ pd.dump_mpis(output, &ii, &[x.value()],
+ &["x"])?,
+ mpis::SecretKeyMaterial::Elgamal { x } =>
+ pd.dump_mpis(output, &ii, &[x.value()],
+ &["x"])?,
+ mpis::SecretKeyMaterial::EdDSA { scalar } =>
+ pd.dump_mpis(output, &ii,
+ &[scalar.value()],
+ &["scalar"])?,
+ mpis::SecretKeyMaterial::ECDSA { scalar } =>
+ pd.dump_mpis(output, &ii,
+ &[scalar.value()],
+ &["scalar"])?,
+ mpis::SecretKeyMaterial::ECDH { scalar } =>
+ pd.dump_mpis(output, &ii,
+ &[scalar.value()],
+ &["scalar"])?,
+ mpis::SecretKeyMaterial::Unknown { mpis, rest } => {
+ let keys: Vec<String> =
+ (0..mpis.len()).map(
+ |i| format!("mpi{}", i)).collect();
+ pd.dump_mpis(
+ output, &ii,
+ &mpis.iter().map(|m| {
+ m.value().iter().as_slice()
+ }).collect::<Vec<_>>()[..],
+ &keys.iter().map(|k| k.as_str())
+ .collect::<Vec<_>>()[..],
+ )?;
+
+ pd.dump_mpis(output, &ii, &[rest],
+ &["rest"])?;
+ },
+ } Ok(()) })?,
+ SecretKeyMaterial::Encrypted(ref e) => {
+ writeln!(output, "{}", i)?;
+ write!(output, "{} S2K: ", ii)?;
+ pd.dump_s2k(output, &ii, e.s2k())?;
+ writeln!(output, "{} Sym. algo: {}", ii,
+ e.algo())?;
+ pd.dump_mpis(output, &ii, &[e.ciphertext()],
+ &["ciphertext"])?;
+ },
+ }
+ }
+ }
+
+ Ok(())
+ }
+
match p {
Unknown(ref u) => {
writeln!(output, "Unknown Packet")?;
@@ -257,6 +391,11 @@ impl PacketDumper {
writeln!(output, "{} Error: {}", i, u.error())?;
},
+ PublicKey(ref k) => dump_key(self, output, i, p, k)?,
+ PublicSubkey(ref k) => dump_key(self, output, i, p, k)?,
+ SecretKey(ref k) => dump_key(self, output, i, p, k)?,
+ SecretSubkey(ref k) => dump_key(self, output, i, p, k)?,
+
Signature(ref s) => {
writeln!(output, "Signature Packet")?;
writeln!(output, "{} Version: {}", i, s.version())?;
@@ -340,133 +479,6 @@ impl PacketDumper {
writeln!(output, "{} Last: {}", i, o.last())?;
},
- PublicKey(ref k) | PublicSubkey(ref k)
- | SecretKey(ref k) | SecretSubkey(ref k) =>
- {
- writeln!(output, "{}", p.tag())?;
- writeln!(output, "{} Version: {}", i, k.version())?;
- writeln!(output, "{} Creation time: {}", i,
- time::strftime(TIMEFMT, k.creation_time()).unwrap())?;
- writeln!(output, "{} Pk algo: {}", i, k.pk_algo())?;
- if let Some(bits) = k.mpis().bits() {
- writeln!(output, "{} Pk size: {} bits", i, bits)?;
- }
- if self.mpis {
- writeln!(output, "{}", i)?;
- writeln!(output, "{} Public Key:", i)?;
-
- let ii = format!("{} ", i);
- match k.mpis() {
- mpis::PublicKey::RSA { e, n } =>
- self.dump_mpis(output, &ii,
- &[e.value(), n.value()],
- &["e", "n"])?,
- mpis::PublicKey::DSA { p, q, g, y } =>
- self.dump_mpis(output, &ii,
- &[p.value(), q.value(), g.value(),
- y.value()],
- &["p", "q", "g", "y"])?,
- mpis::PublicKey::Elgamal { p, g, y } =>
- self.dump_mpis(output, &ii,
- &[p.value(), g.value(), y.value()],
- &["p", "g", "y"])?,
- mpis::PublicKey::EdDSA { curve, q } => {
- writeln!(output, "{} Curve: {}", ii, curve)?;
- self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
- },
- mpis::PublicKey::ECDSA { curve, q } => {
- writeln!(output, "{} Curve: {}", ii, curve)?;
- self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
- },
- mpis::PublicKey::ECDH { curve, q, hash, sym } => {
- writeln!(output, "{} Curve: {}", ii, curve)?;
- writeln!(output, "{} Hash algo: {}", ii, hash)?;
- writeln!(output, "{} Symmetric algo: {}", ii,
- sym)?;
- self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
- },
- mpis::PublicKey::Unknown { mpis, rest } => {
- let keys: Vec<String> =
- (0..mpis.len()).map(
- |i| format!("mpi{}", i)).collect();
- self.dump_mpis(
- output, &ii,
- &mpis.iter().map(|m| {
- m.value().iter().as_slice()
- }).collect::<Vec<_>>()[..],
- &keys.iter().map(|k| k.as_str())
- .collect::<Vec<_>>()[..],
- )?;
-
- self.dump_mpis(output, &ii, &[&rest[..]], &["rest"])?;
- },
- }
-
- if let Some(secrets) = k.secret() {
- use self::openpgp::packet::key::SecretKeyMaterial;
- writeln!(output, "{}", i)?;
- writeln!(output, "{} Secret Key:", i)?;
-
- let ii = format!("{} ", i);
- match secrets {
- SecretKeyMaterial::Unencrypted(ref u) => u.map(
- |mpis| -> Result<()> {
- match mpis
- {
- mpis::SecretKeyMaterial::RSA { d, p, q, u } =>
- self.dump_mpis(output, &ii,
- &[d.value(), p.value(),
- q.value(), u.value()],
- &["d", "p", "q", "u"])?,
- mpis::SecretKeyMaterial::DSA { x } =>
- self.dump_mpis(output, &ii, &[x.value()],
- &["x"])?,
- mpis::SecretKeyMaterial::Elgamal { x } =>
- self.dump_mpis(output, &ii, &[x.value()],
- &["x"])?,
- mpis::SecretKeyMaterial::EdDSA { scalar } =>
- self.dump_mpis(output, &ii,
- &[scalar.value()],
- &["scalar"])?,
- mpis::SecretKeyMaterial::ECDSA { scalar } =>
- self.dump_mpis(output, &ii,
- &[scalar.value()],
- &["scalar"])?,
- mpis::SecretKeyMaterial::ECDH { scalar } =>
- self.dump_mpis(output, &ii,
- &[scalar.value()],
- &["scalar"])?,
- mpis::SecretKeyMaterial::Unknown { mpis, rest } => {
- let keys: Vec<String> =
- (0..mpis.len()).map(
- |i| format!("mpi{}", i)).collect();
- self.dump_mpis(
- output, &ii,
- &mpis.iter().map(|m| {
- m.value().iter().as_slice()
- }).collect::<Vec<_>>()[..],
- &keys.iter().map(|k| k.as_str())
- .collect::<Vec<_>>()[..],
- )?;
-
- self.dump_mpis(output, &ii, &[rest],
- &["rest"])?;
- },
- } Ok(()) })?,
- SecretKeyMaterial::Encrypted(ref e) => {
- writeln!(output, "{}", i)?;
- write!(output, "{} S2K: ", ii)?;
- self.dump_s2k(output, &ii, e.s2k())?;
- writeln!(output, "{} Sym. algo: {}", ii,
- e.algo())?;
- self.dump_mpis(output, &ii, &[e.ciphertext()],
- &["ciphertext"])?;
- },
- }
- }
- }
- },
-
Trust(ref p) => {
writeln!(output, "Trust Packet")?;
writeln!(output, "{} Value: {}", i, hex::encode(p.value()))?;