[−][src]Struct sequoia_openpgp::packet::signature::subpacket::SubpacketArea
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
impl SubpacketArea
[src]
pub fn new(packets: Vec<Subpacket>) -> SubpacketArea
[src]
Returns a new subpacket area based on data
.
pub fn iter(&self) -> impl Iterator<Item = &Subpacket>
[src]
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());
pub fn subpacket(&self, tag: SubpacketTag) -> Option<&Subpacket>
[src]
Returns the subpacket, if any, with the specified tag.
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."); }
pub fn subpackets(
&self,
target: SubpacketTag
) -> impl Iterator<Item = &Subpacket>
[src]
&self,
target: SubpacketTag
) -> impl Iterator<Item = &Subpacket>
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());
pub fn add(&mut self, packet: Subpacket) -> Result<()>
[src]
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)?;
pub fn replace(&mut self, packet: Subpacket) -> Result<()>
[src]
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
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, }; let mut sig: Signature = sig; sig.unhashed_area_mut().replace( Subpacket::new( SubpacketValue::Issuer(KeyID::from_hex("AAAA BBBB CCCC DDDD")?), false)?); sig.verify_message(signer.public(), msg)?;
pub fn remove_all(&mut self, tag: SubpacketTag)
[src]
Removes all subpackets with the given tag.
pub fn clear(&mut self)
[src]
Removes all subpackets.
pub fn sort(&mut self)
[src]
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
impl Clone for SubpacketArea
[src]
fn clone(&self) -> Self
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for SubpacketArea
[src]
impl Default for SubpacketArea
[src]
impl Eq for SubpacketArea
[src]
impl Hash for SubpacketArea
[src]
fn hash<H: Hasher>(&self, state: &mut H)
[src]
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher,
1.3.0[src]
H: Hasher,
impl<'a> IntoIterator for &'a SubpacketArea
[src]
type Item = &'a Subpacket
The type of the elements being iterated over.
type IntoIter = Iter<'a, Subpacket>
Which kind of iterator are we turning this into?
fn into_iter(self) -> Self::IntoIter
[src]
impl Marshal for SubpacketArea
[src]
fn serialize(&self, o: &mut dyn Write) -> Result<()>
[src]
fn export(&self, o: &mut dyn Write) -> Result<()>
[src]
impl MarshalInto for SubpacketArea
[src]
fn serialized_len(&self) -> usize
[src]
fn serialize_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
fn to_vec(&self) -> Result<Vec<u8>>
[src]
fn export_into(&self, buf: &mut [u8]) -> Result<usize>
[src]
fn export_to_vec(&self) -> Result<Vec<u8>>
[src]
impl PartialEq<SubpacketArea> for SubpacketArea
[src]
Auto Trait Implementations
impl RefUnwindSafe for SubpacketArea
impl Send for SubpacketArea
impl Sync for SubpacketArea
impl Unpin for SubpacketArea
impl UnwindSafe for SubpacketArea
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,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DynClone for T where
T: Clone,
[src]
T: Clone,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
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.
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>,