diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c63b6135..2a434fd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -312,4 +312,4 @@ jobs: - uses: actions-rs/clippy-check@v1 with: token: ${{ secrets.GITHUB_TOKEN }} - args: --all-features + args: --all-features --all-targets diff --git a/Cargo.toml b/Cargo.toml index ec62ee2e..0064f1be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,11 +15,11 @@ categories = ["cryptography", "email"] exclude = ["tests/tests/*"] edition = "2021" -rust-version = "1.57" +rust-version = "1.65" [dependencies] aes = "^0.8" -base64 = "^0.20.0" +base64 = "^0.21.0" bitfield = "0.14" block-padding = "^0.3.2" blowfish = "^0.9" @@ -33,7 +33,7 @@ crc24 = "^0.1" derive_builder = "^0.12.0" des = "^0.8" digest = "^0.10" -elliptic-curve = "^0.12" +elliptic-curve = "^0.13" generic-array = "^0.14" hex = "^0.4" idea = "^0.5" @@ -42,15 +42,15 @@ md-5 = { version = "^0.10.5", features = ["oid"] } nom = "^7.0" num-derive = "0.3.0" num-traits = "0.2.6" -p256 = { version = "^0.11", features = ["ecdsa"] } -p384 = { version = "^0.11", features = ["ecdsa"] } +p256 = { version = "^0.13", features = ["ecdsa"] } +p384 = { version = "^0.13", features = ["ecdsa"] } rand = "0.8" ripemd = { version = "^0.1.3", features = ["oid"] } -rsa = { version = "^0.7.0", features = ["hazmat"] } +rsa = { version = "0.9.0-pre.0", features = ["expose-internals"] } sha1 = { version = "^0.10.5", features = ["oid"] } sha2 = { version = "^0.10.6", features = ["oid"] } sha3 = { version = "^0.10.5", features = ["oid"] } -signature = "1.3.0" +signature = "2.0.0" smallvec = "1.8.0" thiserror = "1.0.30" twofish = "^0.7" @@ -62,9 +62,9 @@ version = "0.8.4" default-features = false [dependencies.ed25519-dalek] -version = "^1.0" +version = "2.0.0-pre.0" default-features = false -features = ["std", "u64_backend"] +features = ["std", "zeroize", "fast"] [dependencies.flate2] version = "^1.0" @@ -81,7 +81,7 @@ features = ["rand", "i128", "u64_digit", "prime", "zeroize"] package = "num-bigint-dig" [dependencies.x25519-dalek] -version = "^1.0" +version = "2.0.0-pre.1" default-features = false features = ["std", "u64_backend"] @@ -98,7 +98,7 @@ serde_json = "^1.0" [features] default = [] -nightly = ["ed25519-dalek/nightly", "rsa/nightly", "rand/nightly", "num-bigint/nightly"] +nightly = ["rsa/nightly", "rand/nightly", "num-bigint/nightly"] profile = ["gperftools"] asm = ["sha1/asm", "sha2/asm", "md-5/asm", "nightly"] wasm = ["chrono/wasmbind", "getrandom", "getrandom/js"] diff --git a/README.md b/README.md index e755662f..ba79f5a8 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![crates.io][crate-image]][crate-link] [![Documentation][doc-image]][doc-link] [![Build Status][build-image]][build-link] -![minimum rustc 1.57][msrv-image] +![minimum rustc 1.65][msrv-image] [![dependency status][deps-image]][deps-link] [![License][license-image]][license-link] @@ -70,7 +70,7 @@ Some key differences: ## Minimum Supported Rust Version (MSRV) -All crates in this repository support Rust 1.57 or higher. In future minimally supported version of Rust can be changed, but it will be done with a minor version bump. +All crates in this repository support Rust 1.65 or higher. In future minimally supported version of Rust can be changed, but it will be done with a minor version bump. ## LICENSE @@ -90,6 +90,6 @@ dual licensed as above, without any additional terms or conditions. [license-link]: https://github.com/rpgp/rpgp/blob/master/LICENSE.md [build-image]: https://github.com/rpgp/rpgp/workflows/CI/badge.svg [build-link]: https://github.com/rpgp/rpgp/actions?query=workflow%3ACI+branch%3Amaster -[msrv-image]: https://img.shields.io/badge/rustc-1.57+-blue.svg +[msrv-image]: https://img.shields.io/badge/rustc-1.65+-blue.svg [deps-image]: https://deps.rs/repo/github/rpgp/rpgp/status.svg [deps-link]: https://deps.rs/repo/github/rpgp/rpgp diff --git a/rust-toolchain b/rust-toolchain index 4d5fde5b..902c7418 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.60.0 +1.65.0 diff --git a/src/armor/reader.rs b/src/armor/reader.rs index 5482c1fa..10c80616 100644 --- a/src/armor/reader.rs +++ b/src/armor/reader.rs @@ -3,7 +3,7 @@ use std::hash::Hasher; use std::io::prelude::*; use std::{fmt, io, str}; -use base64::engine::{fast_portable::FastPortable, DEFAULT_ENGINE}; +use base64::engine::{general_purpose::STANDARD, Engine as _}; use buf_redux::BufReader; use byteorder::{BigEndian, ByteOrder}; @@ -69,14 +69,14 @@ impl BlockType { match self { BlockType::PublicKey => "PGP PUBLIC KEY BLOCK".into(), BlockType::PrivateKey => "PGP PRIVATE KEY BLOCK".into(), - BlockType::MultiPartMessage(x, y) => format!("PGP MESSAGE, PART {}/{}", x, y), + BlockType::MultiPartMessage(x, y) => format!("PGP MESSAGE, PART {x}/{y}"), BlockType::Message => "PGP MESSAGE".into(), BlockType::Signature => "PGP SIGNATURE".into(), BlockType::File => "PGP ARMORED FILE".into(), - BlockType::PublicKeyPKCS1(typ) => format!("{} PUBLIC KEY", typ), + BlockType::PublicKeyPKCS1(typ) => format!("{typ} PUBLIC KEY"), BlockType::PublicKeyPKCS8 => "PUBLIC KEY".into(), BlockType::PublicKeyOpenssh => "OPENSSH PUBLIC KEY".into(), - BlockType::PrivateKeyPKCS1(typ) => format!("{} PRIVATE KEY", typ), + BlockType::PrivateKeyPKCS1(typ) => format!("{typ} PRIVATE KEY"), BlockType::PrivateKeyPKCS8 => "PRIVATE KEY".into(), BlockType::PrivateKeyOpenssh => "OPENSSH PRIVATE KEY".into(), } @@ -244,8 +244,9 @@ fn armor_header(i: &[u8]) -> IResult<&[u8], (BlockType, BTreeMap /// Read the checksum from an base64 encoded buffer. fn read_checksum(input: &[u8]) -> ::std::io::Result { - let checksum = - base64::decode_engine(input, &DEFAULT_ENGINE).map_err(|_| io::ErrorKind::InvalidData)?; + let checksum = STANDARD + .decode(input) + .map_err(|_| io::ErrorKind::InvalidData)?; let mut buf = [0; 4]; let mut i = checksum.len(); @@ -306,7 +307,9 @@ pub struct Dearmor { /// the underlying data source, wrapped in a BufferedReader inner: Option>, /// base64 decoder - base_decoder: Option>>>>, + base_decoder: Option< + Base64Decoder>>>, + >, /// Are we done? done: bool, crc: crc24::Crc24Hasher, @@ -363,7 +366,7 @@ impl Dearmor { self.done = true; return Err(io::Error::new( io::ErrorKind::InvalidData, - format!("invalid ascii armor header: {:?}", err), + format!("invalid ascii armor header: {err:?}"), )); } }; @@ -462,7 +465,7 @@ impl Dearmor { self.done = true; return Err(io::Error::new( io::ErrorKind::InvalidData, - format!("invalid ascii armor footer: {:?}", err), + format!("invalid ascii armor footer: {err:?}"), )); } }; diff --git a/src/armor/writer.rs b/src/armor/writer.rs index 2f70d9c1..7a097326 100644 --- a/src/armor/writer.rs +++ b/src/armor/writer.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use std::hash::Hasher; use std::io::Write; -use base64::engine::DEFAULT_ENGINE; +use base64::engine::{general_purpose, Engine as _}; use crc24::Crc24Hasher; use generic_array::typenum::U64; @@ -39,7 +39,8 @@ pub fn write( let mut crc_hasher = Crc24Hasher::init(0x00B7_04CE); { let mut line_wrapper = LineWriter::<_, U64>::new(writer.by_ref(), LineBreak::Lf); - let mut enc = base64::write::EncoderWriter::from(&mut line_wrapper, &DEFAULT_ENGINE); + let mut enc = + base64::write::EncoderWriter::new(&mut line_wrapper, &general_purpose::STANDARD); let mut tee = TeeWriter::new(&mut crc_hasher, &mut enc); source.to_writer(&mut tee)?; @@ -56,7 +57,7 @@ pub fn write( (crc >> 8) as u8, crc as u8, ]; - let crc_enc = base64::encode_engine(crc_buf, &DEFAULT_ENGINE); + let crc_enc = general_purpose::STANDARD.encode(crc_buf); writer.write_all(crc_enc.as_bytes())?; diff --git a/src/base64_decoder.rs b/src/base64_decoder.rs index 8acd01a8..6ec2c2f3 100644 --- a/src/base64_decoder.rs +++ b/src/base64_decoder.rs @@ -5,9 +5,10 @@ use std::io::{self, BufRead, Read, Seek}; use base64::{ alphabet::Alphabet, - decode_engine_slice, - engine::fast_portable::{FastPortable, PAD}, - engine::Engine, + engine::{ + general_purpose::{GeneralPurpose, PAD}, + Engine, + }, }; use buf_redux::{BufReader, Buffer}; @@ -41,7 +42,7 @@ impl fmt::Debug for Base64Decoder { } } -impl Base64Decoder { +impl Base64Decoder { /// Creates a new `Base64Decoder`. pub fn new(input: R) -> Self { Self::new_with_character_set(input, &base64::alphabet::STANDARD) @@ -49,7 +50,7 @@ impl Base64Decoder { pub fn new_with_character_set(input: R, cs: &Alphabet) -> Self { Base64Decoder { - engine: FastPortable::from(cs, PAD), + engine: GeneralPurpose::new(cs, PAD), inner: BufReader::with_capacity(BUF_SIZE, input), out: Buffer::with_capacity(BUF_CAPACITY), out_buffer: [0u8; BUF_CAPACITY], @@ -133,7 +134,7 @@ fn try_decode_engine_slice>( let input_bytes = input.as_ref(); let mut n = input_bytes.len(); while n > 0 { - match decode_engine_slice(&input_bytes[..n], output, engine) { + match engine.decode_slice(&input_bytes[..n], output) { Ok(size) => { return (n, size); } @@ -163,7 +164,6 @@ mod tests { use std::io::Cursor; - use base64::encode_engine; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; @@ -177,7 +177,8 @@ mod tests { for i in 0..n { let data: Vec = (0..i).map(|_| rng.gen()).collect(); - let encoded_data = encode_engine(&data, &FastPortable::from(&cs, PAD)); + let engine = GeneralPurpose::new(&cs, PAD); + let encoded_data = engine.encode(&data); let mut r = Base64Decoder::new_with_character_set(Cursor::new(encoded_data), &cs); let mut out = Vec::new(); diff --git a/src/crypto/aead.rs b/src/crypto/aead.rs index eb301f43..e1e89a2a 100644 --- a/src/crypto/aead.rs +++ b/src/crypto/aead.rs @@ -1,15 +1,11 @@ /// Available AEAD algorithms. #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum AeadAlgorithm { /// None + #[default] None = 0, Eax = 1, Ocb = 2, } - -impl Default for AeadAlgorithm { - fn default() -> Self { - AeadAlgorithm::None - } -} diff --git a/src/crypto/ecdsa.rs b/src/crypto/ecdsa.rs index 7741c234..e8e96c26 100644 --- a/src/crypto/ecdsa.rs +++ b/src/crypto/ecdsa.rs @@ -1,9 +1,6 @@ use elliptic_curve::sec1::ToEncodedPoint; use rand::{CryptoRng, Rng}; -use signature::{ - hazmat::{PrehashSigner, PrehashVerifier}, - Signature as SigSignature, -}; +use signature::hazmat::{PrehashSigner, PrehashVerifier}; use crate::crypto::{ECCCurve, HashAlgorithm}; use crate::errors::Result; @@ -23,7 +20,7 @@ pub fn generate_key( curve, p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), }, - PlainSecretParams::ECDSA(Mpi::from_raw_slice(secret.to_be_bytes().as_slice())), + PlainSecretParams::ECDSA(Mpi::from_raw_slice(secret.to_bytes().as_slice())), )) } @@ -35,7 +32,7 @@ pub fn generate_key( curve, p: Mpi::from_raw_slice(public.to_encoded_point(false).as_bytes()), }, - PlainSecretParams::ECDSA(Mpi::from_raw_slice(secret.to_be_bytes().as_slice())), + PlainSecretParams::ECDSA(Mpi::from_raw_slice(secret.to_bytes().as_slice())), )) } @@ -71,7 +68,7 @@ pub fn verify( sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); - let sig = p256::ecdsa::Signature::from_bytes(&sig_bytes)?; + let sig = p256::ecdsa::Signature::try_from(&sig_bytes[..])?; pk.verify_prehash(hashed, &sig)?; @@ -96,7 +93,7 @@ pub fn verify( sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); - let sig = p384::ecdsa::Signature::from_bytes(&sig_bytes)?; + let sig = p384::ecdsa::Signature::try_from(&sig_bytes[..])?; pk.verify_prehash(hashed, &sig)?; @@ -117,14 +114,14 @@ pub fn sign( let (r, s) = match curve { ECCCurve::P256 => { - let secret = p256::ecdsa::SigningKey::from_bytes(&d)?; - let signature = secret.sign_prehash(digest)?; + let secret = p256::ecdsa::SigningKey::from_slice(&d)?; + let signature: p256::ecdsa::Signature = secret.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } ECCCurve::P384 => { - let secret = p384::ecdsa::SigningKey::from_bytes(&d)?; - let signature = secret.sign_prehash(digest)?; + let secret = p384::ecdsa::SigningKey::from_slice(&d)?; + let signature: p384::ecdsa::Signature = secret.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } diff --git a/src/crypto/eddsa.rs b/src/crypto/eddsa.rs index 8cf41ae3..d0b5fbd0 100644 --- a/src/crypto/eddsa.rs +++ b/src/crypto/eddsa.rs @@ -1,4 +1,3 @@ -use ed25519_dalek::Keypair; use rand::{CryptoRng, Rng}; use signature::{Signer, Verifier}; use zeroize::{Zeroize, Zeroizing}; @@ -11,19 +10,16 @@ use crate::types::{EdDSASecretKey, Mpi, PlainSecretParams, PublicParams}; pub fn generate_key(rng: &mut R) -> (PublicParams, PlainSecretParams) { let mut bytes = Zeroizing::new([0u8; ed25519_dalek::SECRET_KEY_LENGTH]); rng.fill_bytes(&mut *bytes); - let secret = ed25519_dalek::SecretKey::from_bytes(&*bytes).expect("hard coded length"); - let public = ed25519_dalek::PublicKey::from(&secret); - - let keypair = Keypair { secret, public }; - let mut bytes = keypair.to_bytes(); + let secret = ed25519_dalek::SigningKey::from_bytes(&bytes); + let public = ed25519_dalek::VerifyingKey::from(&secret); // public key let mut q = Vec::with_capacity(33); q.push(0x40); - q.extend_from_slice(&bytes[32..]); + q.extend_from_slice(&public.to_bytes()); // secret key - let p = Mpi::from_raw_slice(&bytes[..32]); + let p = Mpi::from_raw_slice(&secret.to_bytes()); bytes.zeroize(); ( @@ -55,13 +51,14 @@ pub fn verify( ensure_eq!(q.len(), 33, "invalid Q (len)"); ensure_eq!(q[0], 0x40, "invalid Q (prefix)"); - let pk = ed25519_dalek::PublicKey::from_bytes(&q[1..])?; + let pk = + ed25519_dalek::VerifyingKey::from_bytes(&q[1..].try_into().expect("pre verified"))?; let mut sig_bytes = vec![0u8; 64]; // add padding if the values were encoded short sig_bytes[(32 - r.len())..32].copy_from_slice(r); sig_bytes[32 + (32 - s.len())..].copy_from_slice(s); - let sig = ed25519_dalek::Signature::from_bytes(&sig_bytes)?; + let sig = ed25519_dalek::Signature::from_slice(&sig_bytes)?; pk.verify(hashed, &sig)?; @@ -81,12 +78,9 @@ pub fn sign( ensure_eq!(q.len(), 33, "invalid Q (len)"); ensure_eq!(q[0], 0x40, "invalid Q (prefix)"); - let mut kp_bytes = vec![0u8; 64]; - kp_bytes[..32].copy_from_slice(&secret_key.secret); - kp_bytes[32..].copy_from_slice(&q[1..]); - let kp = ed25519_dalek::Keypair::from_bytes(&kp_bytes)?; + let key = ed25519_dalek::SigningKey::from_bytes(&secret_key.secret); - let signature = kp.sign(digest); + let signature = key.sign(digest); let bytes = signature.to_bytes(); let r = bytes[..32].to_vec(); diff --git a/src/crypto/hash.rs b/src/crypto/hash.rs index 47c0e2c0..5ed22b9a 100644 --- a/src/crypto/hash.rs +++ b/src/crypto/hash.rs @@ -11,11 +11,13 @@ use crate::errors::Result; /// Ref: https://tools.ietf.org/html/rfc4880.html#section-9.4 #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum HashAlgorithm { None = 0, MD5 = 1, SHA1 = 2, RIPEMD160 = 3, + #[default] SHA2_256 = 8, SHA2_384 = 9, SHA2_512 = 10, @@ -29,12 +31,6 @@ pub enum HashAlgorithm { impl zeroize::DefaultIsZeroes for HashAlgorithm {} -impl Default for HashAlgorithm { - fn default() -> Self { - HashAlgorithm::SHA2_256 - } -} - /// Trait to work around the fact that the `Digest` trait from rustcrypto can not /// be used as `Box`. pub trait Hasher: std::io::Write { diff --git a/src/crypto/rsa.rs b/src/crypto/rsa.rs index 45d0e034..d23be313 100644 --- a/src/crypto/rsa.rs +++ b/src/crypto/rsa.rs @@ -1,22 +1,20 @@ +use digest::{const_oid::AssociatedOid, Digest}; +use md5::Md5; use num_bigint::traits::ModInverse; use num_bigint::BigUint; use rand::{CryptoRng, Rng}; -use rsa::padding::PaddingScheme; -use rsa::pkcs1v15::{Signature as RsaSignature, SigningKey, VerifyingKey}; -use rsa::{PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey}; - -use crate::crypto::HashAlgorithm; -use crate::errors::Result; -use crate::types::{Mpi, PlainSecretParams, PublicParams}; - -use digest::{const_oid::AssociatedOid, Digest}; -use md5::Md5; use ripemd::Ripemd160; +use rsa::pkcs1v15::{Pkcs1v15Encrypt, Signature as RsaSignature, SigningKey, VerifyingKey}; +use rsa::{PublicKey, PublicKeyParts, RsaPrivateKey, RsaPublicKey}; use sha1::Sha1; use sha2::{Sha224, Sha256, Sha384, Sha512}; use sha3::{Sha3_256, Sha3_512}; use signature::hazmat::{PrehashSigner, PrehashVerifier}; -use signature::Signature; +use signature::SignatureEncoding; + +use crate::crypto::HashAlgorithm; +use crate::errors::Result; +use crate::types::{Mpi, PlainSecretParams, PublicParams}; const MAX_KEY_SIZE: usize = 16384; @@ -26,7 +24,7 @@ pub fn decrypt(priv_key: &RsaPrivateKey, mpis: &[Mpi], _fingerprint: &[u8]) -> R ensure_eq!(mpis.len(), 1, "invalid input"); let mpi = &mpis[0]; - let m = priv_key.decrypt(PaddingScheme::new_pkcs1v15_encrypt(), mpi.as_bytes())?; + let m = priv_key.decrypt(Pkcs1v15Encrypt, mpi.as_bytes())?; Ok(m) } @@ -43,7 +41,7 @@ pub fn encrypt( BigUint::from_bytes_be(e), MAX_KEY_SIZE, )?; - let data = key.encrypt(rng, PaddingScheme::new_pkcs1v15_encrypt(), plaintext)?; + let data = key.encrypt(rng, Pkcs1v15Encrypt, plaintext)?; Ok(vec![data]) } @@ -97,8 +95,14 @@ where } /// Verify a RSA, PKCS1v15 padded signature. -pub fn verify(n: &[u8], e: &[u8], hash: HashAlgorithm, hashed: &[u8], sig: &[u8]) -> Result<()> { - let signature = Signature::from_bytes(sig)?; +pub fn verify( + n: &[u8], + e: &[u8], + hash: HashAlgorithm, + hashed: &[u8], + signature: &[u8], +) -> Result<()> { + let signature = RsaSignature::try_from(signature)?; let key = RsaPublicKey::new_with_max_size( BigUint::from_bytes_be(n), BigUint::from_bytes_be(e), diff --git a/src/crypto/sym.rs b/src/crypto/sym.rs index e6154efa..c427a1d3 100644 --- a/src/crypto/sym.rs +++ b/src/crypto/sym.rs @@ -73,6 +73,7 @@ macro_rules! encrypt_regular { /// Available [symmetric key algorithms](https://tools.ietf.org/html/rfc4880#section-9.2). #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum SymmetricKeyAlgorithm { /// Plaintext or unencrypted data Plaintext = 0, @@ -86,6 +87,7 @@ pub enum SymmetricKeyAlgorithm { Blowfish = 4, // 5 & 6 are reserved for DES/SK /// AES with 128-bit key + #[default] AES128 = 7, /// AES with 192-bit key AES192 = 8, @@ -104,12 +106,6 @@ pub enum SymmetricKeyAlgorithm { impl zeroize::DefaultIsZeroes for SymmetricKeyAlgorithm {} -impl Default for SymmetricKeyAlgorithm { - fn default() -> Self { - SymmetricKeyAlgorithm::AES128 - } -} - impl SymmetricKeyAlgorithm { /// The size of a single block in bytes. /// Based on https://github.com/gpg/libgcrypt/blob/master/cipher diff --git a/src/line_writer.rs b/src/line_writer.rs index 449b2a93..71553f9d 100644 --- a/src/line_writer.rs +++ b/src/line_writer.rs @@ -210,7 +210,7 @@ mod tests { use super::*; use crate::util::write_all; - use base64::engine::DEFAULT_ENGINE; + use base64::engine::general_purpose; use generic_array::typenum::{self, U10}; use std::io::Write; @@ -296,7 +296,8 @@ mod tests { { let mut buf = Vec::new(); { - let mut enc = base64::write::EncoderWriter::from(&mut buf, &DEFAULT_ENGINE); + let mut enc = + base64::write::EncoderWriter::new(&mut buf, &general_purpose::STANDARD); enc.write_all(&content).unwrap(); } @@ -335,7 +336,8 @@ mod tests { let mut buf = Vec::new(); { let mut line_wrapper = LineWriter::<_, typenum::U64>::new(&mut buf, LineBreak::Lf); - let mut enc = base64::write::EncoderWriter::from(&mut line_wrapper, &DEFAULT_ENGINE); + let mut enc = + base64::write::EncoderWriter::new(&mut line_wrapper, &general_purpose::STANDARD); write_all(&mut enc, &content).unwrap(); } diff --git a/src/packet/many.rs b/src/packet/many.rs index 50d1a8f8..ad5b0bdc 100644 --- a/src/packet/many.rs +++ b/src/packet/many.rs @@ -196,11 +196,11 @@ mod tests { fn packet_roundtrip(dump: &str, skips: Vec<(usize, i64)>) { let _ = pretty_env_logger::try_init(); - let path = format!("./tests/tests/sks-dump/{}.pgp", dump); + let path = format!("./tests/tests/sks-dump/{dump}.pgp"); let p = Path::new(&path); - let file = File::open(&p).unwrap(); + let file = File::open(p).unwrap(); - let mut bytes = File::open(&p).unwrap(); + let mut bytes = File::open(p).unwrap(); let packets = PacketParser::new(file); diff --git a/src/packet/signature/ser.rs b/src/packet/signature/ser.rs index 43ae1c61..826685ae 100644 --- a/src/packet/signature/ser.rs +++ b/src/packet/signature/ser.rs @@ -335,7 +335,7 @@ mod tests { if let Packet::Signature(_) = p { p.to_writer(&mut serialized).unwrap(); } else { - panic!("unexpected packet: {:?}", p); + panic!("unexpected packet: {p:?}"); }; } diff --git a/src/packet/signature/types.rs b/src/packet/signature/types.rs index 1bd52b1e..08306a5c 100644 --- a/src/packet/signature/types.rs +++ b/src/packet/signature/types.rs @@ -452,20 +452,16 @@ impl Signature { #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum SignatureVersion { /// Deprecated V2 = 2, V3 = 3, + #[default] V4 = 4, V5 = 5, } -impl Default for SignatureVersion { - fn default() -> Self { - SignatureVersion::V4 - } -} - #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive)] #[repr(u8)] pub enum SignatureType { diff --git a/src/types/mpi.rs b/src/types/mpi.rs index e7dc54a1..00d35064 100644 --- a/src/types/mpi.rs +++ b/src/types/mpi.rs @@ -248,7 +248,7 @@ mod tests { ]; for (i, (raw, encoded)) in fixtures.iter().enumerate() { - println!("fixture {}", i); + println!("fixture {i}"); let n = hex::decode(raw).unwrap(); let n_big = BigUint::from_bytes_be(&n); diff --git a/src/types/packet.rs b/src/types/packet.rs index 256f54f7..910cd38d 100644 --- a/src/types/packet.rs +++ b/src/types/packet.rs @@ -72,19 +72,15 @@ pub enum Tag { #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum Version { /// Old Packet Format Old = 0, /// New Packet Format + #[default] New = 1, } -impl Default for Version { - fn default() -> Self { - Version::New - } -} - impl Version { pub fn write_header(self, writer: &mut impl io::Write, tag: u8, len: usize) -> Result<()> { debug!("write_header {:?} {} {}", self, tag, len); @@ -125,19 +121,15 @@ impl Version { // TODO: find a better place for this #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive)] #[repr(u8)] +#[derive(Default)] pub enum KeyVersion { V2 = 2, V3 = 3, + #[default] V4 = 4, V5 = 5, } -impl Default for KeyVersion { - fn default() -> Self { - KeyVersion::V4 - } -} - #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] diff --git a/src/types/s2k.rs b/src/types/s2k.rs index fe332478..c4337d47 100644 --- a/src/types/s2k.rs +++ b/src/types/s2k.rs @@ -130,11 +130,12 @@ impl StringToKey { /// Available String-To-Key types #[repr(u8)] -#[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive)] +#[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, Default)] pub enum StringToKeyType { Simple = 0, Salted = 1, Reserved = 2, + #[default] IteratedAndSalted = 3, Private100 = 100, Private101 = 101, @@ -149,12 +150,6 @@ pub enum StringToKeyType { Private110 = 110, } -impl Default for StringToKeyType { - fn default() -> Self { - StringToKeyType::IteratedAndSalted - } -} - impl StringToKeyType { pub fn param_len(self) -> usize { match self { diff --git a/tests/key_test.rs b/tests/key_test.rs index 5ac02867..16a3e75b 100644 --- a/tests/key_test.rs +++ b/tests/key_test.rs @@ -13,7 +13,6 @@ use chrono::{DateTime, Utc}; use num_bigint::BigUint; use num_traits::ToPrimitive; use rand::thread_rng; -use rsa::padding::PaddingScheme; use rsa::{PublicKey as PublicKeyTrait, PublicKeyParts, RsaPrivateKey, RsaPublicKey}; use smallvec::SmallVec; @@ -35,7 +34,7 @@ fn read_file + ::std::fmt::Debug>(path: P) -> File { match File::open(&path) { // The `description` method of `io::Error` returns a string that // describes the error - Err(why) => panic!("couldn't open {:?}: {}", path, why), + Err(why) => panic!("couldn't open {path:?}: {why}"), Ok(file) => file, } } @@ -48,7 +47,7 @@ fn test_parse_dump(i: usize, expected_count: usize) { // use pretty_env_logger; // let _ = pretty_env_logger::try_init(); - let f = read_file(Path::new("./tests/tests/sks-dump/").join(format!("000{}.pgp", i))); + let f = read_file(Path::new("./tests/tests/sks-dump/").join(format!("000{i}.pgp"))); let count = SignedPublicKey::from_bytes_many(f) .enumerate() @@ -80,7 +79,7 @@ fn test_parse_dump(i: usize, expected_count: usize) { Err(err) => { warn!( "verification failed: public key {}: {:?}", - hex::encode(&key.key_id()), + hex::encode(key.key_id()), err ); false @@ -124,7 +123,7 @@ fn test_parse_gnupg_v1() { let _ = pretty_env_logger::try_init(); for i in 1..5 { - let name = format!("gnupg-v1-00{}.asc", i); + let name = format!("gnupg-v1-00{i}.asc"); let mut file = get_test_key(&name); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); @@ -136,7 +135,7 @@ fn test_parse_gnupg_v1() { Err(Error::Unimplemented(err)) => { warn!("verification failed: {:?}", err); } - Err(err) => panic!("{:?}", err), + Err(err) => panic!("{err:?}"), // all good Ok(_) => {} } @@ -192,18 +191,18 @@ fn test_parse_openpgp_sample_rsa_private() { let pk: RsaPublicKey = k.into(); pk.encrypt( &mut rng, - PaddingScheme::new_pkcs1v15_encrypt(), + rsa::pkcs1v15::Pkcs1v15Encrypt, plaintext.as_slice(), ) .expect("failed to encrypt") }; let new_plaintext = k - .decrypt(PaddingScheme::new_pkcs1v15_encrypt(), ciphertext.as_slice()) + .decrypt(rsa::pkcs1v15::Pkcs1v15Encrypt, ciphertext.as_slice()) .expect("failed to decrypt"); assert_eq!(plaintext, new_plaintext); } - _ => panic!("unexpected params type {:?}", unlocked_key), + _ => panic!("unexpected params type {unlocked_key:?}"), } Ok(()) }, @@ -556,15 +555,13 @@ fn encrypted_private_key() { fn get_test_fingerprint(filename: &str) -> (serde_json::Value, SignedPublicKey) { let mut asc = read_file( Path::new(&format!( - "./tests/opengpg-interop/testcases/keys/{}.asc", - filename + "./tests/opengpg-interop/testcases/keys/{filename}.asc" )) .to_path_buf(), ); let json_file = read_file( Path::new(&format!( - "./tests/opengpg-interop/testcases/keys/{}.json", - filename + "./tests/opengpg-interop/testcases/keys/{filename}.json" )) .to_path_buf(), ); @@ -840,7 +837,7 @@ fn private_ecc1_verify() { let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 1); - assert_eq!(hex::encode(&sk.key_id()).to_uppercase(), "0BA52DF0BAA59D9C",); + assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "0BA52DF0BAA59D9C",); sk.unlock( || "ecc".to_string(), |k| { @@ -865,7 +862,7 @@ fn private_ecc2_verify() { let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 0); - assert_eq!(hex::encode(&sk.key_id()).to_uppercase(), "098033880F54719F",); + assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "098033880F54719F",); sk.unlock( || "ecc".to_string(), |k| { @@ -893,7 +890,7 @@ fn private_x25519_verify() { let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 1); - assert_eq!(hex::encode(&sk.key_id()).to_uppercase(), "F25E5F24BB372CFA",); + assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "F25E5F24BB372CFA",); sk.unlock( || "moon".to_string(), |k| { @@ -918,10 +915,10 @@ fn pub_x25519_little_verify() { let (pk, _headers) = SignedPublicKey::from_armor_single(f).expect("failed to parse key"); pk.verify().expect("invalid key"); assert_eq!(pk.public_subkeys.len(), 1); - assert_eq!(hex::encode(&pk.key_id()).to_uppercase(), "C062C165CA61C215",); + assert_eq!(hex::encode(pk.key_id()).to_uppercase(), "C062C165CA61C215",); assert_eq!( - hex::encode(&pk.public_subkeys[0].key_id()).to_uppercase(), + hex::encode(pk.public_subkeys[0].key_id()).to_uppercase(), "A586D1DD06BD97BC", ); assert_eq!(pk.details.users.len(), 1); @@ -1022,7 +1019,7 @@ fn test_handle_incomplete_packets_end() { key.verify().expect("invalid key"); // add overflow of "b60ed7" - let raw = hex::decode(hex::encode(&key.to_bytes().unwrap()) + "b60ed7").unwrap(); + let raw = hex::decode(hex::encode(key.to_bytes().unwrap()) + "b60ed7").unwrap(); let key = SignedSecretKey::from_bytes(Cursor::new(raw)).expect("failed"); key.verify().expect("invalid key"); } diff --git a/tests/message_test.rs b/tests/message_test.rs index 1532f0c2..d41eec8f 100644 --- a/tests/message_test.rs +++ b/tests/message_test.rs @@ -32,7 +32,7 @@ fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { let _ = pretty_env_logger::try_init(); // TODO: verify filename - let n = format!("{}/{}", base_path, entry); + let n = format!("{base_path}/{entry}"); let mut file = File::open(&n).unwrap_or_else(|_| panic!("no file: {}", &n)); let details: Testcase = serde_json::from_reader(&mut file).unwrap(); @@ -47,7 +47,7 @@ fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { .expect("failed to read decryption key"); decrypt_key.verify().expect("invalid decryption key"); - let decrypt_id = hex::encode(&decrypt_key.key_id()); + let decrypt_id = hex::encode(decrypt_key.key_id()); info!("decrypt key (ID={})", &decrypt_id); if let Some(id) = &details.keyid { @@ -55,12 +55,12 @@ fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { } let verify_key = if let Some(verify_key_str) = details.verify_key.clone() { - let mut verify_key_file = File::open(format!("{}/{}", base_path, verify_key_str)).unwrap(); + let mut verify_key_file = File::open(format!("{base_path}/{verify_key_str}")).unwrap(); let (verify_key, _headers) = SignedPublicKey::from_armor_single(&mut verify_key_file) .expect("failed to read verification key"); verify_key.verify().expect("invalid verification key"); - let verify_id = hex::encode(&verify_key.key_id()); + let verify_id = hex::encode(verify_key.key_id()); info!("verify key (ID={})", &verify_id); Some(verify_key) } else { @@ -68,7 +68,7 @@ fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { }; let file_name = entry.replace(".json", ".asc"); - let cipher_file_path = format!("{}/{}", base_path, file_name); + let cipher_file_path = format!("{base_path}/{file_name}"); let mut cipher_file = File::open(&cipher_file_path).unwrap(); let (message, headers) = @@ -116,16 +116,16 @@ fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { m.get_literal().unwrap().clone() } - _ => panic!("unexpected message type: {:?}", decrypted), + _ => panic!("unexpected message type: {decrypted:?}"), }; assert_eq!( ::std::str::from_utf8(raw.data()).unwrap(), - details.textcontent.unwrap_or_else(|| "".to_string()) + details.textcontent.unwrap_or_default() ); } Message::Signed { signature, .. } => { - println!("signature: {:?}", signature); + println!("signature: {signature:?}"); } _ => { // TODO: some other checks? @@ -270,7 +270,7 @@ fn msg_large_indeterminate_len() { m.get_literal().unwrap().clone() } - _ => panic!("unexpected message type: {:?}", decrypted), + _ => panic!("unexpected message type: {decrypted:?}"), }; assert_eq!(