uselesskey_pgp_native/
lib.rs1#![forbid(unsafe_code)]
2
3use std::io::Cursor;
9
10use pgp::composed::{Deserializable, SignedPublicKey, SignedSecretKey};
11
12pub trait PgpNativeExt {
14 fn secret_key(&self) -> SignedSecretKey;
16
17 fn public_key(&self) -> SignedPublicKey;
19
20 fn secret_key_armor(&self) -> SignedSecretKey;
22
23 fn public_key_armor(&self) -> SignedPublicKey;
25}
26
27impl PgpNativeExt for uselesskey_pgp::PgpKeyPair {
28 fn secret_key(&self) -> SignedSecretKey {
29 SignedSecretKey::from_bytes(Cursor::new(self.private_key_binary()))
30 .expect("failed to parse uselesskey PGP private key bytes")
31 }
32
33 fn public_key(&self) -> SignedPublicKey {
34 SignedPublicKey::from_bytes(Cursor::new(self.public_key_binary()))
35 .expect("failed to parse uselesskey PGP public key bytes")
36 }
37
38 fn secret_key_armor(&self) -> SignedSecretKey {
39 let (key, _) = SignedSecretKey::from_armor_single(Cursor::new(self.private_key_armored()))
40 .expect("failed to parse armored uselesskey PGP private key");
41 key
42 }
43
44 fn public_key_armor(&self) -> SignedPublicKey {
45 let (key, _) = SignedPublicKey::from_armor_single(Cursor::new(self.public_key_armored()))
46 .expect("failed to parse armored uselesskey PGP public key");
47 key
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use pgp::types::KeyDetails;
54 use uselesskey_core::Factory;
55 use uselesskey_pgp::{PgpFactoryExt, PgpSpec};
56
57 use super::PgpNativeExt;
58
59 #[test]
60 fn parse_round_trip_binary_and_armor() {
61 let fx = Factory::random();
62 let keypair = fx.pgp("fixture", PgpSpec::ed25519());
63
64 assert_eq!(
65 keypair.fingerprint(),
66 keypair.secret_key().fingerprint().to_string()
67 );
68 assert_eq!(
69 keypair.fingerprint(),
70 keypair.secret_key_armor().fingerprint().to_string()
71 );
72 assert_eq!(
73 keypair.fingerprint(),
74 keypair.public_key().fingerprint().to_string()
75 );
76 assert_eq!(
77 keypair.fingerprint(),
78 keypair.public_key_armor().fingerprint().to_string()
79 );
80 }
81}