Struct sequoia_openpgp::packet::signature::subpacket::SubpacketArea
source · pub struct SubpacketArea { /* private fields */ }
Expand description
Subpacket area.
A version 4 Signature contains two areas that can stored
signature subpackets: a so-called hashed subpacket area, and a
so-called unhashed subpacket area. The hashed subpacket area is
protected by the signature; the unhashed area is not. This makes
the unhashed subpacket area only appropriate for
self-authenticating data, like the Issuer
subpacket. The
SubpacketAreas
data structure understands these nuances and
routes lookups appropriately. As such, it is usually better to
work with subpackets using that interface.
§Examples
fn sig_stats(sig: &Signature) {
eprintln!("Hashed subpacket area has {} subpackets",
sig.hashed_area().iter().count());
eprintln!("Unhashed subpacket area has {} subpackets",
sig.unhashed_area().iter().count());
}
Implementations§
source§impl SubpacketArea
impl SubpacketArea
sourcepub fn new(packets: Vec<Subpacket>) -> Result<SubpacketArea>
pub fn new(packets: Vec<Subpacket>) -> Result<SubpacketArea>
Returns a new subpacket area containing the given packets
.
sourcepub fn iter(&self) -> impl Iterator<Item = &Subpacket> + Send + Sync
pub fn iter(&self) -> impl Iterator<Item = &Subpacket> + Send + Sync
Iterates over the subpackets.
§Examples
Print the number of different types of subpackets in a Signature’s hashed subpacket area:
let mut tags: Vec<_> = sig.hashed_area().iter().map(|sb| {
sb.tag()
}).collect();
tags.sort();
tags.dedup();
eprintln!("The hashed area contains {} types of subpackets",
tags.len());
sourcepub fn subpacket(&self, tag: SubpacketTag) -> Option<&Subpacket>
pub fn subpacket(&self, tag: SubpacketTag) -> Option<&Subpacket>
Returns a reference to the last instance of the specified subpacket, if any.
A given subpacket may occur multiple times. For some, like
the Notation Data
subpacket, this is reasonable. For
others, like the Signature Creation Time
subpacket, this
results in an ambiguity. Section 5.2.4.1 of RFC 4880 says:
a signature may contain multiple copies of a preference or multiple expiration times. In most cases, an implementation SHOULD use the last subpacket in the signature, but MAY use any conflict resolution scheme that makes more sense.
This function implements the recommended strategy of returning the last subpacket.
§Examples
All signatures must have a Signature Creation Time
subpacket
in the hashed subpacket area:
use sequoia_openpgp as openpgp;
use openpgp::packet::signature::subpacket::SubpacketTag;
if sig.hashed_area().subpacket(SubpacketTag::SignatureCreationTime).is_none() {
eprintln!("Invalid signature.");
}
sourcepub fn subpacket_mut(&mut self, tag: SubpacketTag) -> Option<&mut Subpacket>
pub fn subpacket_mut(&mut self, tag: SubpacketTag) -> Option<&mut Subpacket>
Returns a mutable reference to the last instance of the specified subpacket, if any.
A given subpacket may occur multiple times. For some, like
the Notation Data
subpacket, this is reasonable. For
others, like the Signature Creation Time
subpacket, this
results in an ambiguity. Section 5.2.4.1 of RFC 4880 says:
a signature may contain multiple copies of a preference or multiple expiration times. In most cases, an implementation SHOULD use the last subpacket in the signature, but MAY use any conflict resolution scheme that makes more sense.
This function implements the recommended strategy of returning the last subpacket.
§Examples
All signatures must have a Signature Creation Time
subpacket
in the hashed subpacket area:
use sequoia_openpgp as openpgp;
use openpgp::packet::signature::subpacket::SubpacketTag;
if sig.hashed_area().subpacket(SubpacketTag::SignatureCreationTime).is_none() {
eprintln!("Invalid signature.");
}
sourcepub fn subpackets(
&self,
target: SubpacketTag,
) -> impl Iterator<Item = &Subpacket> + Send + Sync
pub fn subpackets( &self, target: SubpacketTag, ) -> impl Iterator<Item = &Subpacket> + Send + Sync
Returns all instances of the specified subpacket.
For most subpackets, only a single instance of the subpacket
makes sense. SubpacketArea::subpacket
resolves this
ambiguity by returning the last instance of the request
subpacket type. But, for some subpackets, like the Notation Data
subpacket, multiple instances of the subpacket are
reasonable.
§Examples
Count the number of Notation Data
subpackets in the hashed
subpacket area:
use sequoia_openpgp as openpgp;
use openpgp::packet::signature::subpacket::SubpacketTag;
eprintln!("Signature has {} notations.",
sig.hashed_area().subpackets(SubpacketTag::NotationData).count());
sourcepub fn add(&mut self, packet: Subpacket) -> Result<()>
pub fn add(&mut self, packet: Subpacket) -> Result<()>
Adds the given subpacket.
Adds the given subpacket to the subpacket area. If the
subpacket area already contains subpackets with the same tag,
they are left in place. If you want to replace them, you
should instead use the SubpacketArea::replace
method.
§Errors
Returns Error::MalformedPacket
if adding the packet makes
the subpacket area exceed the size limit.
§Examples
Adds an additional Issuer
subpacket to the unhashed
subpacket area. (This is useful if the key material is
associated with multiple certificates, e.g., a v4 and a v5
certificate.) Because the subpacket is added to the unhashed
area, the signature remains valid.
use sequoia_openpgp as openpgp;
use openpgp::KeyID;
use openpgp::packet::signature::subpacket::{
Subpacket,
SubpacketTag,
SubpacketValue,
};
let mut sig: Signature = sig;
sig.unhashed_area_mut().add(
Subpacket::new(
SubpacketValue::Issuer(KeyID::from_hex("AAAA BBBB CCCC DDDD")?),
false)?);
sig.verify_message(signer.public(), msg)?;
sourcepub fn replace(&mut self, packet: Subpacket) -> Result<()>
pub fn replace(&mut self, packet: Subpacket) -> Result<()>
Adds the given subpacket, replacing all other subpackets with the same tag.
Adds the given subpacket to the subpacket area. If the
subpacket area already contains subpackets with the same tag,
they are first removed. If you want to preserve them, you
should instead use the SubpacketArea::add
method.
§Errors
Returns Error::MalformedPacket
if adding the packet makes
the subpacket area exceed the size limit.
§Examples
Assuming we have a signature with an additional Issuer
subpacket in the unhashed area (see the example for
SubpacketArea::add
, this replaces the Issuer
subpacket
in the unhashed area. Because the unhashed area is not
protected by the signature, the signature remains valid:
use sequoia_openpgp as openpgp;
use openpgp::KeyID;
use openpgp::packet::signature::subpacket::{
Subpacket,
SubpacketTag,
SubpacketValue,
};
// First, add a subpacket to the unhashed area.
let mut sig: Signature = sig;
sig.unhashed_area_mut().add(
Subpacket::new(
SubpacketValue::Issuer(KeyID::from_hex("DDDD CCCC BBBB AAAA")?),
false)?);
// Now, replace it.
sig.unhashed_area_mut().replace(
Subpacket::new(
SubpacketValue::Issuer(KeyID::from_hex("AAAA BBBB CCCC DDDD")?),
false)?);
sig.verify_message(signer.public(), msg)?;
sourcepub fn remove_all(&mut self, tag: SubpacketTag)
pub fn remove_all(&mut self, tag: SubpacketTag)
Removes all subpackets with the given tag.
sourcepub fn sort(&mut self)
pub fn sort(&mut self)
Sorts the subpackets by subpacket tag.
This normalizes the subpacket area, and accelerates lookups in implementations that sort the in-core representation and use binary search for lookups.
The subpackets are sorted by the numeric value of their tag.
The sort is stable. So, if there are multiple Notation Data
subpackets, for instance, they will remain in the same order.
The SignatureBuilder
sorts the subpacket areas just before
creating the signature.
Trait Implementations§
source§impl Clone for SubpacketArea
impl Clone for SubpacketArea
source§fn clone(&self) -> SubpacketArea
fn clone(&self) -> SubpacketArea
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for SubpacketArea
impl Debug for SubpacketArea
source§impl Default for SubpacketArea
impl Default for SubpacketArea
source§impl Hash for SubpacketArea
impl Hash for SubpacketArea
source§impl<'a> IntoIterator for &'a SubpacketArea
impl<'a> IntoIterator for &'a SubpacketArea
source§impl Marshal for SubpacketArea
impl Marshal for SubpacketArea
source§impl MarshalInto for SubpacketArea
impl MarshalInto for SubpacketArea
source§fn serialized_len(&self) -> usize
fn serialized_len(&self) -> usize
source§fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
source§impl Ord for SubpacketArea
impl Ord for SubpacketArea
source§fn cmp(&self, other: &SubpacketArea) -> Ordering
fn cmp(&self, other: &SubpacketArea) -> Ordering
1.21.0 · source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
source§impl PartialEq for SubpacketArea
impl PartialEq for SubpacketArea
source§fn eq(&self, other: &SubpacketArea) -> bool
fn eq(&self, other: &SubpacketArea) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl PartialOrd for SubpacketArea
impl PartialOrd for SubpacketArea
source§fn partial_cmp(&self, other: &SubpacketArea) -> Option<Ordering>
fn partial_cmp(&self, other: &SubpacketArea) -> Option<Ordering>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read moreimpl Eq for SubpacketArea
Auto Trait Implementations§
impl !Freeze for SubpacketArea
impl RefUnwindSafe for SubpacketArea
impl Send for SubpacketArea
impl Sync for SubpacketArea
impl Unpin for SubpacketArea
impl UnwindSafe for SubpacketArea
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)