diff --git a/Cargo.lock b/Cargo.lock
index f1016bd057..0348f05727 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -439,10 +439,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
-name = "bitfield"
-version = "0.17.0"
+name = "bitfields"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d84268bbf9b487d31fe4b849edbefcd3911422d7a07de855a2da1f70ab3d1c"
+dependencies = [
+ "bitfields-impl",
+]
+
+[[package]]
+name = "bitfields-impl"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f798d2d157e547aa99aab0967df39edd0b70307312b6f8bd2848e6abe40896e0"
+checksum = "07c93edde7bb4416c35c85048e34f78999dcb47d199bde3b1d79286156f3e2fb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.101",
+ "thiserror 2.0.12",
+]
[[package]]
name = "bitflags"
@@ -456,6 +471,18 @@ version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
[[package]]
name = "blake2"
version = "0.10.6"
@@ -623,16 +650,6 @@ dependencies = [
"alloc-stdlib",
]
-[[package]]
-name = "bstr"
-version = "1.11.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0"
-dependencies = [
- "memchr",
- "serde",
-]
-
[[package]]
name = "buffer-redux"
version = "1.0.2"
@@ -1141,7 +1158,7 @@ dependencies = [
"crypto_secretbox",
"curve25519-dalek",
"salsa20",
- "serdect",
+ "serdect 0.2.0",
"subtle",
"zeroize",
]
@@ -1200,6 +1217,23 @@ dependencies = [
"syn 2.0.101",
]
+[[package]]
+name = "cx448"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4c0cf476284b03eb6c10e78787b21c7abb7d7d43cb2f02532ba6b831ed892fa"
+dependencies = [
+ "crypto-bigint",
+ "elliptic-curve",
+ "pkcs8",
+ "rand_core 0.6.4",
+ "serdect 0.3.0",
+ "sha3",
+ "signature",
+ "subtle",
+ "zeroize",
+]
+
[[package]]
name = "darling"
version = "0.20.10"
@@ -1526,7 +1560,16 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
dependencies = [
- "derive_more-impl",
+ "derive_more-impl 1.0.0",
+]
+
+[[package]]
+name = "derive_more"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
+dependencies = [
+ "derive_more-impl 2.0.1",
]
[[package]]
@@ -1541,6 +1584,18 @@ dependencies = [
"unicode-xid",
]
+[[package]]
+name = "derive_more-impl"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.101",
+ "unicode-xid",
+]
+
[[package]]
name = "des"
version = "0.8.1"
@@ -1735,6 +1790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47"
dependencies = [
"base16ct",
+ "base64ct",
"crypto-bigint",
"digest",
"ff",
@@ -1745,7 +1801,10 @@ dependencies = [
"pkcs8",
"rand_core 0.6.4",
"sec1",
+ "serde_json",
+ "serdect 0.2.0",
"subtle",
+ "tap",
"zeroize",
]
@@ -1930,6 +1989,7 @@ version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449"
dependencies = [
+ "bitvec",
"rand_core 0.6.4",
"subtle",
]
@@ -1965,6 +2025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece"
dependencies = [
"crc32fast",
+ "libz-rs-sys",
"miniz_oxide",
]
@@ -2002,6 +2063,12 @@ dependencies = [
name = "format-flowed"
version = "1.0.0"
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
[[package]]
name = "futures"
version = "0.3.31"
@@ -2867,7 +2934,7 @@ dependencies = [
"crypto_box",
"data-encoding",
"der",
- "derive_more",
+ "derive_more 1.0.0",
"ed25519-dalek",
"futures-buffered",
"futures-util",
@@ -2921,7 +2988,7 @@ checksum = "f91ac4aaab68153d726c4e6b39c30f9f9253743f0e25664e52f4caeb46f48d11"
dependencies = [
"curve25519-dalek",
"data-encoding",
- "derive_more",
+ "derive_more 1.0.0",
"ed25519-dalek",
"rand_core 0.6.4",
"serde",
@@ -2951,7 +3018,7 @@ dependencies = [
"anyhow",
"async-channel 2.3.1",
"bytes",
- "derive_more",
+ "derive_more 1.0.0",
"ed25519-dalek",
"futures-concurrency",
"futures-lite",
@@ -3062,7 +3129,7 @@ dependencies = [
"bytes",
"cfg_aliases",
"data-encoding",
- "derive_more",
+ "derive_more 1.0.0",
"getrandom 0.3.3",
"hickory-resolver",
"http 1.1.0",
@@ -3110,12 +3177,6 @@ dependencies = [
"windows-sys 0.52.0",
]
-[[package]]
-name = "iter-read"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071ed4cc1afd86650602c7b11aa2e1ce30762a1c27193201cb5cee9c6ebb1294"
-
[[package]]
name = "itertools"
version = "0.10.5"
@@ -3216,6 +3277,15 @@ dependencies = [
"vcpkg",
]
+[[package]]
+name = "libz-rs-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a"
+dependencies = [
+ "zlib-rs",
+]
+
[[package]]
name = "linux-raw-sys"
version = "0.4.14"
@@ -3416,7 +3486,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794"
dependencies = [
"cfg_aliases",
- "derive_more",
+ "derive_more 1.0.0",
"futures-buffered",
"futures-lite",
"futures-util",
@@ -3564,7 +3634,7 @@ dependencies = [
"atomic-waker",
"bytes",
"cfg_aliases",
- "derive_more",
+ "derive_more 1.0.0",
"iroh-quinn-udp",
"js-sys",
"libc",
@@ -4059,21 +4129,22 @@ dependencies = [
[[package]]
name = "pgp"
-version = "0.15.0"
+version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30249ac8a98b356b473b04bc5358c75a260aa96a295d0743ce752fe7b173f235"
+checksum = "f91d320242d9b686612b15526fe38711afdf856e112eaa4775ce25b0d9b12b11"
dependencies = [
+ "aead",
"aes",
"aes-gcm",
"aes-kw",
"argon2",
"base64",
- "bitfield",
+ "bitfields",
"block-padding",
"blowfish",
- "bstr",
"buffer-redux",
"byteorder",
+ "bytes",
"camellia",
"cast5",
"cfb-mode",
@@ -4082,8 +4153,9 @@ dependencies = [
"const-oid",
"crc24",
"curve25519-dalek",
+ "cx448",
"derive_builder",
- "derive_more",
+ "derive_more 2.0.1",
"des",
"digest",
"dsa",
@@ -4096,7 +4168,6 @@ dependencies = [
"hex",
"hkdf",
"idea",
- "iter-read",
"k256",
"log",
"md-5",
@@ -4109,6 +4180,7 @@ dependencies = [
"p384",
"p521",
"rand 0.8.5",
+ "regex",
"ripemd",
"rsa",
"sha1",
@@ -4117,7 +4189,7 @@ dependencies = [
"sha3",
"signature",
"smallvec",
- "thiserror 2.0.12",
+ "snafu",
"twofish",
"x25519-dalek",
"zeroize",
@@ -4343,7 +4415,7 @@ checksum = "7d6db66007eac4a0ec8331d0d20c734bd64f6445d64bbaf0d0a27fea7a054e36"
dependencies = [
"base64",
"bytes",
- "derive_more",
+ "derive_more 1.0.0",
"futures-lite",
"futures-util",
"hyper-util",
@@ -4640,6 +4712,12 @@ version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
[[package]]
name = "radix_trie"
version = "0.2.1"
@@ -5198,6 +5276,7 @@ dependencies = [
"der",
"generic-array",
"pkcs8",
+ "serdect 0.2.0",
"subtle",
"zeroize",
]
@@ -5339,6 +5418,16 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serdect"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f42f67da2385b51a5f9652db9c93d78aeaf7610bf5ec366080b6de810604af53"
+dependencies = [
+ "base16ct",
+ "serde",
+]
+
[[package]]
name = "sha-1"
version = "0.10.1"
@@ -5786,6 +5875,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
[[package]]
name = "tempfile"
version = "3.19.1"
@@ -7051,6 +7146,15 @@ dependencies = [
"web-sys",
]
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
+
[[package]]
name = "x25519-dalek"
version = "2.0.1"
@@ -7288,6 +7392,12 @@ dependencies = [
"syn 2.0.101",
]
+[[package]]
+name = "zlib-rs"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8"
+
[[package]]
name = "zune-core"
version = "0.4.12"
diff --git a/Cargo.toml b/Cargo.toml
index 3584b97ee3..cf734b12ce 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -74,7 +74,7 @@ num-derive = "0.4"
num-traits = { workspace = true }
parking_lot = "0.12"
percent-encoding = "2.3"
-pgp = { version = "0.15.0", default-features = false }
+pgp = { version = "0.16.0", default-features = false }
pin-project = "1"
qrcodegen = "1.7.0"
quick-xml = "0.37"
diff --git a/deny.toml b/deny.toml
index 5910ebc5f1..e8072d0ebd 100644
--- a/deny.toml
+++ b/deny.toml
@@ -22,6 +22,8 @@ ignore = [
skip = [
{ name = "async-channel", version = "1.9.0" },
{ name = "bitflags", version = "1.3.2" },
+ { name = "derive_more-impl", version = "1.0.0" },
+ { name = "derive_more", version = "1.0.0" },
{ name = "event-listener", version = "2.5.3" },
{ name = "generator", version = "0.7.5" },
{ name = "getrandom", version = "0.2.12" },
@@ -38,6 +40,7 @@ skip = [
{ name = "regex-automata", version = "0.1.10" },
{ name = "regex-syntax", version = "0.6.29" },
{ name = "rustix", version = "0.38.44" },
+ { name = "serdect", version = "0.2.0" },
{ name = "spin", version = "0.9.8" },
{ name = "strum_macros", version = "0.26.2" },
{ name = "strum", version = "0.26.2" },
diff --git a/src/context.rs b/src/context.rs
index 5af9b2ee0c..75b71f9d65 100644
--- a/src/context.rs
+++ b/src/context.rs
@@ -10,8 +10,8 @@ use std::time::Duration;
use anyhow::{bail, ensure, Context as _, Result};
use async_channel::{self as channel, Receiver, Sender};
+use pgp::composed::SignedPublicKey;
use pgp::types::PublicKeyTrait;
-use pgp::SignedPublicKey;
use ratelimit::Ratelimit;
use tokio::sync::{Mutex, Notify, RwLock};
@@ -1074,7 +1074,7 @@ impl Context {
res += &format!("db_size_bytes {db_size}\n");
let secret_key = &load_self_secret_key(self).await?.primary_key;
- let key_created = secret_key.created_at().timestamp();
+ let key_created = secret_key.public_key().created_at().timestamp();
res += &format!("key_created {key_created}\n");
// how many of the chats active in the last months are:
diff --git a/src/decrypt.rs b/src/decrypt.rs
index 7be616c309..fa23c9e97b 100644
--- a/src/decrypt.rs
+++ b/src/decrypt.rs
@@ -15,10 +15,10 @@ use crate::pgp;
/// Tries to decrypt a message, but only if it is structured as an Autocrypt message.
///
/// If successful and the message is encrypted, returns decrypted body.
-pub fn try_decrypt(
- mail: &ParsedMail<'_>,
- private_keyring: &[SignedSecretKey],
-) -> Result