Skip to content

Commit 5ccec48

Browse files
authored
feat: Switch from base64 to data-encoding (#1743)
1 parent d86d066 commit 5ccec48

File tree

7 files changed

+32
-46
lines changed

7 files changed

+32
-46
lines changed

Cargo.lock

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

relay-auth/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ publish = false
1111
build = "build.rs"
1212

1313
[dependencies]
14-
base64 = "0.10.1"
1514
chrono = "0.4.11"
1615
ed25519-dalek = "0.9.1"
1716
thiserror = "1.0.24"
@@ -21,3 +20,4 @@ relay-common = { path = "../relay-common" }
2120
serde = { version = "1.0.114", features = ["derive"] }
2221
serde_json = "1.0.55"
2322
sha2 = "0.8.1"
23+
data-encoding = "2.3.3"

relay-auth/src/lib.rs

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::fmt;
77
use std::str::FromStr;
88

99
use chrono::{DateTime, Duration, TimeZone, Utc};
10+
use data_encoding::BASE64URL_NOPAD;
1011
use hmac::{Hmac, Mac};
1112
use rand::{rngs::OsRng, thread_rng, RngCore};
1213
use serde::{de::DeserializeOwned, Deserialize, Serialize};
@@ -201,11 +202,11 @@ impl SecretKey {
201202
pub fn sign_with_header(&self, data: &[u8], header: &SignatureHeader) -> String {
202203
let mut header =
203204
serde_json::to_vec(&header).expect("attempted to pack non json safe header");
204-
let header_encoded = base64::encode_config(&header[..], base64::URL_SAFE_NO_PAD);
205+
let header_encoded = BASE64URL_NOPAD.encode(&header);
205206
header.push(b'\x00');
206207
header.extend_from_slice(data);
207208
let sig = self.inner.sign::<Sha512>(&header);
208-
let mut sig_encoded = base64::encode_config(&sig.to_bytes()[..], base64::URL_SAFE_NO_PAD);
209+
let mut sig_encoded = BASE64URL_NOPAD.encode(&sig.to_bytes());
209210
sig_encoded.push('.');
210211
sig_encoded.push_str(&header_encoded);
211212
sig_encoded
@@ -242,7 +243,7 @@ impl FromStr for SecretKey {
242243
type Err = KeyParseError;
243244

244245
fn from_str(s: &str) -> Result<SecretKey, KeyParseError> {
245-
let bytes = match base64::decode_config(s, base64::URL_SAFE_NO_PAD) {
246+
let bytes = match BASE64URL_NOPAD.decode(s.as_bytes()) {
246247
Ok(bytes) => bytes,
247248
_ => return Err(KeyParseError::BadEncoding),
248249
};
@@ -263,16 +264,12 @@ impl FromStr for SecretKey {
263264
impl fmt::Display for SecretKey {
264265
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
265266
if f.alternate() {
266-
write!(
267-
f,
268-
"{}",
269-
base64::encode_config(&self.inner.to_bytes()[..], base64::URL_SAFE_NO_PAD)
270-
)
267+
write!(f, "{}", BASE64URL_NOPAD.encode(&self.inner.to_bytes()))
271268
} else {
272269
write!(
273270
f,
274271
"{}",
275-
base64::encode_config(&self.inner.secret.to_bytes()[..], base64::URL_SAFE_NO_PAD)
272+
BASE64URL_NOPAD.encode(&self.inner.secret.to_bytes())
276273
)
277274
}
278275
}
@@ -292,17 +289,13 @@ impl PublicKey {
292289
pub fn verify_meta(&self, data: &[u8], sig: &str) -> Option<SignatureHeader> {
293290
let mut iter = sig.splitn(2, '.');
294291
let sig_bytes = match iter.next() {
295-
Some(sig_encoded) => {
296-
base64::decode_config(sig_encoded, base64::URL_SAFE_NO_PAD).ok()?
297-
}
292+
Some(sig_encoded) => BASE64URL_NOPAD.decode(sig_encoded.as_bytes()).ok()?,
298293
None => return None,
299294
};
300295
let sig = ed25519_dalek::Signature::from_bytes(&sig_bytes).ok()?;
301296

302297
let header = match iter.next() {
303-
Some(header_encoded) => {
304-
base64::decode_config(header_encoded, base64::URL_SAFE_NO_PAD).ok()?
305-
}
298+
Some(header_encoded) => BASE64URL_NOPAD.decode(header_encoded.as_bytes()).ok()?,
306299
None => return None,
307300
};
308301
let mut to_verify = header.clone();
@@ -373,7 +366,7 @@ impl FromStr for PublicKey {
373366
type Err = KeyParseError;
374367

375368
fn from_str(s: &str) -> Result<PublicKey, KeyParseError> {
376-
let bytes = match base64::decode_config(s, base64::URL_SAFE_NO_PAD) {
369+
let bytes = match BASE64URL_NOPAD.decode(s.as_bytes()) {
377370
Ok(bytes) => bytes,
378371
_ => return Err(KeyParseError::BadEncoding),
379372
};
@@ -386,11 +379,7 @@ impl FromStr for PublicKey {
386379

387380
impl fmt::Display for PublicKey {
388381
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
389-
write!(
390-
f,
391-
"{}",
392-
base64::encode_config(&self.inner.to_bytes()[..], base64::URL_SAFE_NO_PAD)
393-
)
382+
write!(f, "{}", BASE64URL_NOPAD.encode(&self.inner.to_bytes()))
394383
}
395384
}
396385

@@ -445,11 +434,11 @@ impl SignedRegisterState {
445434
/// Signs the given `RegisterState` and serializes it into a single string.
446435
fn sign(state: RegisterState, secret: &[u8]) -> Self {
447436
let json = serde_json::to_string(&state).expect("relay register state serializes to JSON");
448-
let token = base64::encode_config(&json, base64::URL_SAFE_NO_PAD);
437+
let token = BASE64URL_NOPAD.encode(json.as_bytes());
449438

450439
let mut mac = Self::mac(secret);
451440
mac.input(token.as_bytes());
452-
let signature = base64::encode_config(&mac.result().code(), base64::URL_SAFE_NO_PAD);
441+
let signature = BASE64URL_NOPAD.encode(&mac.result().code());
453442

454443
Self(format!("{token}:{signature}"))
455444
}
@@ -475,14 +464,16 @@ impl SignedRegisterState {
475464
max_age: Option<Duration>,
476465
) -> Result<RegisterState, UnpackError> {
477466
let (token, signature) = self.split();
478-
let code = base64::decode_config(signature, base64::URL_SAFE_NO_PAD)
467+
let code = BASE64URL_NOPAD
468+
.decode(signature.as_bytes())
479469
.map_err(|_| UnpackError::BadEncoding)?;
480470

481471
let mut mac = Self::mac(secret);
482472
mac.input(token.as_bytes());
483473
mac.verify(&code).map_err(|_| UnpackError::BadSignature)?;
484474

485-
let json = base64::decode_config(token, base64::URL_SAFE_NO_PAD)
475+
let json = BASE64URL_NOPAD
476+
.decode(token.as_bytes())
486477
.map_err(|_| UnpackError::BadEncoding)?;
487478
let state =
488479
serde_json::from_slice::<RegisterState>(&json).map_err(UnpackError::BadPayload)?;
@@ -539,7 +530,7 @@ fn nonce() -> String {
539530
let mut rng = thread_rng();
540531
let mut bytes = vec![0u8; 64];
541532
rng.fill_bytes(&mut bytes);
542-
base64::encode_config(&bytes, base64::URL_SAFE_NO_PAD)
533+
BASE64URL_NOPAD.encode(&bytes)
543534
}
544535

545536
/// Represents a request for registration with the upstream.

relay-profiling/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ publish = false
1111

1212
[dependencies]
1313
android_trace_log = { version = "0.2.0", features = ["serde"] }
14-
base64 = "0.10.1"
1514
bytes = { version = "0.4.12", features = ["serde"] }
1615
chrono = { version = "0.4", features = ["serde"] }
16+
data-encoding = "2.3.3"
1717
relay-general = { path = "../relay-general" }
1818
serde = { version = "1.0.114", features = ["derive"] }
1919
serde_json = "1.0.55"

relay-profiling/src/android.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::collections::{HashMap, HashSet};
22

33
use android_trace_log::chrono::{DateTime, Utc};
44
use android_trace_log::{AndroidTraceLog, Clock, Time, Vm};
5+
use data_encoding::BASE64;
56
use serde::{Deserialize, Serialize};
67

78
use relay_general::protocol::EventId;
@@ -90,7 +91,7 @@ impl AndroidProfile {
9091
}
9192

9293
fn parse(&mut self) -> Result<(), ProfileError> {
93-
let profile_bytes = match base64::decode(&self.sampled_profile) {
94+
let profile_bytes = match BASE64.decode(self.sampled_profile.as_bytes()) {
9495
Ok(profile) => profile,
9596
Err(_) => return Err(ProfileError::InvalidBase64Value),
9697
};

relay-server/Cargo.toml

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,17 @@ publish = false
1313
[features]
1414
default = []
1515
ssl = ["native-tls", "actix-web/tls"]
16-
processing = [
17-
"minidump",
18-
"relay-config/processing",
19-
"relay-kafka/producer",
20-
"relay-quotas/redis",
21-
"relay-redis/impl",
22-
"symbolic-unreal",
23-
"symbolic-common",
24-
]
16+
processing = ["minidump", "relay-config/processing", "relay-kafka/producer", "relay-quotas/redis", "relay-redis/impl", "symbolic-unreal", "symbolic-common"]
2517

2618
[dependencies]
2719
actix = "0.7.9"
2820
actix-web = { version = "0.7.19", default-features = false }
2921
anyhow = "1.0.66"
30-
base64 = "0.10.1"
3122
brotli2 = "0.3.2"
3223
bytes = { version = "0.4.12", features = ["serde"] }
3324
chrono = { version = "0.4.11", features = ["serde"] }
3425
clap = "2.33.1"
26+
data-encoding = "2.3.3"
3527
failure = "0.1.8"
3628
flate2 = "1.0.19"
3729
fragile = { version = "2.0.0", features = ["slab"] } # used for vendoring sentry-actix

relay-server/src/body/store_body.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::io::{self, ErrorKind, Read};
33

44
use actix_web::{error::PayloadError, HttpRequest};
55
use bytes::Bytes;
6+
use data_encoding::BASE64;
67
use flate2::read::ZlibDecoder;
78
use futures01::prelude::*;
89
use url::form_urlencoded;
@@ -71,8 +72,9 @@ fn decode_bytes<B: Into<Bytes> + AsRef<[u8]>>(body: B) -> Result<Bytes, PayloadE
7172

7273
// TODO: Switch to a streaming decoder
7374
// see https://github.com/alicemaz/rust-base64/pull/56
74-
let binary_body =
75-
base64::decode(&body).map_err(|e| io::Error::new(ErrorKind::InvalidInput, e))?;
75+
let binary_body = BASE64
76+
.decode(body.as_ref())
77+
.map_err(|e| io::Error::new(ErrorKind::InvalidInput, e))?;
7678
if binary_body.starts_with(b"{") {
7779
return Ok(binary_body.into());
7880
}

0 commit comments

Comments
 (0)