mirror of https://github.com/ospab/ostp.git
security: fix obfuscation via HMAC per-packet mask and cap server sessions at 1024
This commit is contained in:
parent
6e35609f42
commit
77b0d55f39
|
|
@ -356,6 +356,15 @@ version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hmac"
|
||||||
|
version = "0.12.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
|
||||||
|
dependencies = [
|
||||||
|
"digest",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "inout"
|
name = "inout"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
|
@ -512,6 +521,7 @@ dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"bytes",
|
"bytes",
|
||||||
"chacha20poly1305",
|
"chacha20poly1305",
|
||||||
|
"hmac",
|
||||||
"rand",
|
"rand",
|
||||||
"sha2",
|
"sha2",
|
||||||
"snow",
|
"snow",
|
||||||
|
|
|
||||||
|
|
@ -25,4 +25,5 @@ tokio = { version = "1.37", features = ["rt-multi-thread", "macros", "net", "tim
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
x25519-dalek = "2"
|
x25519-dalek = "2"
|
||||||
sha2 = "0.10"
|
sha2 = "0.10"
|
||||||
|
hmac = "0.12"
|
||||||
portable-atomic = "1.10"
|
portable-atomic = "1.10"
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,4 @@ thiserror.workspace = true
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
x25519-dalek.workspace = true
|
x25519-dalek.workspace = true
|
||||||
sha2.workspace = true
|
sha2.workspace = true
|
||||||
|
hmac.workspace = true
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::Sha256;
|
||||||
|
use hmac::{Hmac, Mac};
|
||||||
|
type HmacSha256 = Hmac<Sha256>;
|
||||||
|
|
||||||
pub fn derive_obfuscation_key(access_key: &[u8]) -> [u8; 8] {
|
pub fn derive_obfuscation_key(access_key: &[u8]) -> [u8; 8] {
|
||||||
|
use sha2::Digest;
|
||||||
let mut hasher = Sha256::new();
|
let mut hasher = Sha256::new();
|
||||||
hasher.update(access_key);
|
hasher.update(access_key);
|
||||||
let result = hasher.finalize();
|
let result = hasher.finalize();
|
||||||
|
|
@ -10,6 +13,7 @@ pub fn derive_obfuscation_key(access_key: &[u8]) -> [u8; 8] {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn derive_psk(access_key: &[u8]) -> [u8; 32] {
|
pub fn derive_psk(access_key: &[u8]) -> [u8; 32] {
|
||||||
|
use sha2::Digest;
|
||||||
let mut hasher = Sha256::new();
|
let mut hasher = Sha256::new();
|
||||||
hasher.update(access_key);
|
hasher.update(access_key);
|
||||||
hasher.update(b"-ostp-psk-salt");
|
hasher.update(b"-ostp-psk-salt");
|
||||||
|
|
@ -19,72 +23,66 @@ pub fn derive_psk(access_key: &[u8]) -> [u8; 32] {
|
||||||
psk
|
psk
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Derives a unique 4-byte session_id mask using HMAC-SHA256(key, nonce).
|
||||||
|
/// Because nonce is strictly monotonic, each packet gets a cryptographically
|
||||||
|
/// independent mask — consecutive headers are indistinguishable from random noise.
|
||||||
|
fn derive_session_mask(key: &[u8; 8], nonce: u64) -> [u8; 4] {
|
||||||
|
let mut mac = HmacSha256::new_from_slice(key).expect("HMAC accepts any key length");
|
||||||
|
mac.update(&nonce.to_be_bytes());
|
||||||
|
let result = mac.finalize().into_bytes();
|
||||||
|
let mut mask = [0u8; 4];
|
||||||
|
mask.copy_from_slice(&result[..4]);
|
||||||
|
mask
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wire layout for DATA packets:
|
||||||
|
/// [0..4] = session_id XOR HMAC(obf_key, nonce)[0..4] ← masked, unique per-packet
|
||||||
|
/// [4..12] = nonce, plaintext ← needed by receiver to derive mask
|
||||||
|
/// [12..] = AEAD ciphertext ← authenticates everything
|
||||||
|
///
|
||||||
|
/// The nonce is sent in plaintext but this is intentional and safe:
|
||||||
|
/// - It is authenticated by the AEAD tag; tampering is detected.
|
||||||
|
/// - The session_id mask changes with every packet, breaking header correlation.
|
||||||
|
/// - The ciphertext is fully opaque; only nonce sequence is visible.
|
||||||
pub fn obfuscate_packet_inplace(raw: &mut [u8], key: &[u8; 8], is_handshake: bool) {
|
pub fn obfuscate_packet_inplace(raw: &mut [u8], key: &[u8; 8], is_handshake: bool) {
|
||||||
if !is_handshake && raw.len() >= 12 {
|
if !is_handshake && raw.len() >= 12 {
|
||||||
// Data packet
|
// Read nonce from bytes 4..12 (plaintext on wire)
|
||||||
let mut session_id_bytes = [raw[0], raw[1], raw[2], raw[3]];
|
let nonce = u64::from_be_bytes([
|
||||||
let mut nonce_bytes = [
|
|
||||||
raw[4], raw[5], raw[6], raw[7],
|
raw[4], raw[5], raw[6], raw[7],
|
||||||
raw[8], raw[9], raw[10], raw[11]
|
raw[8], raw[9], raw[10], raw[11],
|
||||||
];
|
|
||||||
|
|
||||||
// 1. Obfuscate nonce with derived key
|
|
||||||
for i in 0..8 {
|
|
||||||
nonce_bytes[i] ^= key[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Obfuscate session_id with the REAL (unobfuscated) nonce
|
|
||||||
let real_nonce = u64::from_be_bytes([
|
|
||||||
raw[4], raw[5], raw[6], raw[7],
|
|
||||||
raw[8], raw[9], raw[10], raw[11]
|
|
||||||
]);
|
]);
|
||||||
let nonce_low_32 = (real_nonce & 0xFFFFFFFF) as u32;
|
// Mask only session_id bytes using nonce-derived mask
|
||||||
let nonce_low_bytes = nonce_low_32.to_be_bytes();
|
let mask = derive_session_mask(key, nonce);
|
||||||
|
|
||||||
for i in 0..4 {
|
for i in 0..4 {
|
||||||
session_id_bytes[i] ^= nonce_low_bytes[i];
|
raw[i] ^= mask[i];
|
||||||
}
|
}
|
||||||
|
// nonce bytes 4..12 remain as-is (plaintext, authenticated by AEAD)
|
||||||
// Put them back
|
|
||||||
raw[0..4].copy_from_slice(&session_id_bytes);
|
|
||||||
raw[4..12].copy_from_slice(&nonce_bytes);
|
|
||||||
} else if raw.len() >= 4 {
|
} else if raw.len() >= 4 {
|
||||||
// Handshake packet (XOR with key)
|
// Handshake packets: mask session_id with a fixed handshake-phase mask
|
||||||
|
// u64::MAX used as sentinel to produce a distinct HMAC output from any data nonce
|
||||||
|
let mask = derive_session_mask(key, u64::MAX);
|
||||||
for i in 0..4 {
|
for i in 0..4 {
|
||||||
raw[i] ^= key[i % 8];
|
raw[i] ^= mask[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deobfuscate_packet_inplace(raw: &mut [u8], key: &[u8; 8], is_handshake: bool) {
|
pub fn deobfuscate_packet_inplace(raw: &mut [u8], key: &[u8; 8], is_handshake: bool) {
|
||||||
if !is_handshake && raw.len() >= 12 {
|
if !is_handshake && raw.len() >= 12 {
|
||||||
// Data packet
|
// Read nonce plaintext from bytes 4..12
|
||||||
let mut nonce_bytes = [
|
let nonce = u64::from_be_bytes([
|
||||||
raw[4], raw[5], raw[6], raw[7],
|
raw[4], raw[5], raw[6], raw[7],
|
||||||
raw[8], raw[9], raw[10], raw[11]
|
raw[8], raw[9], raw[10], raw[11],
|
||||||
];
|
]);
|
||||||
|
// Derive same mask and unmask session_id
|
||||||
// 1. Recover real nonce by XORing with key
|
let mask = derive_session_mask(key, nonce);
|
||||||
for i in 0..8 {
|
|
||||||
nonce_bytes[i] ^= key[i];
|
|
||||||
}
|
|
||||||
let real_nonce = u64::from_be_bytes(nonce_bytes);
|
|
||||||
let nonce_low_32 = (real_nonce & 0xFFFFFFFF) as u32;
|
|
||||||
let nonce_low_bytes = nonce_low_32.to_be_bytes();
|
|
||||||
|
|
||||||
// 2. Recover session_id by XORing with recovered nonce
|
|
||||||
let mut session_id_bytes = [raw[0], raw[1], raw[2], raw[3]];
|
|
||||||
for i in 0..4 {
|
for i in 0..4 {
|
||||||
session_id_bytes[i] ^= nonce_low_bytes[i];
|
raw[i] ^= mask[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put them back
|
|
||||||
raw[0..4].copy_from_slice(&session_id_bytes);
|
|
||||||
raw[4..12].copy_from_slice(&nonce_bytes);
|
|
||||||
} else if raw.len() >= 4 {
|
} else if raw.len() >= 4 {
|
||||||
// Handshake packet
|
let mask = derive_session_mask(key, u64::MAX);
|
||||||
for i in 0..4 {
|
for i in 0..4 {
|
||||||
raw[i] ^= key[i % 8];
|
raw[i] ^= mask[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,10 @@ use std::collections::HashMap;
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
|
/// Maximum number of concurrent authenticated sessions.
|
||||||
|
/// Excess handshake attempts are silently dropped — no response, no state allocated.
|
||||||
|
const MAX_SESSIONS: usize = 1024;
|
||||||
|
|
||||||
pub enum DispatchOutcome {
|
pub enum DispatchOutcome {
|
||||||
Unauthorized,
|
Unauthorized,
|
||||||
Accepted {
|
Accepted {
|
||||||
|
|
@ -198,6 +202,11 @@ impl Dispatcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.replay_cache.contains_key(&payload.to_vec()) {
|
if !self.replay_cache.contains_key(&payload.to_vec()) {
|
||||||
|
// §4 fix: hard cap on concurrent sessions to prevent RAM exhaustion
|
||||||
|
if self.peer_machines.len() >= MAX_SESSIONS {
|
||||||
|
return Ok(DispatchOutcome::Unauthorized);
|
||||||
|
}
|
||||||
|
|
||||||
self.replay_cache.insert(payload.to_vec(), ts);
|
self.replay_cache.insert(payload.to_vec(), ts);
|
||||||
|
|
||||||
machine.set_session_keys(candidate_session_id, obf_key);
|
machine.set_session_keys(candidate_session_id, obf_key);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc_fingerprint":18383453396593711792,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.93.0 (254b59607 2026-01-19)\nbinary: rustc\ncommit-hash: 254b59607d4417e9dffbc307138ae5c86280fe4c\ncommit-date: 2026-01-19\nhost: x86_64-unknown-linux-gnu\nrelease: 1.93.0\nLLVM version: 21.1.8\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/deb/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"7758962378047318522":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.a\nlib___.so\n/home/deb/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"musl\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":"warning: dropping unsupported crate type `dylib` for target `x86_64-unknown-linux-musl`\n\nwarning: dropping unsupported crate type `cdylib` for target `x86_64-unknown-linux-musl`\n\nwarning: 2 warnings emitted\n\n"}},"successes":{}}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
96370f041560afb9
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"std\"]","declared_features":"[\"backtrace\", \"default\", \"std\"]","target":5408242616063297496,"profile":1369601567987815722,"path":5078452525537651980,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/anyhow-e62cdfb0455fd4f9/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
d449f2372c77bea1
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":5116616278641129243,"profile":1369601567987815722,"path":17196491191656806637,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[10420560437213941093,"syn",false,7682872829740180825],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/async-trait-679822087579a0f3/dep-lib-async_trait","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
9acbf29577b06a2d
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\"]","declared_features":"[\"debug\", \"default\", \"deprecated\", \"raw-deprecated\", \"unstable-markdown\", \"unstable-v5\"]","target":2345819099678412135,"profile":10673744324659745496,"path":4543708211979366253,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[10420560437213941093,"syn",false,7682872829740180825],[13077543566650298139,"heck",false,8615518309128331684],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/clap_derive-aaf981945b8d17fe/dep-lib-clap_derive","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
c9cae9ea92166f06
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"alloc\", \"default\", \"precomputed-tables\", \"zeroize\"]","declared_features":"[\"alloc\", \"default\", \"digest\", \"ff\", \"group\", \"group-bits\", \"legacy_compatibility\", \"precomputed-tables\", \"rand_core\", \"serde\", \"zeroize\"]","target":5408242616063297496,"profile":1369601567987815722,"path":1140418731873059543,"deps":[[8576480473721236041,"rustc_version",false,17758405319172314203]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/curve25519-dalek-7cf6dddb14aa4756/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
fae7dd1556145f67
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":13207463886205555035,"profile":1369601567987815722,"path":11461193332019812222,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[10420560437213941093,"syn",false,7682872829740180825],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/curve25519-dalek-derive-a9027d4b76f8b498/dep-lib-curve25519_dalek_derive","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
f5d520c25ffed1da
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"more_lengths\"]","declared_features":"[\"more_lengths\", \"serde\", \"zeroize\"]","target":12318548087768197662,"profile":1369601567987815722,"path":7665026906930965837,"deps":[[5398981501050481332,"version_check",false,1791596176917658573]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/generic-array-cb54359ea8b8184a/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
a4e1775341789077
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":17886154901722686619,"profile":1369601567987815722,"path":374610474379358690,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/heck-93181e9cb3ac1c68/dep-lib-heck","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
c740c2d94f30dd6a
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"std\"]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":5408242616063297496,"profile":8928907579149787682,"path":659055322772843324,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/libc-71ca86a88419613b/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
8edb051a64420d3a
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"proc-macro\"]","declared_features":"[\"default\", \"nightly\", \"proc-macro\", \"span-locations\"]","target":369203346396300798,"profile":1369601567987815722,"path":17842192393783320086,"deps":[[4289358735036141001,"build_script_build",false,17300191034754642848],[8901712065508858692,"unicode_ident",false,11836738269896852547]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/proc-macro2-263748b18dca16e2/dep-lib-proc_macro2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
ccd77adb7632e0fd
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"proc-macro\"]","declared_features":"[\"default\", \"nightly\", \"proc-macro\", \"span-locations\"]","target":5408242616063297496,"profile":1369601567987815722,"path":1603275276641070996,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/proc-macro2-544b8d231d8c3a29/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
a0b3f2f415a016f0
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[4289358735036141001,"build_script_build",false,18293677172448745420]],"local":[{"RerunIfChanged":{"output":"release/build/proc-macro2-eb0a6dc1a4bba162/output","paths":["src/probe/proc_macro_span.rs","src/probe/proc_macro_span_location.rs","src/probe/proc_macro_span_file.rs"]}},{"RerunIfEnvChanged":{"var":"RUSTC_BOOTSTRAP","val":null}}],"rustflags":[],"config":0,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
1891f4b033dc8aee
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[13111758008314797071,"build_script_build",false,3627134541148597575]],"local":[{"RerunIfChanged":{"output":"release/build/quote-1fd0fedfe9b16b61/output","paths":["build.rs"]}}],"rustflags":[],"config":0,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
c23bbf0f9fff5380
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"proc-macro\"]","declared_features":"[\"default\", \"proc-macro\"]","target":8313845041260779044,"profile":1369601567987815722,"path":17757947619074011059,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[13111758008314797071,"build_script_build",false,17188793042383180056]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/quote-c6f7cc898613a129/dep-lib-quote","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
472db6d5a52b5632
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"proc-macro\"]","declared_features":"[\"default\", \"proc-macro\"]","target":5408242616063297496,"profile":1369601567987815722,"path":16906092930296942150,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/quote-d6324adbe6fbc1b8/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
5b54acba8c8772f6
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":18294139061885094686,"profile":1369601567987815722,"path":14270892086808806689,"deps":[[9680020106200215617,"semver",false,2133659744099682478]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/rustc_version-cbf0a3a37342423f/dep-lib-rustc_version","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
aec89c8e3b489c1d
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"serde\", \"std\"]","target":12174432953422647384,"profile":1369601567987815722,"path":14435369757839989609,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/semver-38092f9e54c220f4/dep-lib-semver","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
d48e2b97ecbf7e1c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"derive\", \"serde_derive\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"derive\", \"rc\", \"serde_derive\", \"std\", \"unstable\"]","target":5408242616063297496,"profile":1369601567987815722,"path":14580045918014891896,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/serde-5fa5b590484ba9aa/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
3fe611e93914d65c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"result\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"rc\", \"result\", \"std\", \"unstable\"]","target":5408242616063297496,"profile":1369601567987815722,"path":2448802213213893349,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/serde_core-20ac9499cf692a43/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
4819137ca3bee237
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\"]","declared_features":"[\"default\", \"deserialize_in_place\"]","target":13076129734743110817,"profile":1369601567987815722,"path":12763875128210078020,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[10420560437213941093,"syn",false,7682872829740180825],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/serde_derive-01ceec495c3ac2a2/dep-lib-serde_derive","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
c9ad034d951d65ef
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"default\", \"std\"]","declared_features":"[\"alloc\", \"arbitrary_precision\", \"default\", \"float_roundtrip\", \"indexmap\", \"preserve_order\", \"raw_value\", \"std\", \"unbounded_depth\"]","target":5408242616063297496,"profile":1369601567987815722,"path":13160021249542837524,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/serde_json-3ebdb9d0a9bf3f98/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
d9f5e95e2f02533e
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"aes-gcm\", \"blake2\", \"chacha20poly1305\", \"curve25519-dalek\", \"default\", \"default-resolver\", \"sha2\"]","declared_features":"[\"aes-gcm\", \"blake2\", \"byteorder\", \"chacha20poly1305\", \"curve25519-dalek\", \"default\", \"default-resolver\", \"hfs\", \"libsodium-accelerated\", \"libsodium-resolver\", \"nightly\", \"pqclean_kyber1024\", \"pqcrypto-kyber\", \"pqcrypto-traits\", \"ring\", \"ring-accelerated\", \"ring-resolver\", \"risky-raw-split\", \"sha2\", \"sodiumoxide\", \"vector-tests\", \"xchachapoly\"]","target":17883862002600103897,"profile":1369601567987815722,"path":8975801846093883268,"deps":[[8576480473721236041,"rustc_version",false,17758405319172314203]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/snow-d0f9f74971807a67/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
59e5290f220c9f6a
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[\"clone-impls\", \"default\", \"derive\", \"extra-traits\", \"full\", \"parsing\", \"printing\", \"proc-macro\", \"visit\", \"visit-mut\"]","declared_features":"[\"clone-impls\", \"default\", \"derive\", \"extra-traits\", \"fold\", \"full\", \"parsing\", \"printing\", \"proc-macro\", \"test\", \"visit\", \"visit-mut\"]","target":9442126953582868550,"profile":1369601567987815722,"path":12825271569878779604,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[8901712065508858692,"unicode_ident",false,11836738269896852547],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/syn-7e89902d9f592bcf/dep-lib-syn","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
53a01b0fd0ab1997
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":5408242616063297496,"profile":1369601567987815722,"path":16356583085998285410,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/thiserror-93c02f55fe35928c/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
This file has an mtime of when this was started.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
7df09e4b33b1d848
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
{"rustc":5470738401306409665,"features":"[]","declared_features":"[]","target":6216210811039475267,"profile":1369601567987815722,"path":13371872552189109251,"deps":[[4289358735036141001,"proc_macro2",false,4183072626597813134],[10420560437213941093,"syn",false,7682872829740180825],[13111758008314797071,"quote",false,9247015518550834114]],"local":[{"CheckDepInfo":{"dep_info":"release/.fingerprint/thiserror-impl-c65f2966f6a77eb5/dep-lib-thiserror_impl","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue