Skip to content

Commit 5c2af42

Browse files
dignifiedquirehko-slink2xt
authored
build: update to rPGP 0.16.0 (#6719)
Co-authored-by: Heiko Schaefer <heiko@schaefer.name> Co-authored-by: link2xt <link2xt@testrun.org>
1 parent 42975b2 commit 5c2af42

File tree

12 files changed

+342
-182
lines changed

12 files changed

+342
-182
lines changed

Cargo.lock

Lines changed: 145 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ num-derive = "0.4"
7474
num-traits = { workspace = true }
7575
parking_lot = "0.12"
7676
percent-encoding = "2.3"
77-
pgp = { version = "0.15.0", default-features = false }
77+
pgp = { version = "0.16.0", default-features = false }
7878
pin-project = "1"
7979
qrcodegen = "1.7.0"
8080
quick-xml = "0.37"

deny.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ ignore = [
2222
skip = [
2323
{ name = "async-channel", version = "1.9.0" },
2424
{ name = "bitflags", version = "1.3.2" },
25+
{ name = "derive_more-impl", version = "1.0.0" },
26+
{ name = "derive_more", version = "1.0.0" },
2527
{ name = "event-listener", version = "2.5.3" },
2628
{ name = "generator", version = "0.7.5" },
2729
{ name = "getrandom", version = "0.2.12" },
@@ -38,6 +40,7 @@ skip = [
3840
{ name = "regex-automata", version = "0.1.10" },
3941
{ name = "regex-syntax", version = "0.6.29" },
4042
{ name = "rustix", version = "0.38.44" },
43+
{ name = "serdect", version = "0.2.0" },
4144
{ name = "spin", version = "0.9.8" },
4245
{ name = "strum_macros", version = "0.26.2" },
4346
{ name = "strum", version = "0.26.2" },

src/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use std::time::Duration;
1010

1111
use anyhow::{bail, ensure, Context as _, Result};
1212
use async_channel::{self as channel, Receiver, Sender};
13+
use pgp::composed::SignedPublicKey;
1314
use pgp::types::PublicKeyTrait;
14-
use pgp::SignedPublicKey;
1515
use ratelimit::Ratelimit;
1616
use tokio::sync::{Mutex, Notify, RwLock};
1717

@@ -1074,7 +1074,7 @@ impl Context {
10741074
res += &format!("db_size_bytes {db_size}\n");
10751075

10761076
let secret_key = &load_self_secret_key(self).await?.primary_key;
1077-
let key_created = secret_key.created_at().timestamp();
1077+
let key_created = secret_key.public_key().created_at().timestamp();
10781078
res += &format!("key_created {key_created}\n");
10791079

10801080
// how many of the chats active in the last months are:

src/decrypt.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ use crate::pgp;
1515
/// Tries to decrypt a message, but only if it is structured as an Autocrypt message.
1616
///
1717
/// If successful and the message is encrypted, returns decrypted body.
18-
pub fn try_decrypt(
19-
mail: &ParsedMail<'_>,
20-
private_keyring: &[SignedSecretKey],
21-
) -> Result<Option<::pgp::composed::Message>> {
18+
pub fn try_decrypt<'a>(
19+
mail: &'a ParsedMail<'a>,
20+
private_keyring: &'a [SignedSecretKey],
21+
) -> Result<Option<::pgp::composed::Message<'static>>> {
2222
let Some(encrypted_data_part) = get_encrypted_mime(mail) else {
2323
return Ok(None);
2424
};

src/e2ee.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ impl EncryptHelper {
143143
let cursor = Cursor::new(&mut raw_message);
144144
mail_to_encrypt.clone().write_part(cursor).ok();
145145

146-
let ctext = pgp::pk_encrypt(&raw_message, keyring, Some(sign_key), compress).await?;
146+
let ctext = pgp::pk_encrypt(raw_message, keyring, Some(sign_key), compress).await?;
147147

148148
Ok(ctext)
149149
}
@@ -153,9 +153,8 @@ impl EncryptHelper {
153153
pub async fn sign(self, context: &Context, mail: &MimePart<'static>) -> Result<String> {
154154
let sign_key = load_self_secret_key(context).await?;
155155
let mut buffer = Vec::new();
156-
let cursor = Cursor::new(&mut buffer);
157-
mail.clone().write_part(cursor).ok();
158-
let signature = pgp::pk_calc_signature(&buffer, &sign_key)?;
156+
mail.clone().write_part(&mut buffer)?;
157+
let signature = pgp::pk_calc_signature(buffer, &sign_key)?;
159158
Ok(signature)
160159
}
161160
}

src/imex.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::ffi::OsStr;
44
use std::path::{Path, PathBuf};
55
use std::pin::Pin;
66

7-
use ::pgp::types::PublicKeyTrait;
87
use anyhow::{bail, ensure, format_err, Context as _, Result};
98
use futures::TryStreamExt;
109
use futures_lite::FutureExt;
@@ -32,6 +31,7 @@ use crate::tools::{
3231
mod key_transfer;
3332
mod transfer;
3433

34+
use ::pgp::types::KeyDetails;
3535
pub use key_transfer::{continue_key_transfer, initiate_key_transfer};
3636
pub use transfer::{get_backup, BackupProvider};
3737

@@ -173,7 +173,11 @@ async fn set_self_key(context: &Context, armored: &str) -> Result<()> {
173173
};
174174
key::store_self_keypair(context, &keypair).await?;
175175

176-
info!(context, "stored self key: {:?}", keypair.secret.key_id());
176+
info!(
177+
context,
178+
"stored self key: {:?}",
179+
keypair.secret.public_key().key_id()
180+
);
177181
Ok(())
178182
}
179183

src/imex/key_transfer.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
//! # Key transfer via Autocrypt Setup Message.
2+
use std::io::BufReader;
3+
24
use rand::{thread_rng, Rng};
35

46
use anyhow::{bail, ensure, Result};
@@ -71,7 +73,7 @@ pub async fn continue_key_transfer(
7173
if let Some(filename) = msg.get_file(context) {
7274
let file = open_file_std(context, filename)?;
7375
let sc = normalize_setup_code(setup_code);
74-
let armored_key = decrypt_setup_file(&sc, file).await?;
76+
let armored_key = decrypt_setup_file(&sc, BufReader::new(file)).await?;
7577
set_self_key(context, &armored_key).await?;
7678
context.set_config_bool(Config::BccSelf, true).await?;
7779

@@ -96,7 +98,7 @@ pub async fn render_setup_file(context: &Context, passphrase: &str) -> Result<St
9698
true => Some(("Autocrypt-Prefer-Encrypt", "mutual")),
9799
};
98100
let private_key_asc = private_key.to_asc(ac_headers);
99-
let encr = pgp::symm_encrypt(passphrase, private_key_asc.as_bytes())
101+
let encr = pgp::symm_encrypt(passphrase, private_key_asc.into_bytes())
100102
.await?
101103
.replace('\n', "\r\n");
102104

@@ -155,7 +157,7 @@ fn create_setup_code(_context: &Context) -> String {
155157
ret
156158
}
157159

158-
async fn decrypt_setup_file<T: std::io::Read + std::io::Seek>(
160+
async fn decrypt_setup_file<T: std::fmt::Debug + std::io::BufRead + Send + 'static>(
159161
passphrase: &str,
160162
file: T,
161163
) -> Result<String> {
@@ -258,11 +260,10 @@ mod tests {
258260

259261
assert!(!base64.is_empty());
260262

261-
let setup_file = S_EM_SETUPFILE.to_string();
262-
let decrypted =
263-
decrypt_setup_file(S_EM_SETUPCODE, std::io::Cursor::new(setup_file.as_bytes()))
264-
.await
265-
.unwrap();
263+
let setup_file = S_EM_SETUPFILE;
264+
let decrypted = decrypt_setup_file(S_EM_SETUPCODE, setup_file.as_bytes())
265+
.await
266+
.unwrap();
266267

267268
let (typ, headers, _base64) = split_armored_data(decrypted.as_bytes()).unwrap();
268269

@@ -278,14 +279,13 @@ mod tests {
278279
/// "Implementations MUST NOT use plaintext in Symmetrically Encrypted Data packets".
279280
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
280281
async fn test_decrypt_plaintext_autocrypt_setup_message() {
281-
let setup_file = S_PLAINTEXT_SETUPFILE.to_string();
282+
let setup_file = S_PLAINTEXT_SETUPFILE;
282283
let incorrect_setupcode = "0000-0000-0000-0000-0000-0000-0000-0000-0000";
283-
assert!(decrypt_setup_file(
284-
incorrect_setupcode,
285-
std::io::Cursor::new(setup_file.as_bytes()),
286-
)
287-
.await
288-
.is_err());
284+
assert!(
285+
decrypt_setup_file(incorrect_setupcode, setup_file.as_bytes(),)
286+
.await
287+
.is_err()
288+
);
289289
}
290290

291291
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]

src/key.rs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use deltachat_contact_tools::EmailAddress;
1010
use pgp::composed::Deserializable;
1111
pub use pgp::composed::{SignedPublicKey, SignedSecretKey};
1212
use pgp::ser::Serialize;
13-
use pgp::types::{PublicKeyTrait, SecretKeyTrait};
13+
use pgp::types::{KeyDetails, KeyId, Password};
1414
use rand::thread_rng;
1515
use tokio::runtime::Handle;
1616

@@ -24,7 +24,7 @@ use crate::tools::{self, time_elapsed};
2424
/// This trait is implemented for rPGP's [SignedPublicKey] and
2525
/// [SignedSecretKey] types and makes working with them a little
2626
/// easier in the deltachat world.
27-
pub(crate) trait DcKey: Serialize + Deserializable + PublicKeyTrait + Clone {
27+
pub(crate) trait DcKey: Serialize + Deserializable + Clone {
2828
/// Create a key from some bytes.
2929
fn from_slice(bytes: &[u8]) -> Result<Self> {
3030
let res = <Self as Deserializable>::from_bytes(Cursor::new(bytes));
@@ -78,7 +78,7 @@ pub(crate) trait DcKey: Serialize + Deserializable + PublicKeyTrait + Clone {
7878
let bytes = data.as_bytes();
7979
let res = Self::from_armor_single(Cursor::new(bytes));
8080
let (key, headers) = match res {
81-
Err(pgp::errors::Error::NoMatchingPacket) => match Self::is_private() {
81+
Err(pgp::errors::Error::NoMatchingPacket { .. }) => match Self::is_private() {
8282
true => bail!("No private key packet found"),
8383
false => bail!("No public key packet found"),
8484
},
@@ -123,11 +123,10 @@ pub(crate) trait DcKey: Serialize + Deserializable + PublicKeyTrait + Clone {
123123
fn to_asc(&self, header: Option<(&str, &str)>) -> String;
124124

125125
/// The fingerprint for the key.
126-
fn dc_fingerprint(&self) -> Fingerprint {
127-
PublicKeyTrait::fingerprint(self).into()
128-
}
126+
fn dc_fingerprint(&self) -> Fingerprint;
129127

130128
fn is_private() -> bool;
129+
fn key_id(&self) -> KeyId;
131130
}
132131

133132
pub(crate) async fn load_self_public_key(context: &Context) -> Result<SignedPublicKey> {
@@ -230,6 +229,14 @@ impl DcKey for SignedPublicKey {
230229
fn is_private() -> bool {
231230
false
232231
}
232+
233+
fn dc_fingerprint(&self) -> Fingerprint {
234+
self.fingerprint().into()
235+
}
236+
237+
fn key_id(&self) -> KeyId {
238+
KeyDetails::key_id(self)
239+
}
233240
}
234241

235242
impl DcKey for SignedSecretKey {
@@ -249,6 +256,14 @@ impl DcKey for SignedSecretKey {
249256
fn is_private() -> bool {
250257
true
251258
}
259+
260+
fn dc_fingerprint(&self) -> Fingerprint {
261+
self.fingerprint().into()
262+
}
263+
264+
fn key_id(&self) -> KeyId {
265+
KeyDetails::key_id(&**self)
266+
}
252267
}
253268

254269
/// Deltachat extension trait for secret keys.
@@ -262,9 +277,14 @@ pub(crate) trait DcSecretKey {
262277
impl DcSecretKey for SignedSecretKey {
263278
fn split_public_key(&self) -> Result<SignedPublicKey> {
264279
self.verify()?;
265-
let unsigned_pubkey = SecretKeyTrait::public_key(self);
280+
let unsigned_pubkey = self.public_key();
266281
let mut rng = thread_rng();
267-
let signed_pubkey = unsigned_pubkey.sign(&mut rng, self, || "".into())?;
282+
let signed_pubkey = unsigned_pubkey.sign(
283+
&mut rng,
284+
&self.primary_key,
285+
self.primary_key.public_key(),
286+
&Password::empty(),
287+
)?;
268288
Ok(signed_pubkey)
269289
}
270290
}

src/mimeparser.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,10 @@ impl MimeMessage {
342342
let mail_raw; // Memory location for a possible decrypted message.
343343
let decrypted_msg; // Decrypted signed OpenPGP message.
344344

345-
let (mail, encrypted) =
345+
let (mail, is_encrypted) =
346346
match tokio::task::block_in_place(|| try_decrypt(&mail, &private_keyring)) {
347-
Ok(Some(msg)) => {
348-
mail_raw = msg.get_content()?.unwrap_or_default();
347+
Ok(Some(mut msg)) => {
348+
mail_raw = msg.as_data_vec().unwrap_or_default();
349349

350350
let decrypted_mail = mailparse::parse_mail(&mail_raw)?;
351351
if std::env::var(crate::DCC_MIME_DEBUG).is_ok() {
@@ -434,7 +434,7 @@ impl MimeMessage {
434434
signatures.extend(signatures_detached);
435435
content
436436
});
437-
if let (Ok(mail), true) = (mail, encrypted) {
437+
if let (Ok(mail), true) = (mail, is_encrypted) {
438438
if !signatures.is_empty() {
439439
// Remove unsigned opportunistically protected headers from messages considered
440440
// Autocrypt-encrypted / displayed with padlock.
@@ -529,7 +529,7 @@ impl MimeMessage {
529529
}
530530
}
531531
}
532-
if !encrypted {
532+
if !is_encrypted {
533533
signatures.clear();
534534
}
535535
if let Some(peerstate) = &mut peerstate {

0 commit comments

Comments
 (0)