Enum sequoia_openpgp::Fingerprint
source · #[non_exhaustive]pub enum Fingerprint {
V4([u8; 20]),
V5([u8; 32]),
Invalid(Box<[u8]>),
}
Expand description
A long identifier for certificates and keys.
A Fingerprint
uniquely identifies a public key.
Currently, Sequoia supports version 4 fingerprints and Key IDs only. Version 3 fingerprints and Key IDs were deprecated by RFC 4880 in 2007.
Essentially, a v4 fingerprint is a SHA-1 hash over the key’s public key packet. For details, see Section 12.2 of RFC 4880.
Fingerprints are used, for example, to reference the issuing key
of a signature in its IssuerFingerprint
subpacket. As a
general rule of thumb, you should prefer using fingerprints over
KeyIDs because the latter are vulnerable to birthday attacks.
Note: This enum cannot be exhaustively matched to allow future extensions.
§Examples
use openpgp::Fingerprint;
let fp: Fingerprint =
"0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
assert_eq!("0123456789ABCDEF0123456789ABCDEF01234567", fp.to_hex());
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
V4([u8; 20])
A 20 byte SHA-1 hash of the public key packet as defined in the RFC.
V5([u8; 32])
A v5 OpenPGP fingerprint.
Invalid(Box<[u8]>)
Used for holding fingerprint data that is not a V4 fingerprint, e.g. a V3 fingerprint (deprecated) or otherwise wrong-length data.
Implementations§
source§impl Fingerprint
impl Fingerprint
sourcepub fn from_bytes(raw: &[u8]) -> Fingerprint
pub fn from_bytes(raw: &[u8]) -> Fingerprint
Creates a Fingerprint
from a byte slice in big endian
representation.
§Examples
use openpgp::Fingerprint;
let fp: Fingerprint =
"0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
let bytes =
[0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67];
assert_eq!(Fingerprint::from_bytes(&bytes), fp);
sourcepub fn as_bytes(&self) -> &[u8] ⓘ
pub fn as_bytes(&self) -> &[u8] ⓘ
Returns the raw fingerprint as a byte slice in big endian representation.
§Examples
use openpgp::Fingerprint;
let fp: Fingerprint =
"0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
assert_eq!(fp.as_bytes(),
[0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23,
0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67]);
sourcepub fn to_hex(&self) -> String
pub fn to_hex(&self) -> String
Converts this fingerprint to its canonical hexadecimal representation.
This representation is always uppercase and without spaces and is suitable for stable key identifiers.
The output of this function is exactly the same as formatting
this object with the :X
format specifier.
use openpgp::Fingerprint;
let fp: Fingerprint =
"0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
assert_eq!("0123456789ABCDEF0123456789ABCDEF01234567", fp.to_hex());
assert_eq!(format!("{:X}", fp), fp.to_hex());
sourcepub fn to_spaced_hex(&self) -> String
pub fn to_spaced_hex(&self) -> String
Converts this fingerprint to its hexadecimal representation with spaces.
This representation is always uppercase and with spaces grouping the hexadecimal digits into groups of four with a double space in the middle. It is only suitable for manual comparison of fingerprints.
Note: The spaces will hinder other kind of use cases. For example, it is harder to select the whole fingerprint for copying, and it has to be quoted when used as a command line argument. Only use this form for displaying a fingerprint with the intent of manual comparisons.
See also Fingerprint::to_icao
.
let fp: openpgp::Fingerprint =
"0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
assert_eq!("0123 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567",
fp.to_spaced_hex());
sourcepub fn from_hex(s: &str) -> Result<Self, Error>
pub fn from_hex(s: &str) -> Result<Self, Error>
Parses the hexadecimal representation of an OpenPGP fingerprint.
This function is the reverse of to_hex
. It also accepts
other variants of the fingerprint notation including
lower-case letters, spaces and optional leading 0x
.
use openpgp::Fingerprint;
let fp =
Fingerprint::from_hex("0123456789ABCDEF0123456789ABCDEF01234567")?;
assert_eq!("0123456789ABCDEF0123456789ABCDEF01234567", fp.to_hex());
let fp =
Fingerprint::from_hex("0123 4567 89ab cdef 0123 4567 89ab cdef 0123 4567")?;
assert_eq!("0123456789ABCDEF0123456789ABCDEF01234567", fp.to_hex());
sourcepub fn to_icao(&self) -> String
pub fn to_icao(&self) -> String
Converts the hex representation of the Fingerprint
to a
phrase in the ICAO spelling alphabet.
§Examples
use openpgp::Fingerprint;
let fp: Fingerprint =
"01AB 4567 89AB CDEF 0123 4567 89AB CDEF 0123 4567".parse()?;
assert!(fp.to_icao().starts_with("Zero One Alfa Bravo"));
sourcepub fn aliases<H>(&self, other: H) -> bool
pub fn aliases<H>(&self, other: H) -> bool
Returns whether self
and other
could be aliases of each
other.
KeyHandle
’s PartialEq
implementation cannot assert that a
Fingerprint
and a KeyID
are equal, because distinct
fingerprints may have the same KeyID
, and PartialEq
must
be transitive, i.e.,
a == b and b == c implies a == c.
That is, if fpr1
and fpr2
are distinct fingerprints with the
same key ID then:
fpr1 == keyid and fpr2 == keyid, but fpr1 != fpr2.
This definition of equality makes searching for a given
KeyHandle
using PartialEq
awkward. This function fills
that gap. It answers the question: given a KeyHandle
and a
Fingerprint
, could they be aliases? That is, it implements
the desired, non-transitive equality relation:
// fpr1 and fpr2 are different fingerprints with the same KeyID.
assert_ne!(fpr1, fpr2);
assert!(fpr1.aliases(KeyHandle::from(&keyid)));
assert!(fpr2.aliases(KeyHandle::from(&keyid)));
assert!(! fpr1.aliases(KeyHandle::from(&fpr2)));
Trait Implementations§
source§impl Clone for Fingerprint
impl Clone for Fingerprint
source§fn clone(&self) -> Fingerprint
fn clone(&self) -> Fingerprint
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for Fingerprint
impl Debug for Fingerprint
source§impl Display for Fingerprint
impl Display for Fingerprint
source§impl From<&Fingerprint> for KeyHandle
impl From<&Fingerprint> for KeyHandle
source§fn from(i: &Fingerprint) -> Self
fn from(i: &Fingerprint) -> Self
source§impl From<&Fingerprint> for KeyID
impl From<&Fingerprint> for KeyID
source§fn from(fp: &Fingerprint) -> Self
fn from(fp: &Fingerprint) -> Self
source§impl From<Fingerprint> for KeyHandle
impl From<Fingerprint> for KeyHandle
source§fn from(i: Fingerprint) -> Self
fn from(i: Fingerprint) -> Self
source§impl From<Fingerprint> for KeyID
impl From<Fingerprint> for KeyID
source§fn from(fp: Fingerprint) -> Self
fn from(fp: Fingerprint) -> Self
source§impl FromStr for Fingerprint
impl FromStr for Fingerprint
source§impl Hash for Fingerprint
impl Hash for Fingerprint
source§impl LowerHex for Fingerprint
impl LowerHex for Fingerprint
source§impl Marshal for Fingerprint
impl Marshal for Fingerprint
source§impl MarshalInto for Fingerprint
impl MarshalInto for Fingerprint
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 Fingerprint
impl Ord for Fingerprint
source§fn cmp(&self, other: &Fingerprint) -> Ordering
fn cmp(&self, other: &Fingerprint) -> 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 Fingerprint
impl PartialEq for Fingerprint
source§fn eq(&self, other: &Fingerprint) -> bool
fn eq(&self, other: &Fingerprint) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl PartialOrd for Fingerprint
impl PartialOrd for Fingerprint
source§fn partial_cmp(&self, other: &Fingerprint) -> Option<Ordering>
fn partial_cmp(&self, other: &Fingerprint) -> 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 moresource§impl Serialize for Fingerprint
impl Serialize for Fingerprint
source§impl SerializeInto for Fingerprint
impl SerializeInto for Fingerprint
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 TryFrom<&KeyHandle> for Fingerprint
impl TryFrom<&KeyHandle> for Fingerprint
source§impl TryFrom<KeyHandle> for Fingerprint
impl TryFrom<KeyHandle> for Fingerprint
source§impl UpperHex for Fingerprint
impl UpperHex for Fingerprint
impl Eq for Fingerprint
impl StructuralPartialEq for Fingerprint
Auto Trait Implementations§
impl Freeze for Fingerprint
impl RefUnwindSafe for Fingerprint
impl Send for Fingerprint
impl Sync for Fingerprint
impl Unpin for Fingerprint
impl UnwindSafe for Fingerprint
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
)