Struct sequoia_openpgp::PacketPile [−][src]
pub struct PacketPile { /* fields omitted */ }
Expand description
An unstructured packet sequence.
To parse an OpenPGP packet stream into a PacketPile
, you can use
PacketParser
, PacketPileParser
, or
PacketPile::from_file
(or related routines).
You can also convert a Cert
into a PacketPile
using
PacketPile::from
. Unlike serializing a Cert
, this does not
drop any secret key material.
Normally, you’ll want to convert the PacketPile
to a Cert
or a
Message
.
Examples
This example shows how to modify packets in PacketPile using pathspec
s.
use std::convert::TryFrom; use openpgp::{Packet, PacketPile}; use openpgp::packet::signature::Signature4; use openpgp::packet::Signature; use openpgp::cert::prelude::*; use openpgp::parse::Parse; use openpgp::serialize::Serialize; use openpgp::policy::StandardPolicy; use openpgp::crypto::mpi; use openpgp::types::RevocationStatus::{Revoked, CouldBe}; let (cert, revocation) = CertBuilder::new().generate()?; let mut buffer = Vec::new(); cert.serialize(&mut buffer)?; let packet: Packet = revocation.into(); packet.serialize(&mut buffer)?; let policy = &StandardPolicy::new(); // Certificate is considered revoked because it is accompanied with its // revocation signature let pp: PacketPile = PacketPile::from_bytes(&buffer)?; let cert = Cert::try_from(pp)?; if let Revoked(_) = cert.revocation_status(policy, None) { // cert is considered revoked } // Breaking the revocation signature changes certificate's status let mut pp: PacketPile = PacketPile::from_bytes(&buffer)?; if let Some(Packet::Signature(ref mut sig)) = pp.path_ref_mut(&[2]) { *sig = Signature4::new( sig.typ(), sig.pk_algo(), sig.hash_algo(), sig.hashed_area().clone(), sig.unhashed_area().clone(), *sig.digest_prefix(), // MPI is replaced with a dummy one mpi::Signature::RSA { s: mpi::MPI::from(vec![1, 2, 3]) }).into(); } let cert = Cert::try_from(pp)?; if let NotAsFarAsWeKnow = cert.revocation_status(policy, None) { // revocation signature is broken and the cert is not revoked assert_eq!(cert.bad_signatures().count(), 1); }
Implementations
Pretty prints the message to stderr.
This function is primarily intended for debugging purposes.
Returns a reference to the packet at the location described by
pathspec
.
pathspec
is a slice of the form [0, 1, 2]
. Each element
is the index of packet in a container. Thus, the previous
path specification means: return the third child of the second
child of the first top-level packet. In other words, the
starred packet in the following tree:
PacketPile
/ | \
0 1 2 ...
/ \
/ \
0 1 ...
/ | \ ...
0 1 2
*
And, [10]
means return the 11th top-level packet.
Note: there is no packet at the root. Thus, the path []
returns None.
Examples
let pile = PacketPile::from(packets); if let Some(packet) = pile.path_ref(&[0]) { // There is a packet at this path. } if let None = pile.path_ref(&[0, 1, 2]) { // But none here. }
Returns a mutable reference to the packet at the location
described by pathspec
.
See the description of the path_spec
for more details.
Examples
let mut pile = PacketPile::from(packets); if let Some(ref packet) = pile.path_ref_mut(&[0]) { // There is a packet at this path. } if let None = pile.path_ref_mut(&[0, 1, 2]) { // But none here. }
Replaces the specified packets at the location described by
pathspec
with packets
.
If a packet is a container, the sub-tree rooted at the container is removed.
Note: the number of packets to remove need not match the number of packets to insert.
The removed packets are returned.
If the path was invalid, then Error::IndexOutOfRange
is
returned instead.
Examples
// A compressed data packet that contains a literal data packet. let mut literal = Literal::new(DataFormat::Text); literal.set_body(b"old".to_vec()); let mut compressed = CompressedData::new(CompressionAlgorithm::Uncompressed); compressed.children_mut().unwrap().push(literal.into()); let mut pile = PacketPile::from(Packet::from(compressed)); // Replace the literal data packet. let mut literal = Literal::new(DataFormat::Text); literal.set_body(b"new".to_vec()); pile.replace( &[0, 0], 1, [literal.into()].to_vec())?;
Returns an iterator over all of the packet’s descendants, in depth-first order.
let mut lit = Literal::new(DataFormat::Text); lit.set_body(b"test".to_vec()); let pile = PacketPile::from(vec![lit.into()]); for packet in pile.descendants() { assert_eq!(packet.tag(), Tag::Literal); }
Returns an iterator over the top-level packets.
let mut lit = Literal::new(DataFormat::Text); lit.set_body(b"test".to_vec()); let pile = PacketPile::from(vec![lit.into()]); assert_eq!(pile.children().len(), 1);
Returns an IntoIter
over the top-level packets.
let mut lit = Literal::new(DataFormat::Text); lit.set_body(b"test".to_vec()); let pile = PacketPile::from(vec![lit.into()]); for packet in pile.into_children() { assert_eq!(packet.tag(), Tag::Literal); }
Trait Implementations
Returns the “default value” for a type. Read more
Converts the Cert
into a PacketPile
.
If any packets include secret key material, that secret key
material is not dropped, as it is when serializing a Cert
.
Performs the conversion.
Creates a value from an iterator. Read more
Deserializes the OpenPGP message stored in a std::io::Read
object.
Although this method is easier to use to parse a sequence of
OpenPGP packets than a PacketParser
or a
PacketPileParser
, this interface buffers the whole message
in memory. Thus, the caller must be certain that the
deserialized message is not too large.
Note: this interface does buffer the contents of packets.
Deserializes the OpenPGP message stored in the file named by
path
.
See from_reader
for more details and caveats.
Deserializes the OpenPGP message stored in the provided buffer.
See from_reader
for more details and caveats.
This method tests for self
and other
values to be equal, and is used
by ==
. Read more
This method tests for !=
.
Reads all of the packets from a PacketParser
, and turns them
into a message.
Note: this assumes that ppr
points to a top-level packet.
Returns the certificate found in the PacketPile
.
If the PacketPile
does not start with a certificate
(specifically, if it does not start with a primary key
packet), then this fails.
If the sequence contains multiple certificates (i.e., it is a
keyring), or the certificate is followed by an invalid packet
this function will fail. To parse keyrings, use
CertParser
instead of this function.
Examples
use sequoia_openpgp as openpgp; use openpgp::cert::prelude::*; use openpgp::packet::prelude::*; use openpgp::PacketPile; use std::convert::TryFrom; let (cert, rev) = CertBuilder::general_purpose(None, Some("alice@example.org")) .generate()?; // We should be able to turn a certificate into a PacketPile // and back. let pp : PacketPile = cert.into(); assert!(Cert::try_from(pp).is_ok()); // But a revocation certificate is not a certificate, so this // will fail. let pp : PacketPile = Packet::from(rev).into(); assert!(Cert::try_from(pp).is_err());
Converts the PacketPile
to a Message
.
Converting a PacketPile
to a Message
doesn’t change the
packets; it asserts that the packet sequence is an optionally
encrypted, optionally signed, optionally compressed literal
data packet. The exact grammar is defined in Section 11.3 of
RFC 4880.
Caveats: this function assumes that any still encrypted parts or still compressed parts are valid messages.
Auto Trait Implementations
impl !RefUnwindSafe for PacketPile
impl Send for PacketPile
impl Sync for PacketPile
impl Unpin for PacketPile
impl !UnwindSafe for PacketPile
Blanket Implementations
Mutably borrows from an owned value. Read more
type Output = T
type Output = T
Should always be Self