Skip to content

Commit bef6550

Browse files
committed
refactor(rivetkit-core): use subtle::ConstantTimeEq for inspector token verify
1 parent 048de9b commit bef6550

3 files changed

Lines changed: 4 additions & 14 deletions

File tree

Cargo.lock

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

rivetkit-rust/packages/rivetkit-core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ serde.workspace = true
3434
serde_json.workspace = true
3535
serde_bare.workspace = true
3636
serde_bytes.workspace = true
37+
subtle.workspace = true
3738
tokio.workspace = true
3839
tokio-util.workspace = true
3940
tracing.workspace = true

rivetkit-rust/packages/rivetkit-core/src/inspector/auth.rs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use base64::{Engine, engine::general_purpose::URL_SAFE_NO_PAD};
33
use rand::RngCore;
44
use rivet_error::RivetError as RivetErrorDerive;
55
use serde::{Deserialize, Serialize};
6+
use subtle::ConstantTimeEq;
67

78
use crate::ActorContext;
89

@@ -91,22 +92,9 @@ fn generate_inspector_token() -> String {
9192
}
9293

9394
fn verify_token_bytes(candidate: &[u8], expected: &[u8]) -> Result<()> {
94-
if timing_safe_equal(candidate, expected) {
95+
if candidate.ct_eq(expected).into() {
9596
Ok(())
9697
} else {
9798
Err(InspectorUnauthorized.build())
9899
}
99100
}
100-
101-
fn timing_safe_equal(left: &[u8], right: &[u8]) -> bool {
102-
let max_len = left.len().max(right.len());
103-
let mut diff = left.len() ^ right.len();
104-
105-
for idx in 0..max_len {
106-
let left_byte = left.get(idx).copied().unwrap_or_default();
107-
let right_byte = right.get(idx).copied().unwrap_or_default();
108-
diff |= usize::from(left_byte ^ right_byte);
109-
}
110-
111-
diff == 0
112-
}

0 commit comments

Comments
 (0)