Bump Sequoia to 0.9.

- Sequoia now ignores any unhashed subpackets when comparing
    signatures, closing a DoS vector.  Previously, one could create
    any number of valid signatures from a single valid signature that
    were considered distinct by mutating the unhashed subpacket area.

  - Sequoia now handles malformed UserIDs of the form "$addr <$addr>".
    Adjust database::test::test_bad_uids accordingly.

  - Update src/dump.rs from Sequoia.

  - Sequoia now ignores any Unicode codepoint considered whitespace
    when parsing Fingerprints and KeyIDs.  Fixes #122.
This commit is contained in:
Justus Winter 2019-07-08 17:16:19 +02:00
parent 71d38ae865
commit d628acdf93
No known key found for this signature in database
GPG Key ID: 686F55B4AB2B3386
7 changed files with 118 additions and 107 deletions

22
Cargo.lock generated
View File

@ -181,7 +181,7 @@ dependencies = [
[[package]] [[package]]
name = "buffered-reader" name = "buffered-reader"
version = "0.8.0" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",
@ -623,7 +623,7 @@ dependencies = [
"rocket 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rocket 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rocket_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_contrib 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rocket_contrib 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"sequoia-openpgp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sequoia-openpgp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
@ -648,7 +648,7 @@ dependencies = [
"multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", "multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pathdiff 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pathdiff 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"sequoia-openpgp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sequoia-openpgp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
@ -674,7 +674,7 @@ dependencies = [
"multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)", "multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
"pathdiff 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pathdiff 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"sequoia-openpgp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sequoia-openpgp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1766,11 +1766,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "sequoia-openpgp" name = "sequoia-openpgp"
version = "0.8.0" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)",
"buffered-reader 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "buffered-reader 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"lalrpop 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "lalrpop 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1780,13 +1780,13 @@ dependencies = [
"nettle 5.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "nettle 5.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)", "quickcheck 0.8.5 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
"sequoia-rfc2822 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "sequoia-rfc2822 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "sequoia-rfc2822" name = "sequoia-rfc2822"
version = "0.8.0" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2310,7 +2310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
"checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" "checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09"
"checksum buf_redux 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72f25c67abbf523ff8457771622fb731ac4a2391439de33bc60febcdee1749c9" "checksum buf_redux 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72f25c67abbf523ff8457771622fb731ac4a2391439de33bc60febcdee1749c9"
"checksum buffered-reader 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8dfde2ced54994f147d1e970f18aebedd6b33b82320197a66f957b19e797402" "checksum buffered-reader 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "237cf351e1e6666907f4e2b59ee4a00083280445a0c6eb2261640615a3a33317"
"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
"checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101"
@ -2482,8 +2482,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum sequoia-openpgp 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfb5b4f16d3772c94775d89a98b70492889d16beba20c6e635858f033d254f06" "checksum sequoia-openpgp 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc4ddaa91071dad9d960b199e9c7884a72094f6d5ef6559c2cf0327ae215f000"
"checksum sequoia-rfc2822 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbb2baa4147c0d9e88db2a9db73a23c30c9860ec3131394570ef6bbb0e1e5e" "checksum sequoia-rfc2822 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac5c04d61bc70a72173c9a1b3d0ce06dd7e992d90e67614245e108834c2443aa"
"checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b" "checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b"
"checksum serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "ef45eb79d6463b22f5f9e16d283798b7c0175ba6050bc25c1a946c122727fe7b" "checksum serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "ef45eb79d6463b22f5f9e16d283798b7c0175ba6050bc25c1a946c122727fe7b"
"checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" "checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704"

View File

@ -16,7 +16,7 @@ hagrid-database = { path = "database" }
failure = "0.1.5" failure = "0.1.5"
rocket = "0" rocket = "0"
rocket_codegen = "0" rocket_codegen = "0"
sequoia-openpgp = { version = "0.8", default-features = false } sequoia-openpgp = { version = "0.9", default-features = false }
multipart = "0" multipart = "0"
log = "0" log = "0"
serde = "1.0" serde = "1.0"

View File

@ -5,7 +5,7 @@ authors = ["Kai Michaelis <kai@sequoia-pgp.org>"]
[dependencies] [dependencies]
failure = "0.1.5" failure = "0.1.5"
sequoia-openpgp = { version = "0.8", default-features = false } sequoia-openpgp = { version = "0.9", default-features = false }
multipart = "0" multipart = "0"
log = "0" log = "0"
rand = "0.6" rand = "0.6"

View File

@ -911,26 +911,30 @@ pub fn test_bad_uids<D: Database>(db: &mut D) {
.unwrap() .unwrap()
.0; .0;
let fpr = Fingerprint::try_from(tpk.fingerprint()).unwrap(); let fpr = Fingerprint::try_from(tpk.fingerprint()).unwrap();
let email1 = Email::from_str(str_uid1).unwrap();
let email2 = Email::from_str(str_uid2).unwrap(); let email2 = Email::from_str(str_uid2).unwrap();
let tpk_status = db.merge(tpk).unwrap().into_tpk_status(); let tpk_status = db.merge(tpk).unwrap().into_tpk_status();
assert_eq!(TpkStatus { assert_eq!(TpkStatus {
is_revoked: false, is_revoked: false,
email_status: vec!( email_status: vec!(
(email1.clone(), EmailAddressStatus::NotPublished),
(email2.clone(), EmailAddressStatus::NotPublished), (email2.clone(), EmailAddressStatus::NotPublished),
), ),
unparsed_uids: 2, unparsed_uids: 1,
}, tpk_status); }, tpk_status);
db.set_email_published(&fpr, &email2).unwrap(); db.set_email_published(&fpr, &email2).unwrap();
let tpk_status = db.get_tpk_status(&fpr, &vec!(email2.clone())).unwrap(); let tpk_status = db.get_tpk_status(&fpr, &vec!(email1.clone(),
email2.clone())).unwrap();
assert_eq!(TpkStatus { assert_eq!(TpkStatus {
is_revoked: false, is_revoked: false,
email_status: vec!( email_status: vec!(
(email1.clone(), EmailAddressStatus::NotPublished),
(email2.clone(), EmailAddressStatus::Published), (email2.clone(), EmailAddressStatus::Published),
), ),
unparsed_uids: 2, unparsed_uids: 1,
}, tpk_status); }, tpk_status);
} }

View File

@ -6,7 +6,7 @@ authors = ["Vincent Breitmose <look@my.amazin.horse>"]
[dependencies] [dependencies]
hagrid-database = { path = "../database" } hagrid-database = { path = "../database" }
failure = "0.1.5" failure = "0.1.5"
sequoia-openpgp = { version = "0.8", default-features = false } sequoia-openpgp = { version = "0.9", default-features = false }
multipart = "0" multipart = "0"
log = "0" log = "0"
rand = "0.6" rand = "0.6"

View File

@ -1,16 +1,18 @@
// from https://gitlab.com/sequoia-pgp/dump.sequoia-pgp.org/blob/master/src/dump.rs // from https://gitlab.com/sequoia-pgp/sequoia/blob/master/tool/src/commands/dump.rs
// plus *very* slight adaptions for seqoia 0.8
use std::io::{self, Read}; use std::io::{self, Read};
use time;
use sequoia_openpgp::constants::SymmetricAlgorithm; extern crate sequoia_openpgp as openpgp;
use sequoia_openpgp::conversions::hex; use self::openpgp::constants::SymmetricAlgorithm;
use sequoia_openpgp::{Packet, Result}; use self::openpgp::conversions::hex;
use sequoia_openpgp::packet::ctb::CTB; use self::openpgp::crypto::mpis;
use sequoia_openpgp::packet::{Header, BodyLength, Signature}; use self::openpgp::{Packet, Result};
use sequoia_openpgp::packet::signature::subpacket::{Subpacket, SubpacketValue}; use self::openpgp::packet::ctb::CTB;
use sequoia_openpgp::crypto::{SessionKey, s2k::S2K}; use self::openpgp::packet::{Header, BodyLength, Signature};
use sequoia_openpgp::parse::{map::Map, Parse, PacketParserResult}; use self::openpgp::packet::signature::subpacket::{Subpacket, SubpacketValue};
use self::openpgp::crypto::{SessionKey, s2k::S2K};
use self::openpgp::parse::{map::Map, Parse, PacketParserResult};
const TIMEFMT: &'static str = "%Y-%m-%dT%H:%M"; const TIMEFMT: &'static str = "%Y-%m-%dT%H:%M";
@ -24,14 +26,17 @@ pub enum Kind {
Unknown, Unknown,
} }
pub fn dump(input: &mut dyn io::Read, output: &mut dyn io::Write, mpis: bool, hex: bool, pub fn dump<W>(input: &mut dyn io::Read, output: &mut dyn io::Write,
sk: Option<&SessionKey>) mpis: bool, hex: bool, sk: Option<&SessionKey>,
-> Result<Kind> { width: W)
-> Result<Kind>
where W: Into<Option<usize>>
{
let mut ppr let mut ppr
= sequoia_openpgp::parse::PacketParserBuilder::from_reader(input)? = self::openpgp::parse::PacketParserBuilder::from_reader(input)?
.map(hex).finalize()?; .map(hex).finalize()?;
let mut message_encrypted = false; let mut message_encrypted = false;
let width = 32 * 4 + 80; let width = width.into().unwrap_or(80);
let mut dumper = PacketDumper::new(width, mpis); let mut dumper = PacketDumper::new(width, mpis);
while let PacketParserResult::Some(mut pp) = ppr { while let PacketParserResult::Some(mut pp) = ppr {
@ -232,7 +237,7 @@ impl PacketDumper {
header: Option<&Header>, p: &Packet, map: Option<&Map>, header: Option<&Header>, p: &Packet, map: Option<&Map>,
additional_fields: Option<&Vec<String>>) additional_fields: Option<&Vec<String>>)
-> Result<()> { -> Result<()> {
use sequoia_openpgp::Packet::*; use self::openpgp::Packet::*;
if let Some(h) = header { if let Some(h) = header {
write!(output, "{} CTB, {}: ", write!(output, "{} CTB, {}: ",
@ -283,40 +288,40 @@ impl PacketDumper {
level <= {} and data)", n - 1)?, level <= {} and data)", n - 1)?,
} }
if self.mpis { if self.mpis {
use sequoia_openpgp::crypto::mpis::Signature::*;
writeln!(output, "{}", i)?; writeln!(output, "{}", i)?;
writeln!(output, "{} Signature:", i)?; writeln!(output, "{} Signature:", i)?;
let ii = format!("{} ", i); let ii = format!("{} ", i);
match s.mpis() { match s.mpis() {
RSA { s } => mpis::Signature::RSA { s } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&s.value], &[s.value()],
&["s"])?, &["s"])?,
DSA { r, s } => mpis::Signature::DSA { r, s } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&r.value, &s.value], &[r.value(), s.value()],
&["r", "s"])?, &["r", "s"])?,
Elgamal { r, s } => mpis::Signature::Elgamal { r, s } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&r.value, &s.value], &[r.value(), s.value()],
&["r", "s"])?, &["r", "s"])?,
EdDSA { r, s } => mpis::Signature::EdDSA { r, s } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&r.value, &s.value], &[r.value(), s.value()],
&["r", "s"])?, &["r", "s"])?,
ECDSA { r, s } => mpis::Signature::ECDSA { r, s } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&r.value, &s.value], &[r.value(), s.value()],
&["r", "s"])?, &["r", "s"])?,
Unknown { mpis, rest } => { mpis::Signature::Unknown { mpis, rest } => {
let keys: Vec<String> = let keys: Vec<String> =
(0..mpis.len()).map( (0..mpis.len()).map(
|i| format!("mpi{}", i)).collect(); |i| format!("mpi{}", i)).collect();
self.dump_mpis( self.dump_mpis(
output, &ii, output, &ii,
&mpis.iter().map(|m| m.value.iter().as_slice()) &mpis.iter().map(|m| {
.collect::<Vec<_>>()[..], m.value().iter().as_slice()
}).collect::<Vec<_>>()[..],
&keys.iter().map(|k| k.as_str()) &keys.iter().map(|k| k.as_str())
.collect::<Vec<_>>()[..], .collect::<Vec<_>>()[..],
)?; )?;
@ -349,48 +354,48 @@ impl PacketDumper {
writeln!(output, "{} Pk size: {} bits", i, bits)?; writeln!(output, "{} Pk size: {} bits", i, bits)?;
} }
if self.mpis { if self.mpis {
use sequoia_openpgp::crypto::mpis::PublicKey::*;
writeln!(output, "{}", i)?; writeln!(output, "{}", i)?;
writeln!(output, "{} Public Key:", i)?; writeln!(output, "{} Public Key:", i)?;
let ii = format!("{} ", i); let ii = format!("{} ", i);
match k.mpis() { match k.mpis() {
RSA { e, n } => mpis::PublicKey::RSA { e, n } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&e.value, &n.value], &[e.value(), n.value()],
&["e", "n"])?, &["e", "n"])?,
DSA { p, q, g, y } => mpis::PublicKey::DSA { p, q, g, y } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&p.value, &q.value, &g.value, &[p.value(), q.value(), g.value(),
&y.value], y.value()],
&["p", "q", "g", "y"])?, &["p", "q", "g", "y"])?,
Elgamal { p, g, y } => mpis::PublicKey::Elgamal { p, g, y } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&p.value, &g.value, &y.value], &[p.value(), g.value(), y.value()],
&["p", "g", "y"])?, &["p", "g", "y"])?,
EdDSA { curve, q } => { mpis::PublicKey::EdDSA { curve, q } => {
writeln!(output, "{} Curve: {}", ii, curve)?; writeln!(output, "{} Curve: {}", ii, curve)?;
self.dump_mpis(output, &ii, &[&q.value], &["q"])?; self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
}, },
ECDSA { curve, q } => { mpis::PublicKey::ECDSA { curve, q } => {
writeln!(output, "{} Curve: {}", ii, curve)?; writeln!(output, "{} Curve: {}", ii, curve)?;
self.dump_mpis(output, &ii, &[&q.value], &["q"])?; self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
}, },
ECDH { curve, q, hash, sym } => { mpis::PublicKey::ECDH { curve, q, hash, sym } => {
writeln!(output, "{} Curve: {}", ii, curve)?; writeln!(output, "{} Curve: {}", ii, curve)?;
writeln!(output, "{} Hash algo: {}", ii, hash)?; writeln!(output, "{} Hash algo: {}", ii, hash)?;
writeln!(output, "{} Symmetric algo: {}", ii, writeln!(output, "{} Symmetric algo: {}", ii,
sym)?; sym)?;
self.dump_mpis(output, &ii, &[&q.value], &["q"])?; self.dump_mpis(output, &ii, &[q.value()], &["q"])?;
}, },
Unknown { mpis, rest } => { mpis::PublicKey::Unknown { mpis, rest } => {
let keys: Vec<String> = let keys: Vec<String> =
(0..mpis.len()).map( (0..mpis.len()).map(
|i| format!("mpi{}", i)).collect(); |i| format!("mpi{}", i)).collect();
self.dump_mpis( self.dump_mpis(
output, &ii, output, &ii,
&mpis.iter().map(|m| m.value.iter().as_slice()) &mpis.iter().map(|m| {
.collect::<Vec<_>>()[..], m.value().iter().as_slice()
}).collect::<Vec<_>>()[..],
&keys.iter().map(|k| k.as_str()) &keys.iter().map(|k| k.as_str())
.collect::<Vec<_>>()[..], .collect::<Vec<_>>()[..],
)?; )?;
@ -400,44 +405,46 @@ impl PacketDumper {
} }
if let Some(secrets) = k.secret() { if let Some(secrets) = k.secret() {
use sequoia_openpgp::crypto::mpis::SecretKey::*; use self::openpgp::packet::key::SecretKey;
writeln!(output, "{}", i)?; writeln!(output, "{}", i)?;
writeln!(output, "{} Secret Key:", i)?; writeln!(output, "{} Secret Key:", i)?;
let ii = format!("{} ", i); let ii = format!("{} ", i);
match secrets { match secrets {
sequoia_openpgp::packet::key::SecretKey::Unencrypted { SecretKey::Unencrypted(ref u) => match u.mpis()
mpis, {
} => match mpis { mpis::SecretKey::RSA { d, p, q, u } =>
RSA { d, p, q, u } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&d.value, &p.value, &q.value, &[d.value(), p.value(),
&u.value], q.value(), u.value()],
&["d", "p", "q", "u"])?, &["d", "p", "q", "u"])?,
DSA { x } => mpis::SecretKey::DSA { x } =>
self.dump_mpis(output, &ii, &[&x.value], self.dump_mpis(output, &ii, &[x.value()],
&["x"])?, &["x"])?,
Elgamal { x } => mpis::SecretKey::Elgamal { x } =>
self.dump_mpis(output, &ii, &[&x.value], self.dump_mpis(output, &ii, &[x.value()],
&["x"])?, &["x"])?,
EdDSA { scalar } => mpis::SecretKey::EdDSA { scalar } =>
self.dump_mpis(output, &ii, &[&scalar.value], self.dump_mpis(output, &ii,
&[scalar.value()],
&["scalar"])?, &["scalar"])?,
ECDSA { scalar } => mpis::SecretKey::ECDSA { scalar } =>
self.dump_mpis(output, &ii, &[&scalar.value], self.dump_mpis(output, &ii,
&[scalar.value()],
&["scalar"])?, &["scalar"])?,
ECDH { scalar } => mpis::SecretKey::ECDH { scalar } =>
self.dump_mpis(output, &ii, &[&scalar.value], self.dump_mpis(output, &ii,
&[scalar.value()],
&["scalar"])?, &["scalar"])?,
Unknown { mpis, rest } => { mpis::SecretKey::Unknown { mpis, rest } => {
let keys: Vec<String> = let keys: Vec<String> =
(0..mpis.len()).map( (0..mpis.len()).map(
|i| format!("mpi{}", i)).collect(); |i| format!("mpi{}", i)).collect();
self.dump_mpis( self.dump_mpis(
output, &ii, output, &ii,
&mpis.iter() &mpis.iter().map(|m| {
.map(|m| m.value.iter().as_slice()) m.value().iter().as_slice()
.collect::<Vec<_>>()[..], }).collect::<Vec<_>>()[..],
&keys.iter().map(|k| k.as_str()) &keys.iter().map(|k| k.as_str())
.collect::<Vec<_>>()[..], .collect::<Vec<_>>()[..],
)?; )?;
@ -446,15 +453,13 @@ impl PacketDumper {
&["rest"])?; &["rest"])?;
}, },
}, },
sequoia_openpgp::packet::key::SecretKey::Encrypted { SecretKey::Encrypted(ref e) => {
s2k, algorithm, ciphertext,
} => {
writeln!(output, "{}", i)?; writeln!(output, "{}", i)?;
write!(output, "{} S2K: ", ii)?; write!(output, "{} S2K: ", ii)?;
self.dump_s2k(output, &ii, s2k)?; self.dump_s2k(output, &ii, e.s2k())?;
writeln!(output, "{} Sym. algo: {}", ii, writeln!(output, "{} Sym. algo: {}", ii,
algorithm)?; e.algo())?;
self.dump_mpis(output, &ii, &[&ciphertext[..]], self.dump_mpis(output, &ii, &[e.ciphertext()],
&["ciphertext"])?; &["ciphertext"])?;
}, },
} }
@ -474,7 +479,7 @@ impl PacketDumper {
}, },
UserAttribute(ref u) => { UserAttribute(ref u) => {
use sequoia_openpgp::packet::user_attribute::{Subpacket, Image}; use self::openpgp::packet::user_attribute::{Subpacket, Image};
writeln!(output, "User Attribute Packet")?; writeln!(output, "User Attribute Packet")?;
for subpacket in u.subpackets() { for subpacket in u.subpackets() {
@ -532,32 +537,32 @@ impl PacketDumper {
writeln!(output, "{} Recipient: {}", i, p.recipient())?; writeln!(output, "{} Recipient: {}", i, p.recipient())?;
writeln!(output, "{} Pk algo: {}", i, p.pk_algo())?; writeln!(output, "{} Pk algo: {}", i, p.pk_algo())?;
if self.mpis { if self.mpis {
use sequoia_openpgp::crypto::mpis::Ciphertext::*;
writeln!(output, "{}", i)?; writeln!(output, "{}", i)?;
writeln!(output, "{} Encrypted session key:", i)?; writeln!(output, "{} Encrypted session key:", i)?;
let ii = format!("{} ", i); let ii = format!("{} ", i);
match p.esk() { match p.esk() {
RSA { c } => mpis::Ciphertext::RSA { c } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&c.value], &[c.value()],
&["c"])?, &["c"])?,
Elgamal { e, c } => mpis::Ciphertext::Elgamal { e, c } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&e.value, &c.value], &[e.value(), c.value()],
&["e", "c"])?, &["e", "c"])?,
ECDH { e, key } => mpis::Ciphertext::ECDH { e, key } =>
self.dump_mpis(output, &ii, self.dump_mpis(output, &ii,
&[&e.value, key], &[e.value(), key],
&["e", "key"])?, &["e", "key"])?,
Unknown { mpis, rest } => { mpis::Ciphertext::Unknown { mpis, rest } => {
let keys: Vec<String> = let keys: Vec<String> =
(0..mpis.len()).map( (0..mpis.len()).map(
|i| format!("mpi{}", i)).collect(); |i| format!("mpi{}", i)).collect();
self.dump_mpis( self.dump_mpis(
output, &ii, output, &ii,
&mpis.iter().map(|m| m.value.iter().as_slice()) &mpis.iter().map(|m| {
.collect::<Vec<_>>()[..], m.value().iter().as_slice()
}).collect::<Vec<_>>()[..],
&keys.iter().map(|k| k.as_str()) &keys.iter().map(|k| k.as_str())
.collect::<Vec<_>>()[..], .collect::<Vec<_>>()[..],
)?; )?;
@ -572,7 +577,7 @@ impl PacketDumper {
writeln!(output, "Symmetric-key Encrypted Session Key Packet")?; writeln!(output, "Symmetric-key Encrypted Session Key Packet")?;
writeln!(output, "{} Version: {}", i, s.version())?; writeln!(output, "{} Version: {}", i, s.version())?;
match s { match s {
sequoia_openpgp::packet::SKESK::V4(ref s) => { self::openpgp::packet::SKESK::V4(ref s) => {
writeln!(output, "{} Symmetric algo: {}", i, writeln!(output, "{} Symmetric algo: {}", i,
s.symmetric_algo())?; s.symmetric_algo())?;
write!(output, "{} S2K: ", i)?; write!(output, "{} S2K: ", i)?;
@ -583,7 +588,7 @@ impl PacketDumper {
} }
}, },
sequoia_openpgp::packet::SKESK::V5(ref s) => { self::openpgp::packet::SKESK::V5(ref s) => {
writeln!(output, "{} Symmetric algo: {}", i, writeln!(output, "{} Symmetric algo: {}", i,
s.symmetric_algo())?; s.symmetric_algo())?;
writeln!(output, "{} AEAD: {}", i, writeln!(output, "{} AEAD: {}", i,
@ -771,11 +776,11 @@ impl PacketDumper {
writeln!(output, "{} Hash: {}", i, hash)?; writeln!(output, "{} Hash: {}", i, hash)?;
writeln!(output, "{} Salt: {}", i, hex::encode(salt))?; writeln!(output, "{} Salt: {}", i, hex::encode(salt))?;
}, },
Iterated { hash, ref salt, .. } => { Iterated { hash, ref salt, hash_bytes } => {
writeln!(output, "Iterated")?; writeln!(output, "Iterated")?;
writeln!(output, "{} Hash: {}", i, hash)?; writeln!(output, "{} Hash: {}", i, hash)?;
writeln!(output, "{} Salt: {}", i, hex::encode(salt))?; writeln!(output, "{} Salt: {}", i, hex::encode(salt))?;
// writeln!(output, "{} Iterations: {}", i, iterations)?; writeln!(output, "{} Hash bytes: {}", i, hash_bytes)?;
}, },
Private(n) => Private(n) =>
writeln!(output, "Private({})", n)?, writeln!(output, "Private({})", n)?,

View File

@ -30,7 +30,9 @@ pub fn debug_info(
&mut result, &mut result,
false, false,
false, false,
None); None,
32 * 4 + 80,
);
match dump_result { match dump_result {
Ok(Kind::TPK) => { Ok(Kind::TPK) => {
match String::from_utf8(result) { match String::from_utf8(result) {