From 334a19963cc3a11daefe7433f492c810243386df Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Tue, 6 Feb 2024 13:53:55 -0700 Subject: [PATCH] deps: base64 -> data_encoding dependabot wanted to upgrade to base64 0.21, but I resent that the API for the common case of base64 encoding got more difficult in the move from 0.13. So, I'm switching us to data_encoding's implementation instead. Note that the overall rust ecosystem on which we depend here, transitively depends on 3 different versions of the base64 crate, so even though we've removed direct deps on base64 from kumomta, the lock file still references base64 0.10, 0.13 and 0.21, so that kinda sucks. --- Cargo.lock | 11 +++++------ crates/dkim/Cargo.toml | 2 +- crates/dkim/src/hash.rs | 7 +++---- crates/dkim/src/lib.rs | 6 ++---- crates/dkim/src/public_key.rs | 6 ++---- crates/dkim/src/sign.rs | 7 +++---- crates/kumo-log-types/Cargo.toml | 2 +- crates/kumo-log-types/src/rfc5965.rs | 4 +++- crates/kumo-server-common/Cargo.toml | 2 +- crates/kumo-server-common/src/http_server/auth.rs | 2 +- crates/kumod/Cargo.toml | 2 +- crates/kumod/src/http_server/inject_v1.rs | 2 +- crates/kumod/src/smtp_server.rs | 5 +++-- crates/message/Cargo.toml | 1 - crates/rfc5321/Cargo.toml | 2 +- crates/rfc5321/src/client.rs | 2 +- 16 files changed, 29 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 68955550..63df62dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2470,9 +2470,9 @@ dependencies = [ name = "kumo-dkim" version = "0.3.0" dependencies = [ - "base64 0.21.7", "chrono", "criterion", + "data-encoding", "ed25519-dalek", "foreign-types", "futures", @@ -2500,9 +2500,9 @@ name = "kumo-log-types" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.13.1", "bounce-classify", "chrono", + "data-encoding", "k9", "mailparsing", "rfc5321", @@ -2520,11 +2520,11 @@ dependencies = [ "axum-client-ip", "axum-server", "backtrace", - "base64 0.13.1", "cidr-map", "clap 4.4.18", "config", "console-subscriber", + "data-encoding", "data-loader", "domain-map", "gethostname", @@ -2620,13 +2620,13 @@ dependencies = [ "axum", "axum-client-ip", "axum-server", - "base64 0.13.1", "bounce-classify", "caps", "chrono", "cidr-map", "clap 4.4.18", "config", + "data-encoding", "data-loader", "dns-resolver", "duration-serde", @@ -3065,7 +3065,6 @@ name = "message" version = "0.1.0" dependencies = [ "anyhow", - "base64 0.13.1", "bitflags 2.4.2", "chrono", "chrono-tz", @@ -4580,7 +4579,7 @@ dependencies = [ name = "rfc5321" version = "0.1.0" dependencies = [ - "base64 0.13.1", + "data-encoding", "duration-serde", "hickory-proto", "memchr", diff --git a/crates/dkim/Cargo.toml b/crates/dkim/Cargo.toml index 6ff2ede1..fae823a0 100644 --- a/crates/dkim/Cargo.toml +++ b/crates/dkim/Cargo.toml @@ -15,8 +15,8 @@ openssl = ["dep:openssl", "dep:openssl-sys", "dep:foreign-types"] default = ["openssl"] [dependencies] -base64 = "0.21.0" chrono = { version = "0.4.26", default-features = false, features = ["clock", "std"] } +data-encoding = "2.5" ed25519-dalek = {workspace=true, features=["pkcs8"]} futures = {workspace=true} indexmap = "1.9.3" diff --git a/crates/dkim/src/hash.rs b/crates/dkim/src/hash.rs index 4631950b..307640d7 100644 --- a/crates/dkim/src/hash.rs +++ b/crates/dkim/src/hash.rs @@ -1,7 +1,6 @@ use crate::header::HEADER; use crate::{canonicalization, DKIMError, DKIMHeader, ParsedEmail}; -use base64::engine::general_purpose; -use base64::Engine; +use data_encoding::BASE64; use sha1::{Digest as _, Sha1}; use sha2::Sha256; use std::collections::HashMap; @@ -78,8 +77,8 @@ impl HashImpl { pub fn finalize(self) -> String { match self { - Self::Sha1(hasher) => general_purpose::STANDARD.encode(hasher.finalize()), - Self::Sha256(hasher) => general_purpose::STANDARD.encode(hasher.finalize()), + Self::Sha1(hasher) => BASE64.encode(&hasher.finalize()), + Self::Sha256(hasher) => BASE64.encode(&hasher.finalize()), #[cfg(test)] Self::Copy(data) => String::from_utf8_lossy(&data).into(), } diff --git a/crates/dkim/src/lib.rs b/crates/dkim/src/lib.rs index c2cd74d0..6469df2f 100644 --- a/crates/dkim/src/lib.rs +++ b/crates/dkim/src/lib.rs @@ -2,8 +2,6 @@ use crate::errors::Status; use crate::hash::HeaderList; -use base64::engine::general_purpose; -use base64::Engine; use ed25519_dalek::SigningKey; use hickory_resolver::TokioAsyncResolver; use mailparsing::AuthenticationResult; @@ -210,8 +208,8 @@ async fn verify_email_header<'a>( return Err(DKIMError::BodyHashDidNotVerify); } - let signature = general_purpose::STANDARD - .decode(dkim_header.get_required_tag("b")) + let signature = data_encoding::BASE64 + .decode(dkim_header.get_required_tag("b").as_bytes()) .map_err(|err| { DKIMError::SignatureSyntaxError(format!("failed to decode signature: {}", err)) })?; diff --git a/crates/dkim/src/public_key.rs b/crates/dkim/src/public_key.rs index 0fe04606..bee62d23 100644 --- a/crates/dkim/src/public_key.rs +++ b/crates/dkim/src/public_key.rs @@ -1,5 +1,3 @@ -use base64::engine::general_purpose; -use base64::Engine; use rsa::{pkcs1, pkcs8}; use std::collections::HashMap; @@ -51,8 +49,8 @@ pub(crate) async fn retrieve_public_key( }; let tag = tags_map.get("p").ok_or(DKIMError::NoKeyForSignature)?; - let bytes = general_purpose::STANDARD - .decode(&tag.value) + let bytes = data_encoding::BASE64 + .decode(tag.value.as_bytes()) .map_err(|err| { DKIMError::KeyUnavailable(format!("failed to decode public key: {}", err)) })?; diff --git a/crates/dkim/src/sign.rs b/crates/dkim/src/sign.rs index fe3c48be..b05194dd 100644 --- a/crates/dkim/src/sign.rs +++ b/crates/dkim/src/sign.rs @@ -1,7 +1,6 @@ use crate::header::DKIMHeaderBuilder; use crate::{canonicalization, hash, DKIMError, DkimPrivateKey, HeaderList, ParsedEmail, HEADER}; -use base64::engine::general_purpose; -use base64::Engine; +use data_encoding::BASE64; use ed25519_dalek::Signer as _; use rsa::Pkcs1v15Sign; use sha1::Sha1; @@ -243,7 +242,7 @@ impl Signer { // add the signature into the DKIM header and generate the header let dkim_header = dkim_header_builder - .add_tag("b", &general_purpose::STANDARD.encode(signature)) + .add_tag("b", &BASE64.encode(&signature)) .build(); Ok(format!("{}: {}", HEADER, dkim_header.raw_bytes)) @@ -461,7 +460,7 @@ Joe."# let email = ParsedEmail::parse(raw_email).unwrap(); let file_content = fs::read("./test/keys/ed.private").unwrap(); - let file_decoded = general_purpose::STANDARD.decode(file_content).unwrap(); + let file_decoded = BASE64.decode(&file_content).unwrap(); let mut key_bytes = [0u8; ed25519_dalek::SECRET_KEY_LENGTH]; key_bytes.copy_from_slice(&file_decoded); let secret_key = ed25519_dalek::SigningKey::from_bytes(&key_bytes); diff --git a/crates/kumo-log-types/Cargo.toml b/crates/kumo-log-types/Cargo.toml index 2c8533d8..140853a8 100644 --- a/crates/kumo-log-types/Cargo.toml +++ b/crates/kumo-log-types/Cargo.toml @@ -7,9 +7,9 @@ edition = "2021" [dependencies] anyhow = "1.0" -base64 = "0.13" bounce-classify = {path="../bounce-classify"} chrono = {version="0.4", default-features=false, features=["serde", "std"]} +data-encoding = "2.5" mailparsing = {path="../mailparsing"} rfc5321 = {path="../rfc5321", default-features=false} serde = {version="1.0", features=["derive"]} diff --git a/crates/kumo-log-types/src/rfc5965.rs b/crates/kumo-log-types/src/rfc5965.rs index 159978d3..868f5291 100644 --- a/crates/kumo-log-types/src/rfc5965.rs +++ b/crates/kumo-log-types/src/rfc5965.rs @@ -73,7 +73,9 @@ impl ARFReport { if !(hdr.get_name().starts_with("X-") || hdr.get_name().starts_with("x-")) { continue; } - if let Ok(decoded) = base64::decode(hdr.get_raw_value()) { + if let Ok(decoded) = + data_encoding::BASE64.decode(hdr.get_raw_value().as_bytes()) + { #[derive(Deserialize)] struct Wrap { #[serde(rename = "_@_")] diff --git a/crates/kumo-server-common/Cargo.toml b/crates/kumo-server-common/Cargo.toml index cabaf145..6b09e059 100644 --- a/crates/kumo-server-common/Cargo.toml +++ b/crates/kumo-server-common/Cargo.toml @@ -11,11 +11,11 @@ axum = {workspace=true} axum-client-ip = "0.4" axum-server = {workspace=true, features=["tls-rustls"]} backtrace = "0.3" -base64 = "0.13" cidr-map = {path="../cidr-map"} clap = {version="4.1", features=["derive"]} config = {path="../config"} console-subscriber = "0.1" +data-encoding = "2.5" data-loader = {path="../data-loader"} domain-map = {path="../domain-map"} gethostname = "0.4" diff --git a/crates/kumo-server-common/src/http_server/auth.rs b/crates/kumo-server-common/src/http_server/auth.rs index d281ff77..e9a110a8 100644 --- a/crates/kumo-server-common/src/http_server/auth.rs +++ b/crates/kumo-server-common/src/http_server/auth.rs @@ -28,7 +28,7 @@ impl AuthKind { let (kind, contents) = authorization.split_once(' ')?; match kind { "Basic" => { - let decoded = base64::decode(contents).ok()?; + let decoded = data_encoding::BASE64.decode(contents.as_bytes()).ok()?; let decoded = String::from_utf8(decoded).ok()?; let (user, password) = if let Some((id, password)) = decoded.split_once(':') { (id.to_string(), Some(password.to_string())) diff --git a/crates/kumod/Cargo.toml b/crates/kumod/Cargo.toml index dda6f695..bfb43359 100644 --- a/crates/kumod/Cargo.toml +++ b/crates/kumod/Cargo.toml @@ -13,12 +13,12 @@ async-trait = "0.1" axum = {workspace=true, features=["ws"]} axum-client-ip = "=0.4" axum-server = {workspace=true, features=["tls-rustls"]} -base64 = "0.13" bounce-classify = {path="../bounce-classify"} chrono = {version="0.4", default-features=false, features=["serde"]} cidr-map = {path="../cidr-map"} clap = {version="4.1", features=["derive"]} config = {path="../config"} +data-encoding = "2.5" data-loader = {path="../data-loader"} dns-resolver = {path="../dns-resolver", features=["unbound"]} duration-serde = {path="../duration-serde"} diff --git a/crates/kumod/src/http_server/inject_v1.rs b/crates/kumod/src/http_server/inject_v1.rs index a36af4ce..1940e091 100644 --- a/crates/kumod/src/http_server/inject_v1.rs +++ b/crates/kumod/src/http_server/inject_v1.rs @@ -418,7 +418,7 @@ impl InjectV1Request { let part = MimePart::new_binary( &a.content_type, if a.base64 { - decoded_data = base64::decode(&a.data)?; + decoded_data = data_encoding::BASE64.decode(a.data.as_bytes())?; &decoded_data } else { a.data.as_bytes() diff --git a/crates/kumod/src/smtp_server.rs b/crates/kumod/src/smtp_server.rs index 46f7594c..22ffc7d9 100644 --- a/crates/kumod/src/smtp_server.rs +++ b/crates/kumod/src/smtp_server.rs @@ -8,6 +8,7 @@ use anyhow::{anyhow, Context}; use chrono::Utc; use cidr_map::{AnyIpCidr, CidrSet}; use config::{any_err, load_config, serialize_options, CallbackSignature, LuaConfig}; +use data_encoding::BASE64; use data_loader::KeySource; use kumo_log_types::ResolvedAddress; use kumo_server_lifecycle::{Activity, ShutdownSubcription}; @@ -1028,7 +1029,7 @@ impl SmtpServer { continue; } - match base64::decode(&response) { + match BASE64.decode(response.as_bytes()) { Ok(payload) => { // RFC 4616 says that the message is: // [authzid] NUL authcid NUL passwd @@ -1432,7 +1433,7 @@ impl SmtpServer { } } - let value = base64::encode(serde_json::to_string(&object)?); + let value = BASE64.encode(serde_json::to_string(&object)?.as_bytes()); message.prepend_header(Some(&self.params.trace_headers.header_name), &value); } diff --git a/crates/message/Cargo.toml b/crates/message/Cargo.toml index dbcecc87..78f214be 100644 --- a/crates/message/Cargo.toml +++ b/crates/message/Cargo.toml @@ -11,7 +11,6 @@ impl = ["dep:kumo-dkim", "dep:data-loader", "data-loader/impl", "dep:lruttl", "d [dependencies] anyhow = "1.0" -base64 = "0.13" bitflags = "2.3" kumo-dkim = {path="../dkim", optional=true} config = {path="../config"} diff --git a/crates/rfc5321/Cargo.toml b/crates/rfc5321/Cargo.toml index fab021bf..2caa72f4 100644 --- a/crates/rfc5321/Cargo.toml +++ b/crates/rfc5321/Cargo.toml @@ -10,7 +10,7 @@ default = ["client"] client = ["dep:openssl", "dep:tokio-rustls", "dep:tokio-openssl", "dep:tracing", "dep:tokio", "dep:hickory-proto", "dep:webpki-roots"] [dependencies] -base64 = "0.13" +data-encoding = "2.5" duration-serde = {path="../duration-serde"} memchr = "2.5" once_cell = "1.17" diff --git a/crates/rfc5321/src/client.rs b/crates/rfc5321/src/client.rs index 1a15ee15..a3393dec 100644 --- a/crates/rfc5321/src/client.rs +++ b/crates/rfc5321/src/client.rs @@ -367,7 +367,7 @@ impl SmtpClient { // [authzid] NUL authcid NUL passwd let password = password.unwrap_or(""); let payload = format!("\x00{username}\x00{password}"); - let payload = base64::encode(&payload); + let payload = data_encoding::BASE64.encode(payload.as_bytes()); let response = self .send_command(&Command::Auth {