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 pathspecs.

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 a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

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.

Performs the conversion.

Performs the conversion.

Performs the conversion.

Creates a value from an iterator. Read more

The associated error which can be returned from parsing.

Parses a string s to return a value of this type. Read more

Writes a serialized version of the specified PacketPile to o.

Exports a serialized version of the specified PacketPile to o.

Computes the maximal length of the serialized representation. Read more

Serializes into the given buffer. Read more

Exports into the given buffer. Read more

Serializes the packet to a vector.

Exports to a vector. 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 !=.

Writes a serialized version of the object to o.

Exports a serialized version of the object to o. Read more

Computes the maximal length of the serialized representation. Read more

Serializes into the given buffer. Read more

Serializes the packet to a vector.

Exports into the given buffer. Read more

Exports to a vector. Read more

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.

The type returned in the event of a conversion error.

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());

The type returned in the event of a conversion error.

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.

The type returned in the event of a conversion error.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.