[−][src]Struct sequoia_openpgp::PacketPile
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 key is not definitely revoked assert_eq!(cert.bad_signatures().count(), 1); }
Implementations
impl PacketPile
[src]
pub fn pretty_print(&self)
[src]
Pretty prints the message to stderr.
This function is primarily intended for debugging purposes.
pub fn path_ref(&self, pathspec: &[usize]) -> Option<&Packet>
[src]
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. }
pub fn path_ref_mut(&mut self, pathspec: &[usize]) -> Option<&mut Packet>
[src]
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. }
pub fn replace(
&mut self,
pathspec: &[usize],
count: usize,
packets: Vec<Packet>
) -> Result<Vec<Packet>>
[src]
&mut self,
pathspec: &[usize],
count: usize,
packets: Vec<Packet>
) -> Result<Vec<Packet>>
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())?;
pub fn descendants(&self) -> Iter<'_>ⓘ
[src]
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); }
pub fn children(
&self
) -> impl Iterator<Item = &Packet> + ExactSizeIterator + Send + Sync
[src]
&self
) -> impl Iterator<Item = &Packet> + ExactSizeIterator + Send + Sync
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);
pub fn into_children(
self
) -> impl Iterator<Item = Packet> + ExactSizeIterator + Send + Sync
[src]
self
) -> impl Iterator<Item = Packet> + ExactSizeIterator + Send + Sync
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
impl Clone for PacketPile
[src]
pub fn clone(&self) -> PacketPile
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for PacketPile
[src]
impl Default for PacketPile
[src]
pub fn default() -> PacketPile
[src]
impl From<Cert> for PacketPile
[src]
pub fn from(cert: Cert) -> PacketPile
[src]
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
.
impl From<Message> for PacketPile
[src]
impl From<Packet> for PacketPile
[src]
impl From<PacketPile> for Vec<Packet>
[src]
pub fn from(pp: PacketPile) -> Self
[src]
impl From<Vec<Packet, Global>> for PacketPile
[src]
impl FromIterator<Packet> for PacketPile
[src]
pub fn from_iter<I: IntoIterator<Item = Packet>>(iter: I) -> Self
[src]
impl FromStr for PacketPile
[src]
type Err = Error
The associated error which can be returned from parsing.
pub fn from_str(s: &str) -> Result<Self, Self::Err>
[src]
impl Marshal for PacketPile
[src]
pub fn serialize(&self, o: &mut dyn Write) -> Result<()>
[src]
Writes a serialized version of the specified PacketPile
to o
.
pub fn export(&self, o: &mut dyn Write) -> Result<()>
[src]
Exports a serialized version of the specified PacketPile
to o
.
impl MarshalInto for PacketPile
[src]
pub fn serialized_len(&self) -> usize
[src]
pub fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
pub fn export_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
pub fn to_vec(&self) -> Result<Vec<u8>>
[src]
pub fn export_to_vec(&self) -> Result<Vec<u8>>
[src]
impl<'a> Parse<'a, PacketPile> for PacketPile
[src]
pub fn from_reader<R: 'a + Read + Send + Sync>(reader: R) -> Result<PacketPile>
[src]
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.
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<PacketPile>
[src]
Deserializes the OpenPGP message stored in the file named by
path
.
See from_reader
for more details and caveats.
pub fn from_bytes<D: AsRef<[u8]> + ?Sized>(data: &'a D) -> Result<PacketPile>
[src]
Deserializes the OpenPGP message stored in the provided buffer.
See from_reader
for more details and caveats.
impl PartialEq<PacketPile> for PacketPile
[src]
pub fn eq(&self, other: &PacketPile) -> bool
[src]
pub fn ne(&self, other: &PacketPile) -> bool
[src]
impl Serialize for PacketPile
[src]
pub fn serialize(&self, o: &mut dyn Write) -> Result<()>
[src]
pub fn export(&self, o: &mut dyn Write) -> Result<()>
[src]
impl SerializeInto for PacketPile
[src]
pub fn serialized_len(&self) -> usize
[src]
pub fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
pub fn to_vec(&self) -> Result<Vec<u8>>
[src]
pub fn export_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
pub fn export_to_vec(&self) -> Result<Vec<u8>>
[src]
impl StructuralPartialEq for PacketPile
[src]
impl<'a> TryFrom<PacketParserResult<'a>> for PacketPile
[src]
type Error = Error
The type returned in the event of a conversion error.
pub fn try_from(ppr: PacketParserResult<'a>) -> Result<PacketPile>
[src]
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.
impl TryFrom<PacketPile> for Cert
[src]
type Error = Error
The type returned in the event of a conversion error.
pub fn try_from(p: PacketPile) -> Result<Self>
[src]
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());
impl TryFrom<PacketPile> for Message
[src]
type Error = Error
The type returned in the event of a conversion error.
pub fn try_from(pile: PacketPile) -> Result<Self>
[src]
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
[src]
impl Send for PacketPile
[src]
impl Sync for PacketPile
[src]
impl Unpin for PacketPile
[src]
impl UnwindSafe for PacketPile
[src]
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DynClone for T where
T: Clone,
[src]
T: Clone,
pub fn __clone_box(&self, Private) -> *mut ()
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Same<T> for T
type Output = T
Should always be Self
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,