Module sequoia_openpgp::serialize
source · Expand description
Packet serialization infrastructure.
OpenPGP defines a binary representation suitable for storing and communicating OpenPGP data structures (see Section 3 ff. of RFC 4880). Serialization is the process of creating the binary representation.
There are two interfaces to serialize OpenPGP data. Which one is applicable depends on whether or not the packet structure is already assembled in memory, with all information already in place (e.g. because it was previously parsed).
If it is, you can use the Serialize
or SerializeInto
trait. Otherwise, please use our streaming serialization
interface.
§Streaming serialization
The streaming serialization interface is the preferred way to create OpenPGP messages (see Section 11.3 of RFC 4880). It is ergonomic, yet flexible enough to accommodate most use cases. It requires little buffering, minimizing the memory footprint of the operation.
This example demonstrates how to create the simplest possible OpenPGP message (see Section 11.3 of RFC 4880) containing just a literal data packet (see Section 5.9 of RFC 4880):
use std::io::Write;
use sequoia_openpgp as openpgp;
use openpgp::serialize::stream::{Message, LiteralWriter};
let mut o = vec![];
{
let message = Message::new(&mut o);
let mut w = LiteralWriter::new(message).build()?;
w.write_all(b"Hello world.")?;
w.finalize()?;
}
assert_eq!(b"\xcb\x12b\x00\x00\x00\x00\x00Hello world.", o.as_slice());
For a more complete example, see the streaming examples.
§Serializing objects
The traits Serialize
and SerializeInto
provide a mechanism
to serialize OpenPGP data structures. Serialize
writes to
io::Write
rs, while SerializeInto
writes into pre-allocated
buffers, computes the size of the serialized representation, and
provides a convenient method to create byte vectors with the
serialized form.
To prevent accidentally serializing data structures that are not
commonly exchanged between OpenPGP implementations, Serialize
and SerializeInto
is only implemented for types like
Packet
, Cert
, and Message
, but not for packet bodies
like Signature
.
This example demonstrates how to serialize a literal data packet (see Section 5.9 of RFC 4880):
use sequoia_openpgp as openpgp;
use openpgp::packet::{Literal, Packet};
use openpgp::serialize::{Serialize, SerializeInto};
let mut l = Literal::default();
l.set_body(b"Hello world.".to_vec());
// Add packet framing.
let p = Packet::from(l);
// Using Serialize.
let mut b = vec![];
p.serialize(&mut b)?;
assert_eq!(b"\xcb\x12b\x00\x00\x00\x00\x00Hello world.", b.as_slice());
// Using SerializeInto.
let b = p.to_vec()?;
assert_eq!(b"\xcb\x12b\x00\x00\x00\x00\x00Hello world.", b.as_slice());
§Marshalling objects
The traits Marshal
and MarshalInto
provide a mechanism to
serialize all OpenPGP data structures in this crate, even those
not commonly interchanged between OpenPGP implementations. For
example, it allows the serialization of unframed packet bodies:
use sequoia_openpgp as openpgp;
use openpgp::packet::Literal;
use openpgp::serialize::{Marshal, MarshalInto};
let mut l = Literal::default();
l.set_body(b"Hello world.".to_vec());
// Using Marshal.
let mut b = vec![];
l.serialize(&mut b)?;
assert_eq!(b"b\x00\x00\x00\x00\x00Hello world.", b.as_slice());
// Using MarshalInto.
let b = l.to_vec()?;
assert_eq!(b"b\x00\x00\x00\x00\x00Hello world.", b.as_slice());
Modules§
- Streaming packet serialization.
Structs§
- A reference to a
Cert
that allows serialization of secret keys.
Traits§
- Serializes OpenPGP data structures.
- Serializes OpenPGP data structures into pre-allocated buffers.
- Serializes OpenPGP data structures.
- Serializes OpenPGP data structures into pre-allocated buffers.