11use super :: config:: Config ;
22use super :: keyring:: try_get_password;
3- use anyhow:: { anyhow, Context , Ok , Result } ;
3+ use anyhow:: { anyhow, bail , Context , Ok , Result } ;
44use colored:: Colorize ;
55use crypto_hash:: { hex_digest, Algorithm } ;
66use hex:: ToHex ;
@@ -12,6 +12,7 @@ use pgp::{
1212 Deserializable ,
1313} ;
1414use rand:: prelude:: * ;
15+ use rand:: rngs:: OsRng ;
1516use rayon:: iter:: { IntoParallelRefIterator , ParallelIterator } ;
1617use smallvec:: * ;
1718use std:: { fs, io:: Cursor , path:: Path } ;
@@ -57,18 +58,18 @@ pub fn generate_key_pair(nickname: &str, password: String) -> Result<KeyPair> {
5758 . context ( "Failed to create secret key params." ) ?;
5859
5960 let secret_key = secret_key_params
60- . generate ( )
61+ . generate ( OsRng )
6162 . context ( "Failed to generate a plain key." ) ?;
6263
6364 let passwd_fn = || password. clone ( ) ;
6465
6566 let signed_secret_key = secret_key
66- . sign ( passwd_fn)
67+ . sign ( OsRng , passwd_fn)
6768 . context ( "Failed to sign secret key." ) ?;
6869
6970 let public_key = signed_secret_key. public_key ( ) ;
7071 let signed_public_key = public_key
71- . sign ( & signed_secret_key, passwd_fn)
72+ . sign ( OsRng , & signed_secret_key, passwd_fn)
7273 . context ( "Failed to sign public key." ) ?;
7374
7475 let key_pair = KeyPair {
@@ -85,7 +86,7 @@ pub fn encrypt(msg: &str, pubkey_str: &str) -> Result<String> {
8586 let msg = composed:: message:: Message :: new_literal ( "none" , msg) ;
8687
8788 let mut rng = StdRng :: from_entropy ( ) ;
88- let new_msg = msg. encrypt_to_keys (
89+ let new_msg = msg. encrypt_to_keys_seipdv1 (
8990 & mut rng,
9091 crypto:: sym:: SymmetricKeyAlgorithm :: AES128 ,
9192 & [ & pubkey] ,
@@ -102,7 +103,7 @@ pub fn encrypt_multi(msg: &str, pubkeys: &[SignedPublicKey]) -> Result<String> {
102103
103104 let msg = composed:: message:: Message :: new_literal ( "none" , msg) ;
104105
105- let new_msg = msg. encrypt_to_keys (
106+ let new_msg = msg. encrypt_to_keys_seipdv1 (
106107 & mut rng,
107108 crypto:: sym:: SymmetricKeyAlgorithm :: AES128 ,
108109 & borrowed_keys,
@@ -111,15 +112,33 @@ pub fn encrypt_multi(msg: &str, pubkeys: &[SignedPublicKey]) -> Result<String> {
111112 Ok ( new_msg. to_armored_string ( ArmorOptions :: default ( ) ) ?)
112113}
113114
115+ trait GetRecipients {
116+ fn get_recipients ( & self ) -> Vec < & pgp:: types:: KeyId > ;
117+ }
118+
119+ impl GetRecipients for composed:: message:: Message {
120+ fn get_recipients ( & self ) -> Vec < & pgp:: types:: KeyId > {
121+ match self {
122+ Message :: Encrypted { esk, .. } => esk
123+ . iter ( )
124+ . filter_map ( |e| match e {
125+ pgp:: Esk :: PublicKeyEncryptedSessionKey ( k) => k. id ( ) . ok ( ) ,
126+ _ => None ,
127+ } )
128+ . collect :: < Vec < & pgp:: types:: KeyId > > ( ) ,
129+ _ => todo ! ( ) ,
130+ }
131+ }
132+ }
133+
114134pub fn decrypt (
115135 armored : & str ,
116136 seckey : & SignedSecretKey ,
117137 password : String ,
118138) -> Result < String > {
119- let buf = Cursor :: new ( armored) ;
120- let ( msg, _) = composed:: message:: Message :: from_armor_single ( buf)
139+ let ( msg, _) = composed:: message:: Message :: from_string ( armored)
121140 . context ( "Failed to convert &str to armored message" ) ?;
122- let ( dec, _ ) = msg
141+ let ( dec, k ) = msg
123142 . decrypt ( || password, & [ seckey] )
124143 . context ( "Decrypting the message" ) ?;
125144
@@ -148,9 +167,8 @@ pub fn generate_hashed_primary_user_id(name: String, email: String) -> String {
148167}
149168
150169pub fn decrypt_full ( message : String , config : & Config ) -> Result < String > {
151- let buf = Cursor :: new ( message. clone ( ) ) ;
152- let ( msg, _) = composed:: message:: Message :: from_armor_single ( buf)
153- . context ( "Failed to convert &str to armored message" ) ?;
170+ let ( msg, _) = composed:: message:: Message :: from_string ( & message)
171+ . context ( "Failed to parse message" ) ?;
154172
155173 let recipients: Vec < String > = msg
156174 . get_recipients ( )
@@ -209,7 +227,8 @@ pub fn decrypt_full_many(
209227 return Ok ( vec ! [ ] ) ;
210228 } ;
211229
212- let msg = Message :: from_string ( first. as_str ( ) ) ?. 0 ;
230+ let ( msg, headers) = Message :: from_string ( first. as_str ( ) ) ?;
231+ dbg ! ( & headers) ;
213232
214233 let recipients: Vec < String > = msg
215234 . get_recipients ( )
0 commit comments