@@ -114,9 +114,12 @@ pub enum FindSigningFingerprintStrategy {
114114 GPG ,
115115}
116116
117+ /// Contains a full pgp fingerprint of a certificate.
117118#[ derive( Clone , Copy , Debug , Eq , Ord , PartialEq , PartialOrd , Hash ) ]
118119pub enum Fingerprint {
120+ /// A RFC4880 style fingerprint.
119121 V4 ( [ u8 ; 20 ] ) ,
122+ /// A RFC9580 style fingerprint.
120123 V6 ( [ u8 ; 32 ] ) ,
121124}
122125
@@ -132,6 +135,42 @@ impl From<[u8; 20]> for Fingerprint {
132135 }
133136}
134137
138+ /// Intended for usage with slices containing a v4 or v6 fingerprint.
139+ impl TryFrom < & [ u8 ] > for Fingerprint {
140+ type Error = Error ;
141+
142+ fn try_from ( b : & [ u8 ] ) -> std:: result:: Result < Self , Self :: Error > {
143+ match b. len ( ) {
144+ 20 => Ok ( Fingerprint :: V4 (
145+ b. try_into ( ) . expect ( "slice with incorrect length" ) ,
146+ ) ) ,
147+ 32 => Ok ( Fingerprint :: V6 (
148+ b. try_into ( ) . expect ( "slice with incorrect length" ) ,
149+ ) ) ,
150+ _ => Err ( Error :: Generic ( "slice isn't 20 or 32 bytes" ) ) ,
151+ }
152+ }
153+ }
154+
155+ /// Intended for usage with string containing a v4 or v6 fingerprint in hex.
156+ impl TryFrom < & str > for Fingerprint {
157+ type Error = Error ;
158+
159+ fn try_from ( key : & str ) -> std:: result:: Result < Self , Self :: Error > {
160+ if key. len ( ) == 40 {
161+ Ok ( Fingerprint :: from ( <[ u8 ; 20 ] >:: from_hex ( key) ?) )
162+ } else if key. len ( ) == 42 {
163+ Ok ( Fingerprint :: from ( <[ u8 ; 20 ] >:: from_hex ( & key[ 2 ..] ) ?) )
164+ } else if key. len ( ) == 64 {
165+ Ok ( Fingerprint :: from ( <[ u8 ; 32 ] >:: from_hex ( key) ?) )
166+ } else if key. len ( ) == 66 {
167+ Ok ( Fingerprint :: from ( <[ u8 ; 32 ] >:: from_hex ( & key[ 2 ..] ) ?) )
168+ } else {
169+ Err ( Error :: Generic ( "unable to parse fingerprint" ) )
170+ }
171+ }
172+ }
173+
135174impl AsRef < [ u8 ] > for Fingerprint {
136175 fn as_ref ( & self ) -> & [ u8 ] {
137176 match self {
@@ -628,19 +667,6 @@ impl DecryptionHelper for Helper<'_> {
628667 }
629668}
630669
631- /// Intended for usage with slices containing a v4 fingerprint.
632- pub fn slice_to_fingerprint ( b : & [ u8 ] ) -> Result < Fingerprint > {
633- match b. len ( ) {
634- 20 => Ok ( Fingerprint :: V4 (
635- b. try_into ( ) . expect ( "slice with incorrect length" ) ,
636- ) ) ,
637- 32 => Ok ( Fingerprint :: V6 (
638- b. try_into ( ) . expect ( "slice with incorrect length" ) ,
639- ) ) ,
640- _ => Err ( Error :: Generic ( "slice isn't 20 bytes" ) ) ,
641- }
642- }
643-
644670/// A pgp key produced with sequoia.
645671pub struct SequoiaKey {
646672 /// The pgp key
@@ -656,7 +682,7 @@ impl Key for SequoiaKey {
656682 }
657683
658684 fn fingerprint ( & self ) -> Result < Fingerprint > {
659- slice_to_fingerprint ( self . cert . fingerprint ( ) . as_bytes ( ) )
685+ self . cert . fingerprint ( ) . as_bytes ( ) . try_into ( )
660686 }
661687
662688 fn is_not_usable ( & self ) -> bool {
@@ -698,7 +724,7 @@ impl Sequoia {
698724 let data = fs:: read ( path) ?;
699725 let cert = Cert :: from_bytes ( & data) ?;
700726
701- let fingerprint = slice_to_fingerprint ( cert. fingerprint ( ) . as_bytes ( ) ) ?;
727+ let fingerprint = cert. fingerprint ( ) . as_bytes ( ) . try_into ( ) ?;
702728 key_ring. insert ( fingerprint, Arc :: new ( cert) ) ;
703729 }
704730 }
@@ -770,7 +796,7 @@ impl Sequoia {
770796 fn write_cert ( & mut self , cert_str : & str , keys_dir : & Path ) -> Result < String > {
771797 let cert = Cert :: from_bytes ( cert_str. as_bytes ( ) ) ?;
772798
773- let fingerprint = slice_to_fingerprint ( cert. fingerprint ( ) . as_bytes ( ) ) ?;
799+ let fingerprint = cert. fingerprint ( ) . as_bytes ( ) . try_into ( ) ?;
774800
775801 let mut file = File :: create ( keys_dir. join ( hex:: encode ( fingerprint) ) ) ?;
776802
0 commit comments