Make pk_decrypt synchronous

This commit is contained in:
link2xt
2022-12-23 18:15:38 +00:00
parent 6d2b2ac5f9
commit 3de53a313f
2 changed files with 7 additions and 15 deletions

View File

@@ -215,7 +215,7 @@ async fn decrypt_part(
if has_decrypted_pgp_armor(&data) { if has_decrypted_pgp_armor(&data) {
let (plain, ret_valid_signatures) = let (plain, ret_valid_signatures) =
pgp::pk_decrypt(data, private_keyring, &public_keyring_for_validate).await?; pgp::pk_decrypt(data, private_keyring, &public_keyring_for_validate)?;
// Check for detached signatures. // Check for detached signatures.
// If decrypted part is a multipart/signed, then there is a detached signature. // If decrypted part is a multipart/signed, then there is a detached signature.

View File

@@ -265,23 +265,20 @@ pub async fn pk_encrypt(
/// of all keys from the `public_keys_for_validation` keyring that /// of all keys from the `public_keys_for_validation` keyring that
/// have valid signatures there. /// have valid signatures there.
#[allow(clippy::implicit_hasher)] #[allow(clippy::implicit_hasher)]
pub async fn pk_decrypt( pub fn pk_decrypt(
ctext: Vec<u8>, ctext: Vec<u8>,
private_keys_for_decryption: Keyring<SignedSecretKey>, private_keys_for_decryption: Keyring<SignedSecretKey>,
public_keys_for_validation: &Keyring<SignedPublicKey>, public_keys_for_validation: &Keyring<SignedPublicKey>,
) -> Result<(Vec<u8>, HashSet<Fingerprint>)> { ) -> Result<(Vec<u8>, HashSet<Fingerprint>)> {
let mut ret_signature_fingerprints: HashSet<Fingerprint> = Default::default(); let mut ret_signature_fingerprints: HashSet<Fingerprint> = Default::default();
let msgs = tokio::task::spawn_blocking(move || { let cursor = Cursor::new(ctext);
let cursor = Cursor::new(ctext); let (msg, _) = Message::from_armor_single(cursor)?;
let (msg, _) = Message::from_armor_single(cursor)?;
let skeys: Vec<&SignedSecretKey> = private_keys_for_decryption.keys().iter().collect(); let skeys: Vec<&SignedSecretKey> = private_keys_for_decryption.keys().iter().collect();
let (decryptor, _) = msg.decrypt(|| "".into(), || "".into(), &skeys[..])?; let (decryptor, _) = msg.decrypt(|| "".into(), || "".into(), &skeys[..])?;
decryptor.collect::<pgp::errors::Result<Vec<_>>>() let msgs = decryptor.collect::<pgp::errors::Result<Vec<_>>>()?;
})
.await??;
if let Some(msg) = msgs.into_iter().next() { if let Some(msg) = msgs.into_iter().next() {
// get_content() will decompress the message if needed, // get_content() will decompress the message if needed,
@@ -517,7 +514,6 @@ mod tests {
decrypt_keyring, decrypt_keyring,
&sig_check_keyring, &sig_check_keyring,
) )
.await
.unwrap(); .unwrap();
assert_eq!(plain, CLEARTEXT); assert_eq!(plain, CLEARTEXT);
assert_eq!(valid_signatures.len(), 1); assert_eq!(valid_signatures.len(), 1);
@@ -532,7 +528,6 @@ mod tests {
decrypt_keyring, decrypt_keyring,
&sig_check_keyring, &sig_check_keyring,
) )
.await
.unwrap(); .unwrap();
assert_eq!(plain, CLEARTEXT); assert_eq!(plain, CLEARTEXT);
assert_eq!(valid_signatures.len(), 1); assert_eq!(valid_signatures.len(), 1);
@@ -548,7 +543,6 @@ mod tests {
keyring, keyring,
&empty_keyring, &empty_keyring,
) )
.await
.unwrap(); .unwrap();
assert_eq!(plain, CLEARTEXT); assert_eq!(plain, CLEARTEXT);
assert_eq!(valid_signatures.len(), 0); assert_eq!(valid_signatures.len(), 0);
@@ -566,7 +560,6 @@ mod tests {
decrypt_keyring, decrypt_keyring,
&sig_check_keyring, &sig_check_keyring,
) )
.await
.unwrap(); .unwrap();
assert_eq!(plain, CLEARTEXT); assert_eq!(plain, CLEARTEXT);
assert_eq!(valid_signatures.len(), 0); assert_eq!(valid_signatures.len(), 0);
@@ -582,7 +575,6 @@ mod tests {
decrypt_keyring, decrypt_keyring,
&sig_check_keyring, &sig_check_keyring,
) )
.await
.unwrap(); .unwrap();
assert_eq!(plain, CLEARTEXT); assert_eq!(plain, CLEARTEXT);
assert_eq!(valid_signatures.len(), 0); assert_eq!(valid_signatures.len(), 0);